mp4mux: Parse language code tags correctly as ISO 639-2T

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2193>
This commit is contained in:
Sebastian Dröge 2025-04-14 15:46:22 +03:00 committed by GStreamer Marge Bot
parent 7a9cb9d5da
commit 50022b76c0
3 changed files with 16 additions and 6 deletions

1
Cargo.lock generated
View file

@ -2877,6 +2877,7 @@ dependencies = [
"gstreamer-audio", "gstreamer-audio",
"gstreamer-base", "gstreamer-base",
"gstreamer-pbutils", "gstreamer-pbutils",
"gstreamer-tag",
"gstreamer-video", "gstreamer-video",
"num-integer", "num-integer",
"tempfile", "tempfile",

View file

@ -15,6 +15,7 @@ gst-base = { workspace = true, features = ["v1_18"] }
gst-audio = { workspace = true, features = ["v1_18"] } gst-audio = { workspace = true, features = ["v1_18"] }
gst-video = { workspace = true, features = ["v1_20"] } gst-video = { workspace = true, features = ["v1_20"] }
gst-pbutils = { workspace = true, features = ["v1_18"] } gst-pbutils = { workspace = true, features = ["v1_18"] }
gst-tag = { workspace = true, features = ["v1_18"] }
bitstream-io = "2.3" bitstream-io = "2.3"
num-integer = { version = "0.1", default-features = false, features = [] } num-integer = { version = "0.1", default-features = false, features = [] }

View file

@ -267,6 +267,19 @@ impl Stream {
}; };
image_sequence 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)] #[derive(Default)]
@ -1457,14 +1470,9 @@ impl AggregatorImpl for MP4Mux {
); );
// Language as ISO-639-2/T // 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 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 { if tag.scope() == gst::TagScope::Global {
gst::info!( gst::info!(
CAT, CAT,