camerabin2: Flush downstream after setting src to READY
authorNicolas Dufresne <nicolas.dufresne@collabora.co.uk>
Mon, 7 Jul 2014 15:52:18 +0000 (11:52 -0400)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Thu, 10 Jul 2014 22:34:21 +0000 (18:34 -0400)
v4l2src requires all buffers to come back in order to cleanly stop
streaming. Flushing the pipline should force all buffers to come
back.

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

gst/camerabin2/gstwrappercamerabinsrc.c

index c2111a0b7e5b47791dcd2bf35fb015170a84fce5..48ec28f23a9a419fec5014f5bc7586d375f6f97b 100644 (file)
@@ -826,10 +826,22 @@ start_image_capture (GstWrapperCameraBinSrc * self)
       GST_TYPE_PHOTOGRAPHY);
   gboolean ret = FALSE;
   GstCaps *caps;
+  GstPad *pad, *peer;
 
   GST_DEBUG_OBJECT (self, "Starting image capture");
   gst_element_set_state (self->src_vid_src, GST_STATE_READY);
 
+  /* FIXME - V4L2 source will not close the device until all buffers have came
+   * back. Flushing the pipeline, will ensure it's properly closed, and that
+   * setting it back to PLAYING will work. This is more a workaround then a
+   * solution to buffer reclaiming. */
+  pad = gst_element_get_static_pad (self->src_vid_src, "src");
+  peer = gst_pad_get_peer (pad);
+  gst_object_unref (pad);
+  gst_pad_send_event (peer, gst_event_new_flush_start ());
+  gst_pad_send_event (peer, gst_event_new_flush_stop (TRUE));
+  gst_object_unref (peer);
+
   if (self->image_renegotiate) {
     /* clean capsfilter caps so they don't interfere here */
     g_object_set (self->src_filter, "caps", NULL, NULL);