You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
avformat/asfdec_f: Do not print errors if packets do not start with ECC
There is nothing wrong with such packets, the spec allows this Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
@@ -113,6 +113,8 @@ typedef struct ASFContext {
|
|||||||
|
|
||||||
int no_resync_search;
|
int no_resync_search;
|
||||||
int export_xmp;
|
int export_xmp;
|
||||||
|
|
||||||
|
int uses_std_ecc;
|
||||||
} ASFContext;
|
} ASFContext;
|
||||||
|
|
||||||
static const AVOption options[] = {
|
static const AVOption options[] = {
|
||||||
@@ -956,44 +958,53 @@ static int asf_get_packet(AVFormatContext *s, AVIOContext *pb)
|
|||||||
int rsize = 8;
|
int rsize = 8;
|
||||||
int c, d, e, off;
|
int c, d, e, off;
|
||||||
|
|
||||||
// if we do not know packet size, allow skipping up to 32 kB
|
if (asf->uses_std_ecc >= 0) {
|
||||||
off = 32768;
|
// if we do not know packet size, allow skipping up to 32 kB
|
||||||
if (asf->no_resync_search)
|
off = 32768;
|
||||||
off = 3;
|
if (asf->no_resync_search)
|
||||||
else if (s->packet_size > 0)
|
off = 3;
|
||||||
off = (avio_tell(pb) - s->internal->data_offset) % s->packet_size + 3;
|
else if (s->packet_size > 0)
|
||||||
|
off = (avio_tell(pb) - s->internal->data_offset) % s->packet_size + 3;
|
||||||
|
|
||||||
c = d = e = -1;
|
c = d = e = -1;
|
||||||
while (off-- > 0) {
|
while (off-- > 0) {
|
||||||
c = d;
|
c = d;
|
||||||
d = e;
|
d = e;
|
||||||
e = avio_r8(pb);
|
e = avio_r8(pb);
|
||||||
if (c == 0x82 && !d && !e)
|
if (c == 0x82 && !d && !e)
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
* imply complete -EAGAIN handling support at random positions in
|
|
||||||
* the stream. */
|
|
||||||
if (pb->error == AVERROR(EAGAIN))
|
|
||||||
return AVERROR(EAGAIN);
|
|
||||||
if (!avio_feof(pb))
|
|
||||||
av_log(s, AV_LOG_ERROR,
|
|
||||||
"ff asf bad header %x at:%"PRId64"\n", c, avio_tell(pb));
|
|
||||||
}
|
|
||||||
if ((c & 0x8f) == 0x82) {
|
|
||||||
if (d || e) {
|
|
||||||
if (!avio_feof(pb))
|
|
||||||
av_log(s, AV_LOG_ERROR, "ff asf bad non zero\n");
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
}
|
}
|
||||||
c = avio_r8(pb);
|
|
||||||
d = avio_r8(pb);
|
if (!asf->uses_std_ecc) {
|
||||||
rsize += 3;
|
asf->uses_std_ecc = (c == 0x82 && !d && !e) ? 1 : -1;
|
||||||
} else if(!avio_feof(pb)) {
|
}
|
||||||
avio_seek(pb, -1, SEEK_CUR); // FIXME
|
|
||||||
|
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
|
||||||
|
* imply complete -EAGAIN handling support at random positions in
|
||||||
|
* the stream. */
|
||||||
|
if (pb->error == AVERROR(EAGAIN))
|
||||||
|
return AVERROR(EAGAIN);
|
||||||
|
if (!avio_feof(pb))
|
||||||
|
av_log(s, AV_LOG_ERROR,
|
||||||
|
"ff asf bad header %x at:%"PRId64"\n", c, avio_tell(pb));
|
||||||
|
}
|
||||||
|
if ((c & 0x8f) == 0x82) {
|
||||||
|
if (d || e) {
|
||||||
|
if (!avio_feof(pb))
|
||||||
|
av_log(s, AV_LOG_ERROR, "ff asf bad non zero\n");
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
}
|
||||||
|
c = avio_r8(pb);
|
||||||
|
d = avio_r8(pb);
|
||||||
|
rsize += 3;
|
||||||
|
} else if(!avio_feof(pb)) {
|
||||||
|
avio_seek(pb, -1, SEEK_CUR); // FIXME
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
c = avio_r8(pb);
|
||||||
|
d = avio_r8(pb);
|
||||||
}
|
}
|
||||||
|
|
||||||
asf->packet_flags = c;
|
asf->packet_flags = c;
|
||||||
|
Reference in New Issue
Block a user