v4l2: request 0 buffers when stopping
authorMichael Olbrich <m.olbrich@pengutronix.de>
Mon, 6 May 2013 14:54:02 +0000 (16:54 +0200)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Tue, 7 May 2013 14:39:41 +0000 (16:39 +0200)
Without this stopping the pool in *_set_caps() is useless.
S_FMT will still fail with EBUSY.

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

sys/v4l2/gstv4l2bufferpool.c

index fc5cf5a..3771b1c 100644 (file)
@@ -582,6 +582,19 @@ gst_v4l2_buffer_pool_stop (GstBufferPool * bpool)
   g_free (pool->buffers);
   pool->buffers = NULL;
 
+  if (pool->num_buffers > 0) {
+    struct v4l2_requestbuffers breq;
+    memset (&breq, 0, sizeof (struct v4l2_requestbuffers));
+    breq.type = obj->type;
+    breq.count = 0;
+    breq.memory = V4L2_MEMORY_MMAP;
+    if (v4l2_ioctl (pool->video_fd, VIDIOC_REQBUFS, &breq) < 0) {
+      GST_ERROR_OBJECT (pool, "error releasing buffers: %s",
+          g_strerror (errno));
+    }
+    pool->num_buffers = 0;
+  }
+
   return ret;
 
   /* ERRORS */