OSDN Git Service

rtpdec_asf: Handle RTSP-MS packet splitting
authorMartin Storsjö <martin@martin.st>
Wed, 21 Jul 2010 17:17:35 +0000 (17:17 +0000)
committerMartin Storsjö <martin@martin.st>
Wed, 21 Jul 2010 17:17:35 +0000 (17:17 +0000)
Originally committed as revision 24389 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/rtpdec_asf.c

index 556019b..d63d705 100644 (file)
@@ -168,12 +168,18 @@ static int asfrtp_parse_packet(AVFormatContext *s, PayloadContext *asf,
         return -1;
 
     if (len > 0) {
-        int off, out_len;
+        int off, out_len = 0;
 
         if (len < 4)
             return -1;
 
+        av_freep(&asf->buf);
+
         init_put_byte(pb, buf, len, 0, NULL, NULL, NULL, NULL);
+
+        while (url_ftell(pb) + 4 < len) {
+        int start_off = url_ftell(pb);
+
         mflags = get_byte(pb);
         if (mflags & 0x80)
             flags |= RTP_FLAG_KEY;
@@ -186,7 +192,6 @@ static int asfrtp_parse_packet(AVFormatContext *s, PayloadContext *asf,
             url_fskip(pb, 4);
         off = url_ftell(pb);
 
-        av_freep(&asf->buf);
         if (!(mflags & 0x40)) {
             /**
              * If 0x40 is not set, the len_off field specifies an offset of this
@@ -206,6 +211,7 @@ static int asfrtp_parse_packet(AVFormatContext *s, PayloadContext *asf,
                 return AVERROR(EIO);
 
             put_buffer(asf->pktbuf, buf + off, len - off);
+            url_fskip(pb, len - off);
             if (!(flags & RTP_FLAG_MARKER))
                 return -1;
             out_len     = url_close_dyn_buf(asf->pktbuf, &asf->buf);
@@ -218,14 +224,14 @@ static int asfrtp_parse_packet(AVFormatContext *s, PayloadContext *asf,
              * less in case of packet splitting (i.e. multiple ASF packets in
              * one RTP packet).
              */
-            if (len_off != len) {
-                av_log_missing_feature(s,
-                    "RTSP-MS packet splitting", 1);
-                return -1;
-            }
-            asf->buf = av_malloc(len - off);
-            out_len  = len - off;
-            memcpy(asf->buf, buf + off, len - off);
+
+            int cur_len = start_off + len_off - off;
+            int prev_len = out_len;
+            out_len += cur_len;
+            asf->buf = av_realloc(asf->buf, out_len);
+            memcpy(asf->buf + prev_len, buf + off, cur_len);
+            url_fskip(pb, cur_len);
+        }
         }
 
         init_packetizer(pb, asf->buf, out_len);