diff options
author | Michael Niedermayer <michael@niedermayer.cc> | 2015-07-19 11:38:33 +0200 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2015-07-19 11:45:08 +0200 |
commit | 74aba00700d8404cbdad5fce2193e7f26fbe3af4 (patch) | |
tree | 94c900c08cfc3f85fb110622a218f04517c03282 | |
parent | 80a37fc3e10a093d3aff7c9f5c4f62c7d9688f23 (diff) | |
parent | 2883ef34b59c9b427c4cfad4620c3235e5778406 (diff) | |
download | ffmpeg-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.c | 37 |
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, |