@@ -237,7 +237,6 @@ void bsv_movie_frame_rewind()
237237 if (handle -> blocks )
238238 uint32s_index_remove_after (handle -> blocks , handle -> frame_counter );
239239#endif
240- RARCH_LOG ("[REPLAY] rewound to %d\n" , handle -> frame_counter );
241240 intfstream_seek (handle -> file , (int )handle -> frame_pos [handle -> frame_counter & handle -> frame_mask ], SEEK_SET );
242241 if (recording )
243242 intfstream_truncate (handle -> file , intfstream_tell (handle -> file ));
@@ -312,16 +311,6 @@ bool bsv_movie_handle_read_input_event(bsv_movie_t *movie,
312311 return false;
313312}
314313
315- void bsv_movie_finish_rewind (input_driver_state_t * input_st )
316- {
317- bsv_movie_t * handle = input_st -> bsv_movie_state_handle ;
318- if (!handle )
319- return ;
320- handle -> frame_counter += 1 ;
321- handle -> first_rewind = !handle -> did_rewind ;
322- handle -> did_rewind = false;
323- }
324-
325314bool bsv_movie_load_checkpoint (bsv_movie_t * handle , uint8_t compression , uint8_t encoding , replay_checkpoint_behavior checkpoint_behavior )
326315{
327316 input_driver_state_t * input_st = input_state_get_ptr ();
@@ -460,14 +449,7 @@ bool bsv_movie_load_checkpoint(bsv_movie_t *handle, uint8_t compression, uint8_t
460449 }
461450 if (checkpoint_behavior != REPLAY_CPBEHAVIOR_DESERIALIZE )
462451 goto exit ;
463- serial_info .data_const = handle -> cur_save ;
464- serial_info .size = size ;
465- /* TODO: should this happen at the end of the current frame, or at the beginning before inputs have been polled/etc? FCEUMM and PPSSPP have some jankiness here */
466- if (!core_unserialize (& serial_info ))
467- {
468- ret = false;
469- goto exit ;
470- }
452+ handle -> checkpoint_ready = true;
471453 exit :
472454 handle -> cur_save_size = size ;
473455 handle -> last_save_size = handle -> cur_save_size ;
@@ -609,6 +591,20 @@ int64_t bsv_movie_write_checkpoint(bsv_movie_t *handle, uint8_t compression, uin
609591bool bsv_movie_read_next_events (bsv_movie_t * handle , replay_checkpoint_behavior checkpoint_behavior , bool end_movie )
610592{
611593 input_driver_state_t * input_st = input_state_get_ptr ();
594+ if (handle -> checkpoint_ready )
595+ {
596+ retro_ctx_serialize_info_t serial_info ;
597+ handle -> checkpoint_ready = false;
598+ serial_info .data_const = handle -> cur_save ;
599+ serial_info .size = handle -> cur_save_size ;
600+ if (!core_unserialize (& serial_info ))
601+ {
602+ RARCH_ERR ("[Replay] Failed to deserialize checkpoint\n" );
603+ if (end_movie )
604+ input_st -> bsv_movie_state .flags |= BSV_FLAG_MOVIE_END ;
605+ return false;
606+ }
607+ }
612608 /* Skip over backref */
613609 if (handle -> version > 1 )
614610 intfstream_seek (handle -> file , sizeof (uint32_t ), SEEK_CUR );
@@ -694,26 +690,24 @@ bool bsv_movie_read_next_events(bsv_movie_t *handle, replay_checkpoint_behavior
694690 intfstream_seek (handle -> file , size , SEEK_CUR );
695691 else
696692 {
697- state = (uint8_t * )malloc (size );
698- if (intfstream_read (handle -> file , state , size ) != (int64_t )size )
693+ if (!handle -> cur_save || handle -> cur_save_size < size )
699694 {
700- RARCH_ERR ("[Replay] Replay checkpoint truncated\n" );
701- if (end_movie )
702- input_st -> bsv_movie_state .flags |= BSV_FLAG_MOVIE_END ;
703- free (state );
704- return false;
695+ if (handle -> cur_save )
696+ free (handle -> cur_save );
697+ handle -> cur_save = malloc (size );
698+ handle -> cur_save_size = size ;
705699 }
706- serial_info .data_const = state ;
707- serial_info .size = size ;
708- if (!core_unserialize (& serial_info ))
700+ if (intfstream_read (handle -> file , handle -> cur_save , size ) != (int64_t )size )
709701 {
710- RARCH_ERR ("[Replay] Failed to load movie checkpoint, failing \n" );
702+ RARCH_ERR ("[Replay] Replay checkpoint truncated \n" );
711703 if (end_movie )
712704 input_st -> bsv_movie_state .flags |= BSV_FLAG_MOVIE_END ;
713- free (state );
705+ free (handle -> cur_save );
706+ handle -> cur_save = NULL ;
714707 return false;
715708 }
716- free (state );
709+ handle -> cur_save_size = size ;
710+ handle -> checkpoint_ready = true;
717711 }
718712 }
719713 else if (next_frame_type == REPLAY_TOKEN_CHECKPOINT2_FRAME )
@@ -746,6 +740,18 @@ void bsv_movie_scan_to(bsv_movie_t *movie, int64_t pos)
746740 }
747741}
748742
743+ void bsv_movie_dequeue_next (input_driver_state_t * input_st )
744+ {
745+ if (input_st -> bsv_movie_state_next_handle )
746+ {
747+ if (input_st -> bsv_movie_state_handle )
748+ bsv_movie_deinit (input_st );
749+ input_st -> bsv_movie_state_handle = input_st -> bsv_movie_state_next_handle ;
750+ input_st -> bsv_movie_state_next_handle = NULL ;
751+ }
752+ }
753+
754+
749755void bsv_movie_scan_from_start (bsv_movie_t * movie , int32_t len )
750756{
751757 if (!movie || movie -> version == 0 )
@@ -765,22 +771,21 @@ void bsv_movie_next_frame(input_driver_state_t *input_st)
765771 bsv_movie_state_handle to bsv_movie_state_next_handle and clear
766772 next_handle */
767773 bsv_movie_t * handle = input_st -> bsv_movie_state_handle ;
768- if (input_st -> bsv_movie_state_next_handle )
769- {
770- if (handle )
771- bsv_movie_deinit (input_st );
772- handle = input_st -> bsv_movie_state_next_handle ;
773- input_st -> bsv_movie_state_handle = handle ;
774- input_st -> bsv_movie_state_next_handle = NULL ;
775- }
776774
777775 if (!handle )
778776 return ;
779777#ifdef HAVE_REWIND
780778 if (state_manager_frame_is_reversed ())
779+ {
780+ handle -> checkpoint_ready = false;
781781 return ;
782+ }
782783#endif
783784
785+ handle -> frame_counter += 1 ;
786+ handle -> first_rewind = !handle -> did_rewind ;
787+ handle -> did_rewind = false;
788+
784789 if (!handle -> playback && !(input_st -> bsv_movie_state .flags & BSV_FLAG_MOVIE_SEEKING ))
785790 {
786791 int i ;
@@ -1276,7 +1281,6 @@ int16_t bsv_movie_read_state(input_driver_state_t *input_st,
12761281#endif
12771282 return bsv_result ;
12781283 }
1279- input_st -> bsv_movie_state .flags |= BSV_FLAG_MOVIE_END ;
12801284 return 0 ;
12811285}
12821286
0 commit comments