v4l2videodec: fix freeze race condition

This fixes a possible deadlock between gst_v4l2_video_dec_change_state
and gst_v4l2_video_dec_loop on the buffer pool.

When stopping capture, the flushing state of the v4l2 capture buffer
pool gets reverted in the processing loop after it was set via
gst_v4l2_object_unlock (self->v4l2capture) (in
gst_v4l2_video_dec_change_state). As a result, gst_v4l2_video_dec_loop
does not return and consequently, gst_pad_stop_task gets stuck waiting
for the GST_PAD_STREAM_LOCK. To circumvent this, skip acquiring the
buffer pool if stopping capture.

Suggested-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7958>
This commit is contained in:
Jonas Rebmann 2024-11-27 12:16:37 +01:00 committed by GStreamer Marge Bot
parent ccb40ca7d0
commit 225d6b7e11

View file

@ -745,6 +745,13 @@ gst_v4l2_video_dec_loop (GstVideoDecoder * decoder)
GST_VIDEO_DECODER_STREAM_UNLOCK (decoder);
goto beach;
}
/*
* In case we are flushing or stopping the element, ensure the active
* state is reflected onto the newly create pool.
*/
if (!g_atomic_int_get (&self->active))
gst_v4l2_object_unlock (self->v4l2capture);
}
/* just a safety, as introducing mistakes in negotiation seems rather