summaryrefslogtreecommitdiff
path: root/libavformat/matroskadec.c
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2019-05-17 00:29:51 +0200
committerJames Almer <jamrial@gmail.com>2019-06-23 00:47:50 -0300
commit43c3cebbd4c09dd4d2f9122b38f23eddfe7cadbe (patch)
treec17a5ee3206b86c0ed828f77c025b3909b87e3cd /libavformat/matroskadec.c
parent36aceb6174a6a1c40014001ff73c4c30012b569d (diff)
avformat/matroskadec: Set offset of first cluster
By default, the data_offset member of the AVFormatInternal of the AVFormatContext associated with the MatroskaDemuxContext has not been initialized explicitly by any Matroska-specific function, so that it was initialized by default to the offset at the end of matroska_read_header, i.e. usually to the offset of the length field of the first encountered cluster. This meant that in case that the Matroska-specific seek-code fails because there are no index entries for the target track a seek to data_offset would be performed and ordinary parsing would start from there which is nonsense: The length field would be treated as EBML ID and (if the length field is not longer than four bytes (EBML numbers that long are rejected as invalid EBML IDs)) whatever comes next would be treated as its EBML size although it simply isn't. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
Diffstat (limited to 'libavformat/matroskadec.c')
-rw-r--r--libavformat/matroskadec.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 09b5cf3a28..d516ef37c7 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2646,6 +2646,9 @@ static int matroska_read_header(AVFormatContext *s)
pos = avio_tell(matroska->ctx->pb);
res = ebml_parse(matroska, matroska_segment, matroska);
}
+ /* Set data_offset as it might be needed later by seek_frame_generic. */
+ if (matroska->current_id == MATROSKA_ID_CLUSTER)
+ s->internal->data_offset = avio_tell(matroska->ctx->pb) - 4;
matroska_execute_seekhead(matroska);
if (!matroska->time_scale)