From d59820f6fec3fd112436fb7712e4f9d6d768b664 Mon Sep 17 00:00:00 2001 From: Chris Cunningham Date: Thu, 21 Jul 2016 12:01:45 -0700 Subject: [PATCH] libavformat/matroskadec: fix unsigned overflow to improve seeking When seeking a file where codec delay is greater than 0, the timecode can become negative after offsetting by the codec delay. Failing to cast to a signed int64 will cause the check against skip_to_timecode to evaluate true for these negative values. This breaks the "skip_to" seek mechanism. Signed-off-by: Michael Niedermayer --- libavformat/matroskadec.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index f3d701fe4d..60b1b345d2 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -3150,7 +3150,10 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, if (matroska->skip_to_keyframe && track->type != MATROSKA_TRACK_TYPE_SUBTITLE) { - if (timecode < matroska->skip_to_timecode) + // Compare signed timecodes. Timecode may be negative due to codec delay + // offset. We don't support timestamps greater than int64_t anyway - see + // AVPacket's pts. + if ((int64_t)timecode < (int64_t)(matroska->skip_to_timecode)) return res; if (is_keyframe) matroska->skip_to_keyframe = 0;