fmp4mux: add 'offset-to-zero' property

Add it only to 'isofmp4mux', the onvif variant already does this and
CMAF and DASH are always single-stream so you rely on inter-container
synchronization via the running-time.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1063>
This commit is contained in:
Guillaume Desmottes 2023-01-25 10:59:52 +01:00 committed by GStreamer Marge Bot
parent 3b4c48d9f5
commit abe4efc4a2
2 changed files with 60 additions and 4 deletions

View file

@ -1668,6 +1668,20 @@
"presence": "always"
}
},
"properties": {
"offset-to-zero": {
"blurb": "Offsets all streams so that the earliest stream starts at 0",
"conditionally-available": false,
"construct": false,
"construct-only": false,
"controllable": false,
"default": "false",
"mutable": "ready",
"readable": true,
"type": "gboolean",
"writable": true
}
},
"rank": "primary"
},
"onviffmp4mux": {

View file

@ -109,6 +109,7 @@ struct Settings {
interleave_bytes: Option<u64>,
interleave_time: Option<gst::ClockTime>,
movie_timescale: u32,
offset_to_zero: bool,
}
impl Default for Settings {
@ -121,6 +122,7 @@ impl Default for Settings {
interleave_bytes: DEFAULT_INTERLEAVE_BYTES,
interleave_time: DEFAULT_INTERLEAVE_TIME,
movie_timescale: 0,
offset_to_zero: false,
}
}
}
@ -1387,11 +1389,11 @@ impl FMP4Mux {
let (mut interleaved_buffers, mut streams) =
self.interleave_buffers(settings, drained_streams)?;
// Offset stream start time to start at 0 in ONVIF mode instead of using the UTC time
// verbatim. This would be used for the tfdt box later.
// Offset stream start time to start at 0 in ONVIF mode, or if 'offset-to-zero' is enabled,
// instead of using the UTC time verbatim. This would be used for the tfdt box later.
// FIXME: Should this use the original DTS-or-PTS running time instead?
// That might be negative though!
if self.obj().class().as_ref().variant == super::Variant::ONVIF {
if self.obj().class().as_ref().variant == super::Variant::ONVIF || settings.offset_to_zero {
let offset = if let Some(start_dts) = state.start_dts {
std::cmp::min(start_dts, state.earliest_pts.unwrap())
} else {
@ -2522,7 +2524,47 @@ impl ObjectSubclass for ISOFMP4Mux {
type ParentType = super::FMP4Mux;
}
impl ObjectImpl for ISOFMP4Mux {}
impl ObjectImpl for ISOFMP4Mux {
fn properties() -> &'static [glib::ParamSpec] {
static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
vec![glib::ParamSpecBoolean::builder("offset-to-zero")
.nick("Offset to Zero")
.blurb("Offsets all streams so that the earliest stream starts at 0")
.mutable_ready()
.build()]
});
&PROPERTIES
}
fn property(&self, _id: usize, pspec: &glib::ParamSpec) -> glib::Value {
let obj = self.obj();
let fmp4mux = obj.upcast_ref::<super::FMP4Mux>().imp();
match pspec.name() {
"offset-to-zero" => {
let settings = fmp4mux.settings.lock().unwrap();
settings.offset_to_zero.to_value()
}
_ => unimplemented!(),
}
}
fn set_property(&self, _id: usize, value: &glib::Value, pspec: &glib::ParamSpec) {
let obj = self.obj();
let fmp4mux = obj.upcast_ref::<super::FMP4Mux>().imp();
match pspec.name() {
"offset-to-zero" => {
let mut settings = fmp4mux.settings.lock().unwrap();
settings.offset_to_zero = value.get().expect("type checked upstream");
}
_ => unimplemented!(),
}
}
}
impl GstObjectImpl for ISOFMP4Mux {}