[Bf-blender-cvs] [e97a2c228ef] blender-v2.93-release: Fix T87967: M2T video seeking is broken

Richard Antalik noreply at git.blender.org
Mon Aug 23 11:56:28 CEST 2021


Commit: e97a2c228ef546ec96c10d93b94063cba06ca0b8
Author: Richard Antalik
Date:   Mon Aug 16 14:35:23 2021 +0200
Branches: blender-v2.93-release
https://developer.blender.org/rBe97a2c228ef546ec96c10d93b94063cba06ca0b8

Fix T87967: M2T video seeking is broken

Bug caused by integer overflow in ffmpeg_generic_seek_workaround().
Function max_ii() was used to limit int_64tvalue.

After fixing the issue there was another issue, where near-infinite loop
was caused by requested_pos being very large and stream being cut in a
way, that it was missing keyframe at beginning.
This was fixed by checking if we are reading beyond file content.

Reviewed By: zeddb

Differential Revision: https://developer.blender.org/D11888

===================================================================

M	source/blender/imbuf/intern/anim_movie.c

===================================================================

diff --git a/source/blender/imbuf/intern/anim_movie.c b/source/blender/imbuf/intern/anim_movie.c
index 3585f585b91..e61979219a0 100644
--- a/source/blender/imbuf/intern/anim_movie.c
+++ b/source/blender/imbuf/intern/anim_movie.c
@@ -1213,7 +1213,7 @@ static int ffmpeg_generic_seek_workaround(struct anim *anim,
   /* Step backward frame by frame until we find the key frame we are looking for. */
   while (current_pts != 0) {
     current_pts = *requested_pts - (int64_t)round(offset * steps_per_frame);
-    current_pts = max_ii(current_pts, 0);
+    current_pts = MAX2(current_pts, 0);
 
     /* Seek to timestamp. */
     if (av_seek_frame(anim->pFormatCtx, anim->videoStream, current_pts, AVSEEK_FLAG_BACKWARD) <
@@ -1243,11 +1243,12 @@ static int ffmpeg_generic_seek_workaround(struct anim *anim,
         /* We found the I-frame we were looking for! */
         break;
       }
-      if (cur_pts == prev_pts) {
-        /* We got the same key frame packet twice.
-         * This probably means that we have hit the beginning of the stream. */
-        break;
-      }
+    }
+
+    if (cur_pts == prev_pts) {
+      /* We got the same key frame packet twice.
+       * This probably means that we have hit the beginning of the stream. */
+      break;
     }
 
     prev_pts = cur_pts;



More information about the Bf-blender-cvs mailing list