[{"id":21612,"web_url":"https://patchwork.libcamera.org/comment/21612/","msgid":"<163880765627.995700.16649820976271624939@Monstersaurus>","date":"2021-12-06T16:20:56","subject":"Re: [libcamera-devel] [PATCH 2/2] libcamera: Use utils::abs_diff()","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Laurent Pinchart (2021-12-06 15:26:44)\n> Use the new utils::abs_diff() function where appropriate to replace\n> manual implementations.\n> \n> While at it fix a header ordering issue in\n> src/libcamera/pipeline/raspberrypi/raspberrypi.cpp.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nMuch tidier, and clearer (and ... safer?!)\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> ---\n>  src/ipa/ipu3/algorithms/agc.cpp                    | 3 ++-\n>  src/ipa/ipu3/ipu3.cpp                              | 4 ++--\n>  src/ipa/rkisp1/algorithms/agc.cpp                  | 3 ++-\n>  src/libcamera/pipeline/ipu3/imgu.cpp               | 4 ++--\n>  src/libcamera/pipeline/raspberrypi/raspberrypi.cpp | 5 ++---\n>  5 files changed, 10 insertions(+), 9 deletions(-)\n> \n> diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp\n> index 582f0ae1b54b..8d6f18f60aed 100644\n> --- a/src/ipa/ipu3/algorithms/agc.cpp\n> +++ b/src/ipa/ipu3/algorithms/agc.cpp\n> @@ -12,6 +12,7 @@\n>  #include <cmath>\n>  \n>  #include <libcamera/base/log.h>\n> +#include <libcamera/base/utils.h>\n>  \n>  #include <libcamera/ipa/core_ipa_interface.h>\n>  \n> @@ -188,7 +189,7 @@ void Agc::computeExposure(IPAFrameContext &frameContext, double yGain,\n>         double evGain = std::max(yGain, iqMeanGain);\n>  \n>         /* Consider within 1% of the target as correctly exposed */\n> -       if (std::abs(evGain - 1.0) < 0.01)\n> +       if (utils::abs_diff(evGain, 1.0) < 0.01)\n>                 LOG(IPU3Agc, Debug) << \"We are well exposed (evGain = \"\n>                                     << evGain << \")\";\n>  \n> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp\n> index 7618258725a8..3d30770867b9 100644\n> --- a/src/ipa/ipu3/ipu3.cpp\n> +++ b/src/ipa/ipu3/ipu3.cpp\n> @@ -354,7 +354,7 @@ void IPAIPU3::calculateBdsGrid(const Size &bdsOutputSize)\n>                                             kMaxGridWidth);\n>  \n>                 width = width << shift;\n> -               uint32_t error = std::abs(static_cast<int>(width - bdsOutputSize.width));\n> +               uint32_t error = utils::abs_diff(width, bdsOutputSize.width);\n>                 if (error >= minError)\n>                         continue;\n>  \n> @@ -370,7 +370,7 @@ void IPAIPU3::calculateBdsGrid(const Size &bdsOutputSize)\n>                                              kMaxGridHeight);\n>  \n>                 height = height << shift;\n> -               uint32_t error = std::abs(static_cast<int>(height - bdsOutputSize.height));\n> +               uint32_t error = utils::abs_diff(height, bdsOutputSize.height);\n>                 if (error >= minError)\n>                         continue;\n>  \n> diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp\n> index d6abdc310f35..dd97afc00813 100644\n> --- a/src/ipa/rkisp1/algorithms/agc.cpp\n> +++ b/src/ipa/rkisp1/algorithms/agc.cpp\n> @@ -12,6 +12,7 @@\n>  #include <cmath>\n>  \n>  #include <libcamera/base/log.h>\n> +#include <libcamera/base/utils.h>\n>  \n>  #include <libcamera/ipa/core_ipa_interface.h>\n>  \n> @@ -145,7 +146,7 @@ void Agc::computeExposure(IPAContext &context, double yGain)\n>                                           kMaxAnalogueGain);\n>  \n>         /* Consider within 1% of the target as correctly exposed. */\n> -       if (std::abs(yGain - 1.0) < 0.01)\n> +       if (utils::abs_diff(yGain, 1.0) < 0.01)\n>                 return;\n>  \n>         /* extracted from Rpi::Agc::computeTargetExposure. */\n> diff --git a/src/libcamera/pipeline/ipu3/imgu.cpp b/src/libcamera/pipeline/ipu3/imgu.cpp\n> index 3ef0ef144301..e5bbc3829c68 100644\n> --- a/src/libcamera/pipeline/ipu3/imgu.cpp\n> +++ b/src/libcamera/pipeline/ipu3/imgu.cpp\n> @@ -81,7 +81,7 @@ float findScaleFactor(float sf, const std::vector<float> &range,\n>         float bestDiff = std::numeric_limits<float>::max();\n>         unsigned int index = 0;\n>         for (unsigned int i = 0; i < range.size(); ++i) {\n> -               float diff = std::abs(sf - range[i]);\n> +               float diff = utils::abs_diff(sf, range[i]);\n>                 if (diff < bestDiff) {\n>                         bestDiff = diff;\n>                         index = i;\n> @@ -99,7 +99,7 @@ bool isSameRatio(const Size &in, const Size &out)\n>         float inRatio = static_cast<float>(in.width) / in.height;\n>         float outRatio = static_cast<float>(out.width) / out.height;\n>  \n> -       if (std::abs(inRatio - outRatio) > 0.1)\n> +       if (utils::abs_diff(inRatio, outRatio) > 0.1)\n>                 return false;\n>  \n>         return true;\n> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> index 321b72adbbf7..2cb0267ccf4c 100644\n> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> @@ -14,6 +14,7 @@\n>  #include <unordered_set>\n>  \n>  #include <libcamera/base/shared_fd.h>\n> +#include <libcamera/base/utils.h>\n>  \n>  #include <libcamera/camera.h>\n>  #include <libcamera/control_ids.h>\n> @@ -25,8 +26,6 @@\n>  #include <libcamera/property_ids.h>\n>  #include <libcamera/request.h>\n>  \n> -#include <libcamera/base/utils.h>\n> -\n>  #include <linux/bcm2835-isp.h>\n>  #include <linux/media-bus-format.h>\n>  #include <linux/videodev2.h>\n> @@ -154,7 +153,7 @@ V4L2SubdeviceFormat findBestFormat(const SensorFormats &formatsMap, const Size &\n>                         score += penaltyAr * scoreFormat(reqAr, fmtAr);\n>  \n>                         /* Add any penalties... this is not an exact science! */\n> -                       score += std::abs(static_cast<int>(info.bitsPerPixel - bitDepth)) * penaltyBitDepth;\n> +                       score += utils::abs_diff(info.bitsPerPixel, bitDepth) * penaltyBitDepth;\n>  \n>                         if (score <= bestScore) {\n>                                 bestScore = score;\n> -- \n> Regards,\n> \n> Laurent Pinchart\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 2E2D5BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  6 Dec 2021 16:21:02 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7AD30607DE;\n\tMon,  6 Dec 2021 17:21:01 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5F18460725\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  6 Dec 2021 17:20:59 +0100 (CET)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id EBDF0D89;\n\tMon,  6 Dec 2021 17:20:58 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"T0FYHu/k\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1638807659;\n\tbh=nfM1rayfH1WbXXIaCXIe/kc+Ju5+wMOu6kQKIZ0GB4A=;\n\th=In-Reply-To:References:Subject:From:To:Date:From;\n\tb=T0FYHu/kYOlFRQ1S6Rx+KdQTla8zgwUykNZKwFf5tk9+wrUwnq9F5mCUw7xR4/SZm\n\tBYN2Jy2imAup2orIMYCSXamf3frXHKyPV/Poz/sNphEBGa9OChsNfMfHQV9nnaqiGH\n\tk3KRuHT3I5fbTLWwris3IOayrHnuf536kJXQSx+w=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20211206152644.4863-3-laurent.pinchart@ideasonboard.com>","References":"<20211206152644.4863-1-laurent.pinchart@ideasonboard.com>\n\t<20211206152644.4863-3-laurent.pinchart@ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Mon, 06 Dec 2021 16:20:56 +0000","Message-ID":"<163880765627.995700.16649820976271624939@Monstersaurus>","User-Agent":"alot/0.10","Subject":"Re: [libcamera-devel] [PATCH 2/2] libcamera: Use utils::abs_diff()","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":21648,"web_url":"https://patchwork.libcamera.org/comment/21648/","msgid":"<afd77063-e7b8-e74d-d2e7-2278770119c5@ideasonboard.com>","date":"2021-12-07T16:11:42","subject":"Re: [libcamera-devel] [PATCH 2/2] libcamera: Use utils::abs_diff()","submitter":{"id":86,"url":"https://patchwork.libcamera.org/api/people/86/","name":"Umang Jain","email":"umang.jain@ideasonboard.com"},"content":"Hi Laurent,\n\nThank you for the patch\n\nOn 12/6/21 8:56 PM, Laurent Pinchart wrote:\n> Use the new utils::abs_diff() function where appropriate to replace\n> manual implementations.\n>\n> While at it fix a header ordering issue in\n> src/libcamera/pipeline/raspberrypi/raspberrypi.cpp.\n>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n\nReviewed-by: Umang Jain <umang.jain@ideasonboard.com>\n\n> ---\n>   src/ipa/ipu3/algorithms/agc.cpp                    | 3 ++-\n>   src/ipa/ipu3/ipu3.cpp                              | 4 ++--\n>   src/ipa/rkisp1/algorithms/agc.cpp                  | 3 ++-\n>   src/libcamera/pipeline/ipu3/imgu.cpp               | 4 ++--\n>   src/libcamera/pipeline/raspberrypi/raspberrypi.cpp | 5 ++---\n>   5 files changed, 10 insertions(+), 9 deletions(-)\n>\n> diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp\n> index 582f0ae1b54b..8d6f18f60aed 100644\n> --- a/src/ipa/ipu3/algorithms/agc.cpp\n> +++ b/src/ipa/ipu3/algorithms/agc.cpp\n> @@ -12,6 +12,7 @@\n>   #include <cmath>\n>   \n>   #include <libcamera/base/log.h>\n> +#include <libcamera/base/utils.h>\n>   \n>   #include <libcamera/ipa/core_ipa_interface.h>\n>   \n> @@ -188,7 +189,7 @@ void Agc::computeExposure(IPAFrameContext &frameContext, double yGain,\n>   \tdouble evGain = std::max(yGain, iqMeanGain);\n>   \n>   \t/* Consider within 1% of the target as correctly exposed */\n> -\tif (std::abs(evGain - 1.0) < 0.01)\n> +\tif (utils::abs_diff(evGain, 1.0) < 0.01)\n>   \t\tLOG(IPU3Agc, Debug) << \"We are well exposed (evGain = \"\n>   \t\t\t\t    << evGain << \")\";\n>   \n> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp\n> index 7618258725a8..3d30770867b9 100644\n> --- a/src/ipa/ipu3/ipu3.cpp\n> +++ b/src/ipa/ipu3/ipu3.cpp\n> @@ -354,7 +354,7 @@ void IPAIPU3::calculateBdsGrid(const Size &bdsOutputSize)\n>   \t\t\t\t\t    kMaxGridWidth);\n>   \n>   \t\twidth = width << shift;\n> -\t\tuint32_t error = std::abs(static_cast<int>(width - bdsOutputSize.width));\n> +\t\tuint32_t error = utils::abs_diff(width, bdsOutputSize.width);\n>   \t\tif (error >= minError)\n>   \t\t\tcontinue;\n>   \n> @@ -370,7 +370,7 @@ void IPAIPU3::calculateBdsGrid(const Size &bdsOutputSize)\n>   \t\t\t\t\t     kMaxGridHeight);\n>   \n>   \t\theight = height << shift;\n> -\t\tuint32_t error = std::abs(static_cast<int>(height - bdsOutputSize.height));\n> +\t\tuint32_t error = utils::abs_diff(height, bdsOutputSize.height);\n>   \t\tif (error >= minError)\n>   \t\t\tcontinue;\n>   \n> diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp\n> index d6abdc310f35..dd97afc00813 100644\n> --- a/src/ipa/rkisp1/algorithms/agc.cpp\n> +++ b/src/ipa/rkisp1/algorithms/agc.cpp\n> @@ -12,6 +12,7 @@\n>   #include <cmath>\n>   \n>   #include <libcamera/base/log.h>\n> +#include <libcamera/base/utils.h>\n>   \n>   #include <libcamera/ipa/core_ipa_interface.h>\n>   \n> @@ -145,7 +146,7 @@ void Agc::computeExposure(IPAContext &context, double yGain)\n>   \t\t\t\t\t  kMaxAnalogueGain);\n>   \n>   \t/* Consider within 1% of the target as correctly exposed. */\n> -\tif (std::abs(yGain - 1.0) < 0.01)\n> +\tif (utils::abs_diff(yGain, 1.0) < 0.01)\n>   \t\treturn;\n>   \n>   \t/* extracted from Rpi::Agc::computeTargetExposure. */\n> diff --git a/src/libcamera/pipeline/ipu3/imgu.cpp b/src/libcamera/pipeline/ipu3/imgu.cpp\n> index 3ef0ef144301..e5bbc3829c68 100644\n> --- a/src/libcamera/pipeline/ipu3/imgu.cpp\n> +++ b/src/libcamera/pipeline/ipu3/imgu.cpp\n> @@ -81,7 +81,7 @@ float findScaleFactor(float sf, const std::vector<float> &range,\n>   \tfloat bestDiff = std::numeric_limits<float>::max();\n>   \tunsigned int index = 0;\n>   \tfor (unsigned int i = 0; i < range.size(); ++i) {\n> -\t\tfloat diff = std::abs(sf - range[i]);\n> +\t\tfloat diff = utils::abs_diff(sf, range[i]);\n>   \t\tif (diff < bestDiff) {\n>   \t\t\tbestDiff = diff;\n>   \t\t\tindex = i;\n> @@ -99,7 +99,7 @@ bool isSameRatio(const Size &in, const Size &out)\n>   \tfloat inRatio = static_cast<float>(in.width) / in.height;\n>   \tfloat outRatio = static_cast<float>(out.width) / out.height;\n>   \n> -\tif (std::abs(inRatio - outRatio) > 0.1)\n> +\tif (utils::abs_diff(inRatio, outRatio) > 0.1)\n>   \t\treturn false;\n>   \n>   \treturn true;\n> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> index 321b72adbbf7..2cb0267ccf4c 100644\n> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> @@ -14,6 +14,7 @@\n>   #include <unordered_set>\n>   \n>   #include <libcamera/base/shared_fd.h>\n> +#include <libcamera/base/utils.h>\n>   \n>   #include <libcamera/camera.h>\n>   #include <libcamera/control_ids.h>\n> @@ -25,8 +26,6 @@\n>   #include <libcamera/property_ids.h>\n>   #include <libcamera/request.h>\n>   \n> -#include <libcamera/base/utils.h>\n> -\n>   #include <linux/bcm2835-isp.h>\n>   #include <linux/media-bus-format.h>\n>   #include <linux/videodev2.h>\n> @@ -154,7 +153,7 @@ V4L2SubdeviceFormat findBestFormat(const SensorFormats &formatsMap, const Size &\n>   \t\t\tscore += penaltyAr * scoreFormat(reqAr, fmtAr);\n>   \n>   \t\t\t/* Add any penalties... this is not an exact science! */\n> -\t\t\tscore += std::abs(static_cast<int>(info.bitsPerPixel - bitDepth)) * penaltyBitDepth;\n> +\t\t\tscore += utils::abs_diff(info.bitsPerPixel, bitDepth) * penaltyBitDepth;\n>   \n>   \t\t\tif (score <= bestScore) {\n>   \t\t\t\tbestScore = score;","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 3574EBF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  7 Dec 2021 16:11:50 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 6FC3860872;\n\tTue,  7 Dec 2021 17:11:49 +0100 (CET)","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 D3D0E60592\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  7 Dec 2021 17:11:48 +0100 (CET)","from [IPv6:2401:4900:1f3e:16f1:4e1b:f869:54d4:8c0c] (unknown\n\t[IPv6:2401:4900:1f3e:16f1:4e1b:f869:54d4:8c0c])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 7AED2556;\n\tTue,  7 Dec 2021 17:11:47 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"hPJPIa0T\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1638893508;\n\tbh=Vu+8OerTrEv+846cycDT7MGgOd9eRrGTV3lysupIwJ0=;\n\th=Subject:To:References:From:Date:In-Reply-To:From;\n\tb=hPJPIa0TQP7ZEhh0QnhU9DJoG3hhJQquitTyIiLlo8rewvT/v76V+wNkfTupt75Lo\n\tazy8q5W0Bs8c+iNMx5EWpIqGMSxoR4HkBXg5zdZLnTx36hL13NdIu9Gi8xpWKEQhhL\n\tc56jC30r6vprPb//X++iZRcoOJv+Z5WeF/k61AI4=","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20211206152644.4863-1-laurent.pinchart@ideasonboard.com>\n\t<20211206152644.4863-3-laurent.pinchart@ideasonboard.com>","From":"Umang Jain <umang.jain@ideasonboard.com>","Message-ID":"<afd77063-e7b8-e74d-d2e7-2278770119c5@ideasonboard.com>","Date":"Tue, 7 Dec 2021 21:41:42 +0530","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101\n\tThunderbird/78.10.2","MIME-Version":"1.0","In-Reply-To":"<20211206152644.4863-3-laurent.pinchart@ideasonboard.com>","Content-Type":"text/plain; charset=utf-8; format=flowed","Content-Transfer-Encoding":"7bit","Content-Language":"en-US","Subject":"Re: [libcamera-devel] [PATCH 2/2] libcamera: Use utils::abs_diff()","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>"}}]