[{"id":38195,"web_url":"https://patchwork.libcamera.org/comment/38195/","msgid":"<848ffe8c-158f-4ef8-aa0f-adcf4d5004a6@ideasonboard.com>","date":"2026-02-13T09:15:59","subject":"Re: [PATCH v2 2/4] libcamera: Replace iterators with range-based for\n\tloops","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"2026. 02. 12. 16:12 keltezéssel, Laurent Pinchart írta:\n> Use range-based for loops instead of iterators when iterating over a\n> container. This improves readability.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n\nReviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n\n\n>   include/libcamera/base/utils.h       |  8 ++---\n>   src/gstreamer/gstlibcamera-utils.cpp | 50 +++++++++++-----------------\n>   src/ipa/rpi/controller/rpi/agc.cpp   |  4 +--\n>   3 files changed, 26 insertions(+), 36 deletions(-)\n> \n> diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h\n> index 4373bc20d42e..37f0d065f82f 100644\n> --- a/include/libcamera/base/utils.h\n> +++ b/include/libcamera/base/utils.h\n> @@ -110,13 +110,13 @@ std::string join(const Container &items, const std::string &sep, UnaryOp op)\n>   \tstd::ostringstream ss;\n>   \tbool first = true;\n>   \n> -\tfor (auto it = std::begin(items); it != std::end(items); ++it) {\n> +\tfor (const auto &item : items) {\n>   \t\tif (!first)\n>   \t\t\tss << sep;\n>   \t\telse\n>   \t\t\tfirst = false;\n>   \n> -\t\tss << op(*it);\n> +\t\tss << op(item);\n>   \t}\n>   \n>   \treturn ss.str();\n> @@ -128,13 +128,13 @@ std::string join(const Container &items, const std::string &sep)\n>   \tstd::ostringstream ss;\n>   \tbool first = true;\n>   \n> -\tfor (auto it = std::begin(items); it != std::end(items); ++it) {\n> +\tfor (const auto &item : items) {\n>   \t\tif (!first)\n>   \t\t\tss << sep;\n>   \t\telse\n>   \t\t\tfirst = false;\n>   \n> -\t\tss << *it;\n> +\t\tss << item;\n>   \t}\n>   \n>   \treturn ss.str();\n> diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp\n> index bfb094c94641..6541d478c83d 100644\n> --- a/src/gstreamer/gstlibcamera-utils.cpp\n> +++ b/src/gstreamer/gstlibcamera-utils.cpp\n> @@ -749,10 +749,9 @@ int gst_libcamera_set_structure_field(GstStructure *structure, const ControlId *\n>   \tswitch (value.type()) {\n>   \tcase ControlTypeBool:\n>   \t\tif (is_array) {\n> -\t\t\tSpan<const bool> data = value.get<Span<const bool>>();\n> -\t\t\tfor (auto it = data.begin(); it != data.end(); ++it) {\n> +\t\t\tfor (const auto &item : value.get<Span<const bool>>()) {\n>   \t\t\t\tg_value_init(&x, type);\n> -\t\t\t\tg_value_set_boolean(&x, *it);\n> +\t\t\t\tg_value_set_boolean(&x, item);\n>   \t\t\t\tgst_value_array_append_and_take_value(&v, &x);\n>   \t\t\t}\n>   \t\t} else {\n> @@ -762,10 +761,9 @@ int gst_libcamera_set_structure_field(GstStructure *structure, const ControlId *\n>   \t\tbreak;\n>   \tcase ControlTypeByte:\n>   \t\tif (is_array) {\n> -\t\t\tSpan<const uint8_t> data = value.get<Span<const uint8_t>>();\n> -\t\t\tfor (auto it = data.begin(); it != data.end(); ++it) {\n> +\t\t\tfor (const auto &item : value.get<Span<const uint8_t>>()) {\n>   \t\t\t\tg_value_init(&x, type);\n> -\t\t\t\tg_value_set_uint(&x, *it);\n> +\t\t\t\tg_value_set_uint(&x, item);\n>   \t\t\t\tgst_value_array_append_and_take_value(&v, &x);\n>   \t\t\t}\n>   \t\t} else {\n> @@ -775,10 +773,9 @@ int gst_libcamera_set_structure_field(GstStructure *structure, const ControlId *\n>   \t\tbreak;\n>   \tcase ControlTypeUnsigned16:\n>   \t\tif (is_array) {\n> -\t\t\tSpan<const uint16_t> data = value.get<Span<const uint16_t>>();\n> -\t\t\tfor (auto it = data.begin(); it != data.end(); ++it) {\n> +\t\t\tfor (const auto &item : value.get<Span<const uint16_t>>()) {\n>   \t\t\t\tg_value_init(&x, type);\n> -\t\t\t\tg_value_set_uint(&x, *it);\n> +\t\t\t\tg_value_set_uint(&x, item);\n>   \t\t\t\tgst_value_array_append_and_take_value(&v, &x);\n>   \t\t\t}\n>   \t\t} else {\n> @@ -788,10 +785,9 @@ int gst_libcamera_set_structure_field(GstStructure *structure, const ControlId *\n>   \t\tbreak;\n>   \tcase ControlTypeUnsigned32:\n>   \t\tif (is_array) {\n> -\t\t\tSpan<const uint32_t> data = value.get<Span<const uint32_t>>();\n> -\t\t\tfor (auto it = data.begin(); it != data.end(); ++it) {\n> +\t\t\tfor (const auto &item : value.get<Span<const uint32_t>>()) {\n>   \t\t\t\tg_value_init(&x, type);\n> -\t\t\t\tg_value_set_uint(&x, *it);\n> +\t\t\t\tg_value_set_uint(&x, item);\n>   \t\t\t\tgst_value_array_append_and_take_value(&v, &x);\n>   \t\t\t}\n>   \t\t} else {\n> @@ -801,10 +797,9 @@ int gst_libcamera_set_structure_field(GstStructure *structure, const ControlId *\n>   \t\tbreak;\n>   \tcase ControlTypeInteger32:\n>   \t\tif (is_array) {\n> -\t\t\tSpan<const int32_t> data = value.get<Span<const int32_t>>();\n> -\t\t\tfor (auto it = data.begin(); it != data.end(); ++it) {\n> +\t\t\tfor (const auto &item : value.get<Span<const int32_t>>()) {\n>   \t\t\t\tg_value_init(&x, type);\n> -\t\t\t\tg_value_set_int(&x, *it);\n> +\t\t\t\tg_value_set_int(&x, item);\n>   \t\t\t\tgst_value_array_append_and_take_value(&v, &x);\n>   \t\t\t}\n>   \t\t} else {\n> @@ -827,10 +822,9 @@ int gst_libcamera_set_structure_field(GstStructure *structure, const ControlId *\n>   \t\tbreak;\n>   \tcase ControlTypeInteger64:\n>   \t\tif (is_array) {\n> -\t\t\tSpan<const int64_t> data = value.get<Span<const int64_t>>();\n> -\t\t\tfor (auto it = data.begin(); it != data.end(); ++it) {\n> +\t\t\tfor (const auto &item : value.get<Span<const int64_t>>()) {\n>   \t\t\t\tg_value_init(&x, type);\n> -\t\t\t\tg_value_set_int64(&x, *it);\n> +\t\t\t\tg_value_set_int64(&x, item);\n>   \t\t\t\tgst_value_array_append_and_take_value(&v, &x);\n>   \t\t\t}\n>   \t\t} else {\n> @@ -840,10 +834,9 @@ int gst_libcamera_set_structure_field(GstStructure *structure, const ControlId *\n>   \t\tbreak;\n>   \tcase ControlTypeFloat:\n>   \t\tif (is_array) {\n> -\t\t\tSpan<const float> data = value.get<Span<const float>>();\n> -\t\t\tfor (auto it = data.begin(); it != data.end(); ++it) {\n> +\t\t\tfor (const auto &item : value.get<Span<const float>>()) {\n>   \t\t\t\tg_value_init(&x, type);\n> -\t\t\t\tg_value_set_float(&x, *it);\n> +\t\t\t\tg_value_set_float(&x, item);\n>   \t\t\t\tgst_value_array_append_and_take_value(&v, &x);\n>   \t\t\t}\n>   \t\t} else {\n> @@ -862,27 +855,24 @@ int gst_libcamera_set_structure_field(GstStructure *structure, const ControlId *\n>   \t\tbreak;\n>   \tcase ControlTypeSize:\n>   \t\tif (is_array) {\n> -\t\t\tSpan<const Size> data = value.get<Span<const Size>>();\n> -\t\t\tfor (auto it = data.begin(); it != data.end(); ++it)\n> -\t\t\t\tgst_libcamera_gvalue_set_size(&v, *it);\n> +\t\t\tfor (const auto &item : value.get<Span<const Size>>())\n> +\t\t\t\tgst_libcamera_gvalue_set_size(&v, item);\n>   \t\t} else {\n>   \t\t\tgst_libcamera_gvalue_set_size(&v, value.get<const Size>());\n>   \t\t}\n>   \t\tbreak;\n>   \tcase ControlTypePoint:\n>   \t\tif (is_array) {\n> -\t\t\tSpan<const Point> data = value.get<Span<const Point>>();\n> -\t\t\tfor (auto it = data.begin(); it != data.end(); ++it)\n> -\t\t\t\tgst_libcamera_gvalue_set_point(&v, *it);\n> +\t\t\tfor (const auto &item : value.get<Span<const Point>>())\n> +\t\t\t\tgst_libcamera_gvalue_set_point(&v, item);\n>   \t\t} else {\n>   \t\t\tgst_libcamera_gvalue_set_point(&v, value.get<const Point>());\n>   \t\t}\n>   \t\tbreak;\n>   \tcase ControlTypeRectangle:\n>   \t\tif (is_array) {\n> -\t\t\tSpan<const Rectangle> data = value.get<Span<const Rectangle>>();\n> -\t\t\tfor (auto it = data.begin(); it != data.end(); ++it)\n> -\t\t\t\tgst_libcamera_gvalue_set_rectangle(&v, *it);\n> +\t\t\tfor (const auto &item : value.get<Span<const Rectangle>>())\n> +\t\t\t\tgst_libcamera_gvalue_set_rectangle(&v, item);\n>   \t\t} else {\n>   \t\t\tgst_libcamera_gvalue_set_rectangle(&v, value.get<const Rectangle>());\n>   \t\t}\n> diff --git a/src/ipa/rpi/controller/rpi/agc.cpp b/src/ipa/rpi/controller/rpi/agc.cpp\n> index afda2e364f64..a8d91f43df29 100644\n> --- a/src/ipa/rpi/controller/rpi/agc.cpp\n> +++ b/src/ipa/rpi/controller/rpi/agc.cpp\n> @@ -45,10 +45,10 @@ int Agc::read(const libcamera::YamlObject &params)\n>   \t}\n>   \n>   \tconst auto &channels = params[\"channels\"].asList();\n> -\tfor (auto ch = channels.begin(); ch != channels.end(); ch++) {\n> +\tfor (const auto &ch : channels) {\n>   \t\tLOG(RPiAgc, Debug) << \"Read AGC channel\";\n>   \t\tchannelData_.emplace_back();\n> -\t\tint ret = channelData_.back().channel.read(*ch, getHardwareConfig());\n> +\t\tint ret = channelData_.back().channel.read(ch, getHardwareConfig());\n>   \t\tif (ret)\n>   \t\t\treturn ret;\n>   \t}","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 3C0A0BD78E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 13 Feb 2026 09:16:04 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E2E88621E7;\n\tFri, 13 Feb 2026 10:16:03 +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 8BCB2621CD\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 13 Feb 2026 10:16:00 +0100 (CET)","from [192.168.33.67] (185.221.141.206.nat.pool.zt.hu\n\t[185.221.141.206])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id EAE64DDE;\n\tFri, 13 Feb 2026 10:15:11 +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=\"KBK38ZJQ\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1770974112;\n\tbh=k3+w0w6Ss4toh+XNwrVWszq6xSlm0G3rOOIik/LNNis=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=KBK38ZJQZECtCoazpmEXLs4h1pCz+d7f0EXWrfmGl6HAmgKADLgyg7yDtvyHOLu4r\n\tb27JQ6D78qmAlR/25p5UAlNKk7+KWHQmquGJ9emU9DSk44UqVEP5CT4r2LstIEgfV9\n\taJmqemexFER6bO9qwQS6tK7yWvk4x4KA7b0IrNe4=","Message-ID":"<848ffe8c-158f-4ef8-aa0f-adcf4d5004a6@ideasonboard.com>","Date":"Fri, 13 Feb 2026 10:15:59 +0100","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v2 2/4] libcamera: Replace iterators with range-based for\n\tloops","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20260212151238.3736234-1-laurent.pinchart@ideasonboard.com>\n\t<20260212151238.3736234-3-laurent.pinchart@ideasonboard.com>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<20260212151238.3736234-3-laurent.pinchart@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","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":38318,"web_url":"https://patchwork.libcamera.org/comment/38318/","msgid":"<177247329386.3877752.675470803973166989@t16>","date":"2026-03-02T17:41:33","subject":"Re: [PATCH v2 2/4] libcamera: Replace iterators with range-based for\n\tloops","submitter":{"id":215,"url":"https://patchwork.libcamera.org/api/people/215/","name":"Isaac Scott","email":"isaac.scott@ideasonboard.com"},"content":"Hi Laurent,\n\nThank you for the patch!\n\nQuoting Laurent Pinchart (2026-02-12 15:12:36)\n> Use range-based for loops instead of iterators when iterating over a\n> container. This improves readability.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  include/libcamera/base/utils.h       |  8 ++---\n>  src/gstreamer/gstlibcamera-utils.cpp | 50 +++++++++++-----------------\n>  src/ipa/rpi/controller/rpi/agc.cpp   |  4 +--\n>  3 files changed, 26 insertions(+), 36 deletions(-)\n> \n> diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h\n> index 4373bc20d42e..37f0d065f82f 100644\n> --- a/include/libcamera/base/utils.h\n> +++ b/include/libcamera/base/utils.h\n\n<snip>\n\n> @@ -862,27 +855,24 @@ int gst_libcamera_set_structure_field(GstStructure *structure, const ControlId *\n>                 break;\n>         case ControlTypeSize:\n>                 if (is_array) {\n> -                       Span<const Size> data = value.get<Span<const Size>>();\n> -                       for (auto it = data.begin(); it != data.end(); ++it)\n> -                               gst_libcamera_gvalue_set_size(&v, *it);\n> +                       for (const auto &item : value.get<Span<const Size>>())\n> +                               gst_libcamera_gvalue_set_size(&v, item);\n>                 } else {\n>                         gst_libcamera_gvalue_set_size(&v, value.get<const Size>());\n>                 }\n>                 break;\n>         case ControlTypePoint:\n>                 if (is_array) {\n> -                       Span<const Point> data = value.get<Span<const Point>>();\n> -                       for (auto it = data.begin(); it != data.end(); ++it)\n> -                               gst_libcamera_gvalue_set_point(&v, *it);\n> +                       for (const auto &item : value.get<Span<const Point>>())\n> +                               gst_libcamera_gvalue_set_point(&v, item);\n>                 } else {\n>                         gst_libcamera_gvalue_set_point(&v, value.get<const Point>());\n>                 }\n>                 break;\n>         case ControlTypeRectangle:\n>                 if (is_array) {\n> -                       Span<const Rectangle> data = value.get<Span<const Rectangle>>();\n> -                       for (auto it = data.begin(); it != data.end(); ++it)\n> -                               gst_libcamera_gvalue_set_rectangle(&v, *it);\n> +                       for (const auto &item : value.get<Span<const Rectangle>>())\n> +                               gst_libcamera_gvalue_set_rectangle(&v, item);\n>                 } else {\n>                         gst_libcamera_gvalue_set_rectangle(&v, value.get<const Rectangle>());\n>                 }\n> diff --git a/src/ipa/rpi/controller/rpi/agc.cpp b/src/ipa/rpi/controller/rpi/agc.cpp\n> index afda2e364f64..a8d91f43df29 100644\n> --- a/src/ipa/rpi/controller/rpi/agc.cpp\n> +++ b/src/ipa/rpi/controller/rpi/agc.cpp\n> @@ -45,10 +45,10 @@ int Agc::read(const libcamera::YamlObject &params)\n>         }\n>  \n>         const auto &channels = params[\"channels\"].asList();\n> -       for (auto ch = channels.begin(); ch != channels.end(); ch++) {\n> +       for (const auto &ch : channels) {\n>                 LOG(RPiAgc, Debug) << \"Read AGC channel\";\n>                 channelData_.emplace_back();\n> -               int ret = channelData_.back().channel.read(*ch, getHardwareConfig());\n> +               int ret = channelData_.back().channel.read(ch, getHardwareConfig());\n\nReviewed-by: Isaac Scott <isaac.scott@ideasonboard.com>\n\nBest wishes,\nIsaac\n\n>                 if (ret)\n>                         return ret;\n>         }\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 DFD49BE086\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  2 Mar 2026 17:41:39 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 341B862381;\n\tMon,  2 Mar 2026 18:41:39 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6D9FC62080\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  2 Mar 2026 18:41:37 +0100 (CET)","from thinkpad.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 0ACBB986;\n\tMon,  2 Mar 2026 18:40:35 +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=\"rBSoWL5e\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1772473236;\n\tbh=LIYYfXzKOK2LyJ5s2JwbwjFP2qVzeXCe464nBnugzVM=;\n\th=In-Reply-To:References:Subject:From:To:Date:From;\n\tb=rBSoWL5eb17mNlCXoLjn4OrdakM4XMY2HxOOX/6tVI7gpwrx2u4ESl5k8GZuSLq13\n\txu2Cmk85LzFaUMhL9+RqFM/BiQ7W469wzKRLbRHuwIYxT6yOryQiDxWZvmxIw4XxBl\n\toFVQo7P1vWNCy2cOp/KexrlTC1PK7wnJeCCDvGm8=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20260212151238.3736234-3-laurent.pinchart@ideasonboard.com>","References":"<20260212151238.3736234-1-laurent.pinchart@ideasonboard.com>\n\t<20260212151238.3736234-3-laurent.pinchart@ideasonboard.com>","Subject":"Re: [PATCH v2 2/4] libcamera: Replace iterators with range-based for\n\tloops","From":"Isaac Scott <isaac.scott@ideasonboard.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Mon, 02 Mar 2026 17:41:33 +0000","Message-ID":"<177247329386.3877752.675470803973166989@t16>","User-Agent":"alot/0.10","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>"}}]