use std::path::{Path, PathBuf};
use std::time::Duration;
use ff_filter::{AnimatedValue, RealtimeLayerDescriptor, XfadeTransition};
use ff_format::{Color, TextSpec};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum SceneSource {
File(PathBuf),
Solid(Color),
Text(TextSpec),
}
impl SceneSource {
#[must_use]
pub fn as_file(&self) -> Option<&Path> {
match self {
Self::File(path) => Some(path.as_path()),
Self::Solid(_) | Self::Text(_) => None,
}
}
}
#[derive(Debug, Clone)]
pub struct Scene {
pub fps: f64,
pub canvas: Option<(u32, u32)>,
pub lavfi_overlay: Option<String>,
pub video_tracks: Vec<SceneVideoTrack>,
pub audio_tracks: Vec<SceneAudioTrack>,
}
#[derive(Debug, Clone)]
pub struct SceneVideoTrack {
pub placements: Vec<ScenePlacement>,
}
#[derive(Debug, Clone)]
pub struct ScenePlacement {
pub source: SceneSource,
pub offset: Duration,
pub in_point: Duration,
pub out_point: Option<Duration>,
pub speed: f64,
pub xfade_dur: Duration,
pub xfade_kind: Option<XfadeTransition>,
pub video_handle: Duration,
pub opacity: f32,
pub layer: RealtimeLayerDescriptor,
pub fade_in: Duration,
pub fade_out: Duration,
pub volume: AnimatedValue<f64>,
pub pitch: f64,
pub pan: AnimatedValue<f64>,
}
#[derive(Debug, Clone)]
pub struct SceneAudioTrack {
pub placements: Vec<SceneAudioPlacement>,
}
#[derive(Debug, Clone)]
pub struct SceneAudioPlacement {
pub source: PathBuf,
pub offset: Duration,
pub in_point: Duration,
pub out_point: Option<Duration>,
pub speed: f64,
pub fade_in: Duration,
pub fade_out: Duration,
pub volume: AnimatedValue<f64>,
pub pitch: f64,
pub pan: AnimatedValue<f64>,
}