[PATCH v2 3/7] gstreamer: Reduce indentation in gst_libcamera_create_video_pool()

Nicolas Dufresne nicolas.dufresne at collabora.com
Wed Jun 4 19:11:21 CEST 2025


Le mercredi 04 juin 2025 à 16:07 +0300, Laurent Pinchart a écrit :
> Now that video pool creation is handled by a dedicated function, the
> logic can be simplified by returning early instead of nesting scopes. Do
> so to decrease indentation and improve readability, and document the
> implementation of the function with comments.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> Reviewed-by: Nicolas Dufresne <nicolas.dufresne at collabora.com>

Ack.

> ---
> Changes since v1:
> 
> - Fixed regression that didn't allocate a pool when the peer allocation
>   can't be queried
> - Document the implementation of the gst_libcamera_create_video_pool()
>   function with comments
> ---
>  src/gstreamer/gstlibcamerasrc.cpp | 57 ++++++++++++++++---------------
>  1 file changed, 30 insertions(+), 27 deletions(-)
> 
> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp
> index 79b94c7ee7c2..b907a5759740 100644
> --- a/src/gstreamer/gstlibcamerasrc.cpp
> +++ b/src/gstreamer/gstlibcamerasrc.cpp
> @@ -543,45 +543,48 @@ gst_libcamera_create_video_pool(GstLibcameraSrc *self, GstPad *srcpad,
>  {
>  	GstQuery *query = NULL;
>  	const gboolean need_pool = true;
> -	gboolean has_video_meta = false;
>  	GstBufferPool *video_pool = NULL;
>  
> +	/*
> +	 * Get the peer allocation hints to check if it supports the meta API.
> +	 * If so, the stride will be negotiated, and there's no need to create a
> +	 * video pool.
> +	 */
>  	query = gst_query_new_allocation(caps, need_pool);
> +
>  	if (!gst_pad_peer_query(srcpad, query))
>  		GST_DEBUG_OBJECT(self, "Didn't get downstream ALLOCATION hints");
> -	else
> -		has_video_meta = gst_query_find_allocation_meta(query, GST_VIDEO_META_API_TYPE, NULL);
> +	else if (gst_query_find_allocation_meta(query, GST_VIDEO_META_API_TYPE, NULL))
> +		return { NULL, 0 };
>  
> -	if (!has_video_meta) {
> -		GstBufferPool *pool = NULL;
> +	GST_WARNING_OBJECT(self, "Downstream doesn't support video meta, need to copy frame.");
>  
> -		if (gst_query_get_n_allocation_pools(query) > 0)
> -			gst_query_parse_nth_allocation_pool(query, 0, &pool, NULL, NULL, NULL);
> +	/*
> +	 * If the allocation query has pools, use the first one. Otherwise,
> +	 * create a new pool.
> +	 */
> +	if (gst_query_get_n_allocation_pools(query) > 0)
> +		gst_query_parse_nth_allocation_pool(query, 0, &video_pool, NULL, NULL, NULL);
>  
> -		if (pool)
> -			video_pool = pool;
> -		else {
> -			GstStructure *config;
> -			guint min_buffers = 3;
> -			video_pool = gst_video_buffer_pool_new();
> +	if (!video_pool) {
> +		GstStructure *config;
> +		guint min_buffers = 3;
>  
> -			config = gst_buffer_pool_get_config(video_pool);
> -			gst_buffer_pool_config_set_params(config, caps, info->size, min_buffers, 0);
> +		video_pool = gst_video_buffer_pool_new();
> +		config = gst_buffer_pool_get_config(video_pool);
> +		gst_buffer_pool_config_set_params(config, caps, info->size, min_buffers, 0);
>  
> -			GST_DEBUG_OBJECT(self, "Own pool config is %" GST_PTR_FORMAT, config);
> +		GST_DEBUG_OBJECT(self, "Own pool config is %" GST_PTR_FORMAT, config);
>  
> -			gst_buffer_pool_set_config(GST_BUFFER_POOL_CAST(video_pool), config);
> -		}
> +		gst_buffer_pool_set_config(GST_BUFFER_POOL_CAST(video_pool), config);
> +	}
>  
> -		GST_WARNING_OBJECT(self, "Downstream doesn't support video meta, need to copy frame.");
> -
> -		if (!gst_buffer_pool_set_active(video_pool, true)) {
> -			gst_caps_unref(caps);
> -			GST_ELEMENT_ERROR(self, RESOURCE, SETTINGS,
> -					  ("Failed to active buffer pool"),
> -					  ("gst_libcamera_src_negotiate() failed."));
> -			return { NULL, -EINVAL };
> -		}
> +	if (!gst_buffer_pool_set_active(video_pool, true)) {
> +		gst_caps_unref(caps);
> +		GST_ELEMENT_ERROR(self, RESOURCE, SETTINGS,
> +				  ("Failed to active buffer pool"),
> +				  ("gst_libcamera_src_negotiate() failed."));
> +		return { NULL, -EINVAL };
>  	}
>  
>  	gst_query_unref(query);


More information about the libcamera-devel mailing list