From patchwork Mon Aug 3 13:13:45 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: 27549 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 038C5BDE4C for ; Mon, 3 Aug 2026 13:14:42 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 015C367EE4; Mon, 3 Aug 2026 15:14:41 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="E8Yt0Yc/"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id E391067EE4 for ; Mon, 3 Aug 2026 15:14:38 +0200 (CEST) Received: from pb-laptop.local (185.221.141.208.nat.pool.zt.hu [185.221.141.208]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id D7724512 for ; Mon, 3 Aug 2026 15:13:29 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1785762809; bh=Y8WxZA0XN8c4EXPpAHqw9zT4QUk8Aj5JVtcKjrdBMTI=; h=From:To:Subject:Date:From; b=E8Yt0Yc/2KLxCvnESBcoo1k3gEmXP5ujF4NZjPKWCoh6tHv1lKhmgmppYQ3R1nb2J QXnwwU3lh/KPm473oGtUvkukapkGxZji2VnDsqGTLWbFVoOxmiaSnxjSqBYiD4ysaH wgkutZDVAOh3lYmjeH/Src3/lLfbSMBUs51e9EO4= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v3 00/50] ipa: libipa: agc rework Date: Mon, 3 Aug 2026 15:13:45 +0200 Message-ID: <20260803131435.153927-1-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.55.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" This adds an `AgcAlgorithm` that is essentially a copy of the rkisp1 agc algorithm, only that it can either use AgcMeanLuminance or the agc algorithm from the simple ipa module (which is now moved into libipa). Similarly to the previous versions, the following ipa modules are converted: * ipu3 * mali-c55 * rkisp1 * simple This applies on top of the current master branch, not rebased on any of the libipa rework yet. Conflicts should be minimal. v2: https://patchwork.libcamera.org/cover/27449/ v1: https://patchwork.libcamera.org/cover/27179/ Barnabás Pőcze (49): libcamera: software_isp: init(): Fix documentation typo ipa: simple: Remove control presence sanity check ipa: simple: agc: Do not overwrite sensor exposure/gain ipa: rkisp1: Remove `IPASessionConfiguration::sensor.defVBlank` ipa: libipa: agc_mean_luminance: Remove the need for inheritance ipa: rkisp1: Move sensor control info map to context ipa: rkisp1: Update sensor info when configuring ipa: rkisp1: updateControls(): Use sensor info from context ipa: rkisp1: Move AGC related controls into AGC algorithm ipa: mali-c55: Remove `DigitalGain` support ipa: libipa: agc_mean_luminance: Avoid some duplicate lookups ipa: libipa: agc_mean_luminance: Remove unnecessary `std::shared_ptr` ipa: libipa: agc_mean_luminance: calculateNewEv(): Fix typo ipa: libipa: agc_mean_luminance: calculateNewEv(): Collect params ipa: libipa: agc_mean_luminance: constraintClampGain(): Mark `const` ipa: libipa: agc_mean_luminance: calculateNewEv(): Collect results ipa: libipa: agc_mean_luminance: calculateNewEv(): Return y target ipa: libipa: agc_mean_luminance: Remove persistent params ipa: libipa: agc_mean_luminance: Reset `filteredExposure_` when configuring ipa: Simplify sensor exposure/gain setting/getting ipa: libipa: Add `AgcAlgorithm` ipa: libipa: agc: Omit `setLimits()` in `configure()` ipa: libipa: agc: Use default exposure ipa: libipa: agc: Use full range as default `FrameDurationLimits` ipa: libipa: agc: Adjust debug messages slightly ipa: libipa: agc: Store digital gain ipa: libipa: agc: Use minimum line length ipa: libipa: agc: Fix multiplication type ipa: libipa: agc: Calculate vblank and frame duration sooner ipa: rkisp1: agc: Port to `AgcAlgorithm` ipa: mali-c55: agc: Port to `AgcAlgorithm` ipa: ipu3: agc: Port to `AgcAlgorithm` ipa: libipa: agc_mean_luminance: Remove control handling ipa: libipa: histogram: total(): Use `back()` ipa: libipa: histogram: Add `operator[]` to query bin ipa: simple: Store exposure as `uint32_t` ipa: simple: agc: Separate MSV calculation ipa: simple: agc: Simplify min gain step handling ipa: simple: agc: Use `Histogram` ipa: simple: agc: Adjust histogram for black level ipa: simple: agc: Move to libipa ipa: libipa: agc_msv: Ensure limits are always respected ipa: libipa: agc_msv: Handle min gain > 1.0 case ipa: simple: Move sensor helper and controls to context ipa: simple: Update controls after configuration ipa: libipa: agc: Work without `CameraSensorHelper` ipa: libipa: agc: Take parameters from active state for calculation ipa: simple: agc: Port to `AgcAlgorithm` libcamera: pipeline: Set vblank on more platforms Jacopo Mondi (1): ipa: libipa: agc_mean_luminance: Fold resetFrameCount() in configure() .../internal/software_isp/software_isp.h | 3 +- include/libcamera/ipa/soft.mojom | 2 +- src/ipa/ipu3/algorithms/agc.cpp | 197 +++-- src/ipa/ipu3/algorithms/agc.h | 21 +- src/ipa/ipu3/ipa_context.cpp | 49 +- src/ipa/ipu3/ipa_context.h | 27 +- src/ipa/ipu3/ipu3.cpp | 138 +--- src/ipa/libipa/agc.cpp | 723 ++++++++++++++++++ src/ipa/libipa/agc.h | 160 ++++ src/ipa/libipa/agc_mean_luminance.cpp | 254 +++--- src/ipa/libipa/agc_mean_luminance.h | 61 +- src/ipa/libipa/agc_msv.cpp | 224 ++++++ src/ipa/libipa/agc_msv.h | 51 ++ src/ipa/libipa/exposure_mode_helper.cpp | 19 +- src/ipa/libipa/exposure_mode_helper.h | 11 +- src/ipa/libipa/histogram.cpp | 6 + src/ipa/libipa/histogram.h | 9 +- src/ipa/libipa/meson.build | 4 + src/ipa/mali-c55/algorithms/agc.cpp | 206 ++--- src/ipa/mali-c55/algorithms/agc.h | 9 +- src/ipa/mali-c55/ipa_context.h | 38 +- src/ipa/mali-c55/mali-c55.cpp | 165 +--- src/ipa/rkisp1/algorithms/agc.cpp | 460 +++-------- src/ipa/rkisp1/algorithms/agc.h | 15 +- src/ipa/rkisp1/algorithms/lux.cpp | 2 +- src/ipa/rkisp1/ipa_context.cpp | 104 +-- src/ipa/rkisp1/ipa_context.h | 50 +- src/ipa/rkisp1/rkisp1.cpp | 128 +--- src/ipa/simple/algorithms/agc.cpp | 226 ++---- src/ipa/simple/algorithms/agc.h | 15 +- src/ipa/simple/algorithms/blc.cpp | 12 + src/ipa/simple/ipa_context.h | 22 +- src/ipa/simple/soft_simple.cpp | 101 +-- src/libcamera/pipeline/ipu3/ipu3.cpp | 1 + src/libcamera/pipeline/mali-c55/mali-c55.cpp | 1 + src/libcamera/pipeline/simple/simple.cpp | 3 +- src/libcamera/software_isp/software_isp.cpp | 12 +- 37 files changed, 1853 insertions(+), 1676 deletions(-) create mode 100644 src/ipa/libipa/agc.cpp create mode 100644 src/ipa/libipa/agc.h create mode 100644 src/ipa/libipa/agc_msv.cpp create mode 100644 src/ipa/libipa/agc_msv.h --- 2.55.0