From d94efd6093dab8f5d3832bc75318fd0fc703bee5 Mon Sep 17 00:00:00 2001 From: Alex Butler Date: Tue, 26 Jul 2022 06:29:22 +0100 Subject: [PATCH] Map vp9 --preset to -cpu-used Error when setting reserved --enc,enc-input args Avoid overriding --enc b:a, movflags, ac Resolves #45 Resolves #46 --- CHANGELOG.md | 6 ++++++ src/command/args/encode.rs | 24 ++++++++++++++++++++++++ src/ffmpeg.rs | 15 +++++++++++---- src/svtav1.rs | 4 ++-- 4 files changed, 43 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3db644b..90f320d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# Unreleased (v0.4.1) +* For `-e libvpx-vp9` map `--preset` number to ffmpeg `-cpu-used` (0-5). +* When overriding with a ffmpeg encoder avoid setting `b:a`, `movflags` or `ac` if explicitly set via `--enc`. +* Add error output when using `--enc-input` with the default svt-av1 encoder. +* Add errors for `--enc`/`--enc-input` args that are already provided by existing args or inferred. + # v0.4.0 * Add `--encoder`/`-e` encoder override. Any [encoder ffmpeg supports](https://ffmpeg.org/ffmpeg-all.html#toc-Video-Encoders) diff --git a/src/command/args/encode.rs b/src/command/args/encode.rs index 3175747..ee86033 100644 --- a/src/command/args/encode.rs +++ b/src/command/args/encode.rs @@ -6,6 +6,7 @@ use crate::{ use anyhow::ensure; use clap::Parser; use std::{ + collections::HashMap, fmt::{self, Write}, path::PathBuf, sync::Arc, @@ -289,6 +290,29 @@ impl Encode { }) .collect(); + // ban usage of the bits we already set via other args & logic + let reserved = HashMap::from([ + ("-c:a", " use --acodec"), + ("-codec:a", " use --acodec"), + ("-acodec", " use --acodec"), + ("-i", ""), + ("-y", ""), + ("-n", ""), + ("-c:v", ""), + ("-codec:v", ""), + ("-vcodec", ""), + ("-pix_fmt", " use --pix-format"), + ("-crf", ""), + ("-preset", " use --preset"), + ("-vf", " use --vfilter"), + ("-filter:v", " use --vfilter"), + ]); + for arg in args.iter().chain(input_args.iter()) { + if let Some(hint) = reserved.get(arg.as_str()) { + anyhow::bail!("Encoder argument `{arg}` not allowed{hint}"); + } + } + Ok(FfmpegEncodeArgs { input: &self.input, vcodec, diff --git a/src/ffmpeg.rs b/src/ffmpeg.rs index 6a44abb..4a28e1e 100644 --- a/src/ffmpeg.rs +++ b/src/ffmpeg.rs @@ -7,6 +7,7 @@ use crate::{ }; use anyhow::Context; use std::{ + collections::HashSet, path::{Path, PathBuf}, process::Stdio, sync::Arc, @@ -95,12 +96,18 @@ pub fn encode( audio_codec: Option<&str>, downmix_to_stereo: bool, ) -> anyhow::Result>> { - let output_is_mp4 = output.extension().and_then(|e| e.to_str()) == Some("mp4"); + let oargs: HashSet<_> = output_args.iter().map(|a| a.as_str()).collect(); + + let add_faststart = + output.extension().and_then(|e| e.to_str()) == Some("mp4") && !oargs.contains("-movflags"); let audio_codec = audio_codec.unwrap_or_else(|| { svtav1::default_audio_codec(input, output, downmix_to_stereo, has_audio) }); + let set_ba_128k = audio_codec == "libopus" && !oargs.contains("-b:a"); + let downmix_to_stereo = downmix_to_stereo && !oargs.contains("-ac"); + let enc = Command::new("ffmpeg") .kill_on_drop(true) .args(input_args.iter().map(|a| &**a)) @@ -115,8 +122,8 @@ pub fn encode( .arg2("-c:s", "copy") .arg2("-c:a", audio_codec) .arg2_if(downmix_to_stereo, "-ac", 2) - .arg2_if(audio_codec == "libopus", "-b:a", "128k") - .arg2_if(output_is_mp4, "-movflags", "+faststart") + .arg2_if(set_ba_128k, "-b:a", "128k") + .arg2_if(add_faststart, "-movflags", "+faststart") .arg(output) .stdout(Stdio::null()) .stderr(Stdio::piped()) @@ -144,7 +151,7 @@ trait VCodecSpecific { impl VCodecSpecific for Arc { fn preset_arg(&self) -> &str { match &**self { - "libaom-av1" => "-cpu-used", + "libaom-av1" | "libvpx-vp9" => "-cpu-used", _ => "-preset", } } diff --git a/src/svtav1.rs b/src/svtav1.rs index 70035f4..eeb9d0b 100644 --- a/src/svtav1.rs +++ b/src/svtav1.rs @@ -92,7 +92,7 @@ pub fn encode( audio_codec: Option<&str>, downmix_to_stereo: bool, ) -> anyhow::Result>> { - let output_is_mp4 = output.extension().and_then(|e| e.to_str()) == Some("mp4"); + let add_faststart = output.extension().and_then(|e| e.to_str()) == Some("mp4"); let audio_codec = audio_codec .unwrap_or_else(|| default_audio_codec(input, output, downmix_to_stereo, has_audio)); @@ -139,7 +139,7 @@ pub fn encode( .arg2_if(downmix_to_stereo, "-ac", 2) .arg2("-c:v", "copy") .arg2_if(audio_codec == "libopus", "-b:a", "128k") - .arg2_if(output_is_mp4, "-movflags", "+faststart") + .arg2_if(add_faststart, "-movflags", "+faststart") .arg(output) .spawn() .context("ffmpeg to-output")?;