ffmpeg | branch: master | Alexandra Hájková <[email protected]> | 
Fri Jul 17 14:17:06 2015 +0200| [2883ef34b59c9b427c4cfad4620c3235e5778406] | 
committer: Anton Khirnov

asfdec: read the replicated data in a separate function

Signed-off-by: Anton Khirnov <[email protected]>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=2883ef34b59c9b427c4cfad4620c3235e5778406
---

 libavformat/asfdec.c |   37 ++++++++++++++++++++++++-------------
 1 file changed, 24 insertions(+), 13 deletions(-)

diff --git a/libavformat/asfdec.c b/libavformat/asfdec.c
index bb08357..8b0d82a 100644
--- a/libavformat/asfdec.c
+++ b/libavformat/asfdec.c
@@ -1105,6 +1105,27 @@ static void reset_packet(ASFPacket *asf_pkt)
     av_init_packet(&asf_pkt->avpkt);
 }
 
+static int asf_read_replicated_data(AVFormatContext *s, ASFPacket *asf_pkt)
+{
+    ASFContext *asf = s->priv_data;
+    AVIOContext *pb = s->pb;
+    int ret;
+
+    if (!asf_pkt->data_size) {
+        asf_pkt->data_size = asf_pkt->size_left = avio_rl32(pb); // read media 
object size
+        if (asf_pkt->data_size <= 0)
+            return AVERROR_EOF;
+        if ((ret = av_new_packet(&asf_pkt->avpkt, asf_pkt->data_size)) < 0)
+            return ret;
+    } else
+        avio_skip(pb, 4); // reading of media object size is already done
+    asf_pkt->dts = avio_rl32(pb); // read presentation time
+    if (asf->rep_data_len && (asf->rep_data_len >= 8))
+        avio_skip(pb, asf->rep_data_len - 8); // skip replicated data
+
+    return 0;
+}
+
 static int asf_read_multiple_payload(AVFormatContext *s, AVPacket *pkt,
                                  ASFPacket *asf_pkt)
 {
@@ -1123,19 +1144,9 @@ static int asf_read_multiple_payload(AVFormatContext *s, 
AVPacket *pkt,
         if ((ret = asf_read_subpayload(s, pkt, 1)) < 0)
             return ret;
     } else {
-        if (asf->rep_data_len) {
-            if (!asf_pkt->data_size) {
-                asf_pkt->data_size = asf_pkt->size_left = avio_rl32(pb); // 
read media object size
-                if (asf_pkt->data_size <= 0)
-                    return AVERROR_EOF;
-                if ((ret = av_new_packet(&asf_pkt->avpkt, asf_pkt->data_size)) 
< 0)
-                    return ret;
-            } else
-                avio_skip(pb, 4); // reading of media object size is already 
done
-            asf_pkt->dts = avio_rl32(pb); // read presentation time
-            if (asf->rep_data_len && (asf->rep_data_len >= 8))
-                avio_skip(pb, asf->rep_data_len - 8); // skip replicated data
-        }
+        if (asf->rep_data_len)
+            if ((ret = asf_read_replicated_data(s, asf_pkt)) < 0)
+                return ret;
         pay_len = avio_rl16(pb); // payload length should be WORD
         if (pay_len > asf->packet_size) {
             av_log(s, AV_LOG_ERROR,

_______________________________________________
ffmpeg-cvslog mailing list
[email protected]
http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog

Reply via email to