exporter: Add support to skip ahead n-frames for screen capture (#614)
This commit is contained in:
parent
97db518fb1
commit
c30453c144
|
@ -33,6 +33,10 @@ struct Opt {
|
||||||
#[structopt(short = "f", long = "frames", default_value = "1")]
|
#[structopt(short = "f", long = "frames", default_value = "1")]
|
||||||
frames: u32,
|
frames: u32,
|
||||||
|
|
||||||
|
/// Number of frames to skip
|
||||||
|
#[structopt(long = "skipframes", default_value = "0")]
|
||||||
|
skipframes: u32,
|
||||||
|
|
||||||
/// Don't show a progress bar
|
/// Don't show a progress bar
|
||||||
#[structopt(short, long)]
|
#[structopt(short, long)]
|
||||||
silent: bool,
|
silent: bool,
|
||||||
|
@ -43,6 +47,7 @@ fn take_screenshot(
|
||||||
queue: Rc<wgpu::Queue>,
|
queue: Rc<wgpu::Queue>,
|
||||||
swf_path: &Path,
|
swf_path: &Path,
|
||||||
frames: u32,
|
frames: u32,
|
||||||
|
skipframes: u32,
|
||||||
progress: &Option<ProgressBar>,
|
progress: &Option<ProgressBar>,
|
||||||
) -> Result<Vec<RgbaImage>, Box<dyn std::error::Error>> {
|
) -> Result<Vec<RgbaImage>, Box<dyn std::error::Error>> {
|
||||||
let movie = SwfMovie::from_path(&swf_path)?;
|
let movie = SwfMovie::from_path(&swf_path)?;
|
||||||
|
@ -57,7 +62,9 @@ fn take_screenshot(
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let mut result = Vec::new();
|
let mut result = Vec::new();
|
||||||
for i in 0..frames {
|
let totalframes = frames + skipframes;
|
||||||
|
|
||||||
|
for i in 0..totalframes {
|
||||||
if let Some(progress) = &progress {
|
if let Some(progress) = &progress {
|
||||||
progress.set_message(&format!(
|
progress.set_message(&format!(
|
||||||
"{} frame {}",
|
"{} frame {}",
|
||||||
|
@ -65,10 +72,9 @@ fn take_screenshot(
|
||||||
i
|
i
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
player.lock().unwrap().run_frame();
|
player.lock().unwrap().run_frame();
|
||||||
|
if i >= skipframes {
|
||||||
player.lock().unwrap().render();
|
player.lock().unwrap().render();
|
||||||
|
|
||||||
let mut player = player.lock().unwrap();
|
let mut player = player.lock().unwrap();
|
||||||
let renderer = player
|
let renderer = player
|
||||||
.renderer_mut()
|
.renderer_mut()
|
||||||
|
@ -80,6 +86,7 @@ fn take_screenshot(
|
||||||
} else {
|
} else {
|
||||||
return Err(format!("Unable to capture frame {} of {:?}", i, swf_path).into());
|
return Err(format!("Unable to capture frame {} of {:?}", i, swf_path).into());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(progress) = &progress {
|
if let Some(progress) = &progress {
|
||||||
progress.inc(1);
|
progress.inc(1);
|
||||||
|
@ -124,6 +131,7 @@ fn capture_single_swf(
|
||||||
queue: Rc<wgpu::Queue>,
|
queue: Rc<wgpu::Queue>,
|
||||||
swf: &Path,
|
swf: &Path,
|
||||||
frames: u32,
|
frames: u32,
|
||||||
|
skipframes: u32,
|
||||||
output: Option<PathBuf>,
|
output: Option<PathBuf>,
|
||||||
with_progress: bool,
|
with_progress: bool,
|
||||||
) -> Result<(), Box<dyn Error>> {
|
) -> Result<(), Box<dyn Error>> {
|
||||||
|
@ -156,7 +164,7 @@ fn capture_single_swf(
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
let frames = take_screenshot(device, queue, &swf, frames, &progress)?;
|
let frames = take_screenshot(device, queue, &swf, frames, skipframes, &progress)?;
|
||||||
|
|
||||||
if let Some(progress) = &progress {
|
if let Some(progress) = &progress {
|
||||||
progress.set_message(&swf.file_stem().unwrap().to_string_lossy());
|
progress.set_message(&swf.file_stem().unwrap().to_string_lossy());
|
||||||
|
@ -201,6 +209,7 @@ fn capture_multiple_swfs(
|
||||||
queue: Rc<wgpu::Queue>,
|
queue: Rc<wgpu::Queue>,
|
||||||
directory: &Path,
|
directory: &Path,
|
||||||
frames: u32,
|
frames: u32,
|
||||||
|
skipframes: u32,
|
||||||
output: &Path,
|
output: &Path,
|
||||||
with_progress: bool,
|
with_progress: bool,
|
||||||
) -> Result<(), Box<dyn Error>> {
|
) -> Result<(), Box<dyn Error>> {
|
||||||
|
@ -226,6 +235,7 @@ fn capture_multiple_swfs(
|
||||||
queue.clone(),
|
queue.clone(),
|
||||||
&file.path(),
|
&file.path(),
|
||||||
frames,
|
frames,
|
||||||
|
skipframes,
|
||||||
&progress,
|
&progress,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
|
@ -310,6 +320,7 @@ fn main() -> Result<(), Box<dyn Error>> {
|
||||||
Rc::new(queue),
|
Rc::new(queue),
|
||||||
&opt.swf,
|
&opt.swf,
|
||||||
opt.frames,
|
opt.frames,
|
||||||
|
opt.skipframes,
|
||||||
opt.output_path,
|
opt.output_path,
|
||||||
!opt.silent,
|
!opt.silent,
|
||||||
)?;
|
)?;
|
||||||
|
@ -319,6 +330,7 @@ fn main() -> Result<(), Box<dyn Error>> {
|
||||||
Rc::new(queue),
|
Rc::new(queue),
|
||||||
&opt.swf,
|
&opt.swf,
|
||||||
opt.frames,
|
opt.frames,
|
||||||
|
opt.skipframes,
|
||||||
&output,
|
&output,
|
||||||
!opt.silent,
|
!opt.silent,
|
||||||
)?;
|
)?;
|
||||||
|
|
Loading…
Reference in New Issue