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-base",
"gstreamer-pbutils",
"gstreamer-tag",
"gstreamer-video",
"num-integer",
"tempfile",

View file

@ -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 = [] }

View file

@ -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,