From ec169a1517317f696b1d764ed568dd6f67a6c128 Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Tue, 7 Jun 2016 12:41:19 -0400 Subject: [PATCH] v4l2src: Avoid decide allocation on active pool v4l2src will renegotiate only if the format have changed. As of now, it's not possible to change the allocationw without resetting the camera. To avoid unwanted side effect, simply keep the old allocation if no renegotiation is taking place. This fixes assertion and possible failures in USERPTR or DMABUF import mode (when using downstream pools). https://bugzilla.gnome.org/show_bug.cgi?id=754042 --- sys/v4l2/gstv4l2src.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/sys/v4l2/gstv4l2src.c b/sys/v4l2/gstv4l2src.c index 235eda471c..348ab7fbbd 100644 --- a/sys/v4l2/gstv4l2src.c +++ b/sys/v4l2/gstv4l2src.c @@ -489,6 +489,34 @@ gst_v4l2src_decide_allocation (GstBaseSrc * bsrc, GstQuery * query) ret = gst_v4l2src_set_format (src, caps); gst_caps_unref (caps); src->pending_set_fmt = FALSE; + } else if (gst_buffer_pool_is_active (src->v4l2object->pool)) { + /* Trick basesrc into not deactivating the active pool. Renegotiating here + * would otherwise turn off and on the camera. */ + GstAllocator *allocator; + GstAllocationParams params; + GstBufferPool *pool; + + gst_base_src_get_allocator (bsrc, &allocator, ¶ms); + pool = gst_base_src_get_buffer_pool (bsrc); + + if (gst_query_get_n_allocation_params (query)) + gst_query_set_nth_allocation_param (query, 0, allocator, ¶ms); + else + gst_query_add_allocation_param (query, allocator, ¶ms); + + if (gst_query_get_n_allocation_pools (query)) + gst_query_set_nth_allocation_pool (query, 0, pool, + src->v4l2object->info.size, 1, 0); + else + gst_query_add_allocation_pool (query, pool, src->v4l2object->info.size, 1, + 0); + + if (pool) + gst_object_unref (pool); + if (allocator) + gst_object_unref (allocator); + + return GST_BASE_SRC_CLASS (parent_class)->decide_allocation (bsrc, query); } if (ret) {