{"id":22936,"url":"https://patchwork.libcamera.org/api/1.1/patches/22936/?format=json","web_url":"https://patchwork.libcamera.org/patch/22936/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20250305192617.18361-6-mzamazal@redhat.com>","date":"2025-03-05T19:26:12","name":"[v3,5/8] libcamera: simple: Consider raw output configurations","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"9b4c2c3b7ddf31277c0ca7dc347ac5b90ccd31ba","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/1.1/people/177/?format=json","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/22936/mbox/","series":[{"id":5047,"url":"https://patchwork.libcamera.org/api/1.1/series/5047/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=5047","date":"2025-03-05T19:26:07","name":"Enable raw streams with software ISP","version":3,"mbox":"https://patchwork.libcamera.org/series/5047/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/22936/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/22936/checks/","tags":{},"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 205A5C32DE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  5 Mar 2025 19:26:48 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B0B7368889;\n\tWed,  5 Mar 2025 20:26:47 +0100 (CET)","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 73708687DD\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  5 Mar 2025 20:26:42 +0100 (CET)","from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com\n\t(ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97])\n\tby relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n\tcipher=TLS_AES_256_GCM_SHA384) id us-mta-447-X3pJA1i1OFaOgAXY5FzYCg-1;\n\tWed, 05 Mar 2025 14:26:38 -0500","from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com\n\t(mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com\n\t[10.30.177.111])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\tkey-exchange X25519 server-signature RSA-PSS (2048 bits)\n\tserver-digest SHA256) (No client certificate requested)\n\tby mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTPS id 33A53180AB1C; Wed,  5 Mar 2025 19:26:37 +0000 (UTC)","from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.44.32.87])\n\tby mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTP id E14B9180049D; Wed,  5 Mar 2025 19:26:35 +0000 (UTC)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"eb2KJGJO\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1741202801;\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=3pShpBl3wCOhbeIIAAFixnlX6htwzs6sJYz+O1jphrs=;\n\tb=eb2KJGJOIyL9KEL4328w1SarQybWFp0RCctuya2iHag5lIVNGjI5TtE+24b7nAavjh0dkD\n\tjGD9plhYm6XEzgQNR1je2SEbbFpYvG+SM2y7ew76J6St0nQ7XaMG4rykndF5DdtD0DV1k3\n\tk25cI153iNFAo+jxmYfZsbR3gV276PE=","X-MC-Unique":"X3pJA1i1OFaOgAXY5FzYCg-1","X-Mimecast-MFC-AGG-ID":"X3pJA1i1OFaOgAXY5FzYCg_1741202797","From":"Milan Zamazal <mzamazal@redhat.com>","To":"libcamera-devel@lists.libcamera.org","Cc":"Milan Zamazal <mzamazal@redhat.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>","Subject":"[PATCH v3 5/8] libcamera: simple: Consider raw output configurations","Date":"Wed,  5 Mar 2025 20:26:12 +0100","Message-ID":"<20250305192617.18361-6-mzamazal@redhat.com>","In-Reply-To":"<20250305192617.18361-1-mzamazal@redhat.com>","References":"<20250305192617.18361-1-mzamazal@redhat.com>","MIME-Version":"1.0","X-Scanned-By":"MIMEDefang 3.4.1 on 10.30.177.111","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"S1UMB0GpXyjjTa3NRhgylC8w_JwNmrKwPPzyFseVWqw_1741202797","X-Mimecast-Originator":"redhat.com","Content-Transfer-Encoding":"8bit","content-type":"text/plain; charset=\"US-ASCII\"; x-default=true","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>"},"content":"When generating simple pipeline configuration, raw output configurations\nare generated but later filtered out.  Let's include processed and/or\nraw output configurations depending on the requested stream roles.\n\nRaw and processed formats are handled separately.  The intention is that\nin case both raw and processed formats are requested then the raw\nformats should be left intact to the extent possible and not be\ninfluenced by the processed formats (implying that raw parameters\ncompatible with the processed output requirements must be requested by\nthe application).\n\nRaw output configurations are marked by setting their colorSpace to\nColorSpace::Raw, which is the only place there suitable for the purpose.\n\nThis is another preparatory patch without making raw outputs working.\n\nSigned-off-by: Milan Zamazal <mzamazal@redhat.com>\n---\n src/libcamera/pipeline/simple/simple.cpp | 72 ++++++++++++++++--------\n 1 file changed, 49 insertions(+), 23 deletions(-)","diff":"diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\nindex 0c6e0f44..92b9608b 100644\n--- a/src/libcamera/pipeline/simple/simple.cpp\n+++ b/src/libcamera/pipeline/simple/simple.cpp\n@@ -25,6 +25,7 @@\n #include <libcamera/base/log.h>\n \n #include <libcamera/camera.h>\n+#include <libcamera/color_space.h>\n #include <libcamera/control_ids.h>\n #include <libcamera/pixel_format.h>\n #include <libcamera/request.h>\n@@ -389,6 +390,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@@ -1191,15 +1194,56 @@ 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+\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+\t *\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 (raw)\n+\t\t\tcfg.colorSpace = ColorSpace::Raw;\n+\n+\t\tconfig->addConfiguration(cfg);\n+\t}\n+\n+\tconfig->validate();\n+\n+\treturn config;\n+}\n \n+void SimplePipelineHandler::setUpFormatSizes(\n+\tstd::map<PixelFormat, std::vector<SizeRange>> formats)\n+{\n \t/* Sort the sizes and merge any consecutive overlapping ranges. */\n+\n \tfor (auto &[format, sizes] : formats) {\n \t\tstd::sort(sizes.begin(), sizes.end(),\n \t\t\t  [](SizeRange &a, SizeRange &b) {\n@@ -1219,24 +1263,6 @@ SimplePipelineHandler::generateConfiguration(Camera *camera, Span<const StreamRo\n \n \t\tsizes.erase(++cur, sizes.end());\n \t}\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-\t *\n-\t * \\todo Implement a better way to pick the default format\n-\t */\n-\tfor ([[maybe_unused]] StreamRole role : roles) {\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\tconfig->addConfiguration(cfg);\n-\t}\n-\n-\tconfig->validate();\n-\n-\treturn config;\n }\n \n int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c)\n","prefixes":["v3","5/8"]}