[RFC,v4,00/23] ipa: libipa: agc: Take exposure margin into account
mbox series

Message ID 20261026132045.269007-1-barnabas.pocze@ideasonboard.com
Headers show
Series
  • ipa: libipa: agc: Take exposure margin into account
Related show

Message

Barnabás Pőcze Oct. 26, 2026, 1:20 p.m. UTC
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 third 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 v4:
  * only add "maximize" exposure mode
    * it is "overridable" by the tuning file
    * only added implicitly if the tuning file has no stages
  * keep frame duration below 30 fps by default
  * keep frame duration above 15 fps by default if no stages are provided

changes in v3:
  * last stage is hard limit
  * two new exposure modes: "maximize", "minimize"
  * no slower than 10 fps

changes in v2:
  * report `FrameDurationLimits` in metadata
  * add exposure margin to more sensor helpers

v3: https://patchwork.libcamera.org/cover/28367/
v2: https://patchwork.libcamera.org/cover/28367/
v1: https://patchwork.libcamera.org/cover/28111/

Barnabás Pőcze (22):
  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: exposure_mode_helper: Move `stageGain` variable
  ipa: libipa: agc: Move tuning file parsing
  ipa: libipa: agc: Initialize "Maximize" mode when none given
  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                       | 571 ++++++++++++++-----
 src/ipa/libipa/agc.h                         |  22 +-
 src/ipa/libipa/agc_mean_luminance.cpp        | 246 +-------
 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      |  78 +--
 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          |  19 +
 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, 606 insertions(+), 464 deletions(-)

--
2.56.0