From 3afec4dd0167e6abd4aa145a043200885acc15f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Zanelli?= Date: Thu, 4 Sep 2014 18:35:46 +0200 Subject: [PATCH] v4l2: set min_latency for output device according to required minimum number of buffers Since we can get the minimum number of buffers needed by an output device to work, use it to set min_latency which will determine how many buffers are queued. https://bugzilla.gnome.org/show_bug.cgi?id=736072 --- sys/v4l2/gstv4l2bufferpool.c | 6 ++++-- sys/v4l2/gstv4l2object.c | 7 +++++-- sys/v4l2/gstv4l2object.h | 3 +++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/sys/v4l2/gstv4l2bufferpool.c b/sys/v4l2/gstv4l2bufferpool.c index 8851571f9f..d00d123e82 100644 --- a/sys/v4l2/gstv4l2bufferpool.c +++ b/sys/v4l2/gstv4l2bufferpool.c @@ -623,8 +623,10 @@ gst_v4l2_buffer_pool_start (GstBufferPool * bpool) &max_buffers)) goto wrong_config; - /* TODO Also consider min_buffers_for_output when implemented */ - min_latency = MAX (GST_V4L2_MIN_BUFFERS, obj->min_buffers_for_capture); + if (V4L2_TYPE_IS_OUTPUT (obj->type)) + min_latency = MAX (GST_V4L2_MIN_BUFFERS, obj->min_buffers_for_output); + else + min_latency = MAX (GST_V4L2_MIN_BUFFERS, obj->min_buffers_for_capture); switch (obj->mode) { case GST_V4L2_IO_RW: diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c index 8021490d2b..9073a48ecd 100644 --- a/sys/v4l2/gstv4l2object.c +++ b/sys/v4l2/gstv4l2object.c @@ -3472,10 +3472,13 @@ gst_v4l2_object_propose_allocation (GstV4l2Object * obj, GstQuery * query) if (v4l2_ioctl (obj->video_fd, VIDIOC_G_CTRL, &ctl) >= 0) { GST_DEBUG_OBJECT (obj->element, "driver require a miminum of %d buffers", ctl.value); - - min = MAX (ctl.value, GST_V4L2_MIN_BUFFERS); + obj->min_buffers_for_output = ctl.value; + } else { + obj->min_buffers_for_output = 0; } + min = MAX (obj->min_buffers_for_output, GST_V4L2_MIN_BUFFERS); + gst_query_add_allocation_pool (query, pool, size, min, max); /* we also support various metadata */ diff --git a/sys/v4l2/gstv4l2object.h b/sys/v4l2/gstv4l2object.h index c13cd64568..141f62df79 100644 --- a/sys/v4l2/gstv4l2object.h +++ b/sys/v4l2/gstv4l2object.h @@ -121,6 +121,9 @@ struct _GstV4l2Object { * calculate the minimum latency of a m2m decoder. */ guint32 min_buffers_for_capture; + /* This will be set if supported in propose allocation. */ + guint32 min_buffers_for_output; + /* wanted mode */ GstV4l2IOMode req_mode;