[{"id":34339,"web_url":"https://patchwork.libcamera.org/comment/34339/","msgid":"<90cf1579f3b13d83766247a1c1f94ea40507e24f.camel@collabora.com>","date":"2025-05-22T17:34:57","subject":"Re: [PATCH 2/4] gstreamer: Factor out video pool creation","submitter":{"id":31,"url":"https://patchwork.libcamera.org/api/people/31/","name":"Nicolas Dufresne","email":"nicolas.dufresne@collabora.com"},"content":"Hi,\n\nLe jeudi 22 mai 2025 à 14:55 +0200, Laurent Pinchart a écrit :\n> The gst_libcamera_src_negotiate() function uses 5 identation levels,\n> causing long lines. Move video pool creation to a separate function to\n> increase readability.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  src/gstreamer/gstlibcamerasrc.cpp | 105 +++++++++++++++++-------------\n>  1 file changed, 61 insertions(+), 44 deletions(-)\n> \n> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\n> index 70bb0606c72c..71f5700d9de7 100644\n> --- a/src/gstreamer/gstlibcamerasrc.cpp\n> +++ b/src/gstreamer/gstlibcamerasrc.cpp\n> @@ -29,6 +29,7 @@\n>  \n>  #include <atomic>\n>  #include <queue>\n> +#include <tuple>\n>  #include <vector>\n>  \n>  #include <libcamera/camera.h>\n> @@ -519,6 +520,61 @@ gst_libcamera_src_open(GstLibcameraSrc *self)\n>  \treturn true;\n>  }\n>  \n> +static std::tuple<GstBufferPool *, int>\n\nEither document the return values, or drop the tuple. Note that I prefer the\nsecond since there is no value added in the usage of tuple, since it has only\none error code which always imply a nullptr pool pointer. Being a private\nhelper, it can be extended later.\n\n> +gst_libcamera_create_video_pool(GstLibcameraSrc *self,\n> +\t\t\t\tconst StreamConfiguration &stream_cfg,\n> +\t\t\t\tGstVideoInfo *info, GstPad *srcpad,\n> +\t\t\t\tGstCaps *caps)\n> +{\n> +\tGstQuery *query = NULL;\n> +\tconst gboolean need_pool = true;\n> +\tgboolean has_video_meta = false;\n> +\tGstBufferPool *video_pool = NULL;\n\nOops, NULL started to re-appear, when I wrote the initial version I was asked to\nturn them all into nullptr instead. It might be a good moment to fix it, of course\nseparate from the refactoring.\n\n> +\n> +\tgst_libcamera_extrapolate_info(info, stream_cfg.stride);\n> +\n> +\tquery = gst_query_new_allocation(caps, need_pool);\n> +\tif (!gst_pad_peer_query(srcpad, query))\n> +\t\tGST_DEBUG_OBJECT(self, \"Didn't get downstream ALLOCATION hints\");\n> +\telse\n> +\t\thas_video_meta = gst_query_find_allocation_meta(query, GST_VIDEO_META_API_TYPE, NULL);\n> +\n> +\tif (!has_video_meta) {\n> +\t\tGstBufferPool *pool = NULL;\n> +\n> +\t\tif (gst_query_get_n_allocation_pools(query) > 0)\n> +\t\t\tgst_query_parse_nth_allocation_pool(query, 0, &pool, NULL, NULL, NULL);\n> +\n> +\t\tif (pool)\n> +\t\t\tvideo_pool = pool;\n> +\t\telse {\n> +\t\t\tGstStructure *config;\n> +\t\t\tguint min_buffers = 3;\n> +\t\t\tvideo_pool = gst_video_buffer_pool_new();\n> +\n> +\t\t\tconfig = gst_buffer_pool_get_config(video_pool);\n> +\t\t\tgst_buffer_pool_config_set_params(config, caps, info->size, min_buffers, 0);\n> +\n> +\t\t\tGST_DEBUG_OBJECT(self, \"Own pool config is %\" GST_PTR_FORMAT, config);\n> +\n> +\t\t\tgst_buffer_pool_set_config(GST_BUFFER_POOL_CAST(video_pool), config);\n> +\t\t}\n> +\n> +\t\tGST_WARNING_OBJECT(self, \"Downstream doesn't support video meta, need to copy frame.\");\n> +\n> +\t\tif (!gst_buffer_pool_set_active(video_pool, true)) {\n> +\t\t\tgst_caps_unref(caps);\n> +\t\t\tGST_ELEMENT_ERROR(self, RESOURCE, SETTINGS,\n> +\t\t\t\t\t  (\"Failed to active buffer pool\"),\n> +\t\t\t\t\t  (\"gst_libcamera_src_negotiate() failed.\"));\n> +\t\t\treturn { NULL, -EINVAL };\n> +\t\t}\n> +\t}\n> +\n> +\tgst_query_unref(query);\n> +\treturn { video_pool, 0 };\n> +}\n> +\n>  /* Must be called with stream_lock held. */\n>  static bool\n>  gst_libcamera_src_negotiate(GstLibcameraSrc *self)\n> @@ -601,50 +657,11 @@ gst_libcamera_src_negotiate(GstLibcameraSrc *self)\n>  \t\t/* Stride mismatch between camera stride and that calculated by video-info. */\n>  \t\tif (static_cast<unsigned int>(info.stride[0]) != stream_cfg.stride &&\n>  \t\t    GST_VIDEO_INFO_FORMAT(&info) != GST_VIDEO_FORMAT_ENCODED) {\n> -\t\t\tGstQuery *query = NULL;\n> -\t\t\tconst gboolean need_pool = true;\n> -\t\t\tgboolean has_video_meta = false;\n> -\n> -\t\t\tgst_libcamera_extrapolate_info(&info, stream_cfg.stride);\n> -\n> -\t\t\tquery = gst_query_new_allocation(caps, need_pool);\n> -\t\t\tif (!gst_pad_peer_query(srcpad, query))\n> -\t\t\t\tGST_DEBUG_OBJECT(self, \"Didn't get downstream ALLOCATION hints\");\n> -\t\t\telse\n> -\t\t\t\thas_video_meta = gst_query_find_allocation_meta(query, GST_VIDEO_META_API_TYPE,\n> NULL);\n> -\n> -\t\t\tif (!has_video_meta) {\n> -\t\t\t\tGstBufferPool *pool = NULL;\n> -\n> -\t\t\t\tif (gst_query_get_n_allocation_pools(query) > 0)\n> -\t\t\t\t\tgst_query_parse_nth_allocation_pool(query, 0, &pool, NULL, NULL, NULL);\n> -\n> -\t\t\t\tif (pool)\n> -\t\t\t\t\tvideo_pool = pool;\n> -\t\t\t\telse {\n> -\t\t\t\t\tGstStructure *config;\n> -\t\t\t\t\tguint min_buffers = 3;\n> -\t\t\t\t\tvideo_pool = gst_video_buffer_pool_new();\n> -\n> -\t\t\t\t\tconfig = gst_buffer_pool_get_config(video_pool);\n> -\t\t\t\t\tgst_buffer_pool_config_set_params(config, caps, info.size, min_buffers, 0);\n> -\n> -\t\t\t\t\tGST_DEBUG_OBJECT(self, \"Own pool config is %\" GST_PTR_FORMAT, config);\n> -\n> -\t\t\t\t\tgst_buffer_pool_set_config(GST_BUFFER_POOL_CAST(video_pool), config);\n> -\t\t\t\t}\n> -\n> -\t\t\t\tGST_WARNING_OBJECT(self, \"Downstream doesn't support video meta, need to copy\n> frame.\");\n> -\n> -\t\t\t\tif (!gst_buffer_pool_set_active(video_pool, true)) {\n> -\t\t\t\t\tgst_caps_unref(caps);\n> -\t\t\t\t\tGST_ELEMENT_ERROR(self, RESOURCE, SETTINGS,\n> -\t\t\t\t\t\t\t  (\"Failed to active buffer pool\"),\n> -\t\t\t\t\t\t\t  (\"gst_libcamera_src_negotiate() failed.\"));\n> -\t\t\t\t\treturn false;\n> -\t\t\t\t}\n> -\t\t\t}\n> -\t\t\tgst_query_unref(query);\n> +\t\t\tstd::tie(video_pool, ret) =\n> +\t\t\t\tgst_libcamera_create_video_pool(self, stream_cfg,\n> +\t\t\t\t\t\t\t\t&info, srcpad, caps);\n> +\t\t\tif (ret)\n> +\t\t\t\treturn false;\n\nThis is good improvement otherwise.\n\nReviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n\nregards,\nNicolas\n\n>  \t\t}\n>  \n>  \t\tGstLibcameraPool *pool = gst_libcamera_pool_new(self->allocator,","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 72F87BD78E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 22 May 2025 17:35:08 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 3C6D568D8B;\n\tThu, 22 May 2025 19:35:07 +0200 (CEST)","from bali.collaboradmins.com (bali.collaboradmins.com\n\t[148.251.105.195])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9C1AF68D8B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 22 May 2025 19:35:05 +0200 (CEST)","from [IPv6:2606:6d00:17:b2fc::5ac] (unknown\n\t[IPv6:2606:6d00:17:b2fc::5ac])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\tkey-exchange X25519 server-signature RSA-PSS (4096 bits)\n\tserver-digest SHA256)\n\t(No client certificate requested) (Authenticated sender: nicolas)\n\tby bali.collaboradmins.com (Postfix) with ESMTPSA id 84DA917E157A;\n\tThu, 22 May 2025 19:35:04 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=collabora.com header.i=@collabora.com\n\theader.b=\"jVRL3cqy\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com;\n\ts=mail; t=1747935305;\n\tbh=BQBOAe0KljpDj9MHV3GsZPtpXTWgTfWzFiT9fMQpSMI=;\n\th=Subject:From:To:Cc:Date:In-Reply-To:References:From;\n\tb=jVRL3cqy5sMAnA8OTAKDM0QLDIyIMeCs11oG49OAhm5jJ7pUPaI50vkwMZbA1PNv0\n\t+HHGsCe3rd3wloARw1hNMWRt91sGNJSjDYRo+b9H2b1eOL0CZMHVRKom7YweTQiP9D\n\tc2tD6YBbUdrgzKxyJw83FhxHEYadYE6Sl/1pwYR7WWCZWRxOusRBuV9tucuCVkOK0F\n\tGn3WMZGRxLTO4r9K4/6ly88lvDYLzAA/ecJjH8w93xL5QSwUlHURYv++B+FTlpz/3m\n\tnF5dLxjyQjoiytWEC1+vkAJX9vT1Nkq6/vK0ivl6eVl2eVITf8qdNF2a61dnTuHRLo\n\tqdaWlDwJYbl/A==","Message-ID":"<90cf1579f3b13d83766247a1c1f94ea40507e24f.camel@collabora.com>","Subject":"Re: [PATCH 2/4] gstreamer: Factor out video pool creation","From":"Nicolas Dufresne <nicolas.dufresne@collabora.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>, \n\tlibcamera-devel@lists.libcamera.org","Cc":"Hou Qi <qi.hou@nxp.com>","Date":"Thu, 22 May 2025 13:34:57 -0400","In-Reply-To":"<20250522125521.6465-3-laurent.pinchart@ideasonboard.com>","References":"<20250522125521.6465-1-laurent.pinchart@ideasonboard.com>\n\t<20250522125521.6465-3-laurent.pinchart@ideasonboard.com>","Organization":"Collabora Canada","Content-Type":"text/plain; charset=\"UTF-8\"","User-Agent":"Evolution 3.56.1 (3.56.1-1.fc42) ","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":34403,"web_url":"https://patchwork.libcamera.org/comment/34403/","msgid":"<20250603232331.GA29935@pendragon.ideasonboard.com>","date":"2025-06-03T23:23:31","subject":"Re: [PATCH 2/4] gstreamer: Factor out video pool creation","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Thu, May 22, 2025 at 01:34:57PM -0400, Nicolas Dufresne wrote:\n> \n> Hi,\n> \n> Le jeudi 22 mai 2025 à 14:55 +0200, Laurent Pinchart a écrit :\n> > The gst_libcamera_src_negotiate() function uses 5 identation levels,\n> > causing long lines. Move video pool creation to a separate function to\n> > increase readability.\n> > \n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > ---\n> >  src/gstreamer/gstlibcamerasrc.cpp | 105 +++++++++++++++++-------------\n> >  1 file changed, 61 insertions(+), 44 deletions(-)\n> > \n> > diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\n> > index 70bb0606c72c..71f5700d9de7 100644\n> > --- a/src/gstreamer/gstlibcamerasrc.cpp\n> > +++ b/src/gstreamer/gstlibcamerasrc.cpp\n> > @@ -29,6 +29,7 @@\n> >  \n> >  #include <atomic>\n> >  #include <queue>\n> > +#include <tuple>\n> >  #include <vector>\n> >  \n> >  #include <libcamera/camera.h>\n> > @@ -519,6 +520,61 @@ gst_libcamera_src_open(GstLibcameraSrc *self)\n> >  \treturn true;\n> >  }\n> >  \n> > +static std::tuple<GstBufferPool *, int>\n> \n> Either document the return values, or drop the tuple. Note that I prefer the\n> second since there is no value added in the usage of tuple, since it has only\n> one error code which always imply a nullptr pool pointer. Being a private\n> helper, it can be extended later.\n\nAs discussed in patch 4/4, the error code is needed. I will document the\nfunction, but you'll see from the documentation in v2 that I don't fully\nunderstand what it does :-)\n\n> > +gst_libcamera_create_video_pool(GstLibcameraSrc *self,\n> > +\t\t\t\tconst StreamConfiguration &stream_cfg,\n> > +\t\t\t\tGstVideoInfo *info, GstPad *srcpad,\n> > +\t\t\t\tGstCaps *caps)\n> > +{\n> > +\tGstQuery *query = NULL;\n> > +\tconst gboolean need_pool = true;\n> > +\tgboolean has_video_meta = false;\n> > +\tGstBufferPool *video_pool = NULL;\n> \n> Oops, NULL started to re-appear, when I wrote the initial version I was asked to\n> turn them all into nullptr instead. It might be a good moment to fix it, of course\n> separate from the refactoring.\n\nOK, I'll do so.\n\n> > +\n> > +\tgst_libcamera_extrapolate_info(info, stream_cfg.stride);\n> > +\n> > +\tquery = gst_query_new_allocation(caps, need_pool);\n> > +\tif (!gst_pad_peer_query(srcpad, query))\n> > +\t\tGST_DEBUG_OBJECT(self, \"Didn't get downstream ALLOCATION hints\");\n> > +\telse\n> > +\t\thas_video_meta = gst_query_find_allocation_meta(query, GST_VIDEO_META_API_TYPE, NULL);\n> > +\n> > +\tif (!has_video_meta) {\n> > +\t\tGstBufferPool *pool = NULL;\n> > +\n> > +\t\tif (gst_query_get_n_allocation_pools(query) > 0)\n> > +\t\t\tgst_query_parse_nth_allocation_pool(query, 0, &pool, NULL, NULL, NULL);\n> > +\n> > +\t\tif (pool)\n> > +\t\t\tvideo_pool = pool;\n> > +\t\telse {\n> > +\t\t\tGstStructure *config;\n> > +\t\t\tguint min_buffers = 3;\n> > +\t\t\tvideo_pool = gst_video_buffer_pool_new();\n> > +\n> > +\t\t\tconfig = gst_buffer_pool_get_config(video_pool);\n> > +\t\t\tgst_buffer_pool_config_set_params(config, caps, info->size, min_buffers, 0);\n> > +\n> > +\t\t\tGST_DEBUG_OBJECT(self, \"Own pool config is %\" GST_PTR_FORMAT, config);\n> > +\n> > +\t\t\tgst_buffer_pool_set_config(GST_BUFFER_POOL_CAST(video_pool), config);\n> > +\t\t}\n> > +\n> > +\t\tGST_WARNING_OBJECT(self, \"Downstream doesn't support video meta, need to copy frame.\");\n> > +\n> > +\t\tif (!gst_buffer_pool_set_active(video_pool, true)) {\n> > +\t\t\tgst_caps_unref(caps);\n\nI think this is a but. I'll add a new patch in v2 to fix it.\n\n> > +\t\t\tGST_ELEMENT_ERROR(self, RESOURCE, SETTINGS,\n> > +\t\t\t\t\t  (\"Failed to active buffer pool\"),\n> > +\t\t\t\t\t  (\"gst_libcamera_src_negotiate() failed.\"));\n> > +\t\t\treturn { NULL, -EINVAL };\n> > +\t\t}\n> > +\t}\n> > +\n> > +\tgst_query_unref(query);\n> > +\treturn { video_pool, 0 };\n> > +}\n> > +\n> >  /* Must be called with stream_lock held. */\n> >  static bool\n> >  gst_libcamera_src_negotiate(GstLibcameraSrc *self)\n> > @@ -601,50 +657,11 @@ gst_libcamera_src_negotiate(GstLibcameraSrc *self)\n> >  \t\t/* Stride mismatch between camera stride and that calculated by video-info. */\n> >  \t\tif (static_cast<unsigned int>(info.stride[0]) != stream_cfg.stride &&\n> >  \t\t    GST_VIDEO_INFO_FORMAT(&info) != GST_VIDEO_FORMAT_ENCODED) {\n> > -\t\t\tGstQuery *query = NULL;\n> > -\t\t\tconst gboolean need_pool = true;\n> > -\t\t\tgboolean has_video_meta = false;\n> > -\n> > -\t\t\tgst_libcamera_extrapolate_info(&info, stream_cfg.stride);\n> > -\n> > -\t\t\tquery = gst_query_new_allocation(caps, need_pool);\n> > -\t\t\tif (!gst_pad_peer_query(srcpad, query))\n> > -\t\t\t\tGST_DEBUG_OBJECT(self, \"Didn't get downstream ALLOCATION hints\");\n> > -\t\t\telse\n> > -\t\t\t\thas_video_meta = gst_query_find_allocation_meta(query, GST_VIDEO_META_API_TYPE, NULL);\n> > -\n> > -\t\t\tif (!has_video_meta) {\n> > -\t\t\t\tGstBufferPool *pool = NULL;\n> > -\n> > -\t\t\t\tif (gst_query_get_n_allocation_pools(query) > 0)\n> > -\t\t\t\t\tgst_query_parse_nth_allocation_pool(query, 0, &pool, NULL, NULL, NULL);\n> > -\n> > -\t\t\t\tif (pool)\n> > -\t\t\t\t\tvideo_pool = pool;\n> > -\t\t\t\telse {\n> > -\t\t\t\t\tGstStructure *config;\n> > -\t\t\t\t\tguint min_buffers = 3;\n> > -\t\t\t\t\tvideo_pool = gst_video_buffer_pool_new();\n> > -\n> > -\t\t\t\t\tconfig = gst_buffer_pool_get_config(video_pool);\n> > -\t\t\t\t\tgst_buffer_pool_config_set_params(config, caps, info.size, min_buffers, 0);\n> > -\n> > -\t\t\t\t\tGST_DEBUG_OBJECT(self, \"Own pool config is %\" GST_PTR_FORMAT, config);\n> > -\n> > -\t\t\t\t\tgst_buffer_pool_set_config(GST_BUFFER_POOL_CAST(video_pool), config);\n> > -\t\t\t\t}\n> > -\n> > -\t\t\t\tGST_WARNING_OBJECT(self, \"Downstream doesn't support video meta, need to copy frame.\");\n> > -\n> > -\t\t\t\tif (!gst_buffer_pool_set_active(video_pool, true)) {\n> > -\t\t\t\t\tgst_caps_unref(caps);\n> > -\t\t\t\t\tGST_ELEMENT_ERROR(self, RESOURCE, SETTINGS,\n> > -\t\t\t\t\t\t\t  (\"Failed to active buffer pool\"),\n> > -\t\t\t\t\t\t\t  (\"gst_libcamera_src_negotiate() failed.\"));\n> > -\t\t\t\t\treturn false;\n> > -\t\t\t\t}\n> > -\t\t\t}\n> > -\t\t\tgst_query_unref(query);\n> > +\t\t\tstd::tie(video_pool, ret) =\n> > +\t\t\t\tgst_libcamera_create_video_pool(self, stream_cfg,\n> > +\t\t\t\t\t\t\t\t&info, srcpad, caps);\n> > +\t\t\tif (ret)\n> > +\t\t\t\treturn false;\n> \n> This is good improvement otherwise.\n> \n> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n> \n> >  \t\t}\n> >  \n> >  \t\tGstLibcameraPool *pool = gst_libcamera_pool_new(self->allocator,","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 2A2F9C31E9\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  3 Jun 2025 23:23:46 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B2DFC68DAB;\n\tWed,  4 Jun 2025 01:23:44 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 39B6C61869\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  4 Jun 2025 01:23:42 +0200 (CEST)","from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi\n\t[81.175.209.231])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 63CD3E8A;\n\tWed,  4 Jun 2025 01:23:39 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"NK8safM9\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1748993019;\n\tbh=Fclw9R3ctE5CH5wyU8u/WZyW6LWojf6IeZedfUqyEeg=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=NK8safM93Zca+LJKMbcJwXjr5BqmZuBDJD9EJibLQZlQpwr5N1CJKk72deELiec2Y\n\tUkKCg3Y+EUWRFrLFr3PeJkrmgJakutSrtICSRDALRH8T37O91wFtzhUzww/gkEsFgN\n\tfUUiUBRUPk80ZEBeGcwSL2St+CQoc7lSgYJz5588=","Date":"Wed, 4 Jun 2025 02:23:31 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Nicolas Dufresne <nicolas.dufresne@collabora.com>","Cc":"libcamera-devel@lists.libcamera.org, Hou Qi <qi.hou@nxp.com>","Subject":"Re: [PATCH 2/4] gstreamer: Factor out video pool creation","Message-ID":"<20250603232331.GA29935@pendragon.ideasonboard.com>","References":"<20250522125521.6465-1-laurent.pinchart@ideasonboard.com>\n\t<20250522125521.6465-3-laurent.pinchart@ideasonboard.com>\n\t<90cf1579f3b13d83766247a1c1f94ea40507e24f.camel@collabora.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<90cf1579f3b13d83766247a1c1f94ea40507e24f.camel@collabora.com>","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]