wrappercamerabinsrc: do not set source state with lock
authorThiago Santos <thiagoss@osg.samsung.com>
Sat, 27 Dec 2014 02:05:43 +0000 (23:05 -0300)
committerThiago Santos <thiagoss@osg.samsung.com>
Sat, 27 Dec 2014 02:07:39 +0000 (23:07 -0300)
It might be racy with the image probe thread as it uses the capture
mutex just like the start-capture handler from camerabin. The
start-capture would be waiting for the source's streaming thread
to stop to be able to set the source state to ready while the
probe would be blocked waiting to acquire the capture mutex.
It causes a deadlock.

gst/camerabin2/gstwrappercamerabinsrc.c

index 5c08d0eb9b815a4e52cbc94a35b6901ac48fafe5..6023e442b004b8703d3b4d0e75d55502b3f8e1f6 100644 (file)
@@ -842,9 +842,13 @@ start_image_capture (GstWrapperCameraBinSrc * self)
     peer = gst_pad_get_peer (pad);
     gst_object_unref (pad);
     gst_pad_query (peer, gst_query_new_drain ());
-    gst_element_set_state (self->src_vid_src, GST_STATE_READY);
     gst_object_unref (peer);
 
+    self->image_renegotiate = FALSE;
+
+    g_mutex_unlock (&bcamsrc->capturing_mutex);
+    gst_element_set_state (self->src_vid_src, GST_STATE_READY);
+
     /* clean capsfilter caps so they don't interfere here */
     g_object_set (self->src_filter, "caps", NULL, NULL);
     if (self->src_zoom_filter)
@@ -862,8 +866,7 @@ start_image_capture (GstWrapperCameraBinSrc * self)
     /* We caught this event in the src pad event handler and now we want to
      * actually push it upstream */
     gst_pad_send_event (self->outsel_imgpad, gst_event_new_reconfigure ());
-
-    self->image_renegotiate = FALSE;
+    g_mutex_lock (&bcamsrc->capturing_mutex);
   }
 
   if (photography) {