summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavformat/asfdec_f.c28
1 files 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);
}