v4l2sink: Block in preroll_wait on unlock
authorOlivier CrĂȘte <olivier.crete@collabora.com>
Wed, 23 Nov 2016 17:17:55 +0000 (12:17 -0500)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Wed, 5 Apr 2017 13:05:03 +0000 (09:05 -0400)
The correct behaviour of anything stuck in the ->render() function
between ->unlock() and ->unlock_stop() is to call
gst_base_sink_wait_preroll() and only return an error if this returns an
error, otherwise, it must continue where it left off!

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

sys/v4l2/gstv4l2sink.c

index 1d457b5..3295947 100644 (file)
@@ -603,8 +603,16 @@ gst_v4l2sink_show_frame (GstVideoSink * vsink, GstBuffer * buf)
       goto activate_failed;
   }
 
+  gst_buffer_ref (buf);
+again:
   ret = gst_v4l2_buffer_pool_process (GST_V4L2_BUFFER_POOL_CAST (obj->pool),
       &buf);
+  if (ret == GST_FLOW_FLUSHING) {
+    ret = gst_base_sink_wait_preroll (GST_BASE_SINK (vsink));
+    if (ret == GST_FLOW_OK)
+      goto again;
+  }
+  gst_buffer_unref (buf);
 
   return ret;