From patchwork Fri Nov 14 14:17:00 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 25057 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 49628C32DB for ; Fri, 14 Nov 2025 14:17:33 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 6145360AC4; Fri, 14 Nov 2025 15:17:26 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="q5Id4laL"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 9A17F60A8B for ; Fri, 14 Nov 2025 15:17:19 +0100 (CET) Received: from [192.168.1.101] (93-61-96-190.ip145.fastwebnet.it [93.61.96.190]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 9B03415D2; Fri, 14 Nov 2025 15:15:18 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1763129718; bh=UEBgBcx8IvVKaJmWZ6RWcsCM2RsMZRe0Q+bBBarwuno=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=q5Id4laLfh/aHHPM7Spl3cLlibC63GHpu9JzdxxSi/XlPQ2ZlQhNhPUwMBBHPqg8U WmggTAM42TGzsUbhCwyfsT1XlbbkAH9De93b+KDw/NxfxsEwL8pAVOrveDpXFH9v3l lnzPtiWdMcIL+oHjC/n7H91zAiIvobEJk/0OhTPk= From: Jacopo Mondi Date: Fri, 14 Nov 2025 15:17:00 +0100 Subject: [PATCH v3 05/19] ipa: ipu3: Move exposure limits to sensor config MIME-Version: 1.0 Message-Id: <20251114-exposure-limits-v3-5-b7c07feba026@ideasonboard.com> References: <20251114-exposure-limits-v3-0-b7c07feba026@ideasonboard.com> In-Reply-To: <20251114-exposure-limits-v3-0-b7c07feba026@ideasonboard.com> To: =?utf-8?q?Niklas_S=C3=B6derlund?= , Robert Mader , libcamera-devel@lists.libcamera.org Cc: Jacopo Mondi X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5067; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=UEBgBcx8IvVKaJmWZ6RWcsCM2RsMZRe0Q+bBBarwuno=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBpFznqe6V0YFI3EeYqDh6/dP6GMzgbuo5aFY2NQ ilELLUf42WJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaRc56gAKCRByNAaPFqFW PLYfD/9ygxAjK6MYWjYhPChlkVYVXXTsQ8pafS3ayRy2uzQ+jK/26twFonMaQ/ORBJiy5shhOtx UoXgbDsvEoei/Pfx5cjqE5d5pUfwqB5L29dZzQLcsXMdXwy31WMWO53MPQPfT6p2qh7BaqpS0WJ /z4E4ST2i0LEyPKeZf2yXf+oKuIDIvOV4KhuaVJtLFU1vEhPORug2X/kiDKcWYrnB9K5j45kmGj NzdIA5DpnMyxcoT6wDWeYkni3HV/JMI0TmB4GWTBD7Br0E5KnlsKCcT/E2VrJPtOntfL/RqSjuK joZqQb6MexiAzKOSUon4Z1rhWFJA5mE7pg2eBZaevgYln1vZgwR4fbw7rvXRl23vBSPhHT6XGT2 6aT6tpIDQJLGfkVkJnlpFX3svAdVafJyFM5jNtStRH9Zl28ZcOH7d7eIeNU/LMvIMrn0Ck3wOu1 KruH0I9YG+2asmJU+QpYYfFt4cu39AgEn6wf+5i+9osq4Xvp24cWij+SzkMMPTSERH4CNCZ0iHM UdVKHUUmcBLBbch5kdNteyoX6qkz2QFul+ORDA/vObGH7rYOubI0GpG2XZYG3QVefaPXZa8SH/U 3rs5a+xtz+CooABFddk4dKMhAmdj8aspZZMpukCIFNRUW5ToRgyscMJQPHX2JwGaEz1QZn6x5W4 UCRK7ysQccAFcpw== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B 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" Move the exposure limits (shutter time and gains) in the IPAContext sensor configuration and not in the 'agc' member. This aligns the IPU3 IPA with the RkISP1 and Mali ones and will help unifying the handling of sensor configuration data through a common type. Signed-off-by: Jacopo Mondi --- src/ipa/ipu3/algorithms/agc.cpp | 8 ++++---- src/ipa/ipu3/ipa_context.cpp | 27 +++++++++++---------------- src/ipa/ipu3/ipa_context.h | 9 +++------ src/ipa/ipu3/ipu3.cpp | 8 ++++---- 4 files changed, 22 insertions(+), 30 deletions(-) diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp index b0d89541da8550bd50472779da7fa8e33b96e2f0..4574f3a1a9cd3f40b1b1402238809ee1a777946d 100644 --- a/src/ipa/ipu3/algorithms/agc.cpp +++ b/src/ipa/ipu3/algorithms/agc.cpp @@ -101,12 +101,12 @@ int Agc::configure(IPAContext &context, stride_ = configuration.grid.stride; bdsGrid_ = configuration.grid.bdsGrid; - minExposureTime_ = configuration.agc.minExposureTime; - maxExposureTime_ = std::min(configuration.agc.maxExposureTime, + minExposureTime_ = configuration.sensor.minExposureTime; + maxExposureTime_ = std::min(configuration.sensor.maxExposureTime, kMaxExposureTime); - minAnalogueGain_ = std::max(configuration.agc.minAnalogueGain, kMinAnalogueGain); - maxAnalogueGain_ = configuration.agc.maxAnalogueGain; + minAnalogueGain_ = std::max(configuration.sensor.minAnalogueGain, kMinAnalogueGain); + maxAnalogueGain_ = configuration.sensor.maxAnalogueGain; /* Configure the default exposure and gain. */ activeState.agc.gain = minAnalogueGain_; diff --git a/src/ipa/ipu3/ipa_context.cpp b/src/ipa/ipu3/ipa_context.cpp index 5d0ebaaec454fca823851228614a3eb229f0132b..47ae750f0ddb859e1a08e75e255b8decacd730a1 100644 --- a/src/ipa/ipu3/ipa_context.cpp +++ b/src/ipa/ipu3/ipa_context.cpp @@ -96,8 +96,17 @@ namespace libcamera::ipa::ipu3 { */ /** - * \var IPASessionConfiguration::agc - * \brief AGC parameters configuration of the IPA + * \var IPASessionConfiguration::sensor + * \brief Sensor-specific configuration of the IPA + * + * \var IPASessionConfiguration::sensor.lineDuration + * \brief Line duration in microseconds + * + * \var IPASessionConfiguration::sensor.defVBlank + * \brief The default vblank value of the sensor + * + * \var IPASessionConfiguration::sensor.size + * \brief Sensor output resolution * * \var IPASessionConfiguration::agc.minExposureTime * \brief Minimum exposure time supported with the configured sensor @@ -112,20 +121,6 @@ namespace libcamera::ipa::ipu3 { * \brief Maximum analogue gain supported with the configured sensor */ -/** - * \var IPASessionConfiguration::sensor - * \brief Sensor-specific configuration of the IPA - * - * \var IPASessionConfiguration::sensor.lineDuration - * \brief Line duration in microseconds - * - * \var IPASessionConfiguration::sensor.defVBlank - * \brief The default vblank value of the sensor - * - * \var IPASessionConfiguration::sensor.size - * \brief Sensor output resolution - */ - /** * \var IPAActiveState::agc * \brief Context for the Automatic Gain Control algorithm diff --git a/src/ipa/ipu3/ipa_context.h b/src/ipa/ipu3/ipa_context.h index 4544d663642fb6fde1cf69a32f1c0fbb2fbd98f6..baf84b8cbc9a1ff9411c0a994e35317b613580dd 100644 --- a/src/ipa/ipu3/ipa_context.h +++ b/src/ipa/ipu3/ipa_context.h @@ -34,16 +34,13 @@ struct IPASessionConfiguration { } af; struct { + int32_t defVBlank; + utils::Duration lineDuration; + Size size; utils::Duration minExposureTime; utils::Duration maxExposureTime; double minAnalogueGain; double maxAnalogueGain; - } agc; - - struct { - int32_t defVBlank; - utils::Duration lineDuration; - Size size; } sensor; }; diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp index 36d8f0da430a3d4f94e2a3f760850519742ea992..60f22727a0f75e374b53fb6d3185946b70c25582 100644 --- a/src/ipa/ipu3/ipu3.cpp +++ b/src/ipa/ipu3/ipu3.cpp @@ -217,10 +217,10 @@ void IPAIPU3::updateSessionConfiguration(const ControlInfoMap &sensorControls) * * \todo take VBLANK into account for maximum exposure time */ - context_.configuration.agc.minExposureTime = minExposure * context_.configuration.sensor.lineDuration; - context_.configuration.agc.maxExposureTime = maxExposure * context_.configuration.sensor.lineDuration; - context_.configuration.agc.minAnalogueGain = context_.camHelper->gain(minGain); - context_.configuration.agc.maxAnalogueGain = context_.camHelper->gain(maxGain); + context_.configuration.sensor.minExposureTime = minExposure * context_.configuration.sensor.lineDuration; + context_.configuration.sensor.maxExposureTime = maxExposure * context_.configuration.sensor.lineDuration; + context_.configuration.sensor.minAnalogueGain = context_.camHelper->gain(minGain); + context_.configuration.sensor.maxAnalogueGain = context_.camHelper->gain(maxGain); } /**