@@ -1677,12 +1677,15 @@ bool bsv_movie_peek_frame_info(bsv_movie_t *movie, uint8_t *token, uint64_t *len
16771677bool movie_find_checkpoint_before (bsv_movie_t * movie , int64_t frame , bool consider_paused ,
16781678 int64_t * cp_pos_out , int64_t * cp_frame_out )
16791679{
1680- /* skip to prev needs to go back at least 60 frames if rewinding when not paused */
16811680 runloop_state_t * runloop_st = runloop_state_get_ptr ();
16821681 bool paused = !!(runloop_st -> flags & RUNLOOP_FLAG_PAUSED ) || consider_paused ;
1683- const int64_t prev_skip_min_distance = 60 ;
1682+ /* skip to prev would prefer to go back at least 30 frames if
1683+ rewinding when not paused, but won't skip over more than one
1684+ checkpoint while going backwards. */
1685+ const int64_t prev_skip_min_distance = 30 ;
16841686 int64_t target_frame = frame , cur_frame = 0 ;
16851687 int64_t initial_pos , cp_pos = -1 , cp_frame = -1 ;
1688+ int64_t maybe_last_frame = -1 , maybe_last_pos = -1 ;
16861689 uint64_t frame_len ;
16871690 uint8_t tok ;
16881691 if (!movie || movie -> version == 0 )
@@ -1702,6 +1705,16 @@ bool movie_find_checkpoint_before(bsv_movie_t *movie, int64_t frame, bool consid
17021705 cp_pos = intfstream_tell (movie -> file );
17031706 cp_frame = cur_frame ;
17041707 }
1708+ else
1709+ {
1710+ if (maybe_last_pos > 0 )
1711+ {
1712+ cp_pos = maybe_last_pos ;
1713+ cp_frame = maybe_last_frame ;
1714+ }
1715+ maybe_last_pos = intfstream_tell (movie -> file );
1716+ maybe_last_frame = cur_frame ;
1717+ }
17051718 }
17061719 cur_frame += 1 ;
17071720 intfstream_seek (movie -> file , frame_len , SEEK_CUR );
0 commit comments