[{"id":34850,"web_url":"https://patchwork.libcamera.org/comment/34850/","msgid":"<dtihasvmkgofdi6ftpn5acjnbmbracqg4sjsnfosiit56g7zki@77pnq6k2wbzu>","date":"2025-07-11T04:38:41","subject":"Re: [PATCH v9 04/10] libcamera: simple: Add plain output\n\tconfigurations","submitter":{"id":232,"url":"https://patchwork.libcamera.org/api/people/232/","name":"Umang Jain","email":"uajain@igalia.com"},"content":"Hi Milan\n\nOn Mon, Jul 07, 2025 at 05:58:49PM +0200, Milan Zamazal wrote:\n> Output configurations in simple pipeline are added depending on whether\n> a converter, software ISP or none of them are used.  If a converter or\n> software ISP is used, no raw output configurations are added.  Unless\n> only raw configurations are available, in which case we add them to\n> avoid ...\n> \n\n... ?\n> In order to support raw output at least with software ISP, let's always\n> add raw output configurations.  A flag is added to\n> SimpleCameraData::Configuration indicating whether it's for a raw or a\n> converted output.  We later filter formats and output sizes for\n> particular stream configurations according to the new configuration\n> flag.\n> \n> This is just preparation and raw output is still not supported.  At the\n> moment, we simply filter out raw configurations unconditionally to keep\n> the current code working; this will be changed in followup patches.\n> \n> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> ---\n>  src/libcamera/pipeline/simple/simple.cpp | 34 +++++++++++++++---------\n>  1 file changed, 22 insertions(+), 12 deletions(-)\n> \n> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> index 368bf3020..1a7474228 100644\n> --- a/src/libcamera/pipeline/simple/simple.cpp\n> +++ b/src/libcamera/pipeline/simple/simple.cpp\n> @@ -325,6 +325,7 @@ public:\n>  \t\tSize captureSize;\n>  \t\tstd::vector<PixelFormat> outputFormats;\n>  \t\tSizeRange outputSizes;\n> +\t\tbool raw;\n>  \t};\n>  \n>  \tstd::vector<Stream> streams_;\n> @@ -714,27 +715,33 @@ void SimpleCameraData::tryPipeline(unsigned int code, const Size &size)\n>  \t\t\tcontinue;\n>  \n>  \t\tConfiguration config;\n> +\n> +\t\t/* Raw configuration */\n>  \t\tconfig.code = code;\n>  \t\tconfig.sensorSize = size;\n>  \t\tconfig.captureFormat = pixelFormat;\n>  \t\tconfig.captureSize = format.size;\n> +\t\tconfig.outputFormats = { pixelFormat };\n> +\t\tconfig.outputSizes = config.captureSize;\n> +\t\tconfig.raw = true;\n> +\t\tconfigs_.push_back(config);\n\nI am wondering a bit if we really need to do this[1] and if at all, won't a\nbetter idea is to populate \n\n\tstd::map<PixelFormat, std::vector<const Configuration *>> formats_;\n\nwith <rawFormat, Configuration> instead? \n\n[1]\nOn the other hand, looking at format_ mapping with applied:\n\ndiff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\nindex 60034395..abfd3f2d 100644\n--- a/src/libcamera/pipeline/simple/simple.cpp\n+++ b/src/libcamera/pipeline/simple/simple.cpp\n@@ -640,6 +640,14 @@ int SimpleCameraData::init()\n                        formats_[fmt].push_back(&config);\n        }\n \n+       /* Log formats_ key mappings */\n+       for (const auto &iter : formats_) {\n+               const PixelFormatInfo &info = PixelFormatInfo::info(iter.first);\n+               if (info.colourEncoding == PixelFormatInfo::ColourEncodingRAW)\n+                       LOG(SimplePipeline, Info) << \"formats_:<Key> \"\n+                                                  << iter.first.toString();\n+       }\n+\n        properties_ = sensor_->properties();\n \n        /* Find the first subdev that can generate a frame start signal, if any. */\n\nWe have:\n\n[0:32:46.178566332] [409]  INFO SimplePipeline simple.cpp:647 formats_:<Key> SRGGB10\n[0:32:46.178813311] [409]  INFO SimplePipeline simple.cpp:647 formats_:<Key> SRGGB10_CSI2P\n[0:32:46.179011592] [409]  INFO SimplePipeline simple.cpp:647 formats_:<Key> SRGGB8\n\nSo I think we already have rawformats supported by the sensor, mapped to\nConfiguration, in the formats_ map. Should we just detect role=raw\nrequested by the user and use formats_ to retrieve the Configuration ?\n\nWe would have ignore the config.outputFormats and config.outputSizes for the\nrole=raw, since it won't be relevant. And look at this current patch,\n\n +             config.outputFormats = { pixelFormat };                         \n +             config.outputSizes = config.captureSize;   \n\nis caching the redundant information to Configuration.\n\nThese are my current thoughts on the patch. I haven't read the whole\nseries yet (probably will take multiple passes).\n\n>  \n> +\t\t/* Modified, non-raw, configuration */\n> +\t\tconfig.raw = false;\n>  \t\tif (converter_) {\n>  \t\t\tconfig.outputFormats = converter_->formats(pixelFormat);\n>  \t\t\tconfig.outputSizes = converter_->sizes(format.size);\n>  \t\t} else if (swIsp_) {\n> -\t\t\tconfig.outputFormats = swIsp_->formats(pixelFormat);\n> -\t\t\tconfig.outputSizes = swIsp_->sizes(pixelFormat, format.size);\n> -\t\t\tif (config.outputFormats.empty()) {\n> +\t\t\tstd::vector<PixelFormat> outputFormats = swIsp_->formats(pixelFormat);\n> +\t\t\tif (outputFormats.empty()) {\n>  \t\t\t\t/* Do not use swIsp for unsupported pixelFormat's. */\n> -\t\t\t\tconfig.outputFormats = { pixelFormat };\n> -\t\t\t\tconfig.outputSizes = config.captureSize;\n> +\t\t\t\tcontinue;\n>  \t\t\t}\n> +\t\t\tconfig.outputFormats = outputFormats;\n> +\t\t\tconfig.outputSizes = swIsp_->sizes(pixelFormat, format.size);\n>  \t\t} else {\n> -\t\t\tconfig.outputFormats = { pixelFormat };\n> -\t\t\tconfig.outputSizes = config.captureSize;\n> +\t\t\tcontinue;\n>  \t\t}\n> -\n>  \t\tconfigs_.push_back(config);\n>  \t}\n>  }\n> @@ -1313,10 +1320,13 @@ SimplePipelineHandler::generateConfiguration(Camera *camera, Span<const StreamRo\n>  \t/* Create the formats map. */\n>  \tstd::map<PixelFormat, std::vector<SizeRange>> formats;\n>  \n> -\tfor (const SimpleCameraData::Configuration &cfg : data->configs_) {\n> -\t\tfor (PixelFormat format : cfg.outputFormats)\n> -\t\t\tformats[format].push_back(cfg.outputSizes);\n> -\t}\n> +\tconst bool rawOnly = std::all_of(data->configs_.cbegin(),\n> +\t\t\t\t\t data->configs_.cend(),\n> +\t\t\t\t\t [](const auto &c) { return c.raw; });\n> +\tfor (const SimpleCameraData::Configuration &cfg : data->configs_)\n> +\t\tif (!cfg.raw || rawOnly)\n> +\t\t\tfor (PixelFormat format : cfg.outputFormats)\n> +\t\t\t\tformats[format].push_back(cfg.outputSizes);\n>  \n>  \t/* Sort the sizes and merge any consecutive overlapping ranges. */\n>  \tfor (auto &[format, sizes] : formats) {\n> -- \n> 2.50.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 7E44CC3237\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 11 Jul 2025 04:38:47 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9375768F08;\n\tFri, 11 Jul 2025 06:38:46 +0200 (CEST)","from fanzine2.igalia.com (fanzine2.igalia.com [213.97.179.56])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 42E9F61517\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 11 Jul 2025 06:38:44 +0200 (CEST)","from [49.43.35.133] (helo=uajain)\n\tby fanzine2.igalia.com with esmtpsa \n\t(Cipher TLS1.3:ECDHE_SECP256R1__RSA_PSS_RSAE_SHA256__AES_256_GCM:256)\n\t(Exim) id 1ua5Wz-00FELT-PP; Fri, 11 Jul 2025 06:38:42 +0200"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=igalia.com header.i=@igalia.com\n\theader.b=\"g/3vhGpu\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com;\n\ts=20170329;\n\th=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:\n\tSubject:Cc:To:From:Date:Sender:Reply-To:Content-Transfer-Encoding:Content-ID:\n\tContent-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc\n\t:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe:\n\tList-Post:List-Owner:List-Archive;\n\tbh=B85z6mpg6Kt2PIVP+S0KeGmIIeKv0wvXkd5xZk6X+jY=;\n\tb=g/3vhGpuhk8nP+FXQDTa0zThTm\n\tt9FCaQzDrdxcGopcZ1QMibYoyeatGQe1nNzsJfvWuGtihEcb/Q1U7n5rpw4L7gKtHNnuo9mwxTF/L\n\tWEzNpdN8A8sES5UjxXKEyB+iFk//MlDsOklntgFtFX9Tv92EujGHjPUKmZnGavTmyglyyTFVKIGZK\n\tKCgNVwDrvHx0txjPTXCYMi/iJ3Z5/JYfIOnSgNanVN7ERukV0XvWYMJFdEzEbm4HJRzlHboq9urBJ\n\tsiqwHLNn6mUVDRPvcxlY6o4dYCZzu3m7Hvo5wcgTS4YVD+HgzLUyGLXNBbiE08zoaVHD4VRFLL08E\n\t9uYyv8ow==;","Date":"Fri, 11 Jul 2025 10:08:41 +0530","From":"Umang Jain <uajain@igalia.com>","To":"Milan Zamazal <mzamazal@redhat.com>","Cc":"libcamera-devel@lists.libcamera.org, Laurent Pinchart\n\t<laurent.pinchart@ideasonboard.com>, Kieran Bingham\n\t<kieran.bingham@ideasonboard.com>, =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?=\n\t<barnabas.pocze@ideasonboard.com>, Paul Elder\n\t<paul.elder@ideasonboard.com>","Subject":"Re: [PATCH v9 04/10] libcamera: simple: Add plain output\n\tconfigurations","Message-ID":"<dtihasvmkgofdi6ftpn5acjnbmbracqg4sjsnfosiit56g7zki@77pnq6k2wbzu>","References":"<20250707155856.33436-1-mzamazal@redhat.com>\n\t<20250707155856.33436-5-mzamazal@redhat.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","In-Reply-To":"<20250707155856.33436-5-mzamazal@redhat.com>","User-Agent":"NeoMutt/20250510-dirty","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":34860,"web_url":"https://patchwork.libcamera.org/comment/34860/","msgid":"<85ms9add9q.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2025-07-11T14:15:45","subject":"Re: [PATCH v9 04/10] libcamera: simple: Add plain output\n\tconfigurations","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Hi Umang,\n\nthank you for review.\n\nUmang Jain <uajain@igalia.com> writes:\n\n> Hi Milan\n>\n> On Mon, Jul 07, 2025 at 05:58:49PM +0200, Milan Zamazal wrote:\n>> Output configurations in simple pipeline are added depending on whether\n>> a converter, software ISP or none of them are used.  If a converter or\n>> software ISP is used, no raw output configurations are added.  Unless\n>> only raw configurations are available, in which case we add them to\n>> avoid ...\n>> \n>\n> ... ?\n\nForgotten unfinished thought, I'll fix it.\n\n>> In order to support raw output at least with software ISP, let's always\n>> add raw output configurations.  A flag is added to\n>> SimpleCameraData::Configuration indicating whether it's for a raw or a\n>> converted output.  We later filter formats and output sizes for\n>> particular stream configurations according to the new configuration\n>> flag.\n>> \n>> This is just preparation and raw output is still not supported.  At the\n>> moment, we simply filter out raw configurations unconditionally to keep\n>> the current code working; this will be changed in followup patches.\n>> \n>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>> ---\n>>  src/libcamera/pipeline/simple/simple.cpp | 34 +++++++++++++++---------\n>>  1 file changed, 22 insertions(+), 12 deletions(-)\n>> \n>> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n>> index 368bf3020..1a7474228 100644\n>> --- a/src/libcamera/pipeline/simple/simple.cpp\n>> +++ b/src/libcamera/pipeline/simple/simple.cpp\n>> @@ -325,6 +325,7 @@ public:\n>>  \t\tSize captureSize;\n>>  \t\tstd::vector<PixelFormat> outputFormats;\n>>  \t\tSizeRange outputSizes;\n>> +\t\tbool raw;\n>>  \t};\n>>  \n>>  \tstd::vector<Stream> streams_;\n>> @@ -714,27 +715,33 @@ void SimpleCameraData::tryPipeline(unsigned int code, const Size &size)\n>>  \t\t\tcontinue;\n>>  \n>>  \t\tConfiguration config;\n>> +\n>> +\t\t/* Raw configuration */\n>>  \t\tconfig.code = code;\n>>  \t\tconfig.sensorSize = size;\n>>  \t\tconfig.captureFormat = pixelFormat;\n>>  \t\tconfig.captureSize = format.size;\n>> +\t\tconfig.outputFormats = { pixelFormat };\n>> +\t\tconfig.outputSizes = config.captureSize;\n>> +\t\tconfig.raw = true;\n>> +\t\tconfigs_.push_back(config);\n>\n> I am wondering a bit if we really need to do this[1] and if at all, won't a\n> better idea is to populate \n>\n> \tstd::map<PixelFormat, std::vector<const Configuration *>> formats_;\n>\n> with <rawFormat, Configuration> instead? \n\nI prefer keeping unnamed data structures simple.\n\n> [1]\n> On the other hand, looking at format_ mapping with applied:\n>\n> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> index 60034395..abfd3f2d 100644\n> --- a/src/libcamera/pipeline/simple/simple.cpp\n> +++ b/src/libcamera/pipeline/simple/simple.cpp\n> @@ -640,6 +640,14 @@ int SimpleCameraData::init()\n>                         formats_[fmt].push_back(&config);\n>         }\n>  \n> +       /* Log formats_ key mappings */\n> +       for (const auto &iter : formats_) {\n> +               const PixelFormatInfo &info = PixelFormatInfo::info(iter.first);\n> +               if (info.colourEncoding == PixelFormatInfo::ColourEncodingRAW)\n> +                       LOG(SimplePipeline, Info) << \"formats_:<Key> \"\n> +                                                  << iter.first.toString();\n> +       }\n> +\n>         properties_ = sensor_->properties();\n>  \n>         /* Find the first subdev that can generate a frame start signal, if any. */\n>\n> We have:\n>\n> [0:32:46.178566332] [409]  INFO SimplePipeline simple.cpp:647 formats_:<Key> SRGGB10\n> [0:32:46.178813311] [409]  INFO SimplePipeline simple.cpp:647 formats_:<Key> SRGGB10_CSI2P\n> [0:32:46.179011592] [409]  INFO SimplePipeline simple.cpp:647 formats_:<Key> SRGGB8\n>\n> So I think we already have rawformats supported by the sensor, mapped to\n> Configuration, in the formats_ map. Should we just detect role=raw\n> requested by the user and use formats_ to retrieve the Configuration ?\n>\n> We would have ignore the config.outputFormats and config.outputSizes for the\n> role=raw, since it won't be relevant. And look at this current patch,\n>\n>  +             config.outputFormats = { pixelFormat };                         \n>  +             config.outputSizes = config.captureSize;   \n>\n> is caching the redundant information to Configuration.\n\nMakes sense and looks working, with additional adjustments.  I'll try to\nchange it this way in v10.\n\n> These are my current thoughts on the patch. I haven't read the whole\n> series yet (probably will take multiple passes).\n>\n>>  \n>> +\t\t/* Modified, non-raw, configuration */\n>> +\t\tconfig.raw = false;\n>>  \t\tif (converter_) {\n>>  \t\t\tconfig.outputFormats = converter_->formats(pixelFormat);\n>>  \t\t\tconfig.outputSizes = converter_->sizes(format.size);\n>>  \t\t} else if (swIsp_) {\n>> -\t\t\tconfig.outputFormats = swIsp_->formats(pixelFormat);\n>> -\t\t\tconfig.outputSizes = swIsp_->sizes(pixelFormat, format.size);\n>> -\t\t\tif (config.outputFormats.empty()) {\n>> +\t\t\tstd::vector<PixelFormat> outputFormats = swIsp_->formats(pixelFormat);\n>> +\t\t\tif (outputFormats.empty()) {\n>>  \t\t\t\t/* Do not use swIsp for unsupported pixelFormat's. */\n>> -\t\t\t\tconfig.outputFormats = { pixelFormat };\n>> -\t\t\t\tconfig.outputSizes = config.captureSize;\n>> +\t\t\t\tcontinue;\n>>  \t\t\t}\n>> +\t\t\tconfig.outputFormats = outputFormats;\n>> +\t\t\tconfig.outputSizes = swIsp_->sizes(pixelFormat, format.size);\n>>  \t\t} else {\n>> -\t\t\tconfig.outputFormats = { pixelFormat };\n>> -\t\t\tconfig.outputSizes = config.captureSize;\n>> +\t\t\tcontinue;\n>>  \t\t}\n>> -\n>>  \t\tconfigs_.push_back(config);\n>>  \t}\n>>  }\n>> @@ -1313,10 +1320,13 @@ SimplePipelineHandler::generateConfiguration(Camera *camera, Span<const StreamRo\n>>  \t/* Create the formats map. */\n>>  \tstd::map<PixelFormat, std::vector<SizeRange>> formats;\n>>  \n>> -\tfor (const SimpleCameraData::Configuration &cfg : data->configs_) {\n>> -\t\tfor (PixelFormat format : cfg.outputFormats)\n>> -\t\t\tformats[format].push_back(cfg.outputSizes);\n>> -\t}\n>> +\tconst bool rawOnly = std::all_of(data->configs_.cbegin(),\n>> +\t\t\t\t\t data->configs_.cend(),\n>> +\t\t\t\t\t [](const auto &c) { return c.raw; });\n>> +\tfor (const SimpleCameraData::Configuration &cfg : data->configs_)\n>> +\t\tif (!cfg.raw || rawOnly)\n>> +\t\t\tfor (PixelFormat format : cfg.outputFormats)\n>> +\t\t\t\tformats[format].push_back(cfg.outputSizes);\n>>  \n>>  \t/* Sort the sizes and merge any consecutive overlapping ranges. */\n>>  \tfor (auto &[format, sizes] : formats) {\n>> -- \n>> 2.50.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 18C15C3237\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 11 Jul 2025 14:15:55 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5CFCB68F10;\n\tFri, 11 Jul 2025 16:15:54 +0200 (CEST)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.129.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3CF8668E30\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 11 Jul 2025 16:15:52 +0200 (CEST)","from mail-ej1-f71.google.com (mail-ej1-f71.google.com\n\t[209.85.218.71]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-49-9Nnl2GMhMnKNw_y3I7hhJA-1; Fri, 11 Jul 2025 10:15:49 -0400","by mail-ej1-f71.google.com with SMTP id\n\ta640c23a62f3a-ae6d660903aso192506366b.2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 11 Jul 2025 07:15:48 -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-ae6e7ee44basm304270466b.42.2025.07.11.07.15.46\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tFri, 11 Jul 2025 07:15:46 -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=\"LheTLP29\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1752243350;\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=jWrMiUCRX5YaEdIY8APRR+mg5swKXArYkWE3wrZPLbs=;\n\tb=LheTLP29zUeGCer1ii9kWO/nb3PEjGh97eicWrgoKssCgTJJlohocM/zHdIq/GtOX7mRa1\n\ttoeOgpoHEI8iJfSiOc2xZ24EGX9jT0p/0on9ISh0SbSfzPmwpqK0WagmSl1VKTUyOsT7Cj\n\t+5jv2HbSTV0ogSUZ/u2Z6X1LqaKsHRI=","X-MC-Unique":"9Nnl2GMhMnKNw_y3I7hhJA-1","X-Mimecast-MFC-AGG-ID":"9Nnl2GMhMnKNw_y3I7hhJA_1752243348","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1752243348; x=1752848148;\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=jWrMiUCRX5YaEdIY8APRR+mg5swKXArYkWE3wrZPLbs=;\n\tb=DmlD381Q2pQiY0NlxYrYt8NimbWICsnPKJjnLOInSWxhjEmBpjmsP6nDhPxp6UaVf1\n\to0vvCksoakLk+HG7ght3PSLyBl3ot2teO60KeETthAlhB1rXtP8g6tqOKLG252+3JB5Q\n\tqE2WWRG7jjmMlMTGMRDo6wRFdHmi7lbNxY3sUSJ5q+3wuQ4dsSj8EszGtzq2Ca0JWark\n\tYYoMu+vUPYbABrgr5MZz8hmbXOSuqg8uThOMEZly8Km5IkQwq9krx4G1hmExOAZcZ2Cp\n\ti1hp8eBvDc+ninlxE6l4qzRVzGqO4fQJwIeb3wqgCZW8PMCFQEw5A4PHlae3ZlzwGT4y\n\tg8ew==","X-Gm-Message-State":"AOJu0YzbkW/qh4MCGD6LRemCHgXeKFpKfOGHI98qf7igI6ULd7YmGWbk\n\txwk67a4oUEIUjRB76FpAoy3Dh78uZpcA+7ZLqbSOW8ehTTafUthZlIq88XUWS+MfLU74D7Rqt3H\n\t4VqSttG1AqcfHE1nhw/q+lwoOsu0HFqtxYexg0hiacwfGEnn/9uhPtHgRYfvz4La+ZJZ3Ow0kLq\n\tI=","X-Gm-Gg":"ASbGnctBEM5w049aDzPbdWqXhnmlj9fvbCFqt+uvzpnMlcrdFSgktNPFkwIO5+3WVO6\n\tZDP8HnXDnTDJQETK9VhH9j7SNzDt4m1ZR83sQaVvwSAhk2eaPGsSrALpEiKV7VsFJvgzxgfm8jj\n\tVXIcrQgCxEpCmY2p3qWrcoTxB9WrqBe0Dic71G+Wx9+2vWQh8JbhLjHoj20Q3x/fR0OHanOM3/4\n\tZFnM4JEwd5d0hQrqmdXt81RfnX58rMnRt97SBLvPP+04nNNGulLVJJlyO7D4KmBnLjnX6w1PhuB\n\t1xRtXX72Kl0T8/QUNqmt/s2hYYKJ7B2ynQ89HQ/XQjjiJWvx+incvdVH1/jn/FhSBhicNiF61pB\n\tNmQmSegHq7j5O3zVz","X-Received":["by 2002:a17:907:97cc:b0:ae0:daca:f06f with SMTP id\n\ta640c23a62f3a-ae6fc2238fdmr295761266b.60.1752243347524; \n\tFri, 11 Jul 2025 07:15:47 -0700 (PDT)","by 2002:a17:907:97cc:b0:ae0:daca:f06f with SMTP id\n\ta640c23a62f3a-ae6fc2238fdmr295756166b.60.1752243346938; \n\tFri, 11 Jul 2025 07:15:46 -0700 (PDT)"],"X-Google-Smtp-Source":"AGHT+IHvVoUoPPbVeLZozKUSlt1NPDab8rm8BQqQeag2hvbHuQXn+v12DGt6u87HATEepZ8bwmLgOw==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"Umang Jain <uajain@igalia.com>","Cc":"libcamera-devel@lists.libcamera.org,  Laurent Pinchart\n\t<laurent.pinchart@ideasonboard.com>,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>, =?utf-8?q?Barnab?=\n\t=?utf-8?b?w6FzIFDFkWN6ZQ==?=\n\t<barnabas.pocze@ideasonboard.com>, Paul Elder\n\t<paul.elder@ideasonboard.com>","Subject":"Re: [PATCH v9 04/10] libcamera: simple: Add plain output\n\tconfigurations","In-Reply-To":"<dtihasvmkgofdi6ftpn5acjnbmbracqg4sjsnfosiit56g7zki@77pnq6k2wbzu>\n\t(Umang Jain's message of \"Fri, 11 Jul 2025 10:08:41 +0530\")","References":"<20250707155856.33436-1-mzamazal@redhat.com>\n\t<20250707155856.33436-5-mzamazal@redhat.com>\n\t<dtihasvmkgofdi6ftpn5acjnbmbracqg4sjsnfosiit56g7zki@77pnq6k2wbzu>","Date":"Fri, 11 Jul 2025 16:15:45 +0200","Message-ID":"<85ms9add9q.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":"4FUZxxzerbSBsQPCcO22P-QntrqNSMXBXLVX8HHu3z4_1752243348","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>"}}]