From patchwork Tue Oct 28 09:31:51 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 24843 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 01753C32CE for ; Tue, 28 Oct 2025 09:32:22 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 39AD5607D9; Tue, 28 Oct 2025 10:32:19 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="pBgpnwuX"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id D91A5607A9 for ; Tue, 28 Oct 2025 10:32:09 +0100 (CET) Received: from [192.168.0.172] (mob-5-90-58-13.net.vodafone.it [5.90.58.13]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 2200E4B33; Tue, 28 Oct 2025 10:30:21 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1761643821; bh=C4dEBZq342ZteknpVimceWCkvAC91oENsQRg2a/BCj0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=pBgpnwuXZi6tJWdWByxWw4X8IqW3Iitv1l8cWT/zKrdY5at7FzKM9sqkWkW4Bg8U/ v4CFOpqvnLOhhLxsq6rBMAs+ORuocr+wARPimV1lg8/8324fpGjQIWs9ln3bmCllbh vaI5C0O8k8+fvit8dE4+Zlc35U/r7srhxiyWM8ic= From: Jacopo Mondi Date: Tue, 28 Oct 2025 10:31:51 +0100 Subject: [PATCH v2 05/10] ipa: libipa: agc: Configure with frame duration MIME-Version: 1.0 Message-Id: <20251028-exposure-limits-v2-5-a8b5a318323e@ideasonboard.com> References: <20251028-exposure-limits-v2-0-a8b5a318323e@ideasonboard.com> In-Reply-To: <20251028-exposure-limits-v2-0-a8b5a318323e@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=11307; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=C4dEBZq342ZteknpVimceWCkvAC91oENsQRg2a/BCj0=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBpAI2Vb355W09mLmiDokHk6mO40/5mUoAv+Y5RI Qu2Pu5ARO+JAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCaQCNlQAKCRByNAaPFqFW PL37D/90ttB9jx3emcFfKr0SP0liI+yqkHieig48eFbVOwMccP9KdBCDQvW4/Pc/5F3xWYIAXzJ A7g4hRKL2mS+CYHzg1j5fuL+X8Yhj9qlTY8TJ1Q7cxW3ftQDzVXQZz4rMYflBxvmtZ2tjRWAFrp 12wH4joNjd5y2RBsuWuw9Rdj9nk2JPAyPeHQ+PdDLFyMdFiwqBmv5CGSFBjMXJjAvttssL+cX/j r5wJUXFCW95fw+1WM8CGm8ynJHrwIYNieP3QaJFhDtb6LjBtGynix6qWsiRCBWuWWpxwfjdyB0K oNmGxtfcX9kS2FiGceldHCwa75ecQhexLRLfIKXR0oqc8zyyPVKsOoktFNwksexsM043nqVyZ5Q ifdblaArVEcsLcVXKZr7dloB6+nkWm7hU5/emborpOJgP8KfOsCtAc0RJmRH7Iz+ur9jaFotJoB LkGnRl60FaFaFjeaxognxQrvxgGkV41LKGEDvhap57R/mFffgWkZRKZk36bu2E4GodrlUUDfgVB QQKBQED57e4LbkWaKPbWh09jtSjov26N08AyqmGnXZ0QmO5GjY0aF2NkLiMM/+pWFS35rdNT9pz QfSGimzPLP9xwAJxCvHzPcNr/d0lX1v/5awGxrkkoOG32MDrQZG8pK7bOs30h1wIB8WrFhnaJjz uNc/ovMd23t3g3g== 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" Pass the maximum allowed frame duration to the AGC configure() operation. This prepares for limiting the exposure time to the frame duration. In order to be able to provide to the AGC the frame duration in the IPU3 and Mali-C55 IPAs it is necessary to store the FrameDurationLimits control in the context. Signed-off-by: Jacopo Mondi --- src/ipa/ipu3/algorithms/agc.cpp | 4 ++++ src/ipa/ipu3/ipu3.cpp | 7 +++---- src/ipa/libipa/agc_mean_luminance.cpp | 6 ++++++ src/ipa/libipa/agc_mean_luminance.h | 1 + src/ipa/libipa/exposure_mode_helper.cpp | 9 +++++++++ src/ipa/libipa/exposure_mode_helper.h | 5 ++++- src/ipa/mali-c55/algorithms/agc.cpp | 4 ++++ src/ipa/mali-c55/ipa_context.h | 2 ++ src/ipa/mali-c55/mali-c55.cpp | 7 +++---- src/ipa/rkisp1/algorithms/agc.cpp | 1 + 10 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp index e303d724ab165bac03ac6bb9d3891a76049cff47..3a9cde22323719d73ac125179dbfcd5158b352ea 100644 --- a/src/ipa/ipu3/algorithms/agc.cpp +++ b/src/ipa/ipu3/algorithms/agc.cpp @@ -115,9 +115,13 @@ int Agc::configure(IPAContext &context, context.activeState.agc.constraintMode = constraintModes().begin()->first; context.activeState.agc.exposureMode = exposureModeHelpers().begin()->first; + ControlInfo &frameDurationLimits = context.ctrlMap[&controls::FrameDurationLimits]; + AgcMeanLuminance::AgcSensorConfiguration sensorConfig; sensorConfig.lineDuration = context.configuration.sensor.lineDuration; sensorConfig.minExposureTime = minExposureTime_; + sensorConfig.maxFrameDuration = + std::chrono::microseconds(frameDurationLimits.max().get()); sensorConfig.maxExposureTime = maxExposureTime_; sensorConfig.minAnalogueGain = minAnalogueGain_; sensorConfig.maxAnalogueGain = maxAnalogueGain_; diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp index 36d8f0da430a3d4f94e2a3f760850519742ea992..5e7a3d2e1bb8d33d88c5f721d4c25e041cfb2a6e 100644 --- a/src/ipa/ipu3/ipu3.cpp +++ b/src/ipa/ipu3/ipu3.cpp @@ -278,11 +278,10 @@ void IPAIPU3::updateControls(const IPACameraSensorInfo &sensorInfo, frameDurations[i] = frameSize / (sensorInfo.pixelRate / 1000000U); } - controls[&controls::FrameDurationLimits] = ControlInfo(frameDurations[0], - frameDurations[1], - frameDurations[2]); + context_.ctrlMap[&controls::FrameDurationLimits] = + ControlInfo(frameDurations[0], frameDurations[1], frameDurations[2]); - controls.merge(context_.ctrlMap); + controls.insert(context_.ctrlMap.begin(), context_.ctrlMap.end()); *ipaControls = ControlInfoMap(std::move(controls), controls::controls); } diff --git a/src/ipa/libipa/agc_mean_luminance.cpp b/src/ipa/libipa/agc_mean_luminance.cpp index 9886864fc42514040eadb4c0b424796df1f1b6e1..195de2f2e93ce229b8047909b949e1d06ef8d5bf 100644 --- a/src/ipa/libipa/agc_mean_luminance.cpp +++ b/src/ipa/libipa/agc_mean_luminance.cpp @@ -121,6 +121,11 @@ static constexpr double kMaxRelativeLuminanceTarget = 0.95; * \brief The sensor maximum exposure time in microseconds */ +/** + * \var AgcMeanLuminance::AgcSensorConfiguration::maxFrameDuration + * \brief The sensor maximum frame duration in microseconds + */ + /** * \var AgcMeanLuminance::AgcSensorConfiguration::minAnalogueGain * \brief The sensor minimum analogue gain absolute value @@ -363,6 +368,7 @@ void AgcMeanLuminance::configure(const AgcSensorConfiguration &config, for (auto &[id, helper] : exposureModeHelpers_) helper->configure(config.lineDuration, config.minExposureTime, config.maxExposureTime, + config.maxFrameDuration, config.minAnalogueGain, config.maxAnalogueGain, sensorHelper); } diff --git a/src/ipa/libipa/agc_mean_luminance.h b/src/ipa/libipa/agc_mean_luminance.h index 5ab75a3ac6c550a655f4bb7c8c30419ad8249183..c3d52c0b1cba23af14135dace8b3c13da4ae3e4b 100644 --- a/src/ipa/libipa/agc_mean_luminance.h +++ b/src/ipa/libipa/agc_mean_luminance.h @@ -46,6 +46,7 @@ public: utils::Duration lineDuration; utils::Duration minExposureTime; utils::Duration maxExposureTime; + utils::Duration maxFrameDuration; double minAnalogueGain; double maxAnalogueGain; }; diff --git a/src/ipa/libipa/exposure_mode_helper.cpp b/src/ipa/libipa/exposure_mode_helper.cpp index 557e14230ba4e0f120653bc09ea23a29a54cb4c8..edb8f04b245f01119d0d0b0917d10f98c7172dc0 100644 --- a/src/ipa/libipa/exposure_mode_helper.cpp +++ b/src/ipa/libipa/exposure_mode_helper.cpp @@ -84,6 +84,7 @@ ExposureModeHelper::ExposureModeHelper(const Spanfirst; context.activeState.agc.exposureMode = exposureModeHelpers().begin()->first; + ControlInfo &frameDurationLimits = context.ctrlMap[&controls::FrameDurationLimits]; + AgcMeanLuminance::AgcSensorConfiguration sensorConfig; sensorConfig.lineDuration = context.configuration.sensor.lineDuration; sensorConfig.minExposureTime = context.configuration.agc.minShutterSpeed; sensorConfig.maxExposureTime = context.configuration.agc.maxShutterSpeed; + sensorConfig.maxFrameDuration = + std::chrono::microseconds(frameDurationLimits.max().get()); sensorConfig.minAnalogueGain = context.configuration.agc.minAnalogueGain; sensorConfig.maxAnalogueGain = context.configuration.agc.maxAnalogueGain; diff --git a/src/ipa/mali-c55/ipa_context.h b/src/ipa/mali-c55/ipa_context.h index bfa805c7b93f313dda2497365e83542bbc39e291..ecb2f79c0dca0e41166b88f2608c22aa72adcf8a 100644 --- a/src/ipa/mali-c55/ipa_context.h +++ b/src/ipa/mali-c55/ipa_context.h @@ -10,6 +10,8 @@ #include #include +#include + #include "libcamera/internal/bayer_format.h" #include diff --git a/src/ipa/mali-c55/mali-c55.cpp b/src/ipa/mali-c55/mali-c55.cpp index 0751513dc584ca84dd212bf8c1469dd4b40c053d..12cad7374520db8c6fa5ca233a0ef33dc7b2f287 100644 --- a/src/ipa/mali-c55/mali-c55.cpp +++ b/src/ipa/mali-c55/mali-c55.cpp @@ -231,9 +231,8 @@ void IPAMaliC55::updateControls(const IPACameraSensorInfo &sensorInfo, frameDurations[i] = frameSize / (sensorInfo.pixelRate / 1000000U); } - ctrlMap[&controls::FrameDurationLimits] = ControlInfo(frameDurations[0], - frameDurations[1], - frameDurations[2]); + context_.ctrlMap[&controls::FrameDurationLimits] = + ControlInfo(frameDurations[0], frameDurations[1], frameDurations[2]); /* * Compute exposure time limits from the V4L2_CID_EXPOSURE control @@ -258,7 +257,7 @@ void IPAMaliC55::updateControls(const IPACameraSensorInfo &sensorInfo, * Merge in any controls that we support either statically or from the * algorithms. */ - ctrlMap.merge(context_.ctrlMap); + ctrlMap.insert(context_.ctrlMap.begin(), context_.ctrlMap.end()); *ipaControls = ControlInfoMap(std::move(ctrlMap), controls::controls); } diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp index 8c07e6a6eac091d949ad71ee967c893897313cc8..121e75449a6985f951c50fdc85b0298026344297 100644 --- a/src/ipa/rkisp1/algorithms/agc.cpp +++ b/src/ipa/rkisp1/algorithms/agc.cpp @@ -204,6 +204,7 @@ int Agc::configure(IPAContext &context, const IPACameraSensorInfo &configInfo) sensorConfig.lineDuration = context.configuration.sensor.lineDuration; sensorConfig.minExposureTime = context.configuration.sensor.minExposureTime; sensorConfig.maxExposureTime = context.configuration.sensor.maxExposureTime; + sensorConfig.maxFrameDuration = context.activeState.agc.maxFrameDuration; sensorConfig.minAnalogueGain = context.configuration.sensor.minAnalogueGain; sensorConfig.maxAnalogueGain = context.configuration.sensor.maxAnalogueGain;