use thiserror::Error;
#[derive(Debug, Error)]
pub enum RenderError {
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("Server error: {0}")]
Server(#[from] crate::server::ServerError),
#[error("Encode error: {0}")]
Encode(String),
#[error("Frame {0} failed: {1}")]
FrameFailed(u32, String),
}
#[derive(Debug, Clone)]
pub struct RenderConfig {
pub url: String,
pub output_dir: std::path::PathBuf,
pub width: u32,
pub height: u32,
pub fps: f64,
pub duration_in_frames: u32,
pub frame_range: Option<std::ops::RangeInclusive<u32>>,
pub concurrency: usize,
}
impl RenderConfig {
pub fn new(
url: String,
output_dir: impl Into<std::path::PathBuf>,
width: u32,
height: u32,
fps: f64,
duration_in_frames: u32,
) -> Self {
Self {
url,
output_dir: output_dir.into(),
width,
height,
fps,
duration_in_frames,
frame_range: None,
concurrency: num_cpus(),
}
}
pub fn effective_range(&self) -> std::ops::RangeInclusive<u32> {
self.frame_range
.clone()
.unwrap_or(0..=self.duration_in_frames.saturating_sub(1))
}
}
fn num_cpus() -> usize {
std::thread::available_parallelism()
.map(|n| n.get())
.unwrap_or(4)
}