mod input;
mod nlmeans;
use av_denoise::Device;
use av_denoise::accelerate::{Accelerator, get_default_accelerators};
use clap::{Parser, Subcommand};
use strum_macros::EnumString;
pub use self::input::InputSource;
pub use self::nlmeans::NlmeansArgs;
use crate::ingest::BinaryChannelIntent;
#[derive(Debug, Copy, Clone, Default, EnumString)]
#[strum(ascii_case_insensitive)]
pub enum Preset {
Veryfast,
Fast,
#[default]
Base,
Slow,
Veryslow,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, clap::ValueEnum)]
pub enum CliChannelMode {
Luma,
Chroma,
Yuv,
}
pub fn resolve_channel_intent(modes: &[CliChannelMode]) -> Result<BinaryChannelIntent, 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, _, _) => BinaryChannelIntent::YuvFused,
(false, true, true) => BinaryChannelIntent::LumaChroma,
(false, true, false) => BinaryChannelIntent::Luma,
(false, false, true) => BinaryChannelIntent::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, default_value = "base", global = true)]
pub preset: Preset,
#[arg(short = 'A', long, value_delimiter = ',', default_values_t = get_default_accelerators(), global = true)]
pub accelerators: Vec<Accelerator>,
#[arg(short, long, default_value = "default", global = true)]
pub device: Device,
#[arg(
long,
value_enum,
value_delimiter = ',',
default_value = "luma,chroma",
global = true
)]
pub channel_mode: Vec<CliChannelMode>,
#[arg(long, global = true)]
pub progress: bool,
#[command(subcommand)]
pub command: Command,
}
#[derive(Debug, Subcommand)]
pub enum Command {
Nlmeans(NlmeansArgs),
}