From patchwork Thu Jul 23 15:42:43 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: 27449 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 01AFDBDE17 for ; Thu, 23 Jul 2026 15:43:31 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 9B4DF67EC9; Thu, 23 Jul 2026 17:43:31 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="fMCepvy2"; 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 1ACAB67E5C for ; Thu, 23 Jul 2026 17:43:30 +0200 (CEST) Received: from pb-laptop.local (185.182.215.156.nat.pool.zt.hu [185.182.215.156]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 41C021C37 for ; Thu, 23 Jul 2026 17:42:29 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1784821349; bh=lzeKKdQ5nMdR9vRbVuqoG8piKf4X33yQTgrpGnouPrM=; h=From:To:Subject:Date:From; b=fMCepvy20FmmE48iY1RjmGiWwV+UL1do1nJ/O20vJ97A9HMI6cYuYvIwHqwo/Y59u Y36F7X+2yKBJ2rpw4LWl5iaEos0lUcJN+/y7KRG/7SUdedX5sGE1jDraPUvIfcyh40 IODlaeZuuOUN/dGaVS1FDiz7W+jbB7Pyq9M6zh40= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [RFC PATCH v2 00/43] ipa: libipa: agc rework Date: Thu, 23 Jul 2026 17:42:43 +0200 Message-ID: <20260723154327.1357866-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" Unfortunately the first version did not work out because there is a desire for at least some kind of rudimentary operation even without a CameraSensorHelper in the general algorithm. So this version 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 version, 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. v1: https://patchwork.libcamera.org/cover/27179/ Barnabás Pőcze (43): 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: Clamp exposure value ipa: libipa: agc: Adjust debug messages slightly ipa: libipa: agc: Use full range as default `FrameDurationLimits` ipa: libipa: agc: Use default exposure 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: simple: agc: Port to `AgcAlgorithm` .../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 | 141 +--- src/ipa/libipa/agc.cpp | 756 ++++++++++++++++++ src/ipa/libipa/agc.h | 152 ++++ src/ipa/libipa/agc_mean_luminance.cpp | 229 +++--- src/ipa/libipa/agc_mean_luminance.h | 58 +- 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 | 203 ++--- 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 | 127 +-- 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/simple/simple.cpp | 2 +- src/libcamera/software_isp/software_isp.cpp | 12 +- 35 files changed, 1871 insertions(+), 1651 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