add missing advanced filter, cleanup, add aevalsrc

This commit is contained in:
jb-alvarado 2024-03-12 08:18:22 +01:00
parent bc56aaf9d2
commit 419d3c293f
4 changed files with 129 additions and 145 deletions

View File

@ -20,6 +20,7 @@ decoder:
tpad: # tpad=stop_mode=add:stop_duration={}
drawtext_from_file: # drawtext=text='{}':{}{}
drawtext_from_zmq: # zmq=b=tcp\\\\://'{}',drawtext@dyntext={}
aevalsrc: # aevalsrc=0:channel_layout=stereo:duration={}:sample_rate=48000
apad: # apad=whole_dur={}
volume: # volume={}
split: # split={}{}

View File

@ -184,11 +184,14 @@ impl Default for Filters {
}
fn deinterlace(field_order: &Option<String>, chain: &mut Filters) {
if let Some(deinterlace) = &ADVANCED_CONFIG.decoder.filters.deinterlace {
chain.add_filter(&deinterlace, 0, Video)
} else if let Some(order) = field_order {
if let Some(order) = field_order {
if order != "progressive" {
chain.add_filter("yadif=0:-1:0", 0, Video)
let deinterlace = match &ADVANCED_CONFIG.decoder.filters.deinterlace {
Some(deinterlace) => deinterlace.clone(),
None => "yadif=0:-1:0".to_string(),
};
chain.add_filter(&deinterlace, 0, Video);
}
}
}
@ -199,54 +202,45 @@ fn pad(aspect: f64, chain: &mut Filters, v_stream: &ffprobe::Stream, config: &Pl
if let (Some(w), Some(h)) = (v_stream.width, v_stream.height) {
if w > config.processing.width && aspect > config.processing.aspect {
match &ADVANCED_CONFIG.decoder.filters.pad_scale_w {
Some(pad_scale_w) => {
scale = custom_format(pad_scale_w, &[&config.processing.width])
}
None => scale = format!("scale={}:-1,", config.processing.width),
scale = match &ADVANCED_CONFIG.decoder.filters.pad_scale_w {
Some(pad_scale_w) => custom_format(pad_scale_w, &[&config.processing.width]),
None => format!("scale={}:-1,", config.processing.width),
};
} else if h > config.processing.height && aspect < config.processing.aspect {
match &ADVANCED_CONFIG.decoder.filters.pad_scale_h {
Some(pad_scale_h) => {
scale = custom_format(pad_scale_h, &[&config.processing.width])
}
None => scale = format!("scale=-1:{},", config.processing.height),
scale = match &ADVANCED_CONFIG.decoder.filters.pad_scale_h {
Some(pad_scale_h) => custom_format(pad_scale_h, &[&config.processing.width]),
None => format!("scale=-1:{},", config.processing.height),
};
}
}
if let Some(pad_video) = &ADVANCED_CONFIG.decoder.filters.pad_video {
chain.add_filter(
&custom_format(
pad_video,
&[
&scale,
&config.processing.width.to_string(),
&config.processing.height.to_string(),
],
),
0,
Video,
)
} else {
chain.add_filter(
&format!(
"{}pad=max(iw\\,ih*({1}/{2})):ow/({1}/{2}):(ow-iw)/2:(oh-ih)/2",
scale, config.processing.width, config.processing.height
),
0,
Video,
)
}
let pad = match &ADVANCED_CONFIG.decoder.filters.pad_video {
Some(pad_video) => custom_format(
pad_video,
&[
&scale,
&config.processing.width.to_string(),
&config.processing.height.to_string(),
],
),
None => format!(
"{}pad=max(iw\\,ih*({1}/{2})):ow/({1}/{2}):(ow-iw)/2:(oh-ih)/2",
scale, config.processing.width, config.processing.height
),
};
chain.add_filter(&pad, 0, Video)
}
}
fn fps(fps: f64, chain: &mut Filters, config: &PlayoutConfig) {
if fps != config.processing.fps {
match &ADVANCED_CONFIG.decoder.filters.fps {
Some(fps) => chain.add_filter(&custom_format(fps, &[&config.processing.fps]), 0, Video),
None => chain.add_filter(&format!("fps={}", config.processing.fps), 0, Video),
}
let fps_filter = match &ADVANCED_CONFIG.decoder.filters.fps {
Some(fps) => custom_format(fps, &[&config.processing.fps]),
None => format!("fps={}", config.processing.fps),
};
chain.add_filter(&fps_filter, 0, Video)
}
}
@ -260,77 +254,49 @@ fn scale(
// width: i64, height: i64
if let (Some(w), Some(h)) = (width, height) {
if w != config.processing.width || h != config.processing.height {
match &ADVANCED_CONFIG.decoder.filters.scale {
Some(scale) => chain.add_filter(
&custom_format(
scale,
&[&config.processing.width, &config.processing.height],
),
0,
Video,
let scale = match &ADVANCED_CONFIG.decoder.filters.scale {
Some(scale) => custom_format(
scale,
&[&config.processing.width, &config.processing.height],
),
None => {
chain.add_filter(
&format!(
"scale={}:{}",
config.processing.width, config.processing.height
),
0,
Video,
);
}
}
None => format!(
"scale={}:{}",
config.processing.width, config.processing.height
),
};
chain.add_filter(&scale, 0, Video);
} else {
chain.add_filter("null", 0, Video);
}
if !is_close(aspect, config.processing.aspect, 0.03) {
match &ADVANCED_CONFIG.decoder.filters.set_dar {
Some(set_dar) => chain.add_filter(
&custom_format(set_dar, &[&config.processing.aspect]),
0,
Video,
),
None => chain.add_filter(
&format!("setdar=dar={}", config.processing.aspect),
0,
Video,
),
}
let dar = match &ADVANCED_CONFIG.decoder.filters.set_dar {
Some(set_dar) => custom_format(set_dar, &[&config.processing.aspect]),
None => format!("setdar=dar={}", config.processing.aspect),
};
chain.add_filter(&dar, 0, Video);
}
} else {
match &ADVANCED_CONFIG.decoder.filters.scale {
Some(scale) => chain.add_filter(
&custom_format(
scale,
&[&config.processing.width, &config.processing.height],
),
0,
Video,
let scale = match &ADVANCED_CONFIG.decoder.filters.scale {
Some(scale) => custom_format(
scale,
&[&config.processing.width, &config.processing.height],
),
None => format!(
"scale={}:{}",
config.processing.width, config.processing.height
),
None => {
chain.add_filter(
&format!(
"scale={}:{}",
config.processing.width, config.processing.height
),
0,
Video,
);
}
};
match &ADVANCED_CONFIG.decoder.filters.set_dar {
Some(set_dar) => chain.add_filter(
&custom_format(set_dar, &[&config.processing.aspect]),
0,
Video,
),
None => chain.add_filter(
&format!("setdar=dar={}", config.processing.aspect),
0,
Video,
),
}
chain.add_filter(&scale, 0, Video);
let dar = match &ADVANCED_CONFIG.decoder.filters.set_dar {
Some(set_dar) => custom_format(set_dar, &[&config.processing.aspect]),
None => format!("setdar=dar={}", config.processing.aspect),
};
chain.add_filter(&dar, 0, Video);
}
}
@ -347,25 +313,21 @@ fn fade(node: &mut Media, chain: &mut Filters, nr: i32, filter_type: FilterType)
}
if node.seek > 0.0 || node.unit == Ingest {
match &ADVANCED_CONFIG.decoder.filters.fade_in {
Some(fade_in) => chain.add_filter(&custom_format(fade_in, &[t]), 0, Video),
None => chain.add_filter(&format!("{t}fade=in:st=0:d=0.5"), nr, filter_type),
}
let fade_in = match &ADVANCED_CONFIG.decoder.filters.fade_in {
Some(fade) => custom_format(fade, &[t]),
None => format!("{t}fade=in:st=0:d=0.5"),
};
chain.add_filter(&fade_in, nr, filter_type);
}
if (node.out != node.duration && node.out - node.seek > 1.0) || fade_audio {
match &ADVANCED_CONFIG.decoder.filters.fade_out {
Some(fade_out) => chain.add_filter(
&custom_format(fade_out, &[t, &(node.out - node.seek - 1.0).to_string()]),
0,
Video,
),
None => chain.add_filter(
&format!("{t}fade=out:st={}:d=1.0", (node.out - node.seek - 1.0)),
nr,
filter_type,
),
}
let fade_out = match &ADVANCED_CONFIG.decoder.filters.fade_out {
Some(fade) => custom_format(fade, &[t, &(node.out - node.seek - 1.0).to_string()]),
None => format!("{t}fade=out:st={}:d=1.0", (node.out - node.seek - 1.0)),
};
chain.add_filter(&fade_out, nr, filter_type);
}
}
@ -377,11 +339,9 @@ fn overlay(node: &mut Media, chain: &mut Filters, config: &PlayoutConfig) {
let mut scale = String::new();
if !config.processing.logo_scale.is_empty() {
match &ADVANCED_CONFIG.decoder.filters.overlay_logo_scale {
Some(logo_scale) => {
scale = custom_format(logo_scale, &[&config.processing.logo_scale])
}
None => scale = format!(",scale={}", config.processing.logo_scale),
scale = match &ADVANCED_CONFIG.decoder.filters.overlay_logo_scale {
Some(logo_scale) => custom_format(logo_scale, &[&config.processing.logo_scale]),
None => format!(",scale={}", config.processing.logo_scale),
}
}
@ -456,10 +416,14 @@ fn add_text(
}
fn add_audio(node: &Media, chain: &mut Filters, nr: i32) {
let audio = format!(
"aevalsrc=0:channel_layout=stereo:duration={}:sample_rate=48000",
node.out - node.seek
);
let audio = match &ADVANCED_CONFIG.decoder.filters.aevalsrc {
Some(aevalsrc) => custom_format(aevalsrc, &[node.out - node.seek]),
None => format!(
"aevalsrc=0:channel_layout=stereo:duration={}:sample_rate=48000",
node.out - node.seek
),
};
chain.add_filter(&audio, nr, Audio);
}
@ -474,11 +438,12 @@ fn extend_audio(node: &mut Media, chain: &mut Filters, nr: i32) {
{
if node.out - node.seek > audio_duration - node.seek + 0.1 && node.duration >= node.out
{
chain.add_filter(
&format!("apad=whole_dur={}", node.out - node.seek),
nr,
Audio,
)
let apad = match &ADVANCED_CONFIG.decoder.filters.apad {
Some(apad) => custom_format(apad, &[node.out - node.seek]),
None => format!("apad=whole_dur={}", node.out - node.seek),
};
chain.add_filter(&apad, nr, Audio)
}
}
}
@ -486,7 +451,12 @@ fn extend_audio(node: &mut Media, chain: &mut Filters, nr: i32) {
fn audio_volume(chain: &mut Filters, config: &PlayoutConfig, nr: i32) {
if config.processing.volume != 1.0 {
chain.add_filter(&format!("volume={}", config.processing.volume), nr, Audio)
let volume = match &ADVANCED_CONFIG.decoder.filters.volume {
Some(volume) => custom_format(volume, &[config.processing.volume]),
None => format!("volume={}", config.processing.volume),
};
chain.add_filter(&volume, nr, Audio)
}
}
@ -517,8 +487,12 @@ pub fn split_filter(chain: &mut Filters, count: usize, nr: i32, filter_type: Fil
}
}
let split_filter = format!("split={count}{}", out_link.join(""));
chain.add_filter(&split_filter, nr, filter_type);
let split = match &ADVANCED_CONFIG.decoder.filters.split {
Some(split) => custom_format(split, &[count.to_string(), out_link.join("")]),
None => format!("split={count}{}", out_link.join("")),
};
chain.add_filter(&split, nr, filter_type);
}
}

View File

@ -6,7 +6,8 @@ use std::{
use regex::Regex;
use crate::utils::{controller::ProcessUnit::*, Media, PlayoutConfig};
use crate::utils::{controller::ProcessUnit::*, custom_format, Media, PlayoutConfig};
use crate::ADVANCED_CONFIG;
pub fn filter_node(
config: &PlayoutConfig,
@ -43,7 +44,11 @@ pub fn filter_node(
.replace('\'', "'\\\\\\''")
.replace('%', "\\\\\\%")
.replace(':', "\\:");
filter = format!("drawtext=text='{escaped_text}':{}{font}", config.text.style)
filter = match &ADVANCED_CONFIG.decoder.filters.drawtext_from_file {
Some(drawtext) => custom_format(drawtext, &[&escaped_text, &config.text.style, &font]),
None => format!("drawtext=text='{escaped_text}':{}{font}", config.text.style),
};
} else if let Some(socket) = zmq_socket {
let mut filter_cmd = format!("text=''{font}");
@ -53,10 +58,13 @@ pub fn filter_node(
}
}
filter = format!(
"zmq=b=tcp\\\\://'{}',drawtext@dyntext={filter_cmd}",
socket.replace(':', "\\:")
)
filter = match &ADVANCED_CONFIG.decoder.filters.drawtext_from_zmq {
Some(drawtext) => custom_format(drawtext, &[&socket.replace(':', "\\:"), &filter_cmd]),
None => format!(
"zmq=b=tcp\\\\://'{}',drawtext@dyntext={filter_cmd}",
socket.replace(':', "\\:")
),
};
}
filter

View File

@ -58,6 +58,7 @@ pub struct Filters {
pub tpad: Option<String>,
pub drawtext_from_file: Option<String>,
pub drawtext_from_zmq: Option<String>,
pub aevalsrc: Option<String>,
pub apad: Option<String>,
pub volume: Option<String>,
pub split: Option<String>,
@ -80,19 +81,19 @@ impl AdvancedConfig {
config = serde_yaml::from_reader(f).expect("Could not read advanced config file");
if let Some(input_parm) = &config.decoder.input_param {
config.decoder.input_cmd = split(&input_parm);
config.decoder.input_cmd = split(input_parm);
}
if let Some(output_param) = &config.decoder.output_param {
config.decoder.output_cmd = split(&output_param);
config.decoder.output_cmd = split(output_param);
}
if let Some(input_param) = &config.encoder.input_param {
config.encoder.input_cmd = split(&input_param);
config.encoder.input_cmd = split(input_param);
}
if let Some(input_param) = &config.ingest.input_param {
config.ingest.input_cmd = split(&input_param);
config.ingest.input_cmd = split(input_param);
}
};