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: <https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/merge_requests/1316>
This commit is contained in:
Guillaume Desmottes 2023-10-03 09:15:11 +02:00
parent d7494bf1db
commit 7bde0285ff

View file

@ -320,7 +320,9 @@ impl StreamProducer {
drop(consumers); drop(consumers);
if needs_keyframe_request { 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() gst_video::UpstreamForceKeyUnitEvent::builder()
.all_headers(true) .all_headers(true)
.build(), .build(),