diff --git a/Cargo.lock b/Cargo.lock index 7031be2de..d0ddb28e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2877,6 +2877,7 @@ dependencies = [ "gstreamer-audio", "gstreamer-base", "gstreamer-pbutils", + "gstreamer-tag", "gstreamer-video", "num-integer", "tempfile", diff --git a/mux/mp4/Cargo.toml b/mux/mp4/Cargo.toml index 712f7225a..2f43fe780 100644 --- a/mux/mp4/Cargo.toml +++ b/mux/mp4/Cargo.toml @@ -15,6 +15,7 @@ gst-base = { workspace = true, features = ["v1_18"] } gst-audio = { workspace = true, features = ["v1_18"] } gst-video = { workspace = true, features = ["v1_20"] } gst-pbutils = { workspace = true, features = ["v1_18"] } +gst-tag = { workspace = true, features = ["v1_18"] } bitstream-io = "2.3" num-integer = { version = "0.1", default-features = false, features = [] } diff --git a/mux/mp4/src/mp4mux/imp.rs b/mux/mp4/src/mp4mux/imp.rs index 7c6375e4d..58c03f1b0 100644 --- a/mux/mp4/src/mp4mux/imp.rs +++ b/mux/mp4/src/mp4mux/imp.rs @@ -267,6 +267,19 @@ impl Stream { }; image_sequence } + + fn parse_language_code(lang: &str) -> Option<[u8; 3]> { + let lang = gst_tag::language_codes::language_code_iso_639_2t(lang)?; + if lang.len() == 3 && lang.chars().all(|c| c.is_ascii_lowercase()) { + let mut language_code: [u8; 3] = [0; 3]; + for (out, c) in Iterator::zip(language_code.iter_mut(), lang.chars()) { + *out = c as u8; + } + Some(language_code) + } else { + None + } + } } #[derive(Default)] @@ -1457,14 +1470,9 @@ impl AggregatorImpl for MP4Mux { ); // Language as ISO-639-2/T - if lang.len() == 3 && lang.chars().all(|c| c.is_ascii_lowercase()) { + if let Some(language_code) = Stream::parse_language_code(lang) { let mut state = self.state.lock().unwrap(); - let mut language_code: [u8; 3] = [0; 3]; - for (out, c) in Iterator::zip(language_code.iter_mut(), lang.chars()) { - *out = c as u8; - } - if tag.scope() == gst::TagScope::Global { gst::info!( CAT,