mod common;
mod input;
mod list_devices;
mod motion;
mod nl4d;
mod nlmeans;
pub use av_denoise::Preset;
use av_denoise::accelerate::{Accelerator, get_default_accelerators};
use av_denoise::{ChannelIntent, Device, PlaneOptions};
use clap::{Parser, Subcommand};
pub use self::common::CommonArgs;
pub use self::input::InputSource;
pub use self::list_devices::run_list_devices;
pub use self::motion::MotionArgs;
pub use self::nl4d::Nl4dArgs;
pub use self::nlmeans::NlmeansArgs;
#[derive(Debug, Clone)]
pub struct RunOptions {
pub planes: PlaneOptions,
pub progress: bool,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, clap::ValueEnum)]
pub enum CliChannelMode {
Luma,
Chroma,
Yuv,
}
pub fn resolve_channel_intent(modes: &[CliChannelMode]) -> Result<ChannelIntent, anyhow::Error> {
if modes.is_empty() {
anyhow::bail!("--channel-mode must contain at least one value");
}
let has_yuv = modes.contains(&CliChannelMode::Yuv);
if has_yuv && modes.len() > 1 {
anyhow::bail!("--channel-mode `yuv` cannot be combined with other modes");
}
let has_luma = modes.contains(&CliChannelMode::Luma);
let has_chroma = modes.contains(&CliChannelMode::Chroma);
let luma_count = modes.iter().filter(|m| **m == CliChannelMode::Luma).count();
let chroma_count = modes.iter().filter(|m| **m == CliChannelMode::Chroma).count();
let yuv_count = modes.iter().filter(|m| **m == CliChannelMode::Yuv).count();
if luma_count > 1 || chroma_count > 1 || yuv_count > 1 {
anyhow::bail!("--channel-mode entries must be unique");
}
Ok(match (has_yuv, has_luma, has_chroma) {
(true, _, _) => ChannelIntent::YuvFused,
(false, true, true) => ChannelIntent::LumaChroma,
(false, true, false) => ChannelIntent::Luma,
(false, false, true) => ChannelIntent::Chroma,
(false, false, false) => unreachable!("empty list rejected above"),
})
}
#[derive(Debug, Parser)]
#[command(about = "Fast and efficient video denoising", long_about = None, version)]
pub struct Args {
#[arg(long, env = "AVD_PRESET", default_value = "base", global = true)]
pub preset: Preset,
#[arg(
short = 'A',
long,
env = "AVD_ACCELERATORS",
value_delimiter = ',',
default_values_t = get_default_accelerators(),
global = true
)]
pub accelerators: Vec<Accelerator>,
#[arg(short, long, env = "AVD_DEVICE", default_value = "default", global = true)]
pub device: Device,
#[arg(
long,
env = "AVD_CHANNEL_MODE",
value_enum,
value_delimiter = ',',
default_value = "luma,chroma",
global = true
)]
pub channel_mode: Vec<CliChannelMode>,
#[arg(long, env = "AVD_PROGRESS", global = true)]
pub progress: bool,
#[command(subcommand)]
pub command: Command,
}
#[derive(Debug, Subcommand)]
pub enum Command {
Nlmeans(NlmeansArgs),
Nl4d(Nl4dArgs),
ListDevices,
}