v4l2videodec: Don't lock the decoder when stopping task
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Thu, 15 May 2014 14:31:40 +0000 (10:31 -0400)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Thu, 15 May 2014 16:21:54 +0000 (12:21 -0400)
That src pad task may need to take the lock when being pulled
down. takeing that lock can lead to a deadlock.

https://bugzilla.gnome.org/show_bug.cgi?id=730207

sys/v4l2/gstv4l2videodec.c

index 71481d2..9de0b54 100644 (file)
@@ -213,9 +213,10 @@ gst_v4l2_video_dec_stop (GstVideoDecoder * decoder)
   gst_v4l2_object_unlock (self->v4l2output);
   gst_v4l2_object_unlock (self->v4l2capture);
 
-  GST_VIDEO_DECODER_STREAM_LOCK (decoder);
   /* Wait for capture thread to stop */
   gst_pad_stop_task (decoder->srcpad);
+
+  GST_VIDEO_DECODER_STREAM_LOCK (decoder);
   self->output_flow = GST_FLOW_OK;
   GST_VIDEO_DECODER_STREAM_UNLOCK (decoder);
 
@@ -273,7 +274,9 @@ gst_v4l2_video_dec_flush (GstVideoDecoder * decoder)
   GST_DEBUG_OBJECT (self, "Flushing");
 
   /* Wait for capture thread to stop */
+  GST_VIDEO_DECODER_STREAM_UNLOCK (decoder);
   gst_pad_stop_task (decoder->srcpad);
+  GST_VIDEO_DECODER_STREAM_LOCK (decoder);
   self->output_flow = GST_FLOW_OK;
 
   if (self->v4l2output->pool)