[{"id":23441,"web_url":"https://patchwork.libcamera.org/comment/23441/","msgid":"<968393e3-eb82-a8ba-22e7-610b34217192@yoseli.org>","date":"2022-06-17T09:33:21","subject":"Re: [libcamera-devel] [PATCH v3 2/5] ipa: libipa: Add init()\n\tfunction to the Algorithm class","submitter":{"id":127,"url":"https://patchwork.libcamera.org/api/people/127/","name":"Jean-Michel Hautbois","email":"jeanmichel.hautbois@yoseli.org"},"content":"Hi Florian,\n\nThanks for the patch !\n\nOn 17/06/2022 11:23, Florian Sylvestre via libcamera-devel wrote:\n> Add the init() function that will be called during algorithm initialization\n> to provide each algorithm the list of algorithms tuning data.\n> Each algorithm will be responsible to grab their corresponding parameters.\n> \n> Signed-off-by: Florian Sylvestre <fsylvestre@baylibre.com>\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n> ---\n>   src/ipa/ipu3/algorithms/algorithm.h   |  8 +++++---\n>   src/ipa/libipa/algorithm.cpp          | 14 ++++++++++++++\n>   src/ipa/libipa/algorithm.h            | 11 +++++++++--\n>   src/ipa/rkisp1/algorithms/algorithm.h |  8 +++++---\n>   4 files changed, 33 insertions(+), 8 deletions(-)\n> \n> diff --git a/src/ipa/ipu3/algorithms/algorithm.h b/src/ipa/ipu3/algorithms/algorithm.h\n> index 234b2bd7..8b562e5b 100644\n> --- a/src/ipa/ipu3/algorithms/algorithm.h\n> +++ b/src/ipa/ipu3/algorithms/algorithm.h\n> @@ -15,11 +15,13 @@\n>   \n>   namespace libcamera {\n>   \n> +class YamlObject;\n> +\n>   namespace ipa::ipu3 {\n>   \n> -using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPAFrameContext,\n> -\t\t\t\t\t    IPAConfigInfo, ipu3_uapi_params,\n> -\t\t\t\t\t    ipu3_uapi_stats_3a>;\n> +using Algorithm = libcamera::ipa::Algorithm<IPAContext, YamlObject,\n> +\t\t\t\t\t    IPAFrameContext, IPAConfigInfo,\n> +\t\t\t\t\t    ipu3_uapi_params, ipu3_uapi_stats_3a>;\n>   \n>   } /* namespace ipa::ipu3 */\n>   \n> diff --git a/src/ipa/libipa/algorithm.cpp b/src/ipa/libipa/algorithm.cpp\n> index cce2ed62..f1b04160 100644\n> --- a/src/ipa/libipa/algorithm.cpp\n> +++ b/src/ipa/libipa/algorithm.cpp\n> @@ -29,6 +29,20 @@ namespace ipa {\n>    * to manage algorithms regardless of their specific type.\n>    */\n>   \n> +/**\n> + * \\fn Algorithm::init()\n> + * \\brief Configure the Algorithm with default parameters\n> + * \\param[in] context The shared IPA context\n> + * \\param[in] params The initial parameters used to tune algorithms\n\nThis is v3, sorry for not having said it before...\n\nI am a bit annoyed by this name, params, as it is already used for the \nparameters buffer in the prepare() call which does not contain the same \ntype of objects. What about tuningParams ?\n\n> + *\n> + * This function is called once, when the IPA module is initialized, to\n> + * initialize the algorithm. The \\a params YamlObject contains IPA module\n> + * parameters, typically tuning data for all algorithms. The Algorithm is\n> + * responsible for reading the parameters relevant to its configuration.\n> + *\n> + * \\return 0 if successful, an error code otherwise\n> + */\n> +\n>   /**\n>    * \\fn Algorithm::configure()\n>    * \\brief Configure the Algorithm given an IPAConfigInfo\n> diff --git a/src/ipa/libipa/algorithm.h b/src/ipa/libipa/algorithm.h\n> index 032a05b5..2945719e 100644\n> --- a/src/ipa/libipa/algorithm.h\n> +++ b/src/ipa/libipa/algorithm.h\n> @@ -10,13 +10,20 @@ namespace libcamera {\n>   \n>   namespace ipa {\n>   \n> -template<typename Context, typename FrameContext, typename Config,\n> -\t typename Params, typename Stats>\n> +template<typename Context, typename TuningData, typename FrameContext,\n> +\t typename Config, typename Params, typename Stats>\n> +\n>   class Algorithm\n>   {\n>   public:\n>   \tvirtual ~Algorithm() {}\n>   \n> +\tvirtual int init([[maybe_unused]] Context &context,\n> +\t\t\t [[maybe_unused]] const TuningData &params)\n> +\t{\n> +\t\treturn 0;\n> +\t}\n> +\n>   \tvirtual int configure([[maybe_unused]] Context &context,\n>   \t\t\t      [[maybe_unused]] const Config &configInfo)\n>   \t{\n> diff --git a/src/ipa/rkisp1/algorithms/algorithm.h b/src/ipa/rkisp1/algorithms/algorithm.h\n> index 68e3a44e..e813756d 100644\n> --- a/src/ipa/rkisp1/algorithms/algorithm.h\n> +++ b/src/ipa/rkisp1/algorithms/algorithm.h\n> @@ -17,11 +17,13 @@\n>   \n>   namespace libcamera {\n>   \n> +class YamlObject;\n> +\n>   namespace ipa::rkisp1 {\n>   \n> -using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPAFrameContext,\n> -\t\t\t\t\t    IPACameraSensorInfo, rkisp1_params_cfg,\n> -\t\t\t\t\t    rkisp1_stat_buffer>;\n> +using Algorithm = libcamera::ipa::Algorithm<IPAContext, YamlObject,\n> +\t\t\t\t\t    IPAFrameContext, IPACameraSensorInfo,\n> +\t\t\t\t\t    rkisp1_params_cfg, rkisp1_stat_buffer>;\n>   \n>   } /* namespace ipa::rkisp1 */\n>","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 127F0C3273\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 17 Jun 2022 09:39:52 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8A63B65638;\n\tFri, 17 Jun 2022 11:39:51 +0200 (CEST)","from relay11.mail.gandi.net (relay11.mail.gandi.net\n\t[217.70.178.231])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9088A60471\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 17 Jun 2022 11:33:22 +0200 (CEST)","(Authenticated sender: jeanmichel.hautbois@yoseli.org)\n\tby mail.gandi.net (Postfix) with ESMTPSA id 068B1100012;\n\tFri, 17 Jun 2022 09:33:21 +0000 (UTC)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1655458791;\n\tbh=eDl6+KSpWWOSENu2V4vF01c12JoXBat1CifH0+hTFtM=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=uEtiPSIMYx8Kx1K1bS6UWJGJuBNzgYzkdfiIhZNw8yB1cgLhIe7t8Agtfi0UaUD74\n\t2VZf6zbimJUYILysK+DUAtTXtzfzkXQdEDY0gJr4xy5sqf5rxLk0czMCydBIk+NVe2\n\tmXKkWpLJXlJ2d9HVw9hraS8VJSOS4nVvCBD1bgBgAud9G5jyVqwpyOAsSpltfSeQ8+\n\tvFHF/aDon/qc/Xv0CXIu/ilK+zNqlgsVg54Hpo0r3zDFmq5eDoDDHEj0NwKSqnNr84\n\tIbWxvsDE+evbGFi/eMCZnO/YHQfFDL2F13eCDXqa5fUh9qKGaSY+BjeYfq9xEqdAEw\n\t+TJwcd5J/S9iw==","v=1; a=rsa-sha256; c=relaxed/relaxed; d=yoseli.org; s=gm1;\n\tt=1655458402;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:mime-version:mime-version:content-type:content-type:\n\tcontent-transfer-encoding:content-transfer-encoding:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=zKr3ckHKHLcBClrndIdLCDoQ3Sx3Ce1p68MDbGxtscM=;\n\tb=diWWVGcSLkpiHHWeMwTQQ//5+rFzbTTu7LlGadDiiSkZRGprk2W/gCL12JbmVonmShDny2\n\tVWunPCJ7dfbIkcRvaDon1UJBhphFyauUyTkXod3VWSmdpcfG5DU3td2ooO3uX619fiobld\n\tH14R+gVpNPmFJiu4J6p9rkUfPkkLtxXvI2xjeaYTJNke8VlsseUJ/ISMoiAityQxINycCs\n\tf2xPBl3V0uniwlfdBouMl6YIFEA3QuLV8wOoFmyHgVb631B5ARDJziAX93izgiXJPfPLyC\n\tB9hLbb+fx4KacnrNMDxGIp3L+0+cs+c/Gkn8w7oSVPFiwplKCgcSyeaE2tl6lA=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=yoseli.org\n\theader.i=@yoseli.org header.b=\"diWWVGcS\"; \n\tdkim-atps=neutral","Message-ID":"<968393e3-eb82-a8ba-22e7-610b34217192@yoseli.org>","Date":"Fri, 17 Jun 2022 11:33:21 +0200","MIME-Version":"1.0","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101\n\tThunderbird/91.9.1","Content-Language":"en-US","To":"Florian Sylvestre <fsylvestre@baylibre.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20220617092315.120781-1-fsylvestre@baylibre.com>\n\t<20220617092315.120781-3-fsylvestre@baylibre.com>","In-Reply-To":"<20220617092315.120781-3-fsylvestre@baylibre.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","X-Mailman-Approved-At":"Fri, 17 Jun 2022 11:39:50 +0200","Subject":"Re: [libcamera-devel] [PATCH v3 2/5] ipa: libipa: Add init()\n\tfunction to the Algorithm class","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>","From":"Jean-Michel Hautbois via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Jean-Michel Hautbois <jeanmichel.hautbois@yoseli.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":23467,"web_url":"https://patchwork.libcamera.org/comment/23467/","msgid":"<Yqy6CZPWM5b0IQa2@pendragon.ideasonboard.com>","date":"2022-06-17T17:29:45","subject":"Re: [libcamera-devel] [PATCH v3 2/5] ipa: libipa: Add init()\n\tfunction to the Algorithm class","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Fri, Jun 17, 2022 at 11:33:21AM +0200, Jean-Michel Hautbois via libcamera-devel wrote:\n> Hi Florian,\n> \n> Thanks for the patch !\n> \n> On 17/06/2022 11:23, Florian Sylvestre via libcamera-devel wrote:\n> > Add the init() function that will be called during algorithm initialization\n> > to provide each algorithm the list of algorithms tuning data.\n> > Each algorithm will be responsible to grab their corresponding parameters.\n> > \n> > Signed-off-by: Florian Sylvestre <fsylvestre@baylibre.com>\n> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n> > ---\n> >   src/ipa/ipu3/algorithms/algorithm.h   |  8 +++++---\n> >   src/ipa/libipa/algorithm.cpp          | 14 ++++++++++++++\n> >   src/ipa/libipa/algorithm.h            | 11 +++++++++--\n> >   src/ipa/rkisp1/algorithms/algorithm.h |  8 +++++---\n> >   4 files changed, 33 insertions(+), 8 deletions(-)\n> > \n> > diff --git a/src/ipa/ipu3/algorithms/algorithm.h b/src/ipa/ipu3/algorithms/algorithm.h\n> > index 234b2bd7..8b562e5b 100644\n> > --- a/src/ipa/ipu3/algorithms/algorithm.h\n> > +++ b/src/ipa/ipu3/algorithms/algorithm.h\n> > @@ -15,11 +15,13 @@\n> >   \n> >   namespace libcamera {\n> >   \n> > +class YamlObject;\n> > +\n> >   namespace ipa::ipu3 {\n> >   \n> > -using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPAFrameContext,\n> > -\t\t\t\t\t    IPAConfigInfo, ipu3_uapi_params,\n> > -\t\t\t\t\t    ipu3_uapi_stats_3a>;\n> > +using Algorithm = libcamera::ipa::Algorithm<IPAContext, YamlObject,\n> > +\t\t\t\t\t    IPAFrameContext, IPAConfigInfo,\n> > +\t\t\t\t\t    ipu3_uapi_params, ipu3_uapi_stats_3a>;\n> >   \n> >   } /* namespace ipa::ipu3 */\n> >   \n> > diff --git a/src/ipa/libipa/algorithm.cpp b/src/ipa/libipa/algorithm.cpp\n> > index cce2ed62..f1b04160 100644\n> > --- a/src/ipa/libipa/algorithm.cpp\n> > +++ b/src/ipa/libipa/algorithm.cpp\n> > @@ -29,6 +29,20 @@ namespace ipa {\n> >    * to manage algorithms regardless of their specific type.\n> >    */\n> >   \n> > +/**\n> > + * \\fn Algorithm::init()\n> > + * \\brief Configure the Algorithm with default parameters\n> > + * \\param[in] context The shared IPA context\n> > + * \\param[in] params The initial parameters used to tune algorithms\n> \n> This is v3, sorry for not having said it before...\n> \n> I am a bit annoyed by this name, params, as it is already used for the \n> parameters buffer in the prepare() call which does not contain the same \n> type of objects. What about tuningParams ?\n\nOr, given that the type name is TuningData, maybe tuningData for the\nparameter name ?\n\n> > + *\n> > + * This function is called once, when the IPA module is initialized, to\n> > + * initialize the algorithm. The \\a params YamlObject contains IPA module\n> > + * parameters, typically tuning data for all algorithms. The Algorithm is\n> > + * responsible for reading the parameters relevant to its configuration.\n> > + *\n> > + * \\return 0 if successful, an error code otherwise\n> > + */\n> > +\n> >   /**\n> >    * \\fn Algorithm::configure()\n> >    * \\brief Configure the Algorithm given an IPAConfigInfo\n> > diff --git a/src/ipa/libipa/algorithm.h b/src/ipa/libipa/algorithm.h\n> > index 032a05b5..2945719e 100644\n> > --- a/src/ipa/libipa/algorithm.h\n> > +++ b/src/ipa/libipa/algorithm.h\n> > @@ -10,13 +10,20 @@ namespace libcamera {\n> >   \n> >   namespace ipa {\n> >   \n> > -template<typename Context, typename FrameContext, typename Config,\n> > -\t typename Params, typename Stats>\n> > +template<typename Context, typename TuningData, typename FrameContext,\n> > +\t typename Config, typename Params, typename Stats>\n> > +\n> >   class Algorithm\n> >   {\n> >   public:\n> >   \tvirtual ~Algorithm() {}\n> >   \n> > +\tvirtual int init([[maybe_unused]] Context &context,\n> > +\t\t\t [[maybe_unused]] const TuningData &params)\n> > +\t{\n> > +\t\treturn 0;\n> > +\t}\n> > +\n> >   \tvirtual int configure([[maybe_unused]] Context &context,\n> >   \t\t\t      [[maybe_unused]] const Config &configInfo)\n> >   \t{\n> > diff --git a/src/ipa/rkisp1/algorithms/algorithm.h b/src/ipa/rkisp1/algorithms/algorithm.h\n> > index 68e3a44e..e813756d 100644\n> > --- a/src/ipa/rkisp1/algorithms/algorithm.h\n> > +++ b/src/ipa/rkisp1/algorithms/algorithm.h\n> > @@ -17,11 +17,13 @@\n> >   \n> >   namespace libcamera {\n> >   \n> > +class YamlObject;\n> > +\n> >   namespace ipa::rkisp1 {\n> >   \n> > -using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPAFrameContext,\n> > -\t\t\t\t\t    IPACameraSensorInfo, rkisp1_params_cfg,\n> > -\t\t\t\t\t    rkisp1_stat_buffer>;\n> > +using Algorithm = libcamera::ipa::Algorithm<IPAContext, YamlObject,\n> > +\t\t\t\t\t    IPAFrameContext, IPACameraSensorInfo,\n> > +\t\t\t\t\t    rkisp1_params_cfg, rkisp1_stat_buffer>;\n> >   \n> >   } /* namespace ipa::rkisp1 */\n> >","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 BF825BD161\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 17 Jun 2022 17:30:00 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B77F765633;\n\tFri, 17 Jun 2022 19:29:59 +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 6951665632\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 17 Jun 2022 19:29:57 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id D1A69982;\n\tFri, 17 Jun 2022 19:29:56 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1655486999;\n\tbh=EbjKXbBpmBToIRv8Q5PmBea793Raszli7ijEmbseucA=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=FfzDXxDBVHLuYCeGk83i4JWnvBxFUfAl+peGpu8Sxt52EtbwM+qwWIdf7H3j4J1F2\n\tvlMz5HZHKddHfquHCe5GgmMrR0vXXasEgv91bKIH8Q/uCpIfRMxPEs2n+3XVscgkjg\n\tcRT3LCAGJAMFgD02LlTdxF2E9UBlt8amD9MnHDsZogIZTooZ8Y1+RVL6HJPtZKIXlN\n\tPxR7UP9k5AiQC9Z/uB8Lf7CVaEYKJ4te3U1kzE1ew0YCpf+kRqgtTNqAq9c2S0PGIH\n\tRTNojcPKcKW+TGozM0tIyaQZFXAp7/hQ0foArcyvtw6imo3EhUQjvttlMC6wV41Q1I\n\tU7mr0FTxDk7UQ==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1655486997;\n\tbh=EbjKXbBpmBToIRv8Q5PmBea793Raszli7ijEmbseucA=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=MYVdJMV8WEDGzfwGfKlTZUQREJEPRTU0fwpPl5+EhsQjU9KBL4h0Sdhq0NJIX19zj\n\t7/a2H/e/TMC8QE8hbL/FN3rH1pDf5rdIXyIpZL/3e5qKPC2WkuItu4pyp5EIh2wuRI\n\tBFuncRciUdJIN+OUZlgKI8vhIYnGBs1tYLAh5t4s="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"MYVdJMV8\"; dkim-atps=neutral","Date":"Fri, 17 Jun 2022 20:29:45 +0300","To":"Jean-Michel Hautbois <jeanmichel.hautbois@yoseli.org>","Message-ID":"<Yqy6CZPWM5b0IQa2@pendragon.ideasonboard.com>","References":"<20220617092315.120781-1-fsylvestre@baylibre.com>\n\t<20220617092315.120781-3-fsylvestre@baylibre.com>\n\t<968393e3-eb82-a8ba-22e7-610b34217192@yoseli.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<968393e3-eb82-a8ba-22e7-610b34217192@yoseli.org>","Subject":"Re: [libcamera-devel] [PATCH v3 2/5] ipa: libipa: Add init()\n\tfunction to the Algorithm class","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>","From":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]