[{"id":23217,"web_url":"https://patchwork.libcamera.org/comment/23217/","msgid":"<a018e769-a244-a432-2b56-eb67c9b4d036@ideasonboard.com>","date":"2022-05-29T12:37:44","subject":"Re: [libcamera-devel] [PATCH 5/5] libcamera: base: log: Color the\n\tlog prefix","submitter":{"id":86,"url":"https://patchwork.libcamera.org/api/people/86/","name":"Umang Jain","email":"umang.jain@ideasonboard.com"},"content":"Hi Laurent\n\nOn 5/26/22 00:25, Laurent Pinchart via libcamera-devel wrote:\n> Add coloring to the log prefix to increase log readability.\n>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n\nLooks good,\n\nReviewed-by: Umang Jain <umang.jain@ideasonboard.com>\n\n> ---\n>   include/libcamera/base/log.h |  5 ++++-\n>   src/libcamera/base/log.cpp   | 37 +++++++++++++++++++++++-------------\n>   2 files changed, 28 insertions(+), 14 deletions(-)\n>\n> diff --git a/include/libcamera/base/log.h b/include/libcamera/base/log.h\n> index 3f065267c914..3fc5ced38a6a 100644\n> --- a/include/libcamera/base/log.h\n> +++ b/include/libcamera/base/log.h\n> @@ -57,7 +57,8 @@ class LogMessage\n>   {\n>   public:\n>   \tLogMessage(const char *fileName, unsigned int line,\n> -\t\t   const LogCategory &category, LogSeverity severity);\n> +\t\t   const LogCategory &category, LogSeverity severity,\n> +\t\t   const std::string &prefix = std::string());\n>   \n>   \tLogMessage(LogMessage &&);\n>   \t~LogMessage();\n> @@ -68,6 +69,7 @@ public:\n>   \tLogSeverity severity() const { return severity_; }\n>   \tconst LogCategory &category() const { return category_; }\n>   \tconst std::string &fileInfo() const { return fileInfo_; }\n> +\tconst std::string &prefix() const { return prefix_; }\n>   \tconst std::string msg() const { return msgStream_.str(); }\n>   \n>   private:\n> @@ -80,6 +82,7 @@ private:\n>   \tLogSeverity severity_;\n>   \tutils::time_point timestamp_;\n>   \tstd::string fileInfo_;\n> +\tstd::string prefix_;\n>   };\n>   \n>   class Loggable\n> diff --git a/src/libcamera/base/log.cpp b/src/libcamera/base/log.cpp\n> index a9f5bbbd36f7..6620a50a5b6f 100644\n> --- a/src/libcamera/base/log.cpp\n> +++ b/src/libcamera/base/log.cpp\n> @@ -219,6 +219,7 @@ void LogOutput::write(const LogMessage &msg)\n>   \n>   \tconst char *categoryColor = color_ ? kColorBrightWhite : \"\";\n>   \tconst char *fileColor = color_ ? kColorBrightBlue : \"\";\n> +\tconst char *prefixColor = color_ ? kColorGreen : \"\";\n>   \tconst char *msgColor = color_ ? kColorReset : \"\";\n>   \tconst char *severityColor = \"\";\n>   \tLogSeverity severity = msg.severity();\n> @@ -234,8 +235,10 @@ void LogOutput::write(const LogMessage &msg)\n>   \tswitch (target_) {\n>   \tcase LoggingTargetSyslog:\n>   \t\tstr = std::string(log_severity_name(severity)) + \" \"\n> -\t\t    + msg.category().name() + \" \" + msg.fileInfo() + \" \"\n> -\t\t    + msg.msg();\n> +\t\t    + msg.category().name() + \" \" + msg.fileInfo() + \" \";\n> +\t\tif (!msg.prefix().empty())\n> +\t\t\tstr += msg.prefix() + \": \";\n> +\t\tstr += msg.msg();\n>   \t\twriteSyslog(severity, str);\n>   \t\tbreak;\n>   \tcase LoggingTargetStream:\n> @@ -244,8 +247,10 @@ void LogOutput::write(const LogMessage &msg)\n>   \t\t    + std::to_string(Thread::currentId()) + \"] \"\n>   \t\t    + severityColor + log_severity_name(severity) + \" \"\n>   \t\t    + categoryColor + msg.category().name() + \" \"\n> -\t\t    + fileColor + msg.fileInfo() + \" \"\n> -\t\t    + msgColor + msg.msg();\n> +\t\t    + fileColor + msg.fileInfo() + \" \";\n> +\t\tif (!msg.prefix().empty())\n> +\t\t\tstr += prefixColor + msg.prefix() + \": \";\n> +\t\tstr += msgColor + msg.msg();\n>   \t\twriteStream(str);\n>   \t\tbreak;\n>   \tdefault:\n> @@ -823,14 +828,17 @@ const LogCategory &LogCategory::defaultCategory()\n>    * will be displayed\n>    * \\param[in] severity The log message severity, controlling how the message\n>    * will be displayed\n> + * \\param[in] prefix The log message prefix\n>    *\n>    * Create a log message pertaining to line \\a line of file \\a fileName. The\n>    * \\a severity argument sets the message severity to control whether it will be\n> - * output or dropped.\n> + * output or dropped. The \\a prefix optionally identifies the object instance\n> + * logging the message.\n>    */\n>   LogMessage::LogMessage(const char *fileName, unsigned int line,\n> -\t\t       const LogCategory &category, LogSeverity severity)\n> -\t: category_(category), severity_(severity)\n> +\t\t       const LogCategory &category, LogSeverity severity,\n> +\t\t       const std::string &prefix)\n> +\t: category_(category), severity_(severity), prefix_(prefix)\n>   {\n>   \tinit(fileName, line);\n>   }\n> @@ -919,6 +927,12 @@ LogMessage::~LogMessage()\n>    * \\return The file info of the message\n>    */\n>   \n> +/**\n> + * \\fn LogMessage::prefix()\n> + * \\brief Retrieve the prefix of the log message\n> + * \\return The prefix of the message\n> + */\n> +\n>   /**\n>    * \\fn LogMessage::msg()\n>    * \\brief Retrieve the message text of the log message\n> @@ -966,12 +980,9 @@ Loggable::~Loggable()\n>   LogMessage Loggable::_log(const LogCategory *category, LogSeverity severity,\n>   \t\t\t  const char *fileName, unsigned int line) const\n>   {\n> -\tLogMessage msg(fileName, line,\n> -\t\t       category ? *category : LogCategory::defaultCategory(),\n> -\t\t       severity);\n> -\n> -\tmsg.stream() << logPrefix() << \": \";\n> -\treturn msg;\n> +\treturn LogMessage(fileName, line,\n> +\t\t\t  category ? *category : LogCategory::defaultCategory(),\n> +\t\t\t  severity, logPrefix());\n>   }\n>   \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 E0057BD161\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSun, 29 May 2022 12:37:50 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4112065633;\n\tSun, 29 May 2022 14:37:50 +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 3FA8460415\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 29 May 2022 14:37:48 +0200 (CEST)","from [192.168.1.68] (235.red-81-36-186.dynamicip.rima-tde.net\n\t[81.36.186.235])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B617B104;\n\tSun, 29 May 2022 14:37:47 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1653827870;\n\tbh=9lZYP0CTJ5ADQOSx2BHjF+gBWqWDPnw7Xm8FGUVibIw=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=e8n8I+ivrh5192lFHoHYUqZyyytA71Eoie1lqmXDZu+epIJ62i7tZeYnykEkuQboN\n\tiYrGT9tU8R1IM69mW13j0uUNfjNdeZle9L8n1xhEydfPlbLMOFFZpOkqC+sPL9gYWo\n\tjEVT4DQlQDNjKk6iDrBwftvKTVqqjXb8UHlcb/awPH/7nm2+R1nLyeOavGH1DBvzmq\n\t724OIZ9xlFCfIRjy6phST4y3I0dMzMcSLa2tH3UppRCICikxWwX3+M8YTVDgQDV0/I\n\tncYCKUocrDKRqULKutWjfYF09uwXRAk8W9uenQevFHdwjQYpyn5JpZkbPFXLk+GujM\n\t3nLkW7JKtjR1w==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1653827867;\n\tbh=9lZYP0CTJ5ADQOSx2BHjF+gBWqWDPnw7Xm8FGUVibIw=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=JExrp1xu2wU+E0sNNBI/P/t3EM8j7TPASltAlOGO41aidu4f679ywBgOoFumyzM24\n\trwC/s7WcHXetrwK4b6aFPDVazhEkpUqDOLfo2gnpjAyAtzpBh1wILqVdRtfaGWJ6uR\n\tZ+Hxm8mHirdipeA79vBZSLftWw+XJkpPfHT7ocE4="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"JExrp1xu\"; dkim-atps=neutral","Message-ID":"<a018e769-a244-a432-2b56-eb67c9b4d036@ideasonboard.com>","Date":"Sun, 29 May 2022 14:37:44 +0200","MIME-Version":"1.0","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101\n\tThunderbird/91.4.1","Content-Language":"en-US","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20220525222503.6460-1-laurent.pinchart@ideasonboard.com>\n\t<20220525222503.6460-6-laurent.pinchart@ideasonboard.com>","In-Reply-To":"<20220525222503.6460-6-laurent.pinchart@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","Subject":"Re: [libcamera-devel] [PATCH 5/5] libcamera: base: log: Color the\n\tlog prefix","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>","From":"Umang Jain via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Umang Jain <umang.jain@ideasonboard.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":23261,"web_url":"https://patchwork.libcamera.org/comment/23261/","msgid":"<20220531045201.GH2630765@pyrite.rasen.tech>","date":"2022-05-31T04:52:01","subject":"Re: [libcamera-devel] [PATCH 5/5] libcamera: base: log: Color the\n\tlog prefix","submitter":{"id":97,"url":"https://patchwork.libcamera.org/api/people/97/","name":"Nicolas Dufresne via libcamera-devel","email":"libcamera-devel@lists.libcamera.org"},"content":"Hi Laurent,\n\nOn Thu, May 26, 2022 at 01:25:03AM +0300, Laurent Pinchart via libcamera-devel wrote:\n> Add coloring to the log prefix to increase log readability.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nReviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n\n> ---\n>  include/libcamera/base/log.h |  5 ++++-\n>  src/libcamera/base/log.cpp   | 37 +++++++++++++++++++++++-------------\n>  2 files changed, 28 insertions(+), 14 deletions(-)\n> \n> diff --git a/include/libcamera/base/log.h b/include/libcamera/base/log.h\n> index 3f065267c914..3fc5ced38a6a 100644\n> --- a/include/libcamera/base/log.h\n> +++ b/include/libcamera/base/log.h\n> @@ -57,7 +57,8 @@ class LogMessage\n>  {\n>  public:\n>  \tLogMessage(const char *fileName, unsigned int line,\n> -\t\t   const LogCategory &category, LogSeverity severity);\n> +\t\t   const LogCategory &category, LogSeverity severity,\n> +\t\t   const std::string &prefix = std::string());\n>  \n>  \tLogMessage(LogMessage &&);\n>  \t~LogMessage();\n> @@ -68,6 +69,7 @@ public:\n>  \tLogSeverity severity() const { return severity_; }\n>  \tconst LogCategory &category() const { return category_; }\n>  \tconst std::string &fileInfo() const { return fileInfo_; }\n> +\tconst std::string &prefix() const { return prefix_; }\n>  \tconst std::string msg() const { return msgStream_.str(); }\n>  \n>  private:\n> @@ -80,6 +82,7 @@ private:\n>  \tLogSeverity severity_;\n>  \tutils::time_point timestamp_;\n>  \tstd::string fileInfo_;\n> +\tstd::string prefix_;\n>  };\n>  \n>  class Loggable\n> diff --git a/src/libcamera/base/log.cpp b/src/libcamera/base/log.cpp\n> index a9f5bbbd36f7..6620a50a5b6f 100644\n> --- a/src/libcamera/base/log.cpp\n> +++ b/src/libcamera/base/log.cpp\n> @@ -219,6 +219,7 @@ void LogOutput::write(const LogMessage &msg)\n>  \n>  \tconst char *categoryColor = color_ ? kColorBrightWhite : \"\";\n>  \tconst char *fileColor = color_ ? kColorBrightBlue : \"\";\n> +\tconst char *prefixColor = color_ ? kColorGreen : \"\";\n>  \tconst char *msgColor = color_ ? kColorReset : \"\";\n>  \tconst char *severityColor = \"\";\n>  \tLogSeverity severity = msg.severity();\n> @@ -234,8 +235,10 @@ void LogOutput::write(const LogMessage &msg)\n>  \tswitch (target_) {\n>  \tcase LoggingTargetSyslog:\n>  \t\tstr = std::string(log_severity_name(severity)) + \" \"\n> -\t\t    + msg.category().name() + \" \" + msg.fileInfo() + \" \"\n> -\t\t    + msg.msg();\n> +\t\t    + msg.category().name() + \" \" + msg.fileInfo() + \" \";\n> +\t\tif (!msg.prefix().empty())\n> +\t\t\tstr += msg.prefix() + \": \";\n> +\t\tstr += msg.msg();\n>  \t\twriteSyslog(severity, str);\n>  \t\tbreak;\n>  \tcase LoggingTargetStream:\n> @@ -244,8 +247,10 @@ void LogOutput::write(const LogMessage &msg)\n>  \t\t    + std::to_string(Thread::currentId()) + \"] \"\n>  \t\t    + severityColor + log_severity_name(severity) + \" \"\n>  \t\t    + categoryColor + msg.category().name() + \" \"\n> -\t\t    + fileColor + msg.fileInfo() + \" \"\n> -\t\t    + msgColor + msg.msg();\n> +\t\t    + fileColor + msg.fileInfo() + \" \";\n> +\t\tif (!msg.prefix().empty())\n> +\t\t\tstr += prefixColor + msg.prefix() + \": \";\n> +\t\tstr += msgColor + msg.msg();\n>  \t\twriteStream(str);\n>  \t\tbreak;\n>  \tdefault:\n> @@ -823,14 +828,17 @@ const LogCategory &LogCategory::defaultCategory()\n>   * will be displayed\n>   * \\param[in] severity The log message severity, controlling how the message\n>   * will be displayed\n> + * \\param[in] prefix The log message prefix\n>   *\n>   * Create a log message pertaining to line \\a line of file \\a fileName. The\n>   * \\a severity argument sets the message severity to control whether it will be\n> - * output or dropped.\n> + * output or dropped. The \\a prefix optionally identifies the object instance\n> + * logging the message.\n>   */\n>  LogMessage::LogMessage(const char *fileName, unsigned int line,\n> -\t\t       const LogCategory &category, LogSeverity severity)\n> -\t: category_(category), severity_(severity)\n> +\t\t       const LogCategory &category, LogSeverity severity,\n> +\t\t       const std::string &prefix)\n> +\t: category_(category), severity_(severity), prefix_(prefix)\n>  {\n>  \tinit(fileName, line);\n>  }\n> @@ -919,6 +927,12 @@ LogMessage::~LogMessage()\n>   * \\return The file info of the message\n>   */\n>  \n> +/**\n> + * \\fn LogMessage::prefix()\n> + * \\brief Retrieve the prefix of the log message\n> + * \\return The prefix of the message\n> + */\n> +\n>  /**\n>   * \\fn LogMessage::msg()\n>   * \\brief Retrieve the message text of the log message\n> @@ -966,12 +980,9 @@ Loggable::~Loggable()\n>  LogMessage Loggable::_log(const LogCategory *category, LogSeverity severity,\n>  \t\t\t  const char *fileName, unsigned int line) const\n>  {\n> -\tLogMessage msg(fileName, line,\n> -\t\t       category ? *category : LogCategory::defaultCategory(),\n> -\t\t       severity);\n> -\n> -\tmsg.stream() << logPrefix() << \": \";\n> -\treturn msg;\n> +\treturn LogMessage(fileName, line,\n> +\t\t\t  category ? *category : LogCategory::defaultCategory(),\n> +\t\t\t  severity, logPrefix());\n>  }\n>  \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 6D81CBD161\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 31 May 2022 04:52:10 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id A4DBC65633;\n\tTue, 31 May 2022 06:52:09 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 29A446040A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 31 May 2022 06:52:09 +0200 (CEST)","from pyrite.rasen.tech (softbank036240126034.bbtec.net\n\t[36.240.126.34])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 9724E6F0;\n\tTue, 31 May 2022 06:52:07 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1653972729;\n\tbh=4AitFFYpGI6GcQYEfzWDdPHTDiTu11ioBKovNjJyTi8=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=ScCBXBc9n5jDRmJJIT26nAyT23Xzl+5aF2Ld8d+spQlsDsQWA3tO6eH64OT7b+pit\n\tA+lnXjT2dcPR+lQU2Jze38AU3xaLYNaaS2e6y+CGVEOH/NiRikKrqgF3bZlgxn60Rx\n\tP1ZwKs8iePH4tbRh5NYwsALEc8N2wR3FwleZH36q4DpLR0ghcPUZ0wY8DRGtKer5Xj\n\tO2/toRE6u/1NRDPhZKPgERgInguO+FWoD5k5poFRV97HEThKM/djDU9hbbDTyV/UUk\n\t63DRgsd/ppBopSGlwa1GfWOIbhFsBCPVhbgxKU9j3xZjl54UfovYAyJdfoA14InXft\n\t2u1bIOuXvFmYQ==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1653972728;\n\tbh=4AitFFYpGI6GcQYEfzWDdPHTDiTu11ioBKovNjJyTi8=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=qwGOt2IB9LO2VBm4FEkykZiX4rkhiymj6XTmvkn+9bGnaLcr+NfuL36sMIbV16O0Q\n\t88jaEoscptlvKr/uFTaQRxTDDDJtVwCBuiWP20tXKE3J3odojiHh4bhugyAiYONPvD\n\tRNCleYPzj7qO36cILJInMozRc6xjYYYp6eItk0Y4="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"qwGOt2IB\"; dkim-atps=neutral","Date":"Tue, 31 May 2022 13:52:01 +0900","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Message-ID":"<20220531045201.GH2630765@pyrite.rasen.tech>","References":"<20220525222503.6460-1-laurent.pinchart@ideasonboard.com>\n\t<20220525222503.6460-6-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","In-Reply-To":"<20220525222503.6460-6-laurent.pinchart@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH 5/5] libcamera: base: log: Color the\n\tlog prefix","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>","From":"Paul Elder via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"paul.elder@ideasonboard.com","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]