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
This commit is contained in:
parent
c634d859b2
commit
e97a2c228e
Notes:
blender-bot
2023-02-14 10:21:10 +01:00
Referenced by issue #88449, Blender LTS: Maintenance Task 2.93 Referenced by issue #87967, M2T video seeking is broken
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue