[{"id":35719,"web_url":"https://patchwork.libcamera.org/comment/35719/","msgid":"<175732707652.2066996.5501680675239932294@neptunite.rasen.tech>","date":"2025-09-08T10:24:36","subject":"Re: [PATCH v16 02/12] config: Make GlobalConfiguration instance","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"Hi Milan,\n\nThanks for the patch.\n\nQuoting Milan Zamazal (2025-07-29 16:31:50)\n> Global configuration is accessed via a GlobalConfiguration instance.\n> The instance is conceptually a singleton, but singletons are not welcome\n> in libcamera so we must store the (preferably single) instance\n> somewhere.\n> \n> This patch creates a GlobalConfiguration instance in CameraManager and\n> defines the corresponding access method.  CameraManager is typically\n> instantiated only once or a few times, it is accessible in many places\n> in libcamera and the configuration can be retrieved from it and passed\n> to other places if needed (it's read-only once created).  Using\n> CameraManager for the purpose is still suboptimal and we use it only due\n> to lack of better options.  An alternative could be Logger, which is\n> still a singleton and it's accessible from everywhere.  But with Logger,\n> we have a chicken and egg problem -- GlobalConfiguration should log\n> contingent problems with the configuration when it's loaded but if it is\n> created in the logger then there are mutual infinite recursive calls.\n> One possible way to deal with this is to look at the environment\n> variables only during logging initialisation and apply the logging\n> configuration when a CameraManager is constructed.  Considering there\n> are intentions to remove the Logger singleton, let's omit logging\n> configuration for now.\n\nI think putting it in CameraManager is fine. We have other singletons like\nIPAManager and LayerManager living there. It's probably better than making it\nstatic.\n\n> \n> If there are multiple CameraManager instances, there are also multiple\n> GlobalConfiguration instances, each CameraManager instance is meant to\n> be fully independent, including configuration.  They may or may not\n> contain the same data, depending on whether the global configuration\n> file in the file system was changed in the meantime.\n> \n> The configuration is stored in CameraManager privately, it's not meant\n\ns/in CameraManager privately/in the private CameraManager/ maybe? \"Privately\"\nmakes it sound like it goes in the private section of the CameraManager class.\n\n> to be accessed by applications.\n> \n> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n\nThe commit title I think should be\n\"libcamera: camera_manager: Construct GlobalConfiguration instance\"\nas this is touching camera_manager code, not global_configuration code.\n\nLooks good to me.\n\nReviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n\n> ---\n>  include/libcamera/internal/camera_manager.h | 8 ++++++++\n>  src/libcamera/camera_manager.cpp            | 8 ++++++++\n>  2 files changed, 16 insertions(+)\n> \n> diff --git a/include/libcamera/internal/camera_manager.h b/include/libcamera/internal/camera_manager.h\n> index 0150ca61f..e8082eb34 100644\n> --- a/include/libcamera/internal/camera_manager.h\n> +++ b/include/libcamera/internal/camera_manager.h\n> @@ -18,6 +18,7 @@\n>  #include <libcamera/base/thread.h>\n>  #include <libcamera/base/thread_annotations.h>\n>  \n> +#include \"libcamera/internal/global_configuration.h\"\n>  #include \"libcamera/internal/process.h\"\n>  \n>  namespace libcamera {\n> @@ -38,6 +39,11 @@ public:\n>         void addCamera(std::shared_ptr<Camera> camera) LIBCAMERA_TSA_EXCLUDES(mutex_);\n>         void removeCamera(std::shared_ptr<Camera> camera) LIBCAMERA_TSA_EXCLUDES(mutex_);\n>  \n> +       const GlobalConfiguration &configuration() const\n> +       {\n> +               return configuration_;\n> +       }\n> +\n>         IPAManager *ipaManager() const { return ipaManager_.get(); }\n>  \n>  protected:\n> @@ -66,6 +72,8 @@ private:\n>  \n>         std::unique_ptr<IPAManager> ipaManager_;\n>         ProcessManager processManager_;\n> +\n> +       const GlobalConfiguration configuration_;\n>  };\n>  \n>  } /* namespace libcamera */\n> diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp\n> index f81794bfd..dca3d9a83 100644\n> --- a/src/libcamera/camera_manager.cpp\n> +++ b/src/libcamera/camera_manager.cpp\n> @@ -15,6 +15,7 @@\n>  \n>  #include \"libcamera/internal/camera.h\"\n>  #include \"libcamera/internal/device_enumerator.h\"\n> +#include \"libcamera/internal/global_configuration.h\"\n>  #include \"libcamera/internal/ipa_manager.h\"\n>  #include \"libcamera/internal/pipeline_handler.h\"\n>  \n> @@ -258,6 +259,13 @@ void CameraManager::Private::removeCamera(std::shared_ptr<Camera> camera)\n>         o->cameraRemoved.emit(camera);\n>  }\n>  \n> +/**\n> + * \\fn const GlobalConfiguration &CameraManager::Private::configuration() const\n> + * \\brief Get global configuration bound to the camera manager\n> + *\n> + * \\return Reference to the configuration\n> + */\n> +\n>  /**\n>   * \\fn CameraManager::Private::ipaManager() const\n>   * \\brief Retrieve the IPAManager\n> -- \n> 2.50.1\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 5783BC324E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  8 Sep 2025 10:24:44 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 12C5E69353;\n\tMon,  8 Sep 2025 12:24:44 +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 E200B69338\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  8 Sep 2025 12:24:42 +0200 (CEST)","from neptunite.rasen.tech (unknown\n\t[IPv6:2404:7a81:160:2100:60ea:3a39:598b:6db8])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 29284C71;\n\tMon,  8 Sep 2025 12:23:29 +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=\"C2g2pXSE\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1757327010;\n\tbh=6KmpMJq/vXIfdSf0L2DAzKhoF5ivd1rgmz/ZmKmmaFY=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=C2g2pXSEe878TGF4oQ40I6q5k8fAJpYgsOmp3bzwO28ZdEl3Td3vYuT80BT32x4sX\n\tm1wn1iZY4GY3+a9iFvtSd/dheJa+q+M7cPN5x7v2K2kLhjswrF8GWgNO16BxHgLjnj\n\ta9DrAe0kOG0cnndjHgnS+eZ6UxKwVmBjY+u+28UI=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20250729073201.5369-3-mzamazal@redhat.com>","References":"<20250729073201.5369-1-mzamazal@redhat.com>\n\t<20250729073201.5369-3-mzamazal@redhat.com>","Subject":"Re: [PATCH v16 02/12] config: Make GlobalConfiguration instance","From":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"Milan Zamazal <mzamazal@redhat.com>, Kieran Bingham\n\t<kieran.bingham@ideasonboard.com>, =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?=\n\t<barnabas.pocze@ideasonboard.com>, Laurent Pinchart\n\t<laurent.pinchart@ideasonboard.com>","To":"Milan Zamazal <mzamazal@redhat.com>, libcamera-devel@lists.libcamera.org","Date":"Mon, 08 Sep 2025 19:24:36 +0900","Message-ID":"<175732707652.2066996.5501680675239932294@neptunite.rasen.tech>","User-Agent":"alot/0.0.0","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":35725,"web_url":"https://patchwork.libcamera.org/comment/35725/","msgid":"<85v7ltt5rh.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2025-09-08T13:48:02","subject":"Re: [PATCH v16 02/12] config: Make GlobalConfiguration instance","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Hi Paul,\n\nthank you for review.\n\nPaul Elder <paul.elder@ideasonboard.com> writes:\n\n> Hi Milan,\n>\n> Thanks for the patch.\n>\n> Quoting Milan Zamazal (2025-07-29 16:31:50)\n>> Global configuration is accessed via a GlobalConfiguration instance.\n>> The instance is conceptually a singleton, but singletons are not welcome\n>> in libcamera so we must store the (preferably single) instance\n>> somewhere.\n>> \n>> This patch creates a GlobalConfiguration instance in CameraManager and\n>> defines the corresponding access method.  CameraManager is typically\n>> instantiated only once or a few times, it is accessible in many places\n>> in libcamera and the configuration can be retrieved from it and passed\n>> to other places if needed (it's read-only once created).  Using\n>> CameraManager for the purpose is still suboptimal and we use it only due\n>> to lack of better options.  An alternative could be Logger, which is\n>> still a singleton and it's accessible from everywhere.  But with Logger,\n>> we have a chicken and egg problem -- GlobalConfiguration should log\n>> contingent problems with the configuration when it's loaded but if it is\n>> created in the logger then there are mutual infinite recursive calls.\n>> One possible way to deal with this is to look at the environment\n>> variables only during logging initialisation and apply the logging\n>> configuration when a CameraManager is constructed.  Considering there\n>> are intentions to remove the Logger singleton, let's omit logging\n>> configuration for now.\n>\n> I think putting it in CameraManager is fine. We have other singletons like\n> IPAManager and LayerManager living there. It's probably better than making it\n> static.\n>\n>> \n>> If there are multiple CameraManager instances, there are also multiple\n>> GlobalConfiguration instances, each CameraManager instance is meant to\n>> be fully independent, including configuration.  They may or may not\n>> contain the same data, depending on whether the global configuration\n>> file in the file system was changed in the meantime.\n>> \n>> The configuration is stored in CameraManager privately, it's not meant\n>\n> s/in CameraManager privately/in the private CameraManager/ maybe? \"Privately\"\n> makes it sound like it goes in the private section of the CameraManager class.\n\nYes, it's meant to be accessible from within libcamera, I'll change the\nwording.\n\n>> to be accessed by applications.\n>> \n>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>\n> The commit title I think should be\n> \"libcamera: camera_manager: Construct GlobalConfiguration instance\"\n> as this is touching camera_manager code, not global_configuration code.\n\nOK.\n\n> Looks good to me.\n>\n> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n>\n>> ---\n>>  include/libcamera/internal/camera_manager.h | 8 ++++++++\n>>  src/libcamera/camera_manager.cpp            | 8 ++++++++\n>>  2 files changed, 16 insertions(+)\n>> \n>> diff --git a/include/libcamera/internal/camera_manager.h b/include/libcamera/internal/camera_manager.h\n>> index 0150ca61f..e8082eb34 100644\n>> --- a/include/libcamera/internal/camera_manager.h\n>> +++ b/include/libcamera/internal/camera_manager.h\n>> @@ -18,6 +18,7 @@\n>>  #include <libcamera/base/thread.h>\n>>  #include <libcamera/base/thread_annotations.h>\n>>  \n>> +#include \"libcamera/internal/global_configuration.h\"\n>>  #include \"libcamera/internal/process.h\"\n>>  \n>>  namespace libcamera {\n>> @@ -38,6 +39,11 @@ public:\n>>         void addCamera(std::shared_ptr<Camera> camera) LIBCAMERA_TSA_EXCLUDES(mutex_);\n>>         void removeCamera(std::shared_ptr<Camera> camera) LIBCAMERA_TSA_EXCLUDES(mutex_);\n>>  \n>> +       const GlobalConfiguration &configuration() const\n>> +       {\n>> +               return configuration_;\n>> +       }\n>> +\n>>         IPAManager *ipaManager() const { return ipaManager_.get(); }\n>>  \n>>  protected:\n>> @@ -66,6 +72,8 @@ private:\n>>  \n>>         std::unique_ptr<IPAManager> ipaManager_;\n>>         ProcessManager processManager_;\n>> +\n>> +       const GlobalConfiguration configuration_;\n>>  };\n>>  \n>>  } /* namespace libcamera */\n>> diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp\n>> index f81794bfd..dca3d9a83 100644\n>> --- a/src/libcamera/camera_manager.cpp\n>> +++ b/src/libcamera/camera_manager.cpp\n>> @@ -15,6 +15,7 @@\n>>  \n>>  #include \"libcamera/internal/camera.h\"\n>>  #include \"libcamera/internal/device_enumerator.h\"\n>> +#include \"libcamera/internal/global_configuration.h\"\n>>  #include \"libcamera/internal/ipa_manager.h\"\n>>  #include \"libcamera/internal/pipeline_handler.h\"\n>>  \n>> @@ -258,6 +259,13 @@ void CameraManager::Private::removeCamera(std::shared_ptr<Camera> camera)\n>>         o->cameraRemoved.emit(camera);\n>>  }\n>>  \n>> +/**\n>> + * \\fn const GlobalConfiguration &CameraManager::Private::configuration() const\n>> + * \\brief Get global configuration bound to the camera manager\n>> + *\n>> + * \\return Reference to the configuration\n>> + */\n>> +\n>>  /**\n>>   * \\fn CameraManager::Private::ipaManager() const\n>>   * \\brief Retrieve the IPAManager\n>> -- \n>> 2.50.1\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 23D57C324E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  8 Sep 2025 13:48:17 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 448986935B;\n\tMon,  8 Sep 2025 15:48:16 +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 8A2736934E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  8 Sep 2025 15:48:14 +0200 (CEST)","from mail-ej1-f72.google.com (mail-ej1-f72.google.com\n\t[209.85.218.72]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-548-CorGbmwcMqGnUMQGCzMcEg-1; Mon, 08 Sep 2025 09:48:11 -0400","by mail-ej1-f72.google.com with SMTP id\n\ta640c23a62f3a-b04a302fb7cso190210366b.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 08 Sep 2025 06:48:10 -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\ta640c23a62f3a-b0425ce98f1sm1961088166b.67.2025.09.08.06.48.03\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tMon, 08 Sep 2025 06:48:03 -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=\"TpUj+4Y6\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1757339293;\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\tin-reply-to:in-reply-to:references:references;\n\tbh=cR70+NBXycBEs9xz9DShOACCdeOoDS2BTaxrHOoocoU=;\n\tb=TpUj+4Y6k/hbeqxuoj6lDQ1jur6IkxzeahAV01+quc8UOPrZV2FHYKe2Y1d8sxbeX5p+pr\n\tJlInljFhZIXmkSSjBGbt/ZsEJbVYO5OBHu38RuoMIkd8YdlZ46qu/ohqkaYmrAI4cXYYw7\n\tInnIiiMsXtVSfJ2ZMdXH+eVe59IbPrI=","X-MC-Unique":"CorGbmwcMqGnUMQGCzMcEg-1","X-Mimecast-MFC-AGG-ID":"CorGbmwcMqGnUMQGCzMcEg_1757339290","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1757339290; x=1757944090;\n\th=mime-version:user-agent:message-id:date:references:in-reply-to\n\t:subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=cR70+NBXycBEs9xz9DShOACCdeOoDS2BTaxrHOoocoU=;\n\tb=GgYJcdidJkYsUlT4yDwqlVDnNn0+h/DsN6MyJoeNUaikyobN/BNHsD6JQQ2B8B2jYM\n\tl1JxoBvaqXqpYQmt8D1fO77duPjyQo/izj/8isvFhRSqeCwvg0B2XXiqxKmoJXklhif0\n\tn7T//9T/omuWsAKYV5ysj2UYe3BwymmYsEujU2KoM8SSFLrhZqHyrdUArCgK4BZOpGug\n\t79u0nUOE8vcrd81ZcIKp99QQppLQBDwrQla1n3CDSg0Ykra+z5PJfjV2P0PSAN51FGAu\n\tMuHImn8rH2gIcrc242p4r5GJ2jnQccNxeDcOWoPY70kqa0fhBzs4NTUxCrDsuo53Jygy\n\tnX+Q==","X-Gm-Message-State":"AOJu0YyvkBbBiaTaXL+ZTrVPZOOv+mG6JbJJl/t/fZCQvgUZs9EZiE0s\n\tWWMGHj2nkIjcR5o6NUKK8M6iON0P0ZHdKn6gYKOHPhkpXKzgM0TFYyU14WSYpavsqNUNzGCrKrO\n\tEv7eFbFuzStwhKRd4CYvZuNk0tARB8G1l8WfOrRZmmB9s58PS55Y5R20zMOE1LmZhkSq/pb3Z37\n\tc=","X-Gm-Gg":"ASbGncuZtVKjb4mUNsAKFQRjD+AIyBCxCXfIzBn0/LsBXZtbVCDIu+pEJe1NPQaVBFn\n\tS8bdZpidV2/4Qguqe1dRSYWDqTNTCq2AKrmHLuWFJVII+E5Av3twYOg326MnNxesnLyLsoG1EQm\n\tWLROjfReUNzbPWEKE0Al6X0yL23kdw6kG1qBD3g5yw9Z99cVSdIw8m9VRmd/rm8slSp22Peec66\n\tQPkX7dZcE+1k8JAD0B0rpyCh/YF7Zx10Vm6XRCkDXXqknI2nhgvX6xC0qjNWPty1eJ32dBWYq+D\n\tG+Sb6fO7uHQVvuUothPixbUZnl4FEY/J5gu4APUtV1KzzojkRXjEZueUGYLjMnn48ZXlUxuAJ5v\n\t2+ADo8JjMLi/orKA14A==","X-Received":["by 2002:a17:906:fe04:b0:afd:d9e4:51e9 with SMTP id\n\ta640c23a62f3a-b04b17d9b8amr640193866b.65.1757339289716; \n\tMon, 08 Sep 2025 06:48:09 -0700 (PDT)","by 2002:a17:906:fe04:b0:afd:d9e4:51e9 with SMTP id\n\ta640c23a62f3a-b04b17d9b8amr640165666b.65.1757339284190; \n\tMon, 08 Sep 2025 06:48:04 -0700 (PDT)"],"X-Google-Smtp-Source":"AGHT+IEcGheE6xvqJQOjW5woDZj8wvixNNwEWXh1/+Dy7fj1ZVRCoSz8bsEjgDZChev09vfDrTMKTw==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>, =?utf-8?q?Barnab?=\n\t=?utf-8?b?w6FzIFDFkWN6ZQ==?= <barnabas.pocze@ideasonboard.com>,\n\tLaurent Pinchart  <laurent.pinchart@ideasonboard.com>","Subject":"Re: [PATCH v16 02/12] config: Make GlobalConfiguration instance","In-Reply-To":"<175732707652.2066996.5501680675239932294@neptunite.rasen.tech>\n\t(Paul Elder's message of \"Mon, 08 Sep 2025 19:24:36 +0900\")","References":"<20250729073201.5369-1-mzamazal@redhat.com>\n\t<20250729073201.5369-3-mzamazal@redhat.com>\n\t<175732707652.2066996.5501680675239932294@neptunite.rasen.tech>","Date":"Mon, 08 Sep 2025 15:48:02 +0200","Message-ID":"<85v7ltt5rh.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":"6C_C72Sm9hiPICvv3ZiyDBKTu8EdJuLA3BOz2IJLrTI_1757339290","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain","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>"}}]