From patchwork Wed Nov 11 11:55:41 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= X-Patchwork-Id: 28841 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 186CFC3307 for ; Wed, 11 Nov 2026 11:56:07 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 22B2969128; Wed, 11 Nov 2026 12:56:05 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="mxzrPfsO"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 5A5C9690E9 for ; Wed, 11 Nov 2026 12:56:03 +0100 (CET) Received: from pb-laptop.local (185.221.143.99.nat.pool.zt.hu [185.221.143.99]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 2DA298FD for ; Wed, 11 Nov 2026 12:53:40 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1794398020; bh=OmmuJvIfj0hOtG7j97GIwlu2bInQ553Qfr+xNhPWdZk=; h=From:To:Subject:Date:From; b=mxzrPfsOwxADJ40M3zx3c77aB9/jptQkS1AXd0mlQGkmXu6NKYdTj57292CARPN0F nf5iXSfaTDEHE5knXtX77tBf6fanN6LHbEgDflzyZayectFHXVSkGaOe2RskDm3ivq 30dlD0FNRBRuHNQSesmb67unBBigBlATP7mJPuo8= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [PATCH v9 00/18] ipa: libipa: agc: Take exposure margin into account Date: Wed, 11 Nov 2026 12:55:41 +0100 Message-ID: <20261111115600.1097488-1-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.56.0 MIME-Version: 1.0 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" The maximum available exposure depends on the frame duration, but this is not considered by the current agc implementation, it fixes the maximum exposure time based on whatever configuration was used to configure the algorithm. This means that in certain situations the full exposure range might not be used, even in dark scenes. This an eight attempt at adapting https://patchwork.libcamera.org/project/libcamera/list/?series=5590 on the current master branch. But now that the agc handling is largely unified, fewer changes are needed to make this work on every platform. So effectively only patch 7 is taken directly, but only the exposure margin introduction part of it. This was mainly tested on rkisp1+imx219, softisp+ov2740, rppx1+imx708. changes in v9: * keep `processFrameDuration()` in `process()` due to regression changes in v8: * keep parsing in agc_mean_luminance.cpp changes in v7: * drop "Maximize" * [2/22] add link to https://gitlab.freedesktop.org/camera/libcamera/-/work_items/373 * [6/22] keep `lastStageGain` but still restructure to avoid double clamp * drop "ipa: libipa: agc: Take parameters from active state for calculation" due to regression changes in v6: * rebase changes in v5: * [4/24] clarify that the stage gain only constrains the analogue gain * [6/24] adjust documentation as well * [6-7/24] split the moving of the tuning file parsing code * [10/24] avoid clamping the last stage params twice * [23/24] rename `hasExposureStages` -> `hasExposureModes` * [24/24] clamp manual exposure time when it is propagated to a frame and in `process()` changes in v4: * only add "maximize" exposure mode * it is "overridable" by the tuning file * only added implicitly if the tuning file has no stages * keep frame duration below 30 fps by default * keep frame duration above 15 fps by default if no stages are provided changes in v3: * last stage is hard limit * two new exposure modes: "maximize", "minimize" * no slower than 10 fps changes in v2: * report `FrameDurationLimits` in metadata * add exposure margin to more sensor helpers v8: https://patchwork.libcamera.org/cover/28818/ v7: https://patchwork.libcamera.org/cover/28798/ v6: https://patchwork.libcamera.org/cover/28735/ v5: https://patchwork.libcamera.org/cover/28666/ v4: https://patchwork.libcamera.org/cover/28617/ v3: https://patchwork.libcamera.org/cover/28367/ v2: https://patchwork.libcamera.org/cover/28367/ v1: https://patchwork.libcamera.org/cover/28111/ Barnabás Pőcze (17): ipa: libipa: exposure_mode_helper: Remove defaulted destructor ipa: libipa: exposure_mode_helper: Keep stage params together ipa: libipa: exposure_mode_helper: Remove limit getters ipa: libipa: agc_mean_luminance: Split tuning file parsing ipa: libipa: exposure_mode_helper: Consider last stage as hard-limit ipa: libipa: agc: Do not report auto controls if not available ipa: libipa: agc: Keep frame duration limits ordered ipa: libipa: agc: Retrieve `FrameDurationLimits` earlier ipa: libipa: agc: Report `FrameDurationLimits` ipa: libipa: agc: Calculate vblank for correct exposure time ipa: libipa: agc: Better respect frame duration limits ipa: libipa: agc: Rework frame duration limit calculation libcamera: pipeline: Set vblank on more platforms ipa: libipa: agc: Move control info map setup ipa: libipa: agc: Do not run faster than 30fps by default ipa: libipa: agc: Do not run slower than 15fps by default ipa: libipa: agc: Take exposure margin into account Jacopo Mondi (1): ipa: camera_sensor_helper: Introduce exposure margin src/ipa/ipu3/ipu3.cpp | 3 +- src/ipa/libipa/agc.cpp | 304 +++++++++++-------- src/ipa/libipa/agc.h | 19 +- src/ipa/libipa/agc_mean_luminance.cpp | 240 +++++++++------ src/ipa/libipa/agc_mean_luminance.h | 26 +- src/ipa/libipa/camera_sensor_helper.cpp | 68 +++++ src/ipa/libipa/camera_sensor_helper.h | 2 + src/ipa/libipa/exposure_mode_helper.cpp | 81 ++--- src/ipa/libipa/exposure_mode_helper.h | 18 +- src/ipa/mali-c55/mali-c55.cpp | 3 +- src/ipa/rkisp1/rkisp1.cpp | 4 +- src/ipa/softisp/softisp.cpp | 3 +- src/libcamera/pipeline/ipu3/ipu3.cpp | 1 + src/libcamera/pipeline/mali-c55/mali-c55.cpp | 1 + src/libcamera/pipeline/simple/simple.cpp | 1 + 15 files changed, 463 insertions(+), 311 deletions(-) --- 2.56.0