changeset 6296:7e7f9248ec87 libavformat

rtpdec_asf: Handle RTSP-MS packet splitting
author mstorsjo
date Wed, 21 Jul 2010 17:17:35 +0000
parents e8dfc68ad182
children 241c4063d058
files rtpdec_asf.c
diffstat 1 files changed, 16 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/rtpdec_asf.c	Wed Jul 21 07:46:02 2010 +0000
+++ b/rtpdec_asf.c	Wed Jul 21 17:17:35 2010 +0000
@@ -168,12 +168,18 @@
         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 @@
             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 @@
                 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 @@
              * 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);