[{"id":34237,"web_url":"https://patchwork.libcamera.org/comment/34237/","msgid":"<174731149349.209691.8105304003758866862@calcite>","date":"2025-05-15T12:18:13","subject":"Re: [RFC PATCH v1 2/8] utils: codegen: ipc: Remove `namespace`\n\targument","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"Quoting Barnabás Pőcze (2025-05-15 14:00:06)\n> The `serializer()`, `deserializer_{fd,no_fd,simple}()` functions\n> take a string argument named \"namespace\", but they do not use it.\n> So remove the argument.\n\nHuh, I remember putting this in to generate the namespace for the namespace\ndefined in each mojom file, but indeed it's not used and it's covered\nelsewhere.\n\n> \n> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n\nReviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n\n> ---\n>  .../core_ipa_serializer.h.tmpl                 |  8 ++++----\n>  .../module_ipa_serializer.h.tmpl               |  8 ++++----\n>  .../libcamera_templates/serializer.tmpl        | 18 +++++++++---------\n>  3 files changed, 17 insertions(+), 17 deletions(-)\n> \n> diff --git a/utils/codegen/ipc/generators/libcamera_templates/core_ipa_serializer.h.tmpl b/utils/codegen/ipc/generators/libcamera_templates/core_ipa_serializer.h.tmpl\n> index 036518f6c..cbb35ef51 100644\n> --- a/utils/codegen/ipc/generators/libcamera_templates/core_ipa_serializer.h.tmpl\n> +++ b/utils/codegen/ipc/generators/libcamera_templates/core_ipa_serializer.h.tmpl\n> @@ -31,12 +31,12 @@ template<>\n>  class IPADataSerializer<{{struct|name}}>\n>  {\n>  public:\n> -{{- serializer.serializer(struct, \"\")}}\n> +{{- serializer.serializer(struct)}}\n>  {%- if struct|has_fd %}\n> -{{serializer.deserializer_fd(struct, \"\")}}\n> +{{serializer.deserializer_fd(struct)}}\n>  {%- else %}\n> -{{serializer.deserializer_no_fd(struct, \"\")}}\n> -{{serializer.deserializer_fd_simple(struct, \"\")}}\n> +{{serializer.deserializer_no_fd(struct)}}\n> +{{serializer.deserializer_fd_simple(struct)}}\n>  {%- endif %}\n>  };\n>  {% endfor %}\n> diff --git a/utils/codegen/ipc/generators/libcamera_templates/module_ipa_serializer.h.tmpl b/utils/codegen/ipc/generators/libcamera_templates/module_ipa_serializer.h.tmpl\n> index cd5a65a92..f3b8e3b15 100644\n> --- a/utils/codegen/ipc/generators/libcamera_templates/module_ipa_serializer.h.tmpl\n> +++ b/utils/codegen/ipc/generators/libcamera_templates/module_ipa_serializer.h.tmpl\n> @@ -32,12 +32,12 @@ template<>\n>  class IPADataSerializer<{{struct|name_full}}>\n>  {\n>  public:\n> -{{- serializer.serializer(struct, namespace_str)}}\n> +{{- serializer.serializer(struct)}}\n>  {%- if struct|has_fd %}\n> -{{serializer.deserializer_fd(struct, namespace_str)}}\n> +{{serializer.deserializer_fd(struct)}}\n>  {%- else %}\n> -{{serializer.deserializer_no_fd(struct, namespace_str)}}\n> -{{serializer.deserializer_fd_simple(struct, namespace_str)}}\n> +{{serializer.deserializer_no_fd(struct)}}\n> +{{serializer.deserializer_fd_simple(struct)}}\n>  {%- endif %}\n>  };\n>  {% endfor %}\n> diff --git a/utils/codegen/ipc/generators/libcamera_templates/serializer.tmpl b/utils/codegen/ipc/generators/libcamera_templates/serializer.tmpl\n> index 323e12939..114e349c9 100644\n> --- a/utils/codegen/ipc/generators/libcamera_templates/serializer.tmpl\n> +++ b/utils/codegen/ipc/generators/libcamera_templates/serializer.tmpl\n> @@ -28,7 +28,7 @@\n>   #\n>   # \\todo Avoid intermediate vectors\n>   #}\n> -{%- macro serializer_field(field, namespace, loop) %}\n> +{%- macro serializer_field(field, loop) %}\n>  {%- if field|is_pod or field|is_enum %}\n>                 std::vector<uint8_t> {{field.mojom_name}};\n>                 std::tie({{field.mojom_name}}, std::ignore) =\n> @@ -94,7 +94,7 @@\n>   # Generate code to deserialize \\a field into object ret.\n>   # This code is meant to be used by the IPADataSerializer specialization.\n>   #}\n> -{%- macro deserializer_field(field, namespace, loop) %}\n> +{%- macro deserializer_field(field, loop) %}\n>  {% if field|is_pod or field|is_enum %}\n>         {%- set field_size = (field|bit_width|int / 8)|int %}\n>                 {{- check_data_size(field_size, 'dataSize', field.mojom_name, 'data')}}\n> @@ -182,7 +182,7 @@\n>   # Generate code for IPADataSerializer specialization, for serializing\n>   # \\a struct.\n>   #}\n> -{%- macro serializer(struct, namespace) %}\n> +{%- macro serializer(struct) %}\n>         static std::tuple<std::vector<uint8_t>, std::vector<SharedFD>>\n>         serialize(const {{struct|name_full}} &data,\n>  {%- if struct|needs_control_serializer %}\n> @@ -196,7 +196,7 @@\n>                 std::vector<SharedFD> retFds;\n>  {%- endif %}\n>  {%- for field in struct.fields %}\n> -{{serializer_field(field, namespace, loop)}}\n> +{{serializer_field(field, loop)}}\n>  {%- endfor %}\n>  {% if struct|has_fd %}\n>                 return {retData, retFds};\n> @@ -213,7 +213,7 @@\n>   # Generate code for IPADataSerializer specialization, for deserializing\n>   # \\a struct, in the case that \\a struct has file descriptors.\n>   #}\n> -{%- macro deserializer_fd(struct, namespace) %}\n> +{%- macro deserializer_fd(struct) %}\n>         static {{struct|name_full}}\n>         deserialize(std::vector<uint8_t> &data,\n>                     std::vector<SharedFD> &fds,\n> @@ -245,7 +245,7 @@\n>                 size_t dataSize = std::distance(dataBegin, dataEnd);\n>                 [[maybe_unused]] size_t fdsSize = std::distance(fdsBegin, fdsEnd);\n>  {%- for field in struct.fields -%}\n> -{{deserializer_field(field, namespace, loop)}}\n> +{{deserializer_field(field, loop)}}\n>  {%- endfor %}\n>                 return ret;\n>         }\n> @@ -258,7 +258,7 @@\n>   # \\a struct, in the case that \\a struct has no file descriptors but requires\n>   # deserializers with file descriptors.\n>   #}\n> -{%- macro deserializer_fd_simple(struct, namespace) %}\n> +{%- macro deserializer_fd_simple(struct) %}\n>         static {{struct|name_full}}\n>         deserialize(std::vector<uint8_t> &data,\n>                     [[maybe_unused]] std::vector<SharedFD> &fds,\n> @@ -285,7 +285,7 @@\n>   # Generate code for IPADataSerializer specialization, for deserializing\n>   # \\a struct, in the case that \\a struct does not have file descriptors.\n>   #}\n> -{%- macro deserializer_no_fd(struct, namespace) %}\n> +{%- macro deserializer_no_fd(struct) %}\n>         static {{struct|name_full}}\n>         deserialize(std::vector<uint8_t> &data,\n>  {%- if struct|needs_control_serializer %}\n> @@ -312,7 +312,7 @@\n>  \n>                 size_t dataSize = std::distance(dataBegin, dataEnd);\n>  {%- for field in struct.fields -%}\n> -{{deserializer_field(field, namespace, loop)}}\n> +{{deserializer_field(field, loop)}}\n>  {%- endfor %}\n>                 return ret;\n>         }\n> -- \n> 2.49.0\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 3819BC3220\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 15 May 2025 12:18:20 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 609D168B6C;\n\tThu, 15 May 2025 14:18:19 +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 377D068B5D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 15 May 2025 14:18:17 +0200 (CEST)","from pyrite.rasen.tech (unknown\n\t[IPv6:2a01:cb16:204c:4644:2597:989f:e013:9296])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id E2F23836;\n\tThu, 15 May 2025 14:17:59 +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=\"qLcGDgsY\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1747311480;\n\tbh=/b0cQBlL/8K66wMO6c62sPj9GNRATEor0rgM9sg5iwE=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=qLcGDgsYVpcYWDNr4J5Es/OphnTMugsqbPSYfmP/lmRr6Mj/HhPZjte3nlGoCo/Yq\n\txX3iFkFfR5ExZEcEmJnRP+Lnt6Gu6PQEzZM8RVNX5iqfToXzjBSpU2GRqJL5w4tBLa\n\t/qS1Dzsh+v2++TeUYICG+DSA85glT2xgSGblm8w4=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20250515120012.3127231-3-barnabas.pocze@ideasonboard.com>","References":"<20250515120012.3127231-1-barnabas.pocze@ideasonboard.com>\n\t<20250515120012.3127231-3-barnabas.pocze@ideasonboard.com>","Subject":"Re: [RFC PATCH v1 2/8] utils: codegen: ipc: Remove `namespace`\n\targument","From":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Thu, 15 May 2025 14:18:13 +0200","Message-ID":"<174731149349.209691.8105304003758866862@calcite>","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>"}},{"id":34290,"web_url":"https://patchwork.libcamera.org/comment/34290/","msgid":"<a4ciyoiht73zsft4xvwgytlkng6vti7bdwnnejmvrd6c5rbw3d@7zb7phhpolpp>","date":"2025-05-20T11:23:58","subject":"Re: [RFC PATCH v1 2/8] utils: codegen: ipc: Remove `namespace`\n\targument","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Barnabás\n\nOn Thu, May 15, 2025 at 02:00:06PM +0200, Barnabás Pőcze wrote:\n> The `serializer()`, `deserializer_{fd,no_fd,simple}()` functions\n> take a string argument named \"namespace\", but they do not use it.\n> So remove the argument.\n>\n> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n\nThanks\nReviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n\n> ---\n>  .../core_ipa_serializer.h.tmpl                 |  8 ++++----\n>  .../module_ipa_serializer.h.tmpl               |  8 ++++----\n>  .../libcamera_templates/serializer.tmpl        | 18 +++++++++---------\n>  3 files changed, 17 insertions(+), 17 deletions(-)\n>\n> diff --git a/utils/codegen/ipc/generators/libcamera_templates/core_ipa_serializer.h.tmpl b/utils/codegen/ipc/generators/libcamera_templates/core_ipa_serializer.h.tmpl\n> index 036518f6c..cbb35ef51 100644\n> --- a/utils/codegen/ipc/generators/libcamera_templates/core_ipa_serializer.h.tmpl\n> +++ b/utils/codegen/ipc/generators/libcamera_templates/core_ipa_serializer.h.tmpl\n> @@ -31,12 +31,12 @@ template<>\n>  class IPADataSerializer<{{struct|name}}>\n>  {\n>  public:\n> -{{- serializer.serializer(struct, \"\")}}\n> +{{- serializer.serializer(struct)}}\n>  {%- if struct|has_fd %}\n> -{{serializer.deserializer_fd(struct, \"\")}}\n> +{{serializer.deserializer_fd(struct)}}\n>  {%- else %}\n> -{{serializer.deserializer_no_fd(struct, \"\")}}\n> -{{serializer.deserializer_fd_simple(struct, \"\")}}\n> +{{serializer.deserializer_no_fd(struct)}}\n> +{{serializer.deserializer_fd_simple(struct)}}\n>  {%- endif %}\n>  };\n>  {% endfor %}\n> diff --git a/utils/codegen/ipc/generators/libcamera_templates/module_ipa_serializer.h.tmpl b/utils/codegen/ipc/generators/libcamera_templates/module_ipa_serializer.h.tmpl\n> index cd5a65a92..f3b8e3b15 100644\n> --- a/utils/codegen/ipc/generators/libcamera_templates/module_ipa_serializer.h.tmpl\n> +++ b/utils/codegen/ipc/generators/libcamera_templates/module_ipa_serializer.h.tmpl\n> @@ -32,12 +32,12 @@ template<>\n>  class IPADataSerializer<{{struct|name_full}}>\n>  {\n>  public:\n> -{{- serializer.serializer(struct, namespace_str)}}\n> +{{- serializer.serializer(struct)}}\n>  {%- if struct|has_fd %}\n> -{{serializer.deserializer_fd(struct, namespace_str)}}\n> +{{serializer.deserializer_fd(struct)}}\n>  {%- else %}\n> -{{serializer.deserializer_no_fd(struct, namespace_str)}}\n> -{{serializer.deserializer_fd_simple(struct, namespace_str)}}\n> +{{serializer.deserializer_no_fd(struct)}}\n> +{{serializer.deserializer_fd_simple(struct)}}\n>  {%- endif %}\n>  };\n>  {% endfor %}\n> diff --git a/utils/codegen/ipc/generators/libcamera_templates/serializer.tmpl b/utils/codegen/ipc/generators/libcamera_templates/serializer.tmpl\n> index 323e12939..114e349c9 100644\n> --- a/utils/codegen/ipc/generators/libcamera_templates/serializer.tmpl\n> +++ b/utils/codegen/ipc/generators/libcamera_templates/serializer.tmpl\n> @@ -28,7 +28,7 @@\n>   #\n>   # \\todo Avoid intermediate vectors\n>   #}\n> -{%- macro serializer_field(field, namespace, loop) %}\n> +{%- macro serializer_field(field, loop) %}\n>  {%- if field|is_pod or field|is_enum %}\n>  \t\tstd::vector<uint8_t> {{field.mojom_name}};\n>  \t\tstd::tie({{field.mojom_name}}, std::ignore) =\n> @@ -94,7 +94,7 @@\n>   # Generate code to deserialize \\a field into object ret.\n>   # This code is meant to be used by the IPADataSerializer specialization.\n>   #}\n> -{%- macro deserializer_field(field, namespace, loop) %}\n> +{%- macro deserializer_field(field, loop) %}\n>  {% if field|is_pod or field|is_enum %}\n>  \t{%- set field_size = (field|bit_width|int / 8)|int %}\n>  \t\t{{- check_data_size(field_size, 'dataSize', field.mojom_name, 'data')}}\n> @@ -182,7 +182,7 @@\n>   # Generate code for IPADataSerializer specialization, for serializing\n>   # \\a struct.\n>   #}\n> -{%- macro serializer(struct, namespace) %}\n> +{%- macro serializer(struct) %}\n>  \tstatic std::tuple<std::vector<uint8_t>, std::vector<SharedFD>>\n>  \tserialize(const {{struct|name_full}} &data,\n>  {%- if struct|needs_control_serializer %}\n> @@ -196,7 +196,7 @@\n>  \t\tstd::vector<SharedFD> retFds;\n>  {%- endif %}\n>  {%- for field in struct.fields %}\n> -{{serializer_field(field, namespace, loop)}}\n> +{{serializer_field(field, loop)}}\n>  {%- endfor %}\n>  {% if struct|has_fd %}\n>  \t\treturn {retData, retFds};\n> @@ -213,7 +213,7 @@\n>   # Generate code for IPADataSerializer specialization, for deserializing\n>   # \\a struct, in the case that \\a struct has file descriptors.\n>   #}\n> -{%- macro deserializer_fd(struct, namespace) %}\n> +{%- macro deserializer_fd(struct) %}\n>  \tstatic {{struct|name_full}}\n>  \tdeserialize(std::vector<uint8_t> &data,\n>  \t\t    std::vector<SharedFD> &fds,\n> @@ -245,7 +245,7 @@\n>  \t\tsize_t dataSize = std::distance(dataBegin, dataEnd);\n>  \t\t[[maybe_unused]] size_t fdsSize = std::distance(fdsBegin, fdsEnd);\n>  {%- for field in struct.fields -%}\n> -{{deserializer_field(field, namespace, loop)}}\n> +{{deserializer_field(field, loop)}}\n>  {%- endfor %}\n>  \t\treturn ret;\n>  \t}\n> @@ -258,7 +258,7 @@\n>   # \\a struct, in the case that \\a struct has no file descriptors but requires\n>   # deserializers with file descriptors.\n>   #}\n> -{%- macro deserializer_fd_simple(struct, namespace) %}\n> +{%- macro deserializer_fd_simple(struct) %}\n>  \tstatic {{struct|name_full}}\n>  \tdeserialize(std::vector<uint8_t> &data,\n>  \t\t    [[maybe_unused]] std::vector<SharedFD> &fds,\n> @@ -285,7 +285,7 @@\n>   # Generate code for IPADataSerializer specialization, for deserializing\n>   # \\a struct, in the case that \\a struct does not have file descriptors.\n>   #}\n> -{%- macro deserializer_no_fd(struct, namespace) %}\n> +{%- macro deserializer_no_fd(struct) %}\n>  \tstatic {{struct|name_full}}\n>  \tdeserialize(std::vector<uint8_t> &data,\n>  {%- if struct|needs_control_serializer %}\n> @@ -312,7 +312,7 @@\n>\n>  \t\tsize_t dataSize = std::distance(dataBegin, dataEnd);\n>  {%- for field in struct.fields -%}\n> -{{deserializer_field(field, namespace, loop)}}\n> +{{deserializer_field(field, loop)}}\n>  {%- endfor %}\n>  \t\treturn ret;\n>  \t}\n> --\n> 2.49.0\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 32924BD78E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 20 May 2025 11:24:04 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D0D2B68D85;\n\tTue, 20 May 2025 13:24:02 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 7375A614DE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 20 May 2025 13:24:01 +0200 (CEST)","from ideasonboard.com (93-61-96-190.ip145.fastwebnet.it\n\t[93.61.96.190])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 7E205446;\n\tTue, 20 May 2025 13:23:40 +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=\"uNFhxgsS\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1747740220;\n\tbh=NozDqVXgm4QIIisjFCrCvJ3XfotbD7DIg/6cBMCrsCE=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=uNFhxgsSyS2wQ9BUd1o5nZuTus4u81yN+W4C0doUyXXSccpsYBKlLWAyzKEzVXhVB\n\tqFqUDMuAQX7uAXev9u40MOi/fbwcM6XsgdnWBRJR7TuXs6ZBjmD9fOZowlkQFBZetu\n\tJnLaaxk3kFkE9to97xvVB/ALUoz098MLX0OeZDXs=","Date":"Tue, 20 May 2025 13:23:58 +0200","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org, \n\tPaul Elder <paul.elder@ideasonboard.com>","Subject":"Re: [RFC PATCH v1 2/8] utils: codegen: ipc: Remove `namespace`\n\targument","Message-ID":"<a4ciyoiht73zsft4xvwgytlkng6vti7bdwnnejmvrd6c5rbw3d@7zb7phhpolpp>","References":"<20250515120012.3127231-1-barnabas.pocze@ideasonboard.com>\n\t<20250515120012.3127231-3-barnabas.pocze@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20250515120012.3127231-3-barnabas.pocze@ideasonboard.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>"}}]