get mapping by index

This commit is contained in:
jb-alvarado 2022-10-22 22:52:15 +02:00
parent e72967a21c
commit 72a1cb9e5a
6 changed files with 74 additions and 50 deletions

View File

@ -91,7 +91,7 @@ pub fn ingest_server(
if let Some(mut filter) = dummy_media.filter {
server_cmd.append(&mut filter.cmd());
server_cmd.append(&mut filter.map());
server_cmd.append(&mut filter.map(None));
}
server_cmd.append(&mut config.processing.settings.unwrap());

View File

@ -104,7 +104,7 @@ pub fn player(
if let Some(mut filter) = node.filter {
dec_cmd.append(&mut filter.cmd());
dec_cmd.append(&mut filter.map());
dec_cmd.append(&mut filter.map(None));
}
dec_cmd.append(&mut config.processing.clone().settings.unwrap());

View File

@ -97,7 +97,7 @@ pub fn prepare_output_cmd(
) -> Vec<String> {
let mut output_params = config.out.clone().output_cmd.unwrap();
let mut new_params = vec![];
let mut count = 0;
let mut count = 1;
let re_map = Regex::new(r"(\[?[0-9]:[av](:[0-9]+)?\]?|-map$|\[[a-z_0-9]+\])").unwrap(); // match a/v filter links and mapping
if let Some(mut filter) = filters.clone() {
@ -119,23 +119,7 @@ pub fn prepare_output_cmd(
&& i < output_params.len() - 1
{
// add mapping to following outputs
if filter.video_out_link.len() > count {
new_params.append(&mut vec![
"-map".to_string(),
filter.video_out_link[count].clone(),
]);
} else {
new_params.append(&mut vec!["-map".to_string(), "0:v".to_string()]);
}
if filter.audio_out_link.len() > count {
new_params.append(&mut vec![
"-map".to_string(),
filter.audio_out_link[count].clone(),
]);
} else if filter.audio_out_link.is_empty() {
new_params.append(&mut vec!["-map".to_string(), "0:a:0".to_string()]);
}
new_params.append(&mut filter.map(Some(count)));
count += 1
}
@ -144,7 +128,12 @@ pub fn prepare_output_cmd(
output_params = new_params;
cmd.append(&mut filter.cmd());
cmd.append(&mut filter.map());
if config.out.output_count > 1 {
cmd.append(&mut filter.map(Some(0)));
} else {
cmd.append(&mut filter.map(None));
}
}
cmd.append(&mut output_params);

View File

@ -17,6 +17,8 @@ use crate::utils::{
PlayoutConfig,
};
use super::vec_strings;
#[derive(Clone, Debug, Copy, Eq, PartialEq)]
pub enum FilterType {
Audio,
@ -106,7 +108,7 @@ impl Filters {
let m = format!("[{}out{track_nr}]", filter_type);
map.push(m.clone());
self.output_map.append(&mut vec!["-map".to_string(), m]);
self.output_map.append(&mut vec_strings!["-map", m]);
*last = track_nr;
} else if filter.starts_with(';') || filter.starts_with('[') {
chain.push_str(filter);
@ -143,14 +145,38 @@ impl Filters {
cmd
}
pub fn map(&mut self) -> Vec<String> {
pub fn map(&mut self, output_number: Option<usize>) -> Vec<String> {
let mut o_map = self.output_map.clone();
if let Some(n) = output_number {
o_map.clear();
if self.video_out_link.len() > n {
o_map.append(&mut vec_strings!["-map", self.video_out_link[n]])
} else {
o_map.append(&mut vec_strings!["-map", "0:v"])
}
if self.audio_out_link.len() > n {
o_map.append(&mut vec_strings!["-map", self.audio_out_link[n]])
} else {
for i in 0..self.audio_track_count {
let a_map = format!("{}:a:{i}", self.audio_position);
if !o_map.contains(&a_map) {
o_map.append(&mut vec_strings!["-map", a_map]);
};
}
}
return o_map;
}
if self.video_last == -1 {
let v_map = "0:v".to_string();
if !o_map.contains(&v_map) {
o_map.append(&mut vec!["-map".to_string(), v_map]);
o_map.append(&mut vec_strings!["-map", v_map]);
};
}
@ -159,7 +185,7 @@ impl Filters {
let a_map = format!("{}:a:{i}", self.audio_position);
if !o_map.contains(&a_map) {
o_map.append(&mut vec!["-map".to_string(), a_map]);
o_map.append(&mut vec_strings!["-map", a_map]);
};
}
}

View File

@ -63,7 +63,7 @@ fn check_media(
enc_cmd.append(&mut node.cmd.unwrap_or_default());
enc_cmd.append(&mut filter.cmd());
enc_cmd.append(&mut filter.map());
enc_cmd.append(&mut filter.map(None));
enc_cmd.append(&mut vec_strings!["-t", "0.1", "-f", "null", "-"]);
let mut enc_proc = match Command::new("ffmpeg")

View File

@ -30,7 +30,7 @@ fn video_audio_input() {
Some(vec_strings!["-i", "./assets/with_audio.mp4"])
);
assert_eq!(media.filter.clone().unwrap().cmd(), test_filter_cmd);
assert_eq!(media.filter.unwrap().map(), test_filter_map);
assert_eq!(media.filter.unwrap().map(None), test_filter_map);
}
#[test]
@ -55,7 +55,7 @@ fn video_audio_custom_filter1_input() {
Some(vec_strings!["-i", "./assets/with_audio.mp4"])
);
assert_eq!(media.filter.clone().unwrap().cmd(), test_filter_cmd);
assert_eq!(media.filter.unwrap().map(), test_filter_map);
assert_eq!(media.filter.unwrap().map(None), test_filter_map);
}
#[test]
@ -81,7 +81,7 @@ fn video_audio_custom_filter2_input() {
Some(vec_strings!["-i", "./assets/with_audio.mp4"])
);
assert_eq!(media.filter.clone().unwrap().cmd(), test_filter_cmd);
assert_eq!(media.filter.unwrap().map(), test_filter_map);
assert_eq!(media.filter.unwrap().map(None), test_filter_map);
}
#[test]
@ -107,7 +107,7 @@ fn dual_audio_aevalsrc_input() {
Some(vec_strings!["-i", "./assets/with_audio.mp4"])
);
assert_eq!(media.filter.clone().unwrap().cmd(), test_filter_cmd);
assert_eq!(media.filter.unwrap().map(), test_filter_map);
assert_eq!(media.filter.unwrap().map(None), test_filter_map);
}
#[test]
@ -132,7 +132,7 @@ fn dual_audio_input() {
Some(vec_strings!["-i", "./assets/dual_audio.mp4"])
);
assert_eq!(media.filter.clone().unwrap().cmd(), test_filter_cmd);
assert_eq!(media.filter.unwrap().map(), test_filter_map);
assert_eq!(media.filter.unwrap().map(None), test_filter_map);
}
#[test]
@ -165,7 +165,7 @@ fn video_separate_audio_input() {
])
);
assert_eq!(media.filter.clone().unwrap().cmd(), test_filter_cmd);
assert_eq!(media.filter.unwrap().map(), test_filter_map);
assert_eq!(media.filter.unwrap().map(None), test_filter_map);
}
#[test]
@ -392,9 +392,11 @@ fn video_audio_filter3_stream() {
config.processing.add_logo = false;
config.text.add_text = true;
config.text.fontfile = String::new();
config.out.output_filter = Some(
"[0:v]null[o];movie=/path/to/lower_third.png[l];[o][l]overlay=shortest=1[vout0]"
.to_string(),
);
config.out.output_cmd = Some(vec_strings![
"-filter_complex",
"[0:v]null[o];movie=/path/to/lower_third.png[l];[o][l]overlay=shortest=1[v_out0]",
"-map",
"[v_out0]",
"-c:v",
@ -444,9 +446,11 @@ fn video_audio_filter3_stream() {
"-i",
"pipe:0",
"-filter_complex",
format!("[0:v:0]zmq=b=tcp\\\\://'{socket}',drawtext@dyntext=text=''[vout0];[vout0]null[o];movie=/path/to/lower_third.png[l];[o][l]overlay=shortest=1[v_out0]"),
format!("[0:v:0]zmq=b=tcp\\\\://'{socket}',drawtext@dyntext=text='',null[o];movie=/path/to/lower_third.png[l];[o][l]overlay=shortest=1[vout0]"),
"-map",
"[v_out0]",
"[vout0]",
"-map",
"0:a:0",
"-c:v",
"libx264",
"-c:a",
@ -472,13 +476,15 @@ fn video_audio_filter4_stream() {
config.processing.add_logo = false;
config.text.add_text = true;
config.text.fontfile = String::new();
config.out.output_filter = Some(
"[0:v]null[o];movie=/path/to/lower_third.png[l];[o][l]overlay=shortest=1[vout0];[0:a:0]volume=0.2[aout0]"
.to_string(),
);
config.out.output_cmd = Some(vec_strings![
"-filter_complex",
"[0:v]null[o];movie=/path/to/lower_third.png[l];[o][l]overlay=shortest=1[v_out0];[0:a:0]volume=0.2[a_out0]",
"-map",
"[v_out0]",
"[vout0]",
"-map",
"[a_out0]",
"[aout0]",
"-c:v",
"libx264",
"-c:a",
@ -526,11 +532,11 @@ fn video_audio_filter4_stream() {
"-i",
"pipe:0",
"-filter_complex",
format!("[0:v:0]zmq=b=tcp\\\\://'{socket}',drawtext@dyntext=text=''[vout0];[vout0]null[o];movie=/path/to/lower_third.png[l];[o][l]overlay=shortest=1[v_out0];[0:a:0]volume=0.2[a_out0]"),
format!("[0:v:0]zmq=b=tcp\\\\://'{socket}',drawtext@dyntext=text='',null[o];movie=/path/to/lower_third.png[l];[o][l]overlay=shortest=1[vout0];[0:a:0]volume=0.2[aout0]"),
"-map",
"[v_out0]",
"[vout0]",
"-map",
"[a_out0]",
"[aout0]",
"-c:v",
"libx264",
"-c:a",
@ -909,6 +915,7 @@ fn video_dual_audio_multi_filter_stream() {
config.out.mode = Stream;
config.processing.add_logo = false;
config.processing.audio_tracks = 2;
config.out.output_count = 2;
config.text.fontfile = String::new();
config.out.output_cmd = Some(vec_strings![
"-map",
@ -985,9 +992,9 @@ fn video_dual_audio_multi_filter_stream() {
"-i",
"pipe:0",
"-filter_complex",
format!("[0:v:0]zmq=b=tcp\\\\://'{socket}',drawtext@dyntext=text=''[vout0]"),
format!("[0:v:0]zmq=b=tcp\\\\://'{socket}',drawtext@dyntext=text='',split=2[vout_0_0][vout_0_1]"),
"-map",
"[vout0]",
"[vout_0_0]",
"-map",
"0:a:0",
"-map",
@ -1006,7 +1013,7 @@ fn video_dual_audio_multi_filter_stream() {
"mpegts",
"srt://127.0.0.1:40051",
"-map",
"[vout0]",
"[vout_0_1]",
"-map",
"0:a:0",
"-map",
@ -1424,9 +1431,11 @@ fn multi_video_audio_hls() {
config.out.mode = HLS;
config.processing.add_logo = false;
config.text.add_text = false;
config.out.output_count = 2;
config.out.output_filter = Some(
"[0:v]split=2[v1_out][v2];[v2]scale=w=512:h=288[v2_out];[0:a]asplit=2[a1][a2]".to_string(),
);
config.out.output_cmd = Some(vec_strings![
"-filter_complex",
"[0:v]split=2[v1_out][v2];[v2]scale=w=512:h=288[v2_out];[0:a]asplit=2[a1][a2]",
"-map",
"[v1_out]",
"-map",
@ -1536,9 +1545,9 @@ fn multi_video_multi_audio_hls() {
config.processing.add_logo = false;
config.processing.audio_tracks = 2;
config.text.add_text = false;
config.out.output_count = 2;
config.out.output_filter = Some("[0:v]split=2[v1_out][v2];[v2]scale=w=512:h=288[v2_out];[0:a:0]asplit=2[a_0_1][a_0_2];[0:a:1]asplit=2[a_1_1][a_1_2]".to_string());
config.out.output_cmd = Some(vec_strings![
"-filter_complex",
"[0:v]split=2[v1_out][v2];[v2]scale=w=512:h=288[v2_out];[0:a:0]asplit=2[a_0_1][a_0_2];[0:a:1]asplit=2[a_1_1][a_1_2]",
"-map",
"[v1_out]",
"-map",