add unserialize flag to ffmpeg_recorder

This commit is contained in:
viv 2021-07-31 23:37:29 -07:00 committed by lifning
parent 3cad3b1e29
commit 4a38b99c5e
2 changed files with 24 additions and 0 deletions

View File

@ -380,6 +380,17 @@ static bool ffmpeg_init_config(struct ff_config_param *params,
self.receive_and_write_packets(EncoderToWriteFrom::Audio); self.receive_and_write_packets(EncoderToWriteFrom::Audio);
self.octx.write_trailer().unwrap(); self.octx.write_trailer().unwrap();
} }
pub fn unserialize(&mut self, state: impl AsRef<Path>) -> Fallible<()> {
let path = state.as_ref();
let mut v = Vec::new();
if let Ok(mut f) = std::fs::File::open(path) {
if f.read_to_end(&mut v).is_ok(){
return self.retro.unserialize(v.as_ref());
}
}
Err(failure::err_msg("Couldn't read file to unserialize"))
}
} }
impl retro::wrapper::Handler for MyEmulator { impl retro::wrapper::Handler for MyEmulator {
@ -511,6 +522,9 @@ struct Opt {
/// Recorded video to write. /// Recorded video to write.
#[structopt(short, long, parse(from_os_str))] #[structopt(short, long, parse(from_os_str))]
video: PathBuf, video: PathBuf,
/// Save state to load at startup.
#[structopt(long, parse(from_os_str))]
state: Option<PathBuf>,
/// System directory, often containing BIOS files /// System directory, often containing BIOS files
#[structopt(short, long, parse(from_os_str))] #[structopt(short, long, parse(from_os_str))]
system: Option<PathBuf>, system: Option<PathBuf>,
@ -535,6 +549,10 @@ fn main() -> Fallible<()> {
emu.frame_properties_locked = true; emu.frame_properties_locked = true;
if let Some(state) = opt.state {
emu.unserialize(state).unwrap();
}
//for frame in 0..60*10 { //for frame in 0..60*10 {
for frame in 0..800 { for frame in 0..800 {
eprintln!("🖼️ frame: {}", frame); eprintln!("🖼️ frame: {}", frame);

View File

@ -142,6 +142,12 @@ impl LibretroApi {
} }
} }
pub fn unserialize(&self, data: &[u8]) -> Fallible<()> { pub fn unserialize(&self, data: &[u8]) -> Fallible<()> {
// validate size of the data
let size: usize = unsafe { (&self.core_api.retro_serialize_size)() };
if data.len() != size {
return Err(failure::err_msg(format!("Size of data {} doesn't match this core's expected size {}", data.len(), size)))
}
if unsafe { (&self.core_api.retro_unserialize)(data.as_ptr() as *const c_void, data.len()) } { if unsafe { (&self.core_api.retro_unserialize)(data.as_ptr() as *const c_void, data.len()) } {
Ok(()) Ok(())
} else { } else {