aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michael@niedermayer.cc>2015-07-19 11:38:33 +0200
committerMichael Niedermayer <michael@niedermayer.cc>2015-07-19 11:45:08 +0200
commit74aba00700d8404cbdad5fce2193e7f26fbe3af4 (patch)
tree94c900c08cfc3f85fb110622a218f04517c03282
parent80a37fc3e10a093d3aff7c9f5c4f62c7d9688f23 (diff)
parent2883ef34b59c9b427c4cfad4620c3235e5778406 (diff)
downloadffmpeg-74aba00700d8404cbdad5fce2193e7f26fbe3af4.tar.gz
Merge commit '2883ef34b59c9b427c4cfad4620c3235e5778406'
* commit '2883ef34b59c9b427c4cfad4620c3235e5778406': asfdec: read the replicated data in a separate function Merged-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r--libavformat/asfdec_o.c37
1 files changed, 24 insertions, 13 deletions
diff --git a/libavformat/asfdec_o.c b/libavformat/asfdec_o.c
index c0eb9566f7..6170116112 100644
--- a/libavformat/asfdec_o.c
+++ b/libavformat/asfdec_o.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,