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 60A0BC3339 for <parsemail@patchwork.libcamera.org>; Mon, 24 Aug 2026 09:14:13 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 563D9683B6; Mon, 24 Aug 2026 11:14:12 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="aUBcib3/"; 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 152726838A for <libcamera-devel@lists.libcamera.org>; Mon, 24 Aug 2026 11:14:11 +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 AFCA3C23 for <libcamera-devel@lists.libcamera.org>; Mon, 24 Aug 2026 11:12:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1787562766; bh=zRgt81NqPidBQSFsJvKiU+DKiBcWYAjH4pppeYLi/wU=; h=From:To:Subject:Date:From; b=aUBcib3/Moph631GnkVjdngFvixnUPFvuAylm5QExeONU5Gx9Nml2ZftSEN3k89aP oyMs0nY0JSFfk5stlxS7+v2RMVVGB3/Dm/xvi5Mcx4np1dAtPNRTUZw5EIBCuhZ335 WZNUzrSsJ3JFlMkC4J1Y7Xp8BwhjUMu7EZrmvEWo= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com> To: libcamera-devel@lists.libcamera.org Subject: [PATCH v8 00/47] ipa: libipa: agc rework Date: Mon, 24 Aug 2026 11:13:19 +0200 Message-ID: <20260824091407.502020-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 v8: * add more documentation 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 v7: https://patchwork.libcamera.org/cover/27963/ 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 | 200 ++-- 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 | 883 ++++++++++++++++++ src/ipa/libipa/agc.h | 169 ++++ 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 | 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 | 456 ++------- 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 | 220 ++--- 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, 2013 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 v8: * add more documentation 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 v7: https://patchwork.libcamera.org/cover/27963/ 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 | 200 ++-- 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 | 883 ++++++++++++++++++ src/ipa/libipa/agc.h | 169 ++++ 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 | 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 | 456 ++------- 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 | 220 ++--- 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, 2013 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