[{"id":34863,"web_url":"https://patchwork.libcamera.org/comment/34863/","msgid":"<cf1eb450-4adf-4519-a87a-cc1a7eb31068@ideasonboard.com>","date":"2025-07-11T15:28:33","subject":"Re: [PATCH v12 11/12] config: Make configuration file configurable","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"Hi\n\n2025. 07. 02. 15:10 keltezéssel, Milan Zamazal írta:\n> To support easy switching of configurations, let's introduce\n> LIBCAMERA_CONFIG_NAME environment variable, which denotes:\n> \n> - The path of the configuration file to load if it is an absolute path; or\n> - the path of the configuration file to load, relative to the configuration\n>    directories.\n> \n> If such a configuration file doesn't exist, no custom configuration is\n> loaded.\n> \n> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> ---\n>   Documentation/runtime_configuration.rst |  8 ++++++\n>   src/libcamera/global_configuration.cpp  | 33 ++++++++++++++++---------\n>   2 files changed, 30 insertions(+), 11 deletions(-)\n> \n> diff --git a/Documentation/runtime_configuration.rst b/Documentation/runtime_configuration.rst\n> index de74fa732..5648db7d7 100644\n> --- a/Documentation/runtime_configuration.rst\n> +++ b/Documentation/runtime_configuration.rst\n> @@ -19,6 +19,14 @@ order:\n>   - LIBCAMERA_SYSCONF_DIR/configuration.yaml\n>   - /etc/libcamera/configuration.yaml\n>   \n> +The default name of the configuration file, configuration.yaml, can be\n> +overridden in LIBCAMERA_CONFIG_NAME environment variable. The variable\n> +can specify just an alternative configuration file name to be looked up\n> +in the locations above, or it can contain a whole relative or absolute\n> +path. If an absolute path is specified then it is the only location that\n> +is used; if the given file doesn't exist then no configuration file is\n> +read.\n> +\n>   The first configuration file found wins, contingent configuration files\n>   in other locations are ignored.\n>   \n> diff --git a/src/libcamera/global_configuration.cpp b/src/libcamera/global_configuration.cpp\n> index 2ac6191dc..efc293422 100644\n> --- a/src/libcamera/global_configuration.cpp\n> +++ b/src/libcamera/global_configuration.cpp\n> @@ -23,13 +23,6 @@\n>   \n>   namespace libcamera {\n>   \n> -namespace {\n> -const std::vector<std::filesystem::path> globalConfigurationFiles = {\n> -\tstd::filesystem::path(LIBCAMERA_SYSCONF_DIR) / \"configuration.yaml\",\n> -\tstd::filesystem::path(LIBCAMERA_DATA_DIR) / \"configuration.yaml\",\n> -};\n> -}\n> -\n>   LOG_DEFINE_CATEGORY(Configuration)\n>   \n>   /**\n> @@ -74,6 +67,25 @@ bool GlobalConfiguration::loadFile(const std::filesystem::path &fileName)\n>   \n>   bool GlobalConfiguration::load()\n>   {\n> +\tconst std::vector<std::filesystem::path> globalConfigurationDirectories = {\n> +\t\tstd::filesystem::path(LIBCAMERA_SYSCONF_DIR),\n> +\t\tstd::filesystem::path(LIBCAMERA_DATA_DIR),\n> +\t};\n> +\n> +\tconst char *libcameraConfigName =\n> +\t\tutils::secure_getenv(\"LIBCAMERA_CONFIG_NAME\");\n> +\tif (!libcameraConfigName)\n\nIf $LIBCAMERA_CONFIG_NAME is defined but empty, then I believe no configuration should be loaded.\n\n\nRegards,\nBarnabás Pőcze\n\n\n> +\t\tlibcameraConfigName = \"\";\n> +\tstd::filesystem::path configName(libcameraConfigName);\n> +\n> +\tif (configName.is_absolute()) {\n> +\t\tloadFile(configName);\n> +\t\treturn !!yamlConfiguration_;\n> +\t}\n> +\n> +\tif (configName.empty())\n> +\t\tconfigName = std::filesystem::path(\"configuration.yaml\");\n> +\n>   \tstd::filesystem::path userConfigurationDirectory;\n>   \tconst char *xdgConfigHome = utils::secure_getenv(\"XDG_CONFIG_HOME\");\n>   \tif (xdgConfigHome) {\n> @@ -87,15 +99,14 @@ bool GlobalConfiguration::load()\n>   \n>   \tif (!userConfigurationDirectory.empty()) {\n>   \t\tstd::filesystem::path user_configuration_file =\n> -\t\t\tuserConfigurationDirectory / \"libcamera\" / \"configuration.yaml\";\n> +\t\t\tuserConfigurationDirectory / \"libcamera\" / configName;\n>   \t\tif (loadFile(user_configuration_file))\n>   \t\t\treturn !!yamlConfiguration_;\n>   \t}\n>   \n> -\tfor (const auto &path : globalConfigurationFiles) {\n> -\t\tif (loadFile(path))\n> +\tfor (const auto &path : globalConfigurationDirectories)\n> +\t\tif (loadFile(path / configName))\n>   \t\t\treturn !!yamlConfiguration_;\n> -\t}\n>   \n>   \tyamlConfiguration_ = std::make_unique<YamlObject>();\n>   \treturn true;","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 A88D2C3237\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 11 Jul 2025 15:28:39 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 40BCD68F17;\n\tFri, 11 Jul 2025 17:28:39 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 0E44A68E30\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 11 Jul 2025 17:28:37 +0200 (CEST)","from [192.168.33.21] (185.221.140.39.nat.pool.zt.hu\n\t[185.221.140.39])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 340C52C5;\n\tFri, 11 Jul 2025 17:28:07 +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=\"mL573re5\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1752247687;\n\tbh=DZUdgTmE2RuxjfOROQq/BAb9OgCfelZn61mvqNJJGPk=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=mL573re5qXwhGyzEDJaeqnV0mWOiiLICRSawaPv8Ul/n1QCowOTKvBPvTEPZKlNJn\n\tnWTFDJsbnM6CDQNHBkMS0un6OYOrE5HorEXU+AXDIklUimZXG+Q71CVhwJUaEl+3+E\n\tL9HJBI6ECm/qMDqtm3fBorJB2donkvKeSMN6fwa4=","Message-ID":"<cf1eb450-4adf-4519-a87a-cc1a7eb31068@ideasonboard.com>","Date":"Fri, 11 Jul 2025 17:28:33 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v12 11/12] config: Make configuration file configurable","To":"Milan Zamazal <mzamazal@redhat.com>, libcamera-devel@lists.libcamera.org","Cc":"Kieran Bingham <kieran.bingham@ideasonboard.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>","References":"<20250702131032.47654-1-mzamazal@redhat.com>\n\t<20250702131032.47654-12-mzamazal@redhat.com>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<20250702131032.47654-12-mzamazal@redhat.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":34868,"web_url":"https://patchwork.libcamera.org/comment/34868/","msgid":"<851pqmd2m4.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2025-07-11T18:05:55","subject":"Re: [PATCH v12 11/12] config: Make configuration file configurable","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Hi Barnabás,\n\nthank you for review.\n\nBarnabás Pőcze <barnabas.pocze@ideasonboard.com> writes:\n\n> Hi\n>\n> 2025. 07. 02. 15:10 keltezéssel, Milan Zamazal írta:\n>> To support easy switching of configurations, let's introduce\n>> LIBCAMERA_CONFIG_NAME environment variable, which denotes:\n>> - The path of the configuration file to load if it is an absolute path; or\n>> - the path of the configuration file to load, relative to the configuration\n>>    directories.\n>> If such a configuration file doesn't exist, no custom configuration is\n>> loaded.\n>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>> ---\n>>   Documentation/runtime_configuration.rst |  8 ++++++\n>>   src/libcamera/global_configuration.cpp  | 33 ++++++++++++++++---------\n>>   2 files changed, 30 insertions(+), 11 deletions(-)\n>> diff --git a/Documentation/runtime_configuration.rst b/Documentation/runtime_configuration.rst\n>> index de74fa732..5648db7d7 100644\n>> --- a/Documentation/runtime_configuration.rst\n>> +++ b/Documentation/runtime_configuration.rst\n>> @@ -19,6 +19,14 @@ order:\n>>   - LIBCAMERA_SYSCONF_DIR/configuration.yaml\n>>   - /etc/libcamera/configuration.yaml\n>>   +The default name of the configuration file, configuration.yaml, can be\n>> +overridden in LIBCAMERA_CONFIG_NAME environment variable. The variable\n>> +can specify just an alternative configuration file name to be looked up\n>> +in the locations above, or it can contain a whole relative or absolute\n>> +path. If an absolute path is specified then it is the only location that\n>> +is used; if the given file doesn't exist then no configuration file is\n>> +read.\n>> +\n>>   The first configuration file found wins, contingent configuration files\n>>   in other locations are ignored.\n>>   diff --git a/src/libcamera/global_configuration.cpp b/src/libcamera/global_configuration.cpp\n>> index 2ac6191dc..efc293422 100644\n>> --- a/src/libcamera/global_configuration.cpp\n>> +++ b/src/libcamera/global_configuration.cpp\n>> @@ -23,13 +23,6 @@\n>>     namespace libcamera {\n>>   -namespace {\n>> -const std::vector<std::filesystem::path> globalConfigurationFiles = {\n>> -\tstd::filesystem::path(LIBCAMERA_SYSCONF_DIR) / \"configuration.yaml\",\n>> -\tstd::filesystem::path(LIBCAMERA_DATA_DIR) / \"configuration.yaml\",\n>> -};\n>> -}\n>> -\n>>   LOG_DEFINE_CATEGORY(Configuration)\n>>     /**\n>> @@ -74,6 +67,25 @@ bool GlobalConfiguration::loadFile(const std::filesystem::path &fileName)\n>>     bool GlobalConfiguration::load()\n>>   {\n>> +\tconst std::vector<std::filesystem::path> globalConfigurationDirectories = {\n>> +\t\tstd::filesystem::path(LIBCAMERA_SYSCONF_DIR),\n>> +\t\tstd::filesystem::path(LIBCAMERA_DATA_DIR),\n>> +\t};\n>> +\n>> +\tconst char *libcameraConfigName =\n>> +\t\tutils::secure_getenv(\"LIBCAMERA_CONFIG_NAME\");\n>> +\tif (!libcameraConfigName)\n>\n> If $LIBCAMERA_CONFIG_NAME is defined but empty, then I believe no configuration should be loaded.\n\nOK, will change.\n\n> Regards,\n> Barnabás Pőcze\n>\n>\n>> +\t\tlibcameraConfigName = \"\";\n>> +\tstd::filesystem::path configName(libcameraConfigName);\n>> +\n>> +\tif (configName.is_absolute()) {\n>> +\t\tloadFile(configName);\n>> +\t\treturn !!yamlConfiguration_;\n>> +\t}\n>> +\n>> +\tif (configName.empty())\n>> +\t\tconfigName = std::filesystem::path(\"configuration.yaml\");\n>> +\n>>   \tstd::filesystem::path userConfigurationDirectory;\n>>   \tconst char *xdgConfigHome = utils::secure_getenv(\"XDG_CONFIG_HOME\");\n>>   \tif (xdgConfigHome) {\n>> @@ -87,15 +99,14 @@ bool GlobalConfiguration::load()\n>>     \tif (!userConfigurationDirectory.empty()) {\n>>   \t\tstd::filesystem::path user_configuration_file =\n>> -\t\t\tuserConfigurationDirectory / \"libcamera\" / \"configuration.yaml\";\n>> +\t\t\tuserConfigurationDirectory / \"libcamera\" / configName;\n>>   \t\tif (loadFile(user_configuration_file))\n>>   \t\t\treturn !!yamlConfiguration_;\n>>   \t}\n>>   -\tfor (const auto &path : globalConfigurationFiles) {\n>> -\t\tif (loadFile(path))\n>> +\tfor (const auto &path : globalConfigurationDirectories)\n>> +\t\tif (loadFile(path / configName))\n>>   \t\t\treturn !!yamlConfiguration_;\n>> -\t}\n>>     \tyamlConfiguration_ = std::make_unique<YamlObject>();\n>>   \treturn true;","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 8F505BE175\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 11 Jul 2025 18:06:03 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 32D2E68F21;\n\tFri, 11 Jul 2025 20:06:03 +0200 (CEST)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.133.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 1D59F68E30\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 11 Jul 2025 20:06:02 +0200 (CEST)","from mail-wr1-f71.google.com (mail-wr1-f71.google.com\n\t[209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-562-r8-3qtKWPFy1cytTYJWTqA-1; Fri, 11 Jul 2025 14:05:59 -0400","by mail-wr1-f71.google.com with SMTP id\n\tffacd0b85a97d-3a6d90929d6so1117031f8f.2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 11 Jul 2025 11:05:58 -0700 (PDT)","from mzamazal-thinkpadp1gen7.tpbc.csb\n\t(ip-77-48-47-2.net.vodafone.cz. [77.48.47.2])\n\tby smtp.gmail.com with ESMTPSA id\n\tffacd0b85a97d-3b5e8e0d758sm4994816f8f.49.2025.07.11.11.05.56\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tFri, 11 Jul 2025 11:05:56 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"eiBygFVv\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1752257161;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc: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=AVgWnIrahQ+PJRQMIMr/FAYS9fAjCIKLKT/niGpW+YI=;\n\tb=eiBygFVv7tipGRcoGvzc6d96/O5pBLeRPpyuov/oTKRynHf5l/JlJOvr/QL8DMrPEoZq9d\n\ttB+L14shnVDIjwdiJIy4cqRdkBD04ISq9LP3a49WgdR9d6ThdpiUau9UbSYxXJfdPJa1U2\n\tYZ6aTLvFIvKvFCtmNHA+vBCLihg4rwg=","X-MC-Unique":"r8-3qtKWPFy1cytTYJWTqA-1","X-Mimecast-MFC-AGG-ID":"r8-3qtKWPFy1cytTYJWTqA_1752257158","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1752257157; x=1752861957;\n\th=content-transfer-encoding:mime-version:user-agent:message-id:date\n\t:references:in-reply-to:subject:cc:to:from:x-gm-message-state:from\n\t:to:cc:subject:date:message-id:reply-to;\n\tbh=PkIkv+/WYuG592FETQkOJTw7Dj3leMMFkWxLIqBIvCA=;\n\tb=QiD7c2BhzF3T4AHXtFPZgRnO/qphZyqx7C73J9OMjcID7GwO75wNeieHlRgtzAI4JM\n\tCijP6dXOyy0WeGwMm6hkS0IDL/Keyl8DEq13TtqyUb271stZGvUJ2M0BtwNx+Yqzow9G\n\tQZAQD2IoyRnjse9CUCdigK9lAaR11C/31XWifKg6fggFwSSkUt1Cfk0OXuSvIsKtpeUN\n\te3NIJOsfzTIbOd9MP1iK8ZCyvuXQzlQRSlW90mIrKr46WQWbkAcJrOmHffqQJ2o1Q/rj\n\tjl7b1ftUfs/keQsx+jrbRU9l/B7FkwT8VWKhlfMFxeVmjs6Nf3gBuEDdRksMoqw7apTx\n\t2Amw==","X-Gm-Message-State":"AOJu0Yxn3bkVBFllPJ4j2eEerIEM6Z3gxim5d/55FGwKEgDDE+wykB12\n\tOe/HDaEqexY7DAkrfO/KeTRb89fdOtjvbIi8G5uCJDaNl6dqvHoyVgxExM/a3NPJw9paS6APpkQ\n\tC34etcdTpcQd7N/skKDb0qst3zyZW9faxpXOGIS6DruuyScPdvqC2OpdZLxzLEdnG0kTAs8Osg7\n\t0papYfW2w=","X-Gm-Gg":"ASbGncvYqGsPqeoiQJwpsa9zWOUCqPYxcE/nHv/+P3WGopTuDpoM8EXQzgHNcspngPl\n\t72Tp/bHc6B3EizBeP55O+Ws5G8uvT2ITYLeOz2oc3hooiCoqtC5dYxy+OpGCKiMHSm7cByB7REV\n\tTH887MmfLGoAM6+O5KfJqvVCg2gLkL93rC6NEli+IqgzRFabxOdPA+KEjqpRwSOfT+mGcUIacvD\n\th46H6sSouMXRq2vIrJN/UHJTONBFqvHk4XHF4FJ5dgMdHKh89vUXL3wEiKoK7bO+500MOoawK0E\n\tkFhxswc3idrbbJIkNtBDuRqJMVyn7Go87htiC3UzqaxDPhkTobk0wrhxtbCLPUGZUrAsGWk5xD3\n\tYqADRzT267gfkPQVT","X-Received":["by 2002:a05:6000:4b11:b0:3a5:3b63:58f0 with SMTP id\n\tffacd0b85a97d-3b5f2dc2cd1mr2929029f8f.18.1752257157485; \n\tFri, 11 Jul 2025 11:05:57 -0700 (PDT)","by 2002:a05:6000:4b11:b0:3a5:3b63:58f0 with SMTP id\n\tffacd0b85a97d-3b5f2dc2cd1mr2929001f8f.18.1752257157040; \n\tFri, 11 Jul 2025 11:05:57 -0700 (PDT)"],"X-Google-Smtp-Source":"AGHT+IGIRXA7vq8sr9mDyzn2SN8len8HBaKfEA5CH1X/Xs0pPG2rYq/FWAayUtzS2nNkeDcdLYUPUg==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org,  Kieran Bingham\n\t<kieran.bingham@ideasonboard.com>,  Laurent Pinchart\n\t<laurent.pinchart@ideasonboard.com>","Subject":"Re: [PATCH v12 11/12] config: Make configuration file configurable","In-Reply-To":"<cf1eb450-4adf-4519-a87a-cc1a7eb31068@ideasonboard.com> (\n\t=?utf-8?b?IkJhcm5hYsOhcyBQxZFjemUiJ3M=?= message of \"Fri,\n\t11 Jul 2025  17:28:33 +0200\")","References":"<20250702131032.47654-1-mzamazal@redhat.com>\n\t<20250702131032.47654-12-mzamazal@redhat.com>\n\t<cf1eb450-4adf-4519-a87a-cc1a7eb31068@ideasonboard.com>","Date":"Fri, 11 Jul 2025 20:05:55 +0200","Message-ID":"<851pqmd2m4.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","User-Agent":"Gnus/5.13 (Gnus v5.13)","MIME-Version":"1.0","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"1bKZgpBvyvBf_buPSUh2n-upL-3YmNfdM_hAsiQ905M_1752257158","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=utf-8","Content-Transfer-Encoding":"quoted-printable","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>"}}]