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
This commit is contained in:
Nicolas Dufresne 2014-07-08 14:31:59 -04:00 committed by Nicolas Dufresne
parent 010272a796
commit 3df949c745

View file

@ -3183,6 +3183,20 @@ gst_v4l2_object_decide_allocation (GstV4l2Object * obj, GstQuery * query)
can_share_own_pool = (has_video_meta || !obj->need_video_meta); 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 */ /* select a pool */
switch (obj->mode) { switch (obj->mode) {
case GST_V4L2_IO_RW: case GST_V4L2_IO_RW:
@ -3250,16 +3264,6 @@ gst_v4l2_object_decide_allocation (GstV4l2Object * obj, GstQuery * query)
if (size == 0) if (size == 0)
goto no_size; 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, /* If pushing from our own pool, configure it with queried minimum,
* otherwise use the minimum required */ * otherwise use the minimum required */
if (pushing_from_our_pool) { if (pushing_from_our_pool) {