From 63852b3b193a51dfe559344188694720a81066ea Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Tue, 25 Jul 2023 10:58:34 +0200 Subject: [PATCH] streamproducer: forward selected sticky events when adding consumers The consumer pipeline may rely on some sticky events (Tag in my case) which may have already been sent. Part-of: --- gstreamer-utils/src/streamproducer.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/gstreamer-utils/src/streamproducer.rs b/gstreamer-utils/src/streamproducer.rs index e4a1980bc..cf892cfe9 100644 --- a/gstreamer-utils/src/streamproducer.rs +++ b/gstreamer-utils/src/streamproducer.rs @@ -214,6 +214,22 @@ impl StreamProducer { .consumers .insert(consumer.clone(), stream_consumer); + // forward selected sticky events. We can send those now as appsrc will delay the events + // until stream-start, caps and segment are sent. + let events_to_forward = consumers.events_to_forward.clone(); + // drop the lock before sending events + drop(consumers); + + let appsink_pad = self.appsink.static_pad("sink").unwrap(); + appsink_pad.sticky_events_foreach(|event| { + if events_to_forward.contains(&event.type_()) { + gst::debug!(CAT, obj: &self.appsink, "forward sticky event {:?}", event); + consumer.send_event(event.clone()); + } + + std::ops::ControlFlow::Continue(gst::EventForeachAction::Keep) + }); + Ok(()) }