[FFmpeg-cvslog] avformat/asfdec_f: Parse ECC byte according to spec
Michael Niedermayer
git at videolan.org
Wed Jul 22 15:00:05 CEST 2015
ffmpeg | branch: master | Michael Niedermayer <michael at niedermayer.cc> | Wed Jul 22 13:49:31 2015 +0200| [9837d3b06844f6cb24e36bdbcce55c03f8241eb4] | committer: Michael Niedermayer
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 at niedermayer.cc>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=9837d3b06844f6cb24e36bdbcce55c03f8241eb4
---
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 95d561d..9c79164 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);
}
More information about the ffmpeg-cvslog
mailing list