summaryrefslogtreecommitdiff
path: root/src/ipa/rpi
diff options
context:
space:
mode:
authorDavid Plowman <david.plowman@raspberrypi.com>2023-10-13 08:48:37 +0100
committerKieran Bingham <kieran.bingham@ideasonboard.com>2023-10-18 11:01:23 +0100
commit9c90e56733311a1cdabf2554e3b82f7e177e735d (patch)
treeddc457270406eb6722c75215292657ac19bbecf8 /src/ipa/rpi
parenta04fe76a457ede6c8cab75471415484eb0b170f6 (diff)
ipa: rpi: agc: Add an AGC stable region
Add a small "stable region" parameter (defaulting to 2%) within which the AGC will not adjust the exposure it requests. It allows applications to configure the AGC to avoid continual micro-adjustments of exposure values if they are somehow sensitive to it. Signed-off-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Diffstat (limited to 'src/ipa/rpi')
-rw-r--r--src/ipa/rpi/controller/rpi/agc_channel.cpp7
-rw-r--r--src/ipa/rpi/controller/rpi/agc_channel.h1
2 files changed, 8 insertions, 0 deletions
diff --git a/src/ipa/rpi/controller/rpi/agc_channel.cpp b/src/ipa/rpi/controller/rpi/agc_channel.cpp
index 3957dbc3..1e7eae06 100644
--- a/src/ipa/rpi/controller/rpi/agc_channel.cpp
+++ b/src/ipa/rpi/controller/rpi/agc_channel.cpp
@@ -251,6 +251,8 @@ int AgcConfig::read(const libcamera::YamlObject &params)
defaultExposureTime = params["default_exposure_time"].get<double>(1000) * 1us;
defaultAnalogueGain = params["default_analogue_gain"].get<double>(1.0);
+ stableRegion = params["stable_region"].get<double>(0.02);
+
return 0;
}
@@ -871,6 +873,8 @@ bool AgcChannel::applyDigitalGain(double gain, double targetY, bool channelBound
void AgcChannel::filterExposure()
{
double speed = config_.speed;
+ double stableRegion = config_.stableRegion;
+
/*
* AGC adapts instantly if both shutter and gain are directly specified
* or we're in the startup phase.
@@ -880,6 +884,9 @@ void AgcChannel::filterExposure()
speed = 1.0;
if (!filtered_.totalExposure) {
filtered_.totalExposure = target_.totalExposure;
+ } else if (filtered_.totalExposure * (1.0 - stableRegion) < target_.totalExposure &&
+ filtered_.totalExposure * (1.0 + stableRegion) > target_.totalExposure) {
+ /* Total exposure must change by more than this or we leave it alone. */
} else {
/*
* If close to the result go faster, to save making so many
diff --git a/src/ipa/rpi/controller/rpi/agc_channel.h b/src/ipa/rpi/controller/rpi/agc_channel.h
index ae826fa8..c1808422 100644
--- a/src/ipa/rpi/controller/rpi/agc_channel.h
+++ b/src/ipa/rpi/controller/rpi/agc_channel.h
@@ -75,6 +75,7 @@ struct AgcConfig {
double baseEv;
libcamera::utils::Duration defaultExposureTime;
double defaultAnalogueGain;
+ double stableRegion;
};
class AgcChannel