Commit 2883ef34 authored by Alexandra Hájková's avatar Alexandra Hájková Committed by Anton Khirnov

asfdec: read the replicated data in a separate function

Signed-off-by: 's avatarAnton Khirnov <anton@khirnov.net>
parent 0989d3ad
...@@ -1105,6 +1105,27 @@ static void reset_packet(ASFPacket *asf_pkt) ...@@ -1105,6 +1105,27 @@ static void reset_packet(ASFPacket *asf_pkt)
av_init_packet(&asf_pkt->avpkt); 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, static int asf_read_multiple_payload(AVFormatContext *s, AVPacket *pkt,
ASFPacket *asf_pkt) ASFPacket *asf_pkt)
{ {
...@@ -1123,19 +1144,9 @@ static int asf_read_multiple_payload(AVFormatContext *s, AVPacket *pkt, ...@@ -1123,19 +1144,9 @@ static int asf_read_multiple_payload(AVFormatContext *s, AVPacket *pkt,
if ((ret = asf_read_subpayload(s, pkt, 1)) < 0) if ((ret = asf_read_subpayload(s, pkt, 1)) < 0)
return ret; return ret;
} else { } else {
if (asf->rep_data_len) { if (asf->rep_data_len)
if (!asf_pkt->data_size) { if ((ret = asf_read_replicated_data(s, asf_pkt)) < 0)
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; 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
}
pay_len = avio_rl16(pb); // payload length should be WORD pay_len = avio_rl16(pb); // payload length should be WORD
if (pay_len > asf->packet_size) { if (pay_len > asf->packet_size) {
av_log(s, AV_LOG_ERROR, av_log(s, AV_LOG_ERROR,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment