[FFmpeg-devel] [PATCH 07/37] avformat/matroskadec: Set offset of first cluster
James Almer
jamrial at gmail.com
Sun Jun 23 07:15:36 EEST 2019
On 5/16/2019 7:29 PM, Andreas Rheinhardt wrote:
> 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 at gmail.com>
> ---
> libavformat/matroskadec.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
> index 927462d3ad..1cda5d5b76 100644
> --- a/libavformat/matroskadec.c
> +++ b/libavformat/matroskadec.c
> @@ -2669,6 +2669,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)
Applied, thanks.
More information about the ffmpeg-devel
mailing list