From patchwork Mon Aug 17 11:43:01 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: 27778 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 E5603C3263 for ; Mon, 17 Aug 2026 11:43:56 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 914736824E; Mon, 17 Aug 2026 13:43:54 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="FOv1xRFU"; 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 8221767FEE for ; Mon, 17 Aug 2026 13:43:52 +0200 (CEST) Received: from pb-laptop.local (catv-89-132-78-151.catv.fixed.one.hu [89.132.78.151]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 43530B1A for ; Mon, 17 Aug 2026 13:42:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1786966953; bh=Xr0mNHbxiGB3AJN9Sz2t9i8Qc5DPt4NGYpVV8dI6sYo=; h=From:To:Subject:Date:From; b=FOv1xRFUdScNF+rXizv6MW9U0yTyDU5n0AjuLN8w2XRbIeRZGurORTDK60kgtThBZ MoOFtedA0W/galOK42Sx2qAhw/7fcgtdOJI48KLIb9H4SPGpzLyp1OzyV644Wgo0uH l0ANtSsld0ufPpOgvdiG8HBcCqTGizCFdfrwSQ7k= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [PATCH v5 00/47] ipa: libipa: agc rework Date: Mon, 17 Aug 2026 13:43:01 +0200 Message-ID: <20260817114349.994123-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. changes in v5: * drop more technically unnecessary changes * merge the "move" and "rkisp1 porting" changes changes in v4: * drop vblank enablement because it seemingly causes oscillation on ipu3 v4: https://patchwork.libcamera.org/cover/27672/ v3: https://patchwork.libcamera.org/cover/27549/ v2: https://patchwork.libcamera.org/cover/27449/ v1: https://patchwork.libcamera.org/cover/27179/ Barnabás Pőcze (46): 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: 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: libipa: agc_mean_luminance: Remove the need for inheritance 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: Adjust controls based on "auto" availablity 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: 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: simple: agc: Port to `AgcAlgorithm` 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 | 139 +--- src/ipa/libipa/agc.cpp | 786 ++++++++++++++++++ src/ipa/libipa/agc.h | 162 ++++ src/ipa/libipa/agc_mean_luminance.cpp | 254 +++--- src/ipa/libipa/agc_mean_luminance.h | 61 +- src/ipa/libipa/agc_msv.cpp | 238 ++++++ 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 | 37 +- 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 | 23 +- src/ipa/simple/soft_simple.cpp | 102 +-- src/libcamera/pipeline/simple/simple.cpp | 2 +- src/libcamera/software_isp/software_isp.cpp | 12 +- 35 files changed, 1928 insertions(+), 1679 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