mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2025-09-02 17:53:48 +00:00
mp4mux: Store language tags per stream and not globally
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2193>
This commit is contained in:
parent
269e469a7b
commit
3224cf6f06
3 changed files with 28 additions and 9 deletions
|
@ -433,7 +433,7 @@ fn language_code(lang: impl std::borrow::Borrow<[u8; 3]>) -> u16 {
|
||||||
|
|
||||||
fn write_mdhd(
|
fn write_mdhd(
|
||||||
v: &mut Vec<u8>,
|
v: &mut Vec<u8>,
|
||||||
header: &super::Header,
|
_header: &super::Header,
|
||||||
stream: &super::Stream,
|
stream: &super::Stream,
|
||||||
creation_time: u64,
|
creation_time: u64,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
|
@ -456,7 +456,7 @@ fn write_mdhd(
|
||||||
v.extend(duration.to_be_bytes());
|
v.extend(duration.to_be_bytes());
|
||||||
|
|
||||||
// Language as ISO-639-2/T
|
// Language as ISO-639-2/T
|
||||||
if let Some(lang) = header.language_code {
|
if let Some(lang) = stream.language_code {
|
||||||
v.extend(language_code(lang).to_be_bytes());
|
v.extend(language_code(lang).to_be_bytes());
|
||||||
} else {
|
} else {
|
||||||
v.extend(language_code(b"und").to_be_bytes());
|
v.extend(language_code(b"und").to_be_bytes());
|
||||||
|
|
|
@ -148,6 +148,9 @@ struct Stream {
|
||||||
|
|
||||||
extra_header_data: Option<Vec<u8>>,
|
extra_header_data: Option<Vec<u8>>,
|
||||||
|
|
||||||
|
/// Language code from tags
|
||||||
|
language_code: Option<[u8; 3]>,
|
||||||
|
|
||||||
/// Orientation from tags
|
/// Orientation from tags
|
||||||
orientation: Option<ImageOrientation>,
|
orientation: Option<ImageOrientation>,
|
||||||
}
|
}
|
||||||
|
@ -282,9 +285,6 @@ struct State {
|
||||||
|
|
||||||
/// Size of the `mdat` as written so far.
|
/// Size of the `mdat` as written so far.
|
||||||
mdat_size: u64,
|
mdat_size: u64,
|
||||||
|
|
||||||
/// Language code from tags
|
|
||||||
language_code: Option<[u8; 3]>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
|
@ -1220,6 +1220,7 @@ impl MP4Mux {
|
||||||
end_pts: None,
|
end_pts: None,
|
||||||
running_time_utc_time_mapping: None,
|
running_time_utc_time_mapping: None,
|
||||||
extra_header_data: None,
|
extra_header_data: None,
|
||||||
|
language_code: None,
|
||||||
orientation: None,
|
orientation: None,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1434,7 +1435,9 @@ impl AggregatorImpl for MP4Mux {
|
||||||
self.parent_sink_event_pre_queue(aggregator_pad, event)
|
self.parent_sink_event_pre_queue(aggregator_pad, event)
|
||||||
}
|
}
|
||||||
EventView::Tag(ev) => {
|
EventView::Tag(ev) => {
|
||||||
if let Some(tag_value) = ev.tag().get::<gst::tags::LanguageCode>() {
|
let tag = ev.tag();
|
||||||
|
|
||||||
|
if let Some(tag_value) = tag.get::<gst::tags::LanguageCode>() {
|
||||||
let lang = tag_value.get();
|
let lang = tag_value.get();
|
||||||
gst::trace!(
|
gst::trace!(
|
||||||
CAT,
|
CAT,
|
||||||
|
@ -1451,7 +1454,21 @@ impl AggregatorImpl for MP4Mux {
|
||||||
for (out, c) in Iterator::zip(language_code.iter_mut(), lang.chars()) {
|
for (out, c) in Iterator::zip(language_code.iter_mut(), lang.chars()) {
|
||||||
*out = c as u8;
|
*out = c as u8;
|
||||||
}
|
}
|
||||||
state.language_code = Some(language_code);
|
|
||||||
|
if tag.scope() == gst::TagScope::Global {
|
||||||
|
gst::info!(
|
||||||
|
CAT,
|
||||||
|
imp = self,
|
||||||
|
"Language tags scoped 'global' are considered stream tags",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
for stream in &mut state.streams {
|
||||||
|
if &stream.sinkpad == aggregator_pad {
|
||||||
|
stream.language_code = Some(language_code);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if let Some(tag_value) = ev.tag().get::<gst::tags::ImageOrientation>() {
|
} else if let Some(tag_value) = ev.tag().get::<gst::tags::ImageOrientation>() {
|
||||||
let orientation = tag_value.get();
|
let orientation = tag_value.get();
|
||||||
|
@ -1736,6 +1753,7 @@ impl AggregatorImpl for MP4Mux {
|
||||||
image_sequence: stream.image_sequence_mode(),
|
image_sequence: stream.image_sequence_mode(),
|
||||||
chunks: stream.chunks,
|
chunks: stream.chunks,
|
||||||
extra_header_data: stream.extra_header_data.clone(),
|
extra_header_data: stream.extra_header_data.clone(),
|
||||||
|
language_code: stream.language_code,
|
||||||
orientation: stream.orientation,
|
orientation: stream.orientation,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1744,7 +1762,6 @@ impl AggregatorImpl for MP4Mux {
|
||||||
variant: self.obj().class().as_ref().variant,
|
variant: self.obj().class().as_ref().variant,
|
||||||
movie_timescale: settings.movie_timescale,
|
movie_timescale: settings.movie_timescale,
|
||||||
streams,
|
streams,
|
||||||
language_code: state.language_code,
|
|
||||||
})
|
})
|
||||||
.map_err(|err| {
|
.map_err(|err| {
|
||||||
gst::error!(CAT, imp = self, "Failed to create moov box: {err}");
|
gst::error!(CAT, imp = self, "Failed to create moov box: {err}");
|
||||||
|
|
|
@ -203,6 +203,9 @@ pub(crate) struct Stream {
|
||||||
// More data to be included in the fragmented stream header
|
// More data to be included in the fragmented stream header
|
||||||
extra_header_data: Option<Vec<u8>>,
|
extra_header_data: Option<Vec<u8>>,
|
||||||
|
|
||||||
|
// Language code from tags
|
||||||
|
language_code: Option<[u8; 3]>,
|
||||||
|
|
||||||
/// Orientation from tags
|
/// Orientation from tags
|
||||||
orientation: Option<ImageOrientation>,
|
orientation: Option<ImageOrientation>,
|
||||||
|
|
||||||
|
@ -220,7 +223,6 @@ pub(crate) struct Header {
|
||||||
/// Pre-defined movie timescale if not 0.
|
/// Pre-defined movie timescale if not 0.
|
||||||
movie_timescale: u32,
|
movie_timescale: u32,
|
||||||
streams: Vec<Stream>,
|
streams: Vec<Stream>,
|
||||||
language_code: Option<[u8; 3]>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(clippy::upper_case_acronyms)]
|
#[allow(clippy::upper_case_acronyms)]
|
||||||
|
|
Loading…
Reference in a new issue