v4l2: Fix RW io mode
authorNicolas Dufresne <nicolas.dufresne@collabora.co.uk>
Sun, 7 Dec 2014 22:27:37 +0000 (17:27 -0500)
committerNicolas Dufresne <nicolas.dufresne@collabora.co.uk>
Sun, 7 Dec 2014 22:42:48 +0000 (17:42 -0500)
In RW, allocator can be null, max_buffers can be zero, and we need not
to wait while the queue is empty since there is no queue.

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

sys/v4l2/gstv4l2bufferpool.c

index 55d3a10..f901051 100644 (file)
@@ -473,7 +473,8 @@ gst_v4l2_buffer_pool_set_config (GstBufferPool * bpool, GstStructure * config)
       can_allocate = GST_V4L2_ALLOCATOR_CAN_ALLOCATE (pool->vallocator, DMABUF);
       break;
     case GST_V4L2_IO_RW:
-      pool->allocator = g_object_ref (allocator);
+      if (allocator)
+        pool->allocator = g_object_ref (allocator);
       pool->params = params;
       /* No need to change the configuration */
       goto done;
@@ -741,7 +742,7 @@ gst_v4l2_buffer_pool_start (GstBufferPool * bpool)
   pool->min_latency = min_latency;
   pool->num_queued = 0;
 
-  if (max_buffers < min_buffers)
+  if (max_buffers != 0 && max_buffers < min_buffers)
     max_buffers = min_buffers;
 
   gst_buffer_pool_config_set_params (config, caps, size, min_buffers,
@@ -957,10 +958,14 @@ gst_v4l2_buffer_pool_poll (GstV4l2BufferPool * pool)
 {
   gint ret;
 
-  GST_OBJECT_LOCK (pool);
-  while (pool->empty)
-    g_cond_wait (&pool->empty_cond, GST_OBJECT_GET_LOCK (pool));
-  GST_OBJECT_UNLOCK (pool);
+  /* In RW mode there is no queue, hence no need to wait while the queue is
+   * empty */
+  if (pool->obj->mode != GST_V4L2_IO_RW) {
+    GST_OBJECT_LOCK (pool);
+    while (pool->empty)
+      g_cond_wait (&pool->empty_cond, GST_OBJECT_GET_LOCK (pool));
+    GST_OBJECT_UNLOCK (pool);
+  }
 
   if (!pool->can_poll_device)
     goto done;