From patchwork Thu Oct 29 12:58:20 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: 28666 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 3D174C3261 for ; Thu, 29 Oct 2026 12:58:52 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id E88EB6909E; Thu, 29 Oct 2026 13:58:49 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="vw2d/aP0"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 4AFC868E07 for ; Thu, 29 Oct 2026 13:58:48 +0100 (CET) Received: from pb-laptop.local (185.221.143.99.nat.pool.zt.hu [185.221.143.99]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id B4F49C1 for ; Thu, 29 Oct 2026 13:56:34 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1793278594; bh=zxgfzUkqqePvBQp85892Md9KiA5DuFVe8g5uGC5c5C8=; h=From:To:Subject:Date:From; b=vw2d/aP0c7GO0heUJnG/8XrJa70Bx7pKnnt2B3pTrnGgJD77d34WCPDZeGAQ+jqZZ e6IsvvSggZcrIKI+cTEJJOoAyl8ycnOSN4j5j5ajW77b72aqTCPkA6JBLStZaH+ZAi yHNTuH+9WDdwpmHXv1PnSVjyJFjfB0W8VOk7wDdw= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Subject: [PATCH v5 00/24] ipa: libipa: agc: Take exposure margin into account Date: Thu, 29 Oct 2026 13:58:20 +0100 Message-ID: <20261029125844.170324-1-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.56.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" The maximum available exposure depends on the frame duration, but this is not considered by the current agc implementation, it fixes the maximum exposure time based on whatever configuration was used to configure the algorithm. This means that in certain situations the full exposure range might not be used, even in dark scenes. This a fifth attempt at adapting https://patchwork.libcamera.org/project/libcamera/list/?series=5590 on the current master branch. But now that the agc handling is largely unified, fewer changes are needed to make this work on every platform. So effectively only patch 7 is taken directly, but only the exposure margin introduction part of it. This was mainly tested on rkisp1+imx219, softisp+ov2740, rppx1+imx708. changes in v5: * [4/24] clarify that the stage gain only constrains the analogue gain * [6/24] adjust documentation as well * [6-7/24] split the moving of the tuning file parsing code * [10/24] avoid clamping the last stage params twice * [23/24] rename `hasExposureStages` -> `hasExposureModes` * [24/24] clamp manual exposure time when it is propagated to a frame and in `process()` Barnabás Pőcze (23): libcamera: controls: AeExposureMode: Add ExposureMaximize ipa: libipa: agc: Change `AgcMSV` exposure mode ipa: libipa: exposure_mode_helper: Remove defaulted destructor ipa: libipa: exposure_mode_helper: Keep stage params together ipa: libipa: exposure_mode_helper: Remove limit getters ipa: libipa: agc: Move tuning file parsing ipa: libipa: agc: Split tuning data fallback handling ipa: libipa: agc: Initialize "Maximize" mode when none given ipa: libipa: exposure_mode_helper: Remove `lastStageGain` ipa: libipa: exposure_mode_helper: Consider last stage as hard-limit ipa: libipa: agc: Do not report auto controls if not available ipa: libipa: agc: Keep frame duration limits ordered ipa: libipa: agc: Retrieve `FrameDurationLimits` earlier ipa: libipa: agc: Report `FrameDurationLimits` ipa: libipa: agc: Calculate vblank and frame duration sooner ipa: libipa: agc: Better respect frame duration limits ipa: libipa: agc: Take parameters from active state for calculation libcamera: pipeline: Set vblank on more platforms ipa: libipa: agc: Rework frame duration limit calculation ipa: libipa: agc: Move control info map setup ipa: libipa: agc: Do not run faster than 30 fps by default ipa: libipa: agc: Do not run slower than 15fps by default ipa: libipa: agc: Take exposure margin into account Jacopo Mondi (1): ipa: camera_sensor_helper: Introduce exposure margin src/ipa/ipu3/algorithms/agc.cpp | 2 +- src/ipa/ipu3/ipu3.cpp | 3 +- src/ipa/libipa/agc.cpp | 577 ++++++++++++++----- src/ipa/libipa/agc.h | 22 +- src/ipa/libipa/agc_mean_luminance.cpp | 268 +-------- src/ipa/libipa/agc_mean_luminance.h | 22 +- src/ipa/libipa/camera_sensor_helper.cpp | 68 +++ src/ipa/libipa/camera_sensor_helper.h | 2 + src/ipa/libipa/exposure_mode_helper.cpp | 89 ++- src/ipa/libipa/exposure_mode_helper.h | 18 +- src/ipa/mali-c55/algorithms/agc.cpp | 2 +- src/ipa/mali-c55/mali-c55.cpp | 3 +- src/ipa/rkisp1/algorithms/agc.cpp | 2 +- src/ipa/rkisp1/rkisp1.cpp | 4 +- src/ipa/softisp/algorithms/agc.cpp | 2 +- src/ipa/softisp/softisp.cpp | 3 +- src/libcamera/control_ids_core.yaml | 5 + src/libcamera/pipeline/ipu3/ipu3.cpp | 1 + src/libcamera/pipeline/mali-c55/mali-c55.cpp | 1 + src/libcamera/pipeline/simple/simple.cpp | 1 + 20 files changed, 604 insertions(+), 491 deletions(-) --- 2.56.0