[FFmpeg-cvslog] r24389 - trunk/libavformat/rtpdec_asf.c

mstorsjo subversion
Wed Jul 21 19:17:35 CEST 2010


Author: mstorsjo
Date: Wed Jul 21 19:17:35 2010
New Revision: 24389

Log:
rtpdec_asf: Handle RTSP-MS packet splitting

Modified:
   trunk/libavformat/rtpdec_asf.c

Modified: trunk/libavformat/rtpdec_asf.c
==============================================================================
--- trunk/libavformat/rtpdec_asf.c	Wed Jul 21 19:14:22 2010	(r24388)
+++ trunk/libavformat/rtpdec_asf.c	Wed Jul 21 19:17:35 2010	(r24389)
@@ -168,12 +168,18 @@ static int asfrtp_parse_packet(AVFormatC
         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(AVFormatC
             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(AVFormatC
                 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(AVFormatC
              * 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);



More information about the ffmpeg-cvslog mailing list