Patch Detail
Show a patch.
GET /api/patches/24970/?format=api
{ "id": 24970, "url": "https://patchwork.libcamera.org/api/patches/24970/?format=api", "web_url": "https://patchwork.libcamera.org/patch/24970/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20251104153501.34362-4-mzamazal@redhat.com>", "date": "2025-11-04T15:34:54", "name": "[v15,3/8] libcamera: simple: Handle processed and raw formats separately", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "d36f81a2926ac36947b4d66311cdfbc9c880d1c6", "submitter": { "id": 177, "url": "https://patchwork.libcamera.org/api/people/177/?format=api", "name": "Milan Zamazal", "email": "mzamazal@redhat.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/24970/mbox/", "series": [ { "id": 5563, "url": "https://patchwork.libcamera.org/api/series/5563/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5563", "date": "2025-11-04T15:34:51", "name": "Enable raw streams with software ISP", "version": 15, "mbox": "https://patchwork.libcamera.org/series/5563/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/24970/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/24970/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 9D684C3241\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 4 Nov 2025 15:35:32 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 6961A60A86;\n\tTue, 4 Nov 2025 16:35:32 +0100 (CET)", "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 07CBD60A7B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 4 Nov 2025 16:35:29 +0100 (CET)", "from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com\n\t(ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63])\n\tby relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n\tcipher=TLS_AES_256_GCM_SHA384) id us-mta-208-DPHnQ0DDNrmlRMW7_SBuVw-1;\n\tTue, 04 Nov 2025 10:35:25 -0500", "from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com\n\t(mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com\n\t[10.30.177.17])\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-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTPS id 68B2B19560AD; Tue, 4 Nov 2025 15:35:24 +0000 (UTC)", "from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.45.225.23])\n\tby mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix)\n\twith ESMTP id A6B931956056; Tue, 4 Nov 2025 15:35:20 +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=\"GTaAdkfg\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1762270529;\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=OToS9Qiclt6YWpdgTySmSkzYBfKmOsN0qjVaFw8jF9k=;\n\tb=GTaAdkfg6mQ8MltiGwTooQEb7ssSruM0G5VlZul8QkQ3wGaoBAik2arMdwdeqxuizBwLPB\n\t1PW5SGXRAkU3W7Ak3unYXies4svG7TqdZx8gCgc2qraUSjqu+k08VYAZib0aaUXIe4kQrE\n\txTepzHEks8MvWGU+ZFOWk4D8TIKWvJo=", "X-MC-Unique": "DPHnQ0DDNrmlRMW7_SBuVw-1", "X-Mimecast-MFC-AGG-ID": "DPHnQ0DDNrmlRMW7_SBuVw_1762270524", "From": "Milan Zamazal <mzamazal@redhat.com>", "To": "libcamera-devel@lists.libcamera.org", "Cc": "Milan Zamazal <mzamazal@redhat.com>, 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>, Umang Jain <uajain@igalia.com>", "Subject": "[PATCH v15 3/8] libcamera: simple: Handle processed and raw formats\n\tseparately", "Date": "Tue, 4 Nov 2025 16:34:54 +0100", "Message-ID": "<20251104153501.34362-4-mzamazal@redhat.com>", "In-Reply-To": "<20251104153501.34362-1-mzamazal@redhat.com>", "References": "<20251104153501.34362-1-mzamazal@redhat.com>", "MIME-Version": "1.0", "X-Scanned-By": "MIMEDefang 3.0 on 10.30.177.17", "X-Mimecast-Spam-Score": "0", "X-Mimecast-MFC-PROC-ID": "BJajA2r056JzyhMf4qLs1usKoM0rFwnDquH8zhpSzjA_1762270524", "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": "Let's handle both processed and/or raw output configurations. In\naddition to the already handled processed formats and sizes, this patch\nadds handling of raw formats and sizes, which correspond to the capture\nformats and sizes.\n\nWhen creating stream configurations, raw or processed formats are\nselected according to the requested stream roles.\n\nThis is another preparatory patch without making raw outputs working.\n\nSigned-off-by: Milan Zamazal <mzamazal@redhat.com>\nReviewed-by: Umang Jain <uajain@igalia.com>\nSigned-off-by: Milan Zamazal <mzamazal@redhat.com>\n---\n src/libcamera/pipeline/simple/simple.cpp | 79 +++++++++++++++++-------\n 1 file changed, 56 insertions(+), 23 deletions(-)", "diff": "diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\nindex ba8a22ccc..7961a9f02 100644\n--- a/src/libcamera/pipeline/simple/simple.cpp\n+++ b/src/libcamera/pipeline/simple/simple.cpp\n@@ -1344,42 +1344,75 @@ SimplePipelineHandler::generateConfiguration(Camera *camera, Span<const StreamRo\n \tif (roles.empty())\n \t\treturn config;\n \n-\t/* Create the formats map. */\n-\tstd::map<PixelFormat, std::vector<SizeRange>> formats;\n+\tbool processedRequested = false;\n+\tbool rawRequested = false;\n+\tfor (const auto &role : roles)\n+\t\tif (role == StreamRole::Raw) {\n+\t\t\tif (rawRequested) {\n+\t\t\t\tLOG(SimplePipeline, Error)\n+\t\t\t\t\t<< \"Can't capture multiple raw streams\";\n+\t\t\t\treturn nullptr;\n+\t\t\t}\n+\t\t\trawRequested = true;\n+\t\t} else {\n+\t\t\tprocessedRequested = true;\n+\t\t}\n+\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\trawFormats[cfg.captureFormat].push_back(cfg.captureSize);\n \t\tfor (PixelFormat format : cfg.outputFormats)\n-\t\t\tformats[format].push_back(cfg.outputSizes);\n+\t\t\tprocessedFormats[format].push_back(cfg.outputSizes);\n \t}\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 (processedRequested && processedFormats.empty()) {\n+\t\tLOG(SimplePipeline, Error)\n+\t\t\t<< \"Processed stream requested but no corresponding output configuration found\";\n+\t\treturn nullptr;\n+\t}\n+\tif (rawRequested && rawFormats.empty()) {\n+\t\tLOG(SimplePipeline, Error)\n+\t\t\t<< \"Raw stream requested but no corresponding output configuration found\";\n+\t\treturn nullptr;\n \t}\n \n+\tauto setUpFormatSizes = [](std::map<PixelFormat, std::vector<SizeRange>> &formats) {\n+\t\t/* Sort the sizes and merge any consecutive overlapping ranges. */\n+\n+\t\tfor (auto &[format, sizes] : formats) {\n+\t\t\tstd::sort(sizes.begin(), sizes.end(),\n+\t\t\t\t [](SizeRange &a, SizeRange &b) {\n+\t\t\t\t\t return a.min < b.min;\n+\t\t\t\t });\n+\n+\t\t\tauto cur = sizes.begin();\n+\t\t\tauto next = cur;\n+\n+\t\t\twhile (++next != sizes.end()) {\n+\t\t\t\tif (cur->max.width >= next->min.width &&\n+\t\t\t\t cur->max.height >= next->min.height)\n+\t\t\t\t\tcur->max = next->max;\n+\t\t\t\telse if (++cur != next)\n+\t\t\t\t\t*cur = *next;\n+\t\t\t}\n+\n+\t\t\tsizes.erase(++cur, sizes.end());\n+\t\t}\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 \t *\n \t * \\todo Implement a better way to pick the default format\n \t */\n-\tfor ([[maybe_unused]] StreamRole role : roles) {\n+\tfor (StreamRole role : roles) {\n+\t\tconst auto &formats = (role == StreamRole::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", "prefixes": [ "v15", "3/8" ] }