Return-Path: <libcamera-devel-bounces@lists.libcamera.org> 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 3DF2CC3339 for <parsemail@patchwork.libcamera.org>; Fri, 21 Aug 2026 13:02:24 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id D889168373; Fri, 21 Aug 2026 15:02:23 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="p1BDZmbs"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id D29C66835F for <libcamera-devel@lists.libcamera.org>; Fri, 21 Aug 2026 15:02:21 +0200 (CEST) Received: from pb-laptop.local (185.221.143.32.nat.pool.zt.hu [185.221.143.32]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id A98C5157F for <libcamera-devel@lists.libcamera.org>; Fri, 21 Aug 2026 15:00:59 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1787317259; bh=kNNkvi8jjvuRdUuIuZ2EJepY7dQ8sg0+JOMJCeDBQjE=; h=From:To:Subject:Date:From; b=p1BDZmbsgF2f3l8Sp+llYoLvxPArqq1teXyoFFHMZR0RjMi5443fPy9EJrG5cRgif N2ImEBPeQFdZEtNT/IyLQ/M8+LagZTVQesvuJ1kBtNTCc89BCcT6KVzwijtB4YZCn5 rdhix8yhMbbPJ/KwKLeZUAdVOFXKQnfzE94sVN9Y= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com> To: libcamera-devel@lists.libcamera.org Subject: [PATCH v7 00/47] ipa: libipa: agc rework Date: Fri, 21 Aug 2026 15:01:30 +0200 Message-ID: <20260821130218.2706196-1-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.55.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: <libcamera-devel.lists.libcamera.org> List-Unsubscribe: <https://lists.libcamera.org/options/libcamera-devel>, <mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe> List-Archive: <https://lists.libcamera.org/pipermail/libcamera-devel/> List-Post: <mailto:libcamera-devel@lists.libcamera.org> List-Help: <mailto:libcamera-devel-request@lists.libcamera.org?subject=help> List-Subscribe: <https://lists.libcamera.org/listinfo/libcamera-devel>, <mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe> Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" <libcamera-devel-bounces@lists.libcamera.org>
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 * softisp This applies on top of the current master branch. changes in v7: * add more documentation * apply more review comments changes in v6: * apply more review comments * adjust to simple->softisp rename 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 v6: https://patchwork.libcamera.org/cover/27905/ v5: https://patchwork.libcamera.org/cover/27778/ 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: softisp: Remove control presence sanity check ipa: softisp: 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: softisp: Store exposure as `uint32_t` ipa: softisp: agc: Separate MSV calculation ipa: softisp: agc: Simplify min gain step handling ipa: softisp: agc: Use `Histogram` ipa: softisp: agc: Adjust histogram for black level ipa: softisp: agc: Move to libipa ipa: libipa: agc_msv: Ensure limits are always respected ipa: libipa: agc_msv: Handle min gain > 1.0 case ipa: softisp: Move sensor helper and controls to context ipa: softisp: Update controls after configuration ipa: libipa: agc: Work without `CameraSensorHelper` ipa: softisp: 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/softisp.mojom | 2 +- src/ipa/ipu3/algorithms/agc.cpp | 201 ++--- src/ipa/ipu3/algorithms/agc.h | 21 +- src/ipa/ipu3/ipa_context.cpp | 49 +- src/ipa/ipu3/ipa_context.h | 30 +- src/ipa/ipu3/ipu3.cpp | 139 +-- src/ipa/libipa/agc.cpp | 823 ++++++++++++++++++ src/ipa/libipa/agc.h | 170 ++++ 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 | 52 ++ 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 | 7 +- src/ipa/libipa/meson.build | 4 + src/ipa/mali-c55/algorithms/agc.cpp | 207 +---- 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 | 457 +++------- 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/softisp/algorithms/agc.cpp | 221 ++--- src/ipa/softisp/algorithms/agc.h | 15 +- src/ipa/softisp/algorithms/blc.cpp | 12 + src/ipa/softisp/ipa_context.h | 23 +- src/ipa/softisp/softisp.cpp | 102 +-- src/libcamera/pipeline/simple/simple.cpp | 2 +- src/libcamera/software_isp/software_isp.cpp | 12 +- 35 files changed, 1958 insertions(+), 1693 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
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 * softisp This applies on top of the current master branch. changes in v7: * add more documentation * apply more review comments changes in v6: * apply more review comments * adjust to simple->softisp rename 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 v6: https://patchwork.libcamera.org/cover/27905/ v5: https://patchwork.libcamera.org/cover/27778/ 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: softisp: Remove control presence sanity check ipa: softisp: 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: softisp: Store exposure as `uint32_t` ipa: softisp: agc: Separate MSV calculation ipa: softisp: agc: Simplify min gain step handling ipa: softisp: agc: Use `Histogram` ipa: softisp: agc: Adjust histogram for black level ipa: softisp: agc: Move to libipa ipa: libipa: agc_msv: Ensure limits are always respected ipa: libipa: agc_msv: Handle min gain > 1.0 case ipa: softisp: Move sensor helper and controls to context ipa: softisp: Update controls after configuration ipa: libipa: agc: Work without `CameraSensorHelper` ipa: softisp: 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/softisp.mojom | 2 +- src/ipa/ipu3/algorithms/agc.cpp | 201 ++--- src/ipa/ipu3/algorithms/agc.h | 21 +- src/ipa/ipu3/ipa_context.cpp | 49 +- src/ipa/ipu3/ipa_context.h | 30 +- src/ipa/ipu3/ipu3.cpp | 139 +-- src/ipa/libipa/agc.cpp | 823 ++++++++++++++++++ src/ipa/libipa/agc.h | 170 ++++ 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 | 52 ++ 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 | 7 +- src/ipa/libipa/meson.build | 4 + src/ipa/mali-c55/algorithms/agc.cpp | 207 +---- 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 | 457 +++------- 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/softisp/algorithms/agc.cpp | 221 ++--- src/ipa/softisp/algorithms/agc.h | 15 +- src/ipa/softisp/algorithms/blc.cpp | 12 + src/ipa/softisp/ipa_context.h | 23 +- src/ipa/softisp/softisp.cpp | 102 +-- src/libcamera/pipeline/simple/simple.cpp | 2 +- src/libcamera/software_isp/software_isp.cpp | 12 +- 35 files changed, 1958 insertions(+), 1693 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