From 9837d3b06844f6cb24e36bdbcce55c03f8241eb4 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Wed, 22 Jul 2015 13:49:31 +0200 Subject: [PATCH] avformat/asfdec_f: Parse ECC byte according to spec This should not change anything as the spec requires specific values for the fields, which where handled previously. Ask for samples when these values do not match Signed-off-by: Michael Niedermayer --- libavformat/asfdec_f.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/libavformat/asfdec_f.c b/libavformat/asfdec_f.c index 95d561da43..9c791649c8 100644 --- a/libavformat/asfdec_f.c +++ b/libavformat/asfdec_f.c @@ -958,13 +958,13 @@ static int asf_get_packet(AVFormatContext *s, AVIOContext *pb) int rsize = 8; int c, d, e, off; - if (asf->uses_std_ecc >= 0) { + if (asf->uses_std_ecc > 0) { // if we do not know packet size, allow skipping up to 32 kB off = 32768; if (asf->no_resync_search) off = 3; - else if (s->packet_size > 0 && !asf->uses_std_ecc) - off = (avio_tell(pb) - s->internal->data_offset) % s->packet_size + 3; +// else if (s->packet_size > 0 && !asf->uses_std_ecc) +// off = (avio_tell(pb) - s->internal->data_offset) % s->packet_size + 3; c = d = e = -1; while (off-- > 0) { @@ -975,10 +975,6 @@ static int asf_get_packet(AVFormatContext *s, AVIOContext *pb) break; } - if (!asf->uses_std_ecc) { - asf->uses_std_ecc = (c == 0x82 && !d && !e) ? 1 : -1; - } - if (c != 0x82) { /* This code allows handling of -EAGAIN at packet boundaries (i.e. * if the packet sync code above triggers -EAGAIN). This does not @@ -1004,6 +1000,24 @@ static int asf_get_packet(AVFormatContext *s, AVIOContext *pb) } } else { c = avio_r8(pb); + if (c & 0x80) { + rsize ++; + if (!(c & 0x60)) { + d = avio_r8(pb); + e = avio_r8(pb); + avio_seek(pb, (c & 0xF) - 2, SEEK_CUR); + rsize += c & 0xF; + } + + if (c != 0x82) + avpriv_request_sample(s, "Invalid ECC byte\n"); + + if (!asf->uses_std_ecc) + asf->uses_std_ecc = (c == 0x82 && !d && !e) ? 1 : -1; + + c = avio_r8(pb); + } else + asf->uses_std_ecc = -1; d = avio_r8(pb); }