diff --git a/Cargo.lock b/Cargo.lock index 9720300a..be80d786 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -88,15 +88,15 @@ dependencies = [ "libc", "num-integer", "num-traits", - "time", + "time 0.1.43", "winapi 0.3.9", ] [[package]] name = "clap" -version = "3.1.13" +version = "3.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4b3ee449efa0c4f95cd48b00539829d3655a98e189a90617246492788d22404" +checksum = "85a35a599b11c089a7f49105658d089b8f2cf0882993c17daf6de15285c2c35d" dependencies = [ "atty", "bitflags", @@ -216,6 +216,7 @@ dependencies = [ "serde_yaml", "shlex", "simplelog", + "time 0.3.9", "walkdir", ] @@ -232,7 +233,7 @@ dependencies = [ [[package]] name = "file-rotate" version = "0.6.0" -source = "git+https://github.com/jb-alvarado/file-rotate.git#46a47225f3f0e0fd23ca42b2dea527c55daf1a12" +source = "git+https://github.com/jb-alvarado/file-rotate.git#ae5062a5b82626b4d1f9fea2a17325fe1d160d4c" dependencies = [ "chrono", "flate2", @@ -701,9 +702,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.16" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if 1.0.0", ] @@ -891,9 +892,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] @@ -908,6 +909,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + [[package]] name = "once_cell" version = "1.10.0" @@ -916,18 +926,30 @@ checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" [[package]] name = "openssl" -version = "0.10.38" +version = "0.10.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7ae222234c30df141154f159066c5093ff73b63204dcda7121eb082fc56a95" +checksum = "fb81a6430ac911acb25fe5ac8f1d2af1b4ea8a4fdfda0f1ee4292af2e2d8eb0e" dependencies = [ "bitflags", "cfg-if 1.0.0", "foreign-types", "libc", "once_cell", + "openssl-macros", "openssl-sys", ] +[[package]] +name = "openssl-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "openssl-probe" version = "0.1.5" @@ -945,9 +967,9 @@ dependencies = [ [[package]] name = "openssl-sys" -version = "0.9.72" +version = "0.9.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e46109c383602735fa0a2e48dd2b7c892b048e1bf69e5c3b1d804b7d9c203cb" +checksum = "9d5fd19fb3e0a8191c1e34935718976a3e70c112ab9a24af6d7cadccd9d90bc0" dependencies = [ "autocfg", "cc", @@ -965,9 +987,9 @@ checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" [[package]] name = "paris" -version = "1.5.11" +version = "1.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c69d19a208bba8b94bd27d4b7a06ad153cddc6b88cb2149a668e23ce7bdb67d5" +checksum = "2eaf2319cd71dd9ff38c72bebde61b9ea657134abcf26ae4205f54f772a32810" [[package]] name = "parking_lot" @@ -1187,18 +1209,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.136" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.136" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" dependencies = [ "proc-macro2", "quote", @@ -1207,9 +1229,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.80" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f972498cf015f7c0746cac89ebe1d6ef10c293b94175a243a2d9442c163d9944" +checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" dependencies = [ "itoa", "ryu", @@ -1218,9 +1240,9 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.8.23" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a521f2940385c165a24ee286aa8599633d162077a54bdcae2a6fd5a7bfa7a0" +checksum = "707d15895415db6628332b737c838b88c598522e4dc70647e59b72312924aebc" dependencies = [ "indexmap", "ryu", @@ -1236,14 +1258,14 @@ checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" [[package]] name = "simplelog" -version = "0.11.2" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1348164456f72ca0116e4538bdaabb0ddb622c7d9f16387c725af3e96d6001c" +checksum = "48dfff04aade74dd495b007c831cd6f4e0cee19c344dd9dc0884c0289b70a786" dependencies = [ - "chrono", "log", "paris", "termcolor", + "time 0.3.9", ] [[package]] @@ -1324,6 +1346,24 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "time" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2702e08a7a860f005826c6815dcac101b19b5eb330c27fe4a5928fec1d20ddd" +dependencies = [ + "itoa", + "libc", + "num_threads", + "time-macros", +] + +[[package]] +name = "time-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" + [[package]] name = "tinyvec" version = "1.6.0" @@ -1341,9 +1381,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.18.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f48b6d60512a392e34dbf7fd456249fd2de3c83669ab642e021903f4015185b" +checksum = "dce653fb475565de9f6fb0614b28bca8df2c430c0cf84bcd9c843f15de5414cc" dependencies = [ "bytes", "libc", @@ -1439,9 +1479,9 @@ dependencies = [ [[package]] name = "unicode-xid" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" [[package]] name = "vcpkg" diff --git a/Cargo.toml b/Cargo.toml index bfa47350..1ffcec92 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,7 +24,8 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" serde_yaml = "0.8" shlex = "1.1" -simplelog = { version = "^0.11", features = ["paris"] } +simplelog = { version = "^0.12", features = ["paris"] } +time = { version = "0.3", features = ["formatting", "macros"] } walkdir = "2" [target.x86_64-unknown-linux-musl.dependencies] @@ -48,6 +49,7 @@ license-file = ["LICENSE", "0"] depends = "" suggests = "ffmpeg" copyright = "Copyright (c) 2022, Jonathan Baecker. All rights reserved." +conf-files = ["/etc/ffplayout/ffplayout.yml"] assets = [ ["target/x86_64-unknown-linux-musl/release/ffplayout", "/usr/bin/ffplayout", "755"], ["assets/ffplayout.yml", "/etc/ffplayout/ffplayout.yml", "644"], @@ -62,7 +64,7 @@ name = "ffplayout-engine" license = "GPL-3.0" assets = [ { source = "target/x86_64-unknown-linux-musl/release/ffplayout", dest = "/usr/bin/ffplayout", mode = "755" }, - { source = "assets/ffplayout.yml", dest = "/etc/ffplayout/ffplayout.yml", mode = "644" }, + { source = "assets/ffplayout.yml", dest = "/etc/ffplayout/ffplayout.yml", mode = "644", config = true }, { source = "assets/ffplayout-engine.service", dest = "/lib/systemd/system/ffplayout-engine.service", mode = "644" }, { source = "README.md", dest = "/usr/share/doc/ffplayout-engine/README", mode = "644", doc = true }, { source = "LICENSE", dest = "/usr/share/doc/ffplayout-engine/LICENSE", mode = "644" }, diff --git a/src/filter/ingest_filter.rs b/src/filter/ingest_filter.rs index 048391d9..98be5654 100644 --- a/src/filter/ingest_filter.rs +++ b/src/filter/ingest_filter.rs @@ -32,7 +32,13 @@ pub fn filter_cmd() -> Vec { config.processing.aspect ); - filter.push_str(&v_overlay::filter_node(config, true)); + let overlay = v_overlay::filter_node(config, true); + + if !overlay.is_empty() { + filter.push(','); + } + + filter.push_str(&overlay); filter.push_str("[vout1]"); filter.push_str(audio_filter(config).as_str()); diff --git a/src/filter/mod.rs b/src/filter/mod.rs index 9f64c76c..66ea47f1 100644 --- a/src/filter/mod.rs +++ b/src/filter/mod.rs @@ -179,9 +179,8 @@ fn extend_video(node: &mut Media, chain: &mut Filters) { } } +/// add drawtext filter for lower thirds messages fn add_text(node: &mut Media, chain: &mut Filters, config: &GlobalConfig) { - // add drawtext filter for lower thirds messages - if config.text.add_text && config.text.over_pre { let filter = v_drawtext::filter_node(node); @@ -268,9 +267,8 @@ fn fps_calc(r_frame_rate: &str) -> f64 { fps } +/// This realtime filter is important for HLS output to stay in sync. fn realtime_filter(node: &mut Media, chain: &mut Filters, config: &GlobalConfig, codec_type: &str) { - // this realtime filter is important for HLS output to stay in sync - let mut t = ""; if codec_type == "audio" { diff --git a/src/filter/v_overlay.rs b/src/filter/v_overlay.rs index b3f2d62a..0607090c 100644 --- a/src/filter/v_overlay.rs +++ b/src/filter/v_overlay.rs @@ -14,7 +14,10 @@ pub fn filter_node(config: &GlobalConfig, add_tail: bool) -> String { config.processing.logo_opacity ); let logo_loop = "loop=loop=-1:size=1:start=0"; - logo_chain = format!("[v];movie={},{logo_loop},{opacity}", config.processing.logo); + logo_chain = format!( + "null[v];movie={},{logo_loop},{opacity}", + config.processing.logo + ); if add_tail { logo_chain.push_str( diff --git a/src/utils/config.rs b/src/utils/config.rs index c9321a38..0c753f44 100644 --- a/src/utils/config.rs +++ b/src/utils/config.rs @@ -273,11 +273,10 @@ impl GlobalConfig { static INSTANCE: OnceCell = OnceCell::new(); +/// When add_loudnorm is False we use a different audio encoder, +/// s302m has higher quality, but is experimental +/// and works not well together with the loudnorm filter. fn pre_audio_codec(add_loudnorm: bool) -> Vec { - // when add_loudnorm is False we use a different audio encoder, - // s302m has higher quality, but is experimental - // and works not well together with the loudnorm filter - let mut codec = vec!["-c:a", "s302m", "-strict", "-2"]; if add_loudnorm { diff --git a/src/utils/logging.rs b/src/utils/logging.rs index 717bdf5b..e60e1005 100644 --- a/src/utils/logging.rs +++ b/src/utils/logging.rs @@ -8,6 +8,7 @@ use std::{ time::Duration, }; +use chrono::prelude::*; use file_rotate::{ compression::Compression, suffix::{AppendTimestamp, DateFrom, FileLimit}, @@ -17,8 +18,6 @@ use lettre::{ message::header, transport::smtp::authentication::Credentials, Message, SmtpTransport, Transport, }; - -use chrono::prelude::*; use log::{Level, LevelFilter, Log, Metadata, Record}; use regex::Regex; use simplelog::*; @@ -152,18 +151,26 @@ pub fn init_logging() -> Vec> { time_level = LevelFilter::Error; } - let mut log_config = simplelog::ConfigBuilder::new() + let mut log_config = ConfigBuilder::new() .set_thread_level(LevelFilter::Off) .set_target_level(LevelFilter::Off) .set_level_padding(LevelPadding::Left) - .set_time_to_local(app_config.local_time) .set_time_level(time_level) .clone(); + if app_config.local_time { + log_config = match log_config.set_time_offset_to_local() { + Ok(local) => local.clone(), + Err(_) => log_config, + }; + }; + if app_config.log_to_file { let file_config = log_config .clone() - .set_time_format("[%Y-%m-%d %H:%M:%S%.3f]".into()) + .set_time_format_custom(format_description!( + "[[year]-[month]-[day] [hour]:[minute]:[second].[subsecond]]" + )) .build(); let mut log_path = "logs/ffplayout.log".to_string(); @@ -199,7 +206,9 @@ pub fn init_logging() -> Vec> { .set_level_color(Level::Info, Some(Color::Ansi256(10))) .set_level_color(Level::Warn, Some(Color::Ansi256(208))) .set_level_color(Level::Error, Some(Color::Ansi256(9))) - .set_time_format_str("\x1b[30;1m[%Y-%m-%d %H:%M:%S%.3f]\x1b[0m") + .set_time_format_custom(format_description!( + "\x1b[[30;1m[[[year]-[month]-[day] [hour]:[minute]:[second].[subsecond digits:4]]\x1b[[0m" + )) .build(); app_logger.push(TermLogger::new(