Browse Source

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 <michael@niedermayer.cc>
tags/n2.8
Michael Niedermayer 10 years ago
parent
commit
9837d3b068
1 changed files with 21 additions and 7 deletions
  1. +21
    -7
      libavformat/asfdec_f.c

+ 21
- 7
libavformat/asfdec_f.c View File

@@ -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);
}



Loading…
Cancel
Save