WIP: getting closer to actually encoding a frame!!
This commit is contained in:
parent
b1bde52bb0
commit
f94f5c836f
1 changed files with 25 additions and 9 deletions
|
@ -42,13 +42,15 @@ fn video_filter(
|
||||||
PixelFormat::RGB565 => if cfg!(target_endian = "big") { "rgb565be" } else { "rgb565le" },
|
PixelFormat::RGB565 => if cfg!(target_endian = "big") { "rgb565be" } else { "rgb565le" },
|
||||||
};
|
};
|
||||||
let pixel_aspect = av_info.geometry.aspect_ratio / (av_info.geometry.base_width as f32 / av_info.geometry.base_height as f32);
|
let pixel_aspect = av_info.geometry.aspect_ratio / (av_info.geometry.base_width as f32 / av_info.geometry.base_height as f32);
|
||||||
|
let fps = if av_info.timing.fps == 0.0 { 60.0 } else { av_info.timing.fps };
|
||||||
let args = format!(
|
let args = format!(
|
||||||
"width={}:height={}:pix_fmt={}:frame_rate={}:pixel_aspect={}",
|
"width={}:height={}:pix_fmt={}:frame_rate={}:pixel_aspect={}:time_base=1/{}",
|
||||||
av_info.geometry.base_width,
|
av_info.geometry.base_width,
|
||||||
av_info.geometry.base_height,
|
av_info.geometry.base_height,
|
||||||
pix_fmt,
|
pix_fmt,
|
||||||
if av_info.timing.fps == 0.0 { 60.0 } else { av_info.timing.fps },
|
fps,
|
||||||
pixel_aspect,
|
pixel_aspect,
|
||||||
|
fps,
|
||||||
);
|
);
|
||||||
eprintln!("{}", args);
|
eprintln!("{}", args);
|
||||||
vfilter.add(&filter::find("buffer").unwrap(), "in", &args)?;
|
vfilter.add(&filter::find("buffer").unwrap(), "in", &args)?;
|
||||||
|
@ -61,7 +63,9 @@ fn video_filter(
|
||||||
}
|
}
|
||||||
|
|
||||||
vfilter.output("in", 0)?
|
vfilter.output("in", 0)?
|
||||||
.input("out", 0)?;
|
.input("out", 0)?
|
||||||
|
.parse("null")?;
|
||||||
|
|
||||||
vfilter.validate()?;
|
vfilter.validate()?;
|
||||||
|
|
||||||
Ok(vfilter)
|
Ok(vfilter)
|
||||||
|
@ -72,7 +76,9 @@ fn audio_filter(
|
||||||
sample_rate: f64,
|
sample_rate: f64,
|
||||||
) -> Result<filter::Graph, ffmpeg::Error> {
|
) -> Result<filter::Graph, ffmpeg::Error> {
|
||||||
let mut afilter = filter::Graph::new();
|
let mut afilter = filter::Graph::new();
|
||||||
|
let sample_rate = if sample_rate == 0.0 { 32040.0 } else { sample_rate };
|
||||||
let args = format!("sample_rate={}:sample_fmt=s16:channel_layout=stereo", sample_rate);
|
let args = format!("sample_rate={}:sample_fmt=s16:channel_layout=stereo", sample_rate);
|
||||||
|
eprintln!("{}", args);
|
||||||
afilter.add(&filter::find("abuffer").unwrap(), "in", &args)?;
|
afilter.add(&filter::find("abuffer").unwrap(), "in", &args)?;
|
||||||
//aresample?
|
//aresample?
|
||||||
afilter.add(&filter::find("abuffersink").unwrap(), "out", "")?;
|
afilter.add(&filter::find("abuffersink").unwrap(), "out", "")?;
|
||||||
|
@ -85,7 +91,8 @@ fn audio_filter(
|
||||||
}
|
}
|
||||||
|
|
||||||
afilter.output("in", 0)?
|
afilter.output("in", 0)?
|
||||||
.input("out", 0)?;
|
.input("out", 0)?
|
||||||
|
.parse("anull")?;
|
||||||
afilter.validate()?;
|
afilter.validate()?;
|
||||||
|
|
||||||
Ok(afilter)
|
Ok(afilter)
|
||||||
|
@ -105,13 +112,16 @@ impl MyEmulator {
|
||||||
let sys_info = retro.get_system_info();
|
let sys_info = retro.get_system_info();
|
||||||
let av_info = retro.get_system_av_info();
|
let av_info = retro.get_system_av_info();
|
||||||
|
|
||||||
video_encoder.set_time_base(Rational::new(1, av_info.timing.fps.round() as i32));
|
let fps_int = av_info.timing.fps.round() as i32;
|
||||||
|
let fps_int = if fps_int == 0 { 60 } else { fps_int };
|
||||||
|
|
||||||
|
video_encoder.set_time_base(Rational::new(1, fps_int));
|
||||||
video_encoder.set_frame_rate(av_info.timing.fps.into());
|
video_encoder.set_frame_rate(av_info.timing.fps.into());
|
||||||
video_encoder.set_width(av_info.geometry.base_width);
|
video_encoder.set_width(av_info.geometry.base_width);
|
||||||
video_encoder.set_height(av_info.geometry.base_height);
|
video_encoder.set_height(av_info.geometry.base_height);
|
||||||
video_encoder.set_aspect_ratio(av_info.geometry.aspect_ratio as f64);
|
video_encoder.set_aspect_ratio(av_info.geometry.aspect_ratio as f64);
|
||||||
|
|
||||||
audio_encoder.set_rate(av_info.timing.sample_rate.round() as i32);
|
audio_encoder.set_rate(44100);
|
||||||
|
|
||||||
let pix_fmt = PixelFormat::ARGB1555; // temporary until env call is made
|
let pix_fmt = PixelFormat::ARGB1555; // temporary until env call is made
|
||||||
let video_filter = video_filter(&video_encoder, &av_info, pix_fmt).unwrap();
|
let video_filter = video_filter(&video_encoder, &av_info, pix_fmt).unwrap();
|
||||||
|
@ -144,7 +154,7 @@ impl MyEmulator {
|
||||||
pub fn run(&mut self) {
|
pub fn run(&mut self) {
|
||||||
self.retro.run();
|
self.retro.run();
|
||||||
|
|
||||||
let vframe = self.video_frames.pop_front().unwrap();
|
let mut vframe = self.video_frames.pop_front().unwrap();
|
||||||
let mut aframe = frame::Audio::new(
|
let mut aframe = frame::Audio::new(
|
||||||
format::Sample::I16(format::sample::Type::Packed),
|
format::Sample::I16(format::sample::Type::Packed),
|
||||||
self.audio_buf.len(),
|
self.audio_buf.len(),
|
||||||
|
@ -155,8 +165,14 @@ impl MyEmulator {
|
||||||
self.audio_buf.clear();
|
self.audio_buf.clear();
|
||||||
|
|
||||||
let mut out = ffmpeg::Packet::empty();
|
let mut out = ffmpeg::Packet::empty();
|
||||||
self.video_encoder.encode(&vframe, &mut out).unwrap();
|
self.video_filter.get("in").unwrap().source().add(&vframe).unwrap();
|
||||||
self.audio_encoder.encode(&aframe, &mut out).unwrap();
|
self.audio_filter.get("in").unwrap().source().add(&aframe).unwrap();
|
||||||
|
while let Ok(..) = self.video_filter.get("out").unwrap().sink().frame(&mut vframe) {
|
||||||
|
self.video_encoder.encode(&vframe, &mut out).unwrap();
|
||||||
|
}
|
||||||
|
while let Ok(..) = self.audio_filter.get("out").unwrap().sink().frame(&mut aframe) {
|
||||||
|
self.audio_encoder.encode(&aframe, &mut out).unwrap();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn load_game(&self, rom: impl AsRef<Path>) {
|
pub fn load_game(&self, rom: impl AsRef<Path>) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue