diff options
author | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2019-06-24 01:46:54 +0200 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2019-07-16 16:16:58 -0300 |
commit | b31c9b72e5e677149b73b5f26b0c1deabc6a0803 (patch) | |
tree | e90a2396190aac2ad48bda30242dd6418515d61e /libavformat/sbgdec.c | |
parent | c1abd95ad0964ff7295fa38af564f2dea1a3b314 (diff) | |
download | ffmpeg-b31c9b72e5e677149b73b5f26b0c1deabc6a0803.tar.gz |
avformat/matroskadec: Redo level handling
This commit changes how levels are handled: If the level used for
ebml_parse ends directly after an element that has been consumed, then
ebml_parse ends the level itself (and any known-length levels that end
there as well) and informs the caller via the return value; if the
current level is of unknown-length, then the level is ended as soon as
an element that is not valid on the current level, but on a higher
level is encountered (or if EOF has been encountered).
This is designed for situations where one wants to parse master elements
incrementally, i.e. not in one go via ebml_parse_nest.
The (incremental) parsing of clusters still mixes levels by using a
syntax list that contains elements from different levels and the level
is still ended manually via a call to ebml_level_end if the last cluster
was an unknown-length cluster (known-length clusters are already ended
when their last element is read), but only if the next element is a
cluster, too. A different level 1 element following an unknown-length
cluster will currently simply be presumed to be part of the earlier
cluster. Fixing this will be done in a future patch. The modifications
to matroska_parse_cluster contained in this patch are only intended not
to cause regressions.
Nevertheless, the fact that known-length levels are automatically ended
in ebml_parse when their last element has been read already fixes a bogus
error message introduced in 9326117b that was emitted when a known-length
cluster is followed by another level 1 element other than a cluster in
which case the cluster's level was not ended (which only happened when
a new cluster has been encountered) so that the length check (introduced
in 9326117b) failed for the level 1 element as it is of course not
contained in the previous cluster. Most Matroska files were affected by
this.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
Diffstat (limited to 'libavformat/sbgdec.c')
0 files changed, 0 insertions, 0 deletions