Browse Source

core: parser/sdp - optimized a= lines parsing

- search for next a= line from the last parsed position in previous a=
  line
Daniel-Constantin Mierla 14 years ago
parent
commit
550a879a50
3 changed files with 19 additions and 3 deletions
  1. 5 3
      parser/sdp/sdp.c
  2. 12 0
      parser/sdp/sdp_helpr_funcs.c
  3. 2 0
      parser/sdp/sdp_helpr_funcs.h

+ 5 - 3
parser/sdp/sdp.c

@@ -553,11 +553,13 @@ static int parse_sdp_session(str *sdp_body, int session_num, str *cnt_disp, sdp_
 				a1p = stream->max_size.s + stream->max_size.len;
 			} else if (extract_path(&tmpstr1, &stream->path) == 0) {
 				a1p = stream->path.s + stream->path.len;
-			/*} else { */
-			/*	LM_DBG("else: `%.*s'\n", tmpstr1.len, tmpstr1.s); */
+			} else {
+				/* unknown a= line, ignore -- jump over it */
+				LM_DBG("ignoring unknown type in a= line: `%.*s'\n", tmpstr1.len, tmpstr1.s);
+				a1p += 2;
 			}
 
-			a2p = find_next_sdp_line(a2p, m2p, 'a', m2p);
+			a2p = find_first_sdp_line(a1p, m2p, 'a', m2p);
 		}
 		/* Let's detect if the media is on hold by checking
 		 * the good old "0.0.0.0" connection address */

+ 12 - 0
parser/sdp/sdp_helpr_funcs.c

@@ -606,6 +606,18 @@ char * find_next_sdp_line(char* p, char* plimit, char linechar, char* defptr)
 }
 
 
+/* Find first SDP line starting with linechar. Return defptr if not found */
+char * find_first_sdp_line(char* pstart, char* plimit, char linechar,
+		char* defptr)
+{
+	char *t;
+	if (pstart >= plimit || plimit - pstart < 3)
+		return defptr;
+	t = find_sdp_line(pstart, plimit, linechar);
+	return t ? t : defptr;
+}
+
+
 /* returns pointer to next header line, and fill hdr_f ;
  * if at end of header returns pointer to the last crlf  (always buf)*/
 char* get_sdp_hdr_field(char* buf, char* end, struct hdr_field* hdr)

+ 2 - 0
parser/sdp/sdp_helpr_funcs.h

@@ -68,4 +68,6 @@ char* get_sdp_hdr_field(char* , char* , struct hdr_field* );
 
 char *find_sdp_line_delimiter(char *p, char *plimit, str delimiter);
 char *find_next_sdp_line_delimiter(char *p, char *plimit, str delimiter, char *defptr); 
+char * find_first_sdp_line(char* pstart, char* plimit, char linechar,
+		 char* defptr);
 #endif