[FFmpeg-cvslog] libavformat/matroskadec: fix unsigned overflow to improve seeking

Chris Cunningham git at videolan.org
Sat Jul 23 13:19:32 EEST 2016


ffmpeg | branch: master | Chris Cunningham <chcunningham at chromium.org> | Thu Jul 21 12:01:45 2016 -0700| [d59820f6fec3fd112436fb7712e4f9d6d768b664] | committer: Michael Niedermayer

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 <michael at niedermayer.cc>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d59820f6fec3fd112436fb7712e4f9d6d768b664
---

 libavformat/matroskadec.c |    5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index f3d701f..60b1b34 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;



More information about the ffmpeg-cvslog mailing list