mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-28 10:22:10 +00:00
avformat/matroskadec: Improve forward compability
Matroska is built around the principle that a reader does not need to understand everything in a file in order to be able to make use of it; it just needs to ignore the data it doesn't know about. Our demuxer typically follows this principle, but there is one important instance where it does not: A Block belonging to a TrackEntry with no associated stream is treated as invalid data (i.e. the demuxer will try to resync to the next level 1 element because it takes this as a sign that it has lost sync). Given that we do not create streams if we don't know or don't support the type of the TrackEntry, this impairs this demuxer's forward compability. Furthermore, ignoring Blocks belonging to a TrackEntry without corresponding stream can (in future commits) also be used to ignore TrackEntries with obviously bogus entries without affecting the other TrackEntries (by not creating a stream for said TrackEntry). Finally, given that matroska_find_track_by_num() already emits its own error message in case there is no TrackEntry with a given TrackNumber, the error message (with level AV_LOG_INFO) for this can be removed. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
parent
e471faf962
commit
b577968cab
@ -3556,13 +3556,16 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf
|
||||
size -= n;
|
||||
|
||||
track = matroska_find_track_by_num(matroska, num);
|
||||
if (!track || !track->stream) {
|
||||
av_log(matroska->ctx, AV_LOG_INFO,
|
||||
"Invalid stream %"PRIu64"\n", num);
|
||||
if (!track || size < 3)
|
||||
return AVERROR_INVALIDDATA;
|
||||
} else if (size < 3)
|
||||
return AVERROR_INVALIDDATA;
|
||||
st = track->stream;
|
||||
|
||||
if (!(st = track->stream)) {
|
||||
av_log(matroska->ctx, AV_LOG_VERBOSE,
|
||||
"No stream associated to TrackNumber %"PRIu64". "
|
||||
"Ignoring Block with this TrackNumber.\n", num);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (st->discard >= AVDISCARD_ALL)
|
||||
return res;
|
||||
av_assert1(block_duration != AV_NOPTS_VALUE);
|
||||
|
Loading…
Reference in New Issue
Block a user