utils/fallbacksrc: Proxy the uridecodebin3 buffer-duration property

This commit is contained in:
Sebastian Dröge 2020-07-10 11:14:33 +03:00
parent 2b892ec01a
commit 5e1ce7f9a7

View file

@ -47,6 +47,7 @@ struct Settings {
retry_timeout: u64, retry_timeout: u64,
restart_on_eos: bool, restart_on_eos: bool,
min_latency: u64, min_latency: u64,
buffer_duration: i64,
} }
impl Default for Settings { impl Default for Settings {
@ -62,6 +63,7 @@ impl Default for Settings {
retry_timeout: 60 * gst::SECOND_VAL, retry_timeout: 60 * gst::SECOND_VAL,
restart_on_eos: false, restart_on_eos: false,
min_latency: 0, min_latency: 0,
buffer_duration: -1,
} }
} }
} }
@ -148,7 +150,7 @@ enum Status {
Running, Running,
} }
static PROPERTIES: [subclass::Property; 11] = [ static PROPERTIES: [subclass::Property; 12] = [
subclass::Property("enable-audio", |name| { subclass::Property("enable-audio", |name| {
glib::ParamSpec::boolean( glib::ParamSpec::boolean(
name, name,
@ -253,6 +255,17 @@ static PROPERTIES: [subclass::Property; 11] = [
glib::ParamFlags::READWRITE, glib::ParamFlags::READWRITE,
) )
}), }),
subclass::Property("buffer-duration", |name| {
glib::ParamSpec::int64(
name,
"Buffer Duration",
"Buffer duration when buffering streams (-1 default value)",
-1,
std::i64::MAX,
-1,
glib::ParamFlags::READWRITE,
)
}),
]; ];
impl ObjectSubclass for FallbackSrc { impl ObjectSubclass for FallbackSrc {
@ -428,6 +441,18 @@ impl ObjectImpl for FallbackSrc {
); );
settings.min_latency = new_value; settings.min_latency = new_value;
} }
subclass::Property("buffer-duration", ..) => {
let mut settings = self.settings.lock().unwrap();
let new_value = value.get_some().expect("type checked upstream");
gst_info!(
CAT,
obj: element,
"Changing Buffer Duration from {:?} to {:?}",
settings.buffer_duration,
new_value,
);
settings.buffer_duration = new_value;
}
_ => unimplemented!(), _ => unimplemented!(),
} }
} }
@ -531,6 +556,10 @@ impl ObjectImpl for FallbackSrc {
let settings = self.settings.lock().unwrap(); let settings = self.settings.lock().unwrap();
Ok(settings.min_latency.to_value()) Ok(settings.min_latency.to_value())
} }
subclass::Property("buffer-duration", ..) => {
let settings = self.settings.lock().unwrap();
Ok(settings.buffer_duration.to_value())
}
_ => unimplemented!(), _ => unimplemented!(),
} }
} }
@ -611,6 +640,7 @@ impl FallbackSrc {
&self, &self,
element: &gst::Bin, element: &gst::Bin,
source: &Source, source: &Source,
buffer_duration: i64,
) -> Result<gst::Element, gst::StateChangeError> { ) -> Result<gst::Element, gst::StateChangeError> {
let source = match source { let source = match source {
Source::Uri(ref uri) => { Source::Uri(ref uri) => {
@ -619,6 +649,9 @@ impl FallbackSrc {
source.set_property("uri", &uri).unwrap(); source.set_property("uri", &uri).unwrap();
source.set_property("use-buffering", &true).unwrap(); source.set_property("use-buffering", &true).unwrap();
source
.set_property("buffer-duration", &buffer_duration)
.unwrap();
source source
} }
@ -976,7 +1009,8 @@ impl FallbackSrc {
let fallback_uri = &settings.fallback_uri; let fallback_uri = &settings.fallback_uri;
// Create main input // Create main input
let source = self.create_main_input(element, &configured_source)?; let source =
self.create_main_input(element, &configured_source, settings.buffer_duration)?;
let mut flow_combiner = gst_base::UniqueFlowCombiner::new(); let mut flow_combiner = gst_base::UniqueFlowCombiner::new();
@ -1901,7 +1935,11 @@ impl FallbackSrc {
element.remove(&state.source).unwrap(); element.remove(&state.source).unwrap();
let source = src let source = src
.create_main_input(element, &state.configured_source) .create_main_input(
element,
&state.configured_source,
state.settings.buffer_duration,
)
.expect("failed to create new source"); .expect("failed to create new source");
( (