[EXT] [PATCH 4/4] gstreamer: Reduce indentation in gst_libcamera_create_video_pool()

Qi Hou qi.hou at nxp.com
Fri May 23 07:58:36 CEST 2025


Hi,

> -----Original Message-----
> From: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> Sent: 2025年5月22日 20:55
> To: libcamera-devel at lists.libcamera.org
> Cc: Qi Hou <qi.hou at nxp.com>; Nicolas Dufresne
> <nicolas.dufresne at collabora.com>
> Subject: [EXT] [PATCH 4/4] gstreamer: Reduce indentation in
> gst_libcamera_create_video_pool()
> 
> Caution: This is an external email. Please take care when clicking links or
> opening attachments. When in doubt, report the message using the 'Report
> this email' button
> 
> 
> 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.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
>  src/gstreamer/gstlibcamerasrc.cpp | 50 ++++++++++++++-----------------
>  1 file changed, 23 insertions(+), 27 deletions(-)
> 
> diff --git a/src/gstreamer/gstlibcamerasrc.cpp
> b/src/gstreamer/gstlibcamerasrc.cpp
> index 380f8368af8b..e0eb6e7b4227 100644
> --- a/src/gstreamer/gstlibcamerasrc.cpp
> +++ b/src/gstreamer/gstlibcamerasrc.cpp
> @@ -528,47 +528,43 @@ gst_libcamera_create_video_pool(GstLibcameraSrc
> *self,  {
>         g_autoptr(GstQuery) query = NULL;
>         const gboolean need_pool = true;
> -       gboolean has_video_meta = false;
>         GstBufferPool *video_pool = NULL;
> 
>         gst_libcamera_extrapolate_info(info, stream_cfg.stride);
> 
>         query = gst_query_new_allocation(caps, need_pool);
> -       if (!gst_pad_peer_query(srcpad, query))
> +       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);
> +               return { NULL, 0 };
> +       }

I think the failure of gst_pad_peer_query() is not a problem, because connected plugin such as filesink does not provide propose_allocation(). This case is like that of query success but downstream doesn't support videometa. Both require creating internal video pool.

Regards,
Qi Hou

> 
> -       if (!has_video_meta) {
> -               GstBufferPool *pool = NULL;
> +       if (gst_query_find_allocation_meta(query,
> GST_VIDEO_META_API_TYPE, NULL))
> +               return { NULL, 0 };
> 
> -               if (gst_query_get_n_allocation_pools(query) > 0)
> -                       gst_query_parse_nth_allocation_pool(query, 0,
> &pool, NULL, NULL, NULL);
> +       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.");
> +       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 };
>         }
> 
>         return { video_pool, 0 };
> --
> Regards,
> 
> Laurent Pinchart



More information about the libcamera-devel mailing list