Commit 3df949c7 authored by Nicolas Dufresne's avatar Nicolas Dufresne Committed by Nicolas Dufresne

v4l2object: Don't share own pool if min exceed V4L2 capacity

If the minimum required buffer exceed V4L2 capacity, don't share down
pool. This allow support very high latency, like with x264enc default
encoding settings.

https://bugzilla.gnome.org/show_bug.cgi?id=732288
parent 010272a7
......@@ -3183,6 +3183,20 @@ gst_v4l2_object_decide_allocation (GstV4l2Object * obj, GstQuery * query)
can_share_own_pool = (has_video_meta || !obj->need_video_meta);
/* Certain driver may expose a minimum through controls */
ctl.id = V4L2_CID_MIN_BUFFERS_FOR_CAPTURE;
if (v4l2_ioctl (obj->video_fd, VIDIOC_G_CTRL, &ctl) >= 0) {
GST_DEBUG_OBJECT (obj->element, "driver require a minimum of %d buffers",
ctl.value);
obj->min_buffers_for_capture = ctl.value;
} else {
obj->min_buffers_for_capture = 0;
}
/* We can't share our own pool, if it exceed V4L2 capacity */
if (min + obj->min_buffers_for_capture + 1 > VIDEO_MAX_FRAME)
can_share_own_pool = FALSE;
/* select a pool */
switch (obj->mode) {
case GST_V4L2_IO_RW:
......@@ -3250,16 +3264,6 @@ gst_v4l2_object_decide_allocation (GstV4l2Object * obj, GstQuery * query)
if (size == 0)
goto no_size;
/* Certain driver may expose a minimum through controls */
ctl.id = V4L2_CID_MIN_BUFFERS_FOR_CAPTURE;
if (v4l2_ioctl (obj->video_fd, VIDIOC_G_CTRL, &ctl) >= 0) {
GST_DEBUG_OBJECT (obj->element, "driver require a minimum of %d buffers",
ctl.value);
obj->min_buffers_for_capture = ctl.value;
} else {
obj->min_buffers_for_capture = 0;
}
/* If pushing from our own pool, configure it with queried minimum,
* otherwise use the minimum required */
if (pushing_from_our_pool) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment