[{"id":34171,"web_url":"https://patchwork.libcamera.org/comment/34171/","msgid":"<906123fd-b734-4140-80ed-6665ce6121a2@ideasonboard.com>","date":"2025-05-09T15:46:22","subject":"Re: [PATCH v4 07/11] libcamera: simple: Consider raw output\n\tconfigurations","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. 04. 07. 10:56 keltezéssel, Milan Zamazal írta:\n> When generating simple pipeline configuration, raw output configurations\n> are generated but later filtered out.  Let's include processed and/or\n> raw output configurations depending on the requested stream roles.\n> \n> Raw and processed formats are handled separately.  The intention is that\n> in case both raw and processed formats are requested then the raw\n> formats should be left intact to the extent possible and not be\n> influenced by the processed formats (implying that raw parameters\n> compatible with the processed output requirements must be requested by\n> the application).\n> \n> Raw output configurations are identified by colorSpace being set to\n> ColorSpace::Raw.\n> \n> This is another preparatory patch without making raw outputs working.\n> \n> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n> ---\n>   src/libcamera/pipeline/simple/simple.cpp | 73 ++++++++++++++++--------\n>   1 file changed, 48 insertions(+), 25 deletions(-)\n> \n> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> index bf9d75f4..6b65d79f 100644\n> --- a/src/libcamera/pipeline/simple/simple.cpp\n> +++ b/src/libcamera/pipeline/simple/simple.cpp\n> @@ -439,6 +439,8 @@ private:\n>   \tconst MediaPad *acquirePipeline(SimpleCameraData *data);\n>   \tvoid releasePipeline(SimpleCameraData *data);\n>   \n> +\tvoid setUpFormatSizes(std::map<PixelFormat, std::vector<SizeRange>> &formats);\n> +\n>   \tstd::map<const MediaEntity *, EntityData> entities_;\n>   \n>   \tMediaDevice *converter_;\n> @@ -1321,35 +1323,28 @@ SimplePipelineHandler::generateConfiguration(Camera *camera, Span<const StreamRo\n>   \t\t\tdata->processedRequested_ = true;\n>   \t\t}\n>   \n> -\t/* Create the formats map. */\n> -\tstd::map<PixelFormat, std::vector<SizeRange>> formats;\n> +\t/* Create the formats maps. */\n> +\tstd::map<PixelFormat, std::vector<SizeRange>> processedFormats;\n> +\tstd::map<PixelFormat, std::vector<SizeRange>> rawFormats;\n>   \n>   \tfor (const SimpleCameraData::Configuration &cfg : data->configs_)\n> -\t\tif (!cfg.raw)\n> -\t\t\tfor (PixelFormat format : cfg.outputFormats)\n> -\t\t\t\tformats[format].push_back(cfg.outputSizes);\n> +\t\tfor (PixelFormat format : cfg.outputFormats)\n> +\t\t\t(cfg.raw ? rawFormats : processedFormats)[format].push_back(cfg.outputSizes);\n>   \n> -\t/* Sort the sizes and merge any consecutive overlapping ranges. */\n> -\tfor (auto &[format, sizes] : formats) {\n> -\t\tstd::sort(sizes.begin(), sizes.end(),\n> -\t\t\t  [](SizeRange &a, SizeRange &b) {\n> -\t\t\t\t  return a.min < b.min;\n> -\t\t\t  });\n> -\n> -\t\tauto cur = sizes.begin();\n> -\t\tauto next = cur;\n> -\n> -\t\twhile (++next != sizes.end()) {\n> -\t\t\tif (cur->max.width >= next->min.width &&\n> -\t\t\t    cur->max.height >= next->min.height)\n> -\t\t\t\tcur->max = next->max;\n> -\t\t\telse if (++cur != next)\n> -\t\t\t\t*cur = *next;\n> -\t\t}\n> -\n> -\t\tsizes.erase(++cur, sizes.end());\n> +\tif (data->processedRequested_ && processedFormats.empty()) {\n> +\t\tLOG(SimplePipeline, Error)\n> +\t\t\t<< \"Processed stream requsted but no corresponding output configuration found\";\n> +\t\treturn nullptr;\n> +\t}\n> +\tif (data->rawRequested_ && rawFormats.empty()) {\n> +\t\tLOG(SimplePipeline, Error)\n> +\t\t\t<< \"Raw stream requsted but no corresponding output configuration found\";\n> +\t\treturn nullptr;\n>   \t}\n>   \n> +\tsetUpFormatSizes(processedFormats);\n> +\tsetUpFormatSizes(rawFormats);\n> +\n>   \t/*\n>   \t * Create the stream configurations. Take the first entry in the formats\n>   \t * map as the default, for lack of a better option.\n> @@ -1357,11 +1352,13 @@ SimplePipelineHandler::generateConfiguration(Camera *camera, Span<const StreamRo\n>   \t * \\todo Implement a better way to pick the default format\n>   \t */\n>   \tfor (StreamRole role : roles) {\n> +\t\tbool raw = (role == StreamRole::Raw);\n> +\t\tauto formats = (raw ? rawFormats : processedFormats);\n>   \t\tStreamConfiguration cfg{ StreamFormats{ formats } };\n>   \t\tcfg.pixelFormat = formats.begin()->first;\n>   \t\tcfg.size = formats.begin()->second[0].max;\n>   \n> -\t\tif (role == StreamRole::Raw)\n> +\t\tif (raw)\n>   \t\t\tcfg.colorSpace = ColorSpace::Raw;\n>   \t\telse if (data->swIsp_)\n>   \t\t\tcfg.colorSpace = ColorSpace::Srgb;\n> @@ -1374,6 +1371,32 @@ SimplePipelineHandler::generateConfiguration(Camera *camera, Span<const StreamRo\n>   \treturn config;\n>   }\n>   \n> +void SimplePipelineHandler::setUpFormatSizes(\n> +\tstd::map<PixelFormat, std::vector<SizeRange>> &formats)\n\nDoes this need to be a member? If not, could it be moved into an anonymous\nnamespace in this file? Or since this is only used in a function, maybe\njust save it into a lambda there for now.\n\n\n> +{\n> +\t/* Sort the sizes and merge any consecutive overlapping ranges. */\n\nI see that this has been copied unchanged, but I don't understand how this could\nbe correct. It does not seem to account for `SizeRange::{h,v}Step` at all.\nWhat am I missing something?\n\n\nRegards,\nBarnabás Pőcze\n\n> +\n> +\tfor (auto &[format, sizes] : formats) {\n> +\t\tstd::sort(sizes.begin(), sizes.end(),\n> +\t\t\t  [](SizeRange &a, SizeRange &b) {\n> +\t\t\t\t  return a.min < b.min;\n> +\t\t\t  });\n> +\n> +\t\tauto cur = sizes.begin();\n> +\t\tauto next = cur;\n> +\n> +\t\twhile (++next != sizes.end()) {\n> +\t\t\tif (cur->max.width >= next->min.width &&\n> +\t\t\t    cur->max.height >= next->min.height)\n> +\t\t\t\tcur->max = next->max;\n> +\t\t\telse if (++cur != next)\n> +\t\t\t\t*cur = *next;\n> +\t\t}\n> +\n> +\t\tsizes.erase(++cur, sizes.end());\n> +\t}\n> +}\n> +\n>   int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c)\n>   {\n>   \tSimpleCameraConfiguration *config =","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 83D63C3226\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri,  9 May 2025 15:46:27 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9588868B50;\n\tFri,  9 May 2025 17:46:26 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9CF2F617C7\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  9 May 2025 17:46:25 +0200 (CEST)","from [192.168.33.12] (185.221.140.100.nat.pool.zt.hu\n\t[185.221.140.100])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 990B38DB;\n\tFri,  9 May 2025 17:46:12 +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=\"smxUaBL4\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1746805572;\n\tbh=FAce1oN72gm0h30XVbAfQwRrYRU9FMxGwqiGy+jhHz8=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=smxUaBL4zJNJFR4dbaOtL0dF+HcN6C3TWcsqvNxZ94QmHyfKDr3ZDLRIzeKjKRknD\n\t2zQajxNisZAeI+MjeW1q6J8IpOehDvOKb+lLbmQhQSsBEEerPTaj+1N+gphROMdbzM\n\tiK9Ph1mk2XK/62/PKRQv8Y31uXJ0TeqMZq0ulf4k=","Message-ID":"<906123fd-b734-4140-80ed-6665ce6121a2@ideasonboard.com>","Date":"Fri, 9 May 2025 17:46:22 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v4 07/11] libcamera: simple: Consider raw output\n\tconfigurations","To":"Milan Zamazal <mzamazal@redhat.com>, libcamera-devel@lists.libcamera.org","References":"<20250407085639.16180-1-mzamazal@redhat.com>\n\t<20250407085639.16180-8-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":"<20250407085639.16180-8-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":34220,"web_url":"https://patchwork.libcamera.org/comment/34220/","msgid":"<85a57giyzd.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2025-05-13T10:31:02","subject":"Re: [PATCH v4 07/11] libcamera: simple: Consider raw output\n\tconfigurations","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. 04. 07. 10:56 keltezéssel, Milan Zamazal írta:\n>> When generating simple pipeline configuration, raw output configurations\n>> are generated but later filtered out.  Let's include processed and/or\n>> raw output configurations depending on the requested stream roles.\n>> Raw and processed formats are handled separately.  The intention is that\n>> in case both raw and processed formats are requested then the raw\n>> formats should be left intact to the extent possible and not be\n>> influenced by the processed formats (implying that raw parameters\n>> compatible with the processed output requirements must be requested by\n>> the application).\n>> Raw output configurations are identified by colorSpace being set to\n>> ColorSpace::Raw.\n>> This is another preparatory patch without making raw outputs working.\n>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>\n>> ---\n>>   src/libcamera/pipeline/simple/simple.cpp | 73 ++++++++++++++++--------\n>>   1 file changed, 48 insertions(+), 25 deletions(-)\n>> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n>> index bf9d75f4..6b65d79f 100644\n>> --- a/src/libcamera/pipeline/simple/simple.cpp\n>> +++ b/src/libcamera/pipeline/simple/simple.cpp\n>> @@ -439,6 +439,8 @@ private:\n>>   \tconst MediaPad *acquirePipeline(SimpleCameraData *data);\n>>   \tvoid releasePipeline(SimpleCameraData *data);\n>>   +\tvoid setUpFormatSizes(std::map<PixelFormat, std::vector<SizeRange>> &formats);\n>> +\n>>   \tstd::map<const MediaEntity *, EntityData> entities_;\n>>     \tMediaDevice *converter_;\n>> @@ -1321,35 +1323,28 @@ SimplePipelineHandler::generateConfiguration(Camera *camera, Span<const StreamRo\n>>   \t\t\tdata->processedRequested_ = true;\n>>   \t\t}\n>>   -\t/* Create the formats map. */\n>> -\tstd::map<PixelFormat, std::vector<SizeRange>> formats;\n>> +\t/* Create the formats maps. */\n>> +\tstd::map<PixelFormat, std::vector<SizeRange>> processedFormats;\n>> +\tstd::map<PixelFormat, std::vector<SizeRange>> rawFormats;\n>>     \tfor (const SimpleCameraData::Configuration &cfg : data->configs_)\n>> -\t\tif (!cfg.raw)\n>> -\t\t\tfor (PixelFormat format : cfg.outputFormats)\n>> -\t\t\t\tformats[format].push_back(cfg.outputSizes);\n>> +\t\tfor (PixelFormat format : cfg.outputFormats)\n>> +\t\t\t(cfg.raw ? rawFormats : processedFormats)[format].push_back(cfg.outputSizes);\n>>   -\t/* Sort the sizes and merge any consecutive overlapping ranges. */\n>> -\tfor (auto &[format, sizes] : formats) {\n>> -\t\tstd::sort(sizes.begin(), sizes.end(),\n>> -\t\t\t  [](SizeRange &a, SizeRange &b) {\n>> -\t\t\t\t  return a.min < b.min;\n>> -\t\t\t  });\n>> -\n>> -\t\tauto cur = sizes.begin();\n>> -\t\tauto next = cur;\n>> -\n>> -\t\twhile (++next != sizes.end()) {\n>> -\t\t\tif (cur->max.width >= next->min.width &&\n>> -\t\t\t    cur->max.height >= next->min.height)\n>> -\t\t\t\tcur->max = next->max;\n>> -\t\t\telse if (++cur != next)\n>> -\t\t\t\t*cur = *next;\n>> -\t\t}\n>> -\n>> -\t\tsizes.erase(++cur, sizes.end());\n>> +\tif (data->processedRequested_ && processedFormats.empty()) {\n>> +\t\tLOG(SimplePipeline, Error)\n>> +\t\t\t<< \"Processed stream requsted but no corresponding output configuration found\";\n>> +\t\treturn nullptr;\n>> +\t}\n>> +\tif (data->rawRequested_ && rawFormats.empty()) {\n>> +\t\tLOG(SimplePipeline, Error)\n>> +\t\t\t<< \"Raw stream requsted but no corresponding output configuration found\";\n>> +\t\treturn nullptr;\n>>   \t}\n>>   +\tsetUpFormatSizes(processedFormats);\n>> +\tsetUpFormatSizes(rawFormats);\n>> +\n>>   \t/*\n>>   \t * Create the stream configurations. Take the first entry in the formats\n>>   \t * map as the default, for lack of a better option.\n>> @@ -1357,11 +1352,13 @@ SimplePipelineHandler::generateConfiguration(Camera *camera, Span<const StreamRo\n>>   \t * \\todo Implement a better way to pick the default format\n>>   \t */\n>>   \tfor (StreamRole role : roles) {\n>> +\t\tbool raw = (role == StreamRole::Raw);\n>> +\t\tauto formats = (raw ? rawFormats : processedFormats);\n>>   \t\tStreamConfiguration cfg{ StreamFormats{ formats } };\n>>   \t\tcfg.pixelFormat = formats.begin()->first;\n>>   \t\tcfg.size = formats.begin()->second[0].max;\n>>   -\t\tif (role == StreamRole::Raw)\n>> +\t\tif (raw)\n>>   \t\t\tcfg.colorSpace = ColorSpace::Raw;\n>>   \t\telse if (data->swIsp_)\n>>   \t\t\tcfg.colorSpace = ColorSpace::Srgb;\n>> @@ -1374,6 +1371,32 @@ SimplePipelineHandler::generateConfiguration(Camera *camera, Span<const StreamRo\n>>   \treturn config;\n>>   }\n>>   +void SimplePipelineHandler::setUpFormatSizes(\n>> +\tstd::map<PixelFormat, std::vector<SizeRange>> &formats)\n>\n> Does this need to be a member? If not, could it be moved into an anonymous\n> namespace in this file? Or since this is only used in a function, maybe\n> just save it into a lambda there for now.\n\nOr it could be a loop over the two variables.  I don't have any real\npreference, I can do whatever reviewers like.\n\n>> +{\n>> +\t/* Sort the sizes and merge any consecutive overlapping ranges. */\n>\n> I see that this has been copied unchanged, but I don't understand how this could\n> be correct. It does not seem to account for `SizeRange::{h,v}Step` at all.\n> What am I missing something?\n\nIt's probably some implicit assumption about the steps, whether correct\nor not.  Perhaps this and the followup \\todo should be revised some day.\n\n> Regards,\n> Barnabás Pőcze\n>\n>> +\n>> +\tfor (auto &[format, sizes] : formats) {\n>> +\t\tstd::sort(sizes.begin(), sizes.end(),\n>> +\t\t\t  [](SizeRange &a, SizeRange &b) {\n>> +\t\t\t\t  return a.min < b.min;\n>> +\t\t\t  });\n>> +\n>> +\t\tauto cur = sizes.begin();\n>> +\t\tauto next = cur;\n>> +\n>> +\t\twhile (++next != sizes.end()) {\n>> +\t\t\tif (cur->max.width >= next->min.width &&\n>> +\t\t\t    cur->max.height >= next->min.height)\n>> +\t\t\t\tcur->max = next->max;\n>> +\t\t\telse if (++cur != next)\n>> +\t\t\t\t*cur = *next;\n>> +\t\t}\n>> +\n>> +\t\tsizes.erase(++cur, sizes.end());\n>> +\t}\n>> +}\n>> +\n>>   int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c)\n>>   {\n>>   \tSimpleCameraConfiguration *config =","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 0127EC3200\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 13 May 2025 10:31:09 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 1FDC368B59;\n\tTue, 13 May 2025 12:31:09 +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 0F50C6175C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 13 May 2025 12:31:07 +0200 (CEST)","from mail-wm1-f69.google.com (mail-wm1-f69.google.com\n\t[209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-223-j-UUR5DKMqKbV7II0-Q86A-1; Tue, 13 May 2025 06:31:05 -0400","by mail-wm1-f69.google.com with SMTP id\n\t5b1f17b1804b1-44059976a1fso18503535e9.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 13 May 2025 03:31:05 -0700 (PDT)","from mzamazal-thinkpadp1gen7.tpbc.csb ([85.93.96.130])\n\tby smtp.gmail.com with ESMTPSA id\n\tffacd0b85a97d-3a1f57dde6bsm15886444f8f.13.2025.05.13.03.31.02\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tTue, 13 May 2025 03:31:02 -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=\"WQS4qa1d\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1747132266;\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=s0uYJQyP1+0a17SKCNJnokcwnaqmiRksBmktNu0wxug=;\n\tb=WQS4qa1d0KMWuLWSLYh6ei7Uh2EL66yb7EPeju16dFjaTh08Sm7Ma90gzB3IIgt94KMGIg\n\tm4kudi2WgWVKDlAXRs7gOehiUW4P8ru1PulUzdrHtutMp4V/pyLjjxgngVHxVViLKDTt1f\n\tukHivA2Kyvl4U4ejskIGaAoEU1iW4Ic=","X-MC-Unique":"j-UUR5DKMqKbV7II0-Q86A-1","X-Mimecast-MFC-AGG-ID":"j-UUR5DKMqKbV7II0-Q86A_1747132264","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1747132264; x=1747737064;\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=L9v5pVygOM152JJ1mQeACXD38PUXwMTWPz9i/LI7hQo=;\n\tb=S9gKlsn+HfhVwkh9vhhw4LoJcpr4Evyl+pLAYNv7vxBnZePfgc5EukVPXwT0J++mYf\n\t/Mgt8baJxJd/lPnDX9QM8FQ4Z2xnQvZfAJem9E7rwdLlK2dS41XzR+XknPKTSVXxkXKo\n\tVd7VZmo9UHxxUsZ0+ie/QdeoPPjtoaBz9ANzXKaCwiFA4+ePQYyrBqcQP0bTKvFOmfGT\n\tIAf82fThWa/IEtmO8OkjHawwfi8r2w9mFF0oPzFkOaeA/MAAoJU6h7j1cbC979X9le48\n\t3zjj7QHYEapH6SNG1+6CakX8DerrXLQsUh4p+i7BhUss7uWH77MI/6pWHNg4WR6R7gKX\n\t6KEg==","X-Gm-Message-State":"AOJu0Ywwlm/4SjnEwzXS2t2xNMnkrBfcwmaMDb6TuGZgQz9cfKhhlXSI\n\tRYGDY+WSHTsfbT4IMzLojBOWar+T7nrYS4LBQNg53mLFGe5koZ0I0Z2r9yzQ1KJV1Na152FCRNQ\n\tuH1XOnXEGZLAFlruAD3a0Jwj6Fy96u/sRdAJVxUA4rOTXrDo+ZuF8JrNClW+enbubPPM9Ct6cFR\n\tTBzEQlyzcOWTw6BanJhYTFnnwtdVw874iPpYR6xkfQn3sK1qlzZ8lx78k=","X-Gm-Gg":"ASbGncuIrkfiYCwAeTm8OuBOe2OgWip0xdErBxCwcwi1gBvWAQq6Kn8SZJO8XXLEDi+\n\tuUZ4qqycNyt9+hw05mwBDslHTFMcw7G3Q0+6p8MVCPS0no/NCzkj2VBt65GltDwlewHvb4t1EXW\n\t5jopdGc3z/QuzJ18k9y1fE5FWwz4nPb0IWh9mYYB2zRoAiZ+YoagwofdPNfEg3ttdkY7Xw7Ut6p\n\t4qgxyrhZYkDNJDZE7V5XRcxEc+YXMWTf4wxqdoa0Lpgt7u6vX9MRnT0z58Lv4wECE5e5VqX2uma\n\tfYCS4JzeSYY0IFD132P1rTr7YB32kkiYPm/b","X-Received":["by 2002:a05:6000:18a9:b0:3a0:88d5:6126 with SMTP id\n\tffacd0b85a97d-3a1f64a5c07mr13402941f8f.39.1747132263950; \n\tTue, 13 May 2025 03:31:03 -0700 (PDT)","by 2002:a05:6000:18a9:b0:3a0:88d5:6126 with SMTP id\n\tffacd0b85a97d-3a1f64a5c07mr13402914f8f.39.1747132263393; \n\tTue, 13 May 2025 03:31:03 -0700 (PDT)"],"X-Google-Smtp-Source":"AGHT+IEgDcvJzIfEnUYIl3nkFjxJdutAI2MvlSZd7GVeNqfoTzvaL8ESnFvsIJTXziQWqC3jBuwOHQ==","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","Subject":"Re: [PATCH v4 07/11] libcamera: simple: Consider raw output\n\tconfigurations","In-Reply-To":"<906123fd-b734-4140-80ed-6665ce6121a2@ideasonboard.com> (\n\t=?utf-8?b?IkJhcm5hYsOhcyBQxZFjemUiJ3M=?= message of \"Fri,\n\t9 May 2025  17:46:22 +0200\")","References":"<20250407085639.16180-1-mzamazal@redhat.com>\n\t<20250407085639.16180-8-mzamazal@redhat.com>\n\t<906123fd-b734-4140-80ed-6665ce6121a2@ideasonboard.com>","Date":"Tue, 13 May 2025 12:31:02 +0200","Message-ID":"<85a57giyzd.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":"MyzkIYGNIvfr7FvWmvYWOEZDQGKtC89V1N9WJAK3eD4_1747132264","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>"}}]