From a0f1caa34b6d037fa690b82600a38a56f5eebb43 Mon Sep 17 00:00:00 2001 From: Dominic Date: Mon, 30 Oct 2023 16:05:21 +0100 Subject: [PATCH] more filter logic --- src/main.rs | 3 +- src/render/ffmpeg.rs | 72 +++------------- src/render/filter.rs | 200 +++++++++++++++++++++++++++++++++++++++++++ src/render/mod.rs | 1 + 4 files changed, 216 insertions(+), 60 deletions(-) create mode 100644 src/render/filter.rs diff --git a/src/main.rs b/src/main.rs index a9ea623..870fdcd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,4 @@ +#![allow(clippy::manual_range_contains)] #![warn(rust_2018_idioms)] #![forbid(elided_lifetimes_in_paths, unsafe_code)] @@ -27,7 +28,7 @@ struct Args { course: String } -#[allow(non_camel_case_types)] +#[allow(non_camel_case_types, clippy::upper_case_acronyms)] #[derive(Clone, Copy, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize)] enum Resolution { /// 640x360 diff --git a/src/render/ffmpeg.rs b/src/render/ffmpeg.rs index 70e5dba..1202825 100644 --- a/src/render/ffmpeg.rs +++ b/src/render/ffmpeg.rs @@ -1,4 +1,4 @@ -use super::cmd; +use super::{cmd, filter::Filter}; use crate::time::{format_time, Time}; use camino::{Utf8Path as Path, Utf8PathBuf as PathBuf}; use rational::Rational; @@ -45,66 +45,12 @@ impl FfmpegInput { } } -pub(crate) enum Filter { - Concat { - inputs: Vec>, - n: usize, - output: Cow<'static, str> - }, - - FadeIn { - input: Cow<'static, str>, - start: Time, - duration: Time, - output: Cow<'static, str> - }, - - FadeOut { - input: Cow<'static, str>, - start: Time, - duration: Time, - output: Cow<'static, str> - }, - - Overlay { - video_input: Cow<'static, str>, - overlay_input: Cow<'static, str>, - x: Cow<'static, str>, - y: Cow<'static, str>, - output: Cow<'static, str> - }, - - GenerateSilence { - output: Cow<'static, str> - } -} - -impl Filter { - fn is_video_filter(&self) -> bool { - matches!( - self, - Self::Concat { .. } - | Self::FadeIn { .. } - | Self::FadeOut { .. } - | Self::Overlay { .. } - ) - } - - fn is_audio_filter(&self) -> bool { - matches!( - self, - Self::Concat { .. } - | Self::FadeIn { .. } - | Self::FadeOut { .. } - | Self::GenerateSilence { .. } - ) - } -} - pub(crate) struct Ffmpeg { inputs: Vec, filters: Vec, - output: PathBuf + output: PathBuf, + + filter_idx: usize } impl Ffmpeg { @@ -112,7 +58,9 @@ impl Ffmpeg { Self { inputs: Vec::new(), filters: Vec::new(), - output + output, + + filter_idx: 0 } } @@ -152,6 +100,12 @@ impl Ffmpeg { } else { cmd.arg("-c:v").arg("copy"); } + if aenc { + cmd.arg("-c:a").arg("aac"); + cmd.arg("-b:a").arg("128000"); + } else { + cmd.arg("-c:a").arg("copy"); + } unimplemented!() } diff --git a/src/render/filter.rs b/src/render/filter.rs new file mode 100644 index 0000000..fc97e38 --- /dev/null +++ b/src/render/filter.rs @@ -0,0 +1,200 @@ +use crate::time::{format_time, Time}; +use std::{borrow::Cow, fmt::Write as _}; + +pub(crate) enum Filter { + /// Trim audio and video alike + Trim { + input: Cow<'static, str>, + start: Option