From 6c6384e9cd0c906c12bfbcd8c6c95d135d4632cc Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Tue, 3 Oct 2023 09:15:11 +0200 Subject: [PATCH] gst-utils: prevent dead lock when requesting key unit Sending the UpstreamForceKeyUnitEvent using gst_element_send_event() internally takes the state lock. If appsink is pre-rolling we are also holding the preroll lock. This may result in a dead lock with the thread doing the state change as this one takes the state lock and then the pre-roll lock. Part-of: --- gstreamer-utils/src/streamproducer.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gstreamer-utils/src/streamproducer.rs b/gstreamer-utils/src/streamproducer.rs index cf892cfe9..ceba37125 100644 --- a/gstreamer-utils/src/streamproducer.rs +++ b/gstreamer-utils/src/streamproducer.rs @@ -320,7 +320,9 @@ impl StreamProducer { drop(consumers); if needs_keyframe_request { - appsink.send_event( + // Do not use `gst_element_send_event()` as it takes the state lock which may lead to dead locks. + let pad = appsink.static_pad("sink").unwrap(); + pad.push_event( gst_video::UpstreamForceKeyUnitEvent::builder() .all_headers(true) .build(),