From 10a56806921c36ffc6203306123bdd4d75edf142 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 20 Oct 2011 15:21:07 +0200 Subject: [PATCH] omxvideodec: Fix deadlock caused by calling reset while the loop function does something with the base video codec stream lock --- omx/gstomxvideodec.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c index edf239d5937..b236407ef21 100644 --- a/omx/gstomxvideodec.c +++ b/omx/gstomxvideodec.c @@ -1093,21 +1093,25 @@ gst_omx_video_dec_reset (GstBaseVideoDecoder * decoder) /* FIXME: Workaround for * https://bugzilla.gnome.org/show_bug.cgi?id=654529 + * + * This is always called with GST_BASE_VIDEO_CODEC_STREAM_LOCK */ - GST_BASE_VIDEO_CODEC_STREAM_LOCK (self); g_list_foreach (GST_BASE_VIDEO_CODEC (self)->frames, (GFunc) gst_base_video_codec_free_frame, NULL); g_list_free (GST_BASE_VIDEO_CODEC (self)->frames); GST_BASE_VIDEO_CODEC (self)->frames = NULL; - GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (self); if (self->started) { gst_omx_port_set_flushing (self->in_port, TRUE); gst_omx_port_set_flushing (self->out_port, TRUE); - /* Wait until the srcpad loop is finished */ + /* Wait until the srcpad loop is finished, + * unlock GST_BASE_VIDEO_CODEC_STREAM_LOCK to prevent deadlocks + * caused by using this lock from inside the loop function */ + GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (self); GST_PAD_STREAM_LOCK (GST_BASE_VIDEO_CODEC_SRC_PAD (self)); GST_PAD_STREAM_UNLOCK (GST_BASE_VIDEO_CODEC_SRC_PAD (self)); + GST_BASE_VIDEO_CODEC_STREAM_LOCK (self); gst_omx_port_set_flushing (self->in_port, FALSE); gst_omx_port_set_flushing (self->out_port, FALSE); -- 2.34.1