From patchwork Wed Mar 5 19:26:12 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Milan Zamazal X-Patchwork-Id: 22936 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 205A5C32DE for ; Wed, 5 Mar 2025 19:26:48 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id B0B7368889; Wed, 5 Mar 2025 20:26:47 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.b="eb2KJGJO"; dkim-atps=neutral Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 73708687DD for ; Wed, 5 Mar 2025 20:26:42 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1741202801; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=3pShpBl3wCOhbeIIAAFixnlX6htwzs6sJYz+O1jphrs=; b=eb2KJGJOIyL9KEL4328w1SarQybWFp0RCctuya2iHag5lIVNGjI5TtE+24b7nAavjh0dkD jGD9plhYm6XEzgQNR1je2SEbbFpYvG+SM2y7ew76J6St0nQ7XaMG4rykndF5DdtD0DV1k3 k25cI153iNFAo+jxmYfZsbR3gV276PE= Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-447-X3pJA1i1OFaOgAXY5FzYCg-1; Wed, 05 Mar 2025 14:26:38 -0500 X-MC-Unique: X3pJA1i1OFaOgAXY5FzYCg-1 X-Mimecast-MFC-AGG-ID: X3pJA1i1OFaOgAXY5FzYCg_1741202797 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 33A53180AB1C; Wed, 5 Mar 2025 19:26:37 +0000 (UTC) Received: from mzamazal-thinkpadp1gen7.tpbc.com (unknown [10.44.32.87]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id E14B9180049D; Wed, 5 Mar 2025 19:26:35 +0000 (UTC) From: Milan Zamazal To: libcamera-devel@lists.libcamera.org Cc: Milan Zamazal , Laurent Pinchart 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-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: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" When generating simple pipeline configuration, raw output configurations are generated but later filtered out. Let's include processed and/or raw output configurations depending on the requested stream roles. Raw and processed formats are handled separately. The intention is that in case both raw and processed formats are requested then the raw formats should be left intact to the extent possible and not be influenced by the processed formats (implying that raw parameters compatible with the processed output requirements must be requested by the application). Raw output configurations are marked by setting their colorSpace to ColorSpace::Raw, which is the only place there suitable for the purpose. This is another preparatory patch without making raw outputs working. Signed-off-by: Milan Zamazal --- src/libcamera/pipeline/simple/simple.cpp | 72 ++++++++++++++++-------- 1 file changed, 49 insertions(+), 23 deletions(-) diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp index 0c6e0f44..92b9608b 100644 --- a/src/libcamera/pipeline/simple/simple.cpp +++ b/src/libcamera/pipeline/simple/simple.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -389,6 +390,8 @@ private: const MediaPad *acquirePipeline(SimpleCameraData *data); void releasePipeline(SimpleCameraData *data); + void setUpFormatSizes(std::map> formats); + std::map entities_; MediaDevice *converter_; @@ -1191,15 +1194,56 @@ SimplePipelineHandler::generateConfiguration(Camera *camera, SpanprocessedRequested_ = true; } - /* Create the formats map. */ - std::map> formats; + /* Create the formats maps. */ + std::map> processedFormats; + std::map> rawFormats; for (const SimpleCameraData::Configuration &cfg : data->configs_) - if (!cfg.raw) - for (PixelFormat format : cfg.outputFormats) - formats[format].push_back(cfg.outputSizes); + for (PixelFormat format : cfg.outputFormats) + (cfg.raw ? rawFormats : processedFormats)[format].push_back(cfg.outputSizes); + + if (data->processedRequested_ && processedFormats.empty()) { + LOG(SimplePipeline, Error) + << "Processed stream requsted but no corresponding output configuration found"; + return nullptr; + } + if (data->rawRequested_ && rawFormats.empty()) { + LOG(SimplePipeline, Error) + << "Raw stream requsted but no corresponding output configuration found"; + return nullptr; + } + + setUpFormatSizes(processedFormats); + setUpFormatSizes(rawFormats); + + /* + * Create the stream configurations. Take the first entry in the formats + * map as the default, for lack of a better option. + * + * \todo Implement a better way to pick the default format + */ + for (StreamRole role : roles) { + bool raw = (role == StreamRole::Raw); + auto formats = (raw ? rawFormats : processedFormats); + StreamConfiguration cfg{ StreamFormats{ formats } }; + cfg.pixelFormat = formats.begin()->first; + cfg.size = formats.begin()->second[0].max; + if (raw) + cfg.colorSpace = ColorSpace::Raw; + + config->addConfiguration(cfg); + } + + config->validate(); + + return config; +} +void SimplePipelineHandler::setUpFormatSizes( + std::map> formats) +{ /* Sort the sizes and merge any consecutive overlapping ranges. */ + for (auto &[format, sizes] : formats) { std::sort(sizes.begin(), sizes.end(), [](SizeRange &a, SizeRange &b) { @@ -1219,24 +1263,6 @@ SimplePipelineHandler::generateConfiguration(Camera *camera, Spanfirst; - cfg.size = formats.begin()->second[0].max; - - config->addConfiguration(cfg); - } - - config->validate(); - - return config; } int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c)