summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>2021-10-12 17:06:02 +0200
committerJean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>2021-10-22 07:31:32 +0200
commitcd0b3402ea205136ed0373e8307358c1b58f9cf5 (patch)
tree6be2722e2c6f355747bfa8ad33dcfb8cb8bc813c /src
parentfd5a82ea880908f2dc99e730e91cbe2cc6ce0327 (diff)
ipa: ipu3: agc: Introduce previous exposure value
We need to calculate the gain on the previous exposure value calculated. Now that we initialise the exposure and gain values in configure(), we know the initial exposure value, and we can set it before any loop is running. Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src')
-rw-r--r--src/ipa/ipu3/algorithms/agc.cpp19
-rw-r--r--src/ipa/ipu3/algorithms/agc.h1
2 files changed, 18 insertions, 2 deletions
diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp
index e7c59f3d..43ef89df 100644
--- a/src/ipa/ipu3/algorithms/agc.cpp
+++ b/src/ipa/ipu3/algorithms/agc.cpp
@@ -42,7 +42,8 @@ static constexpr double kEvGainTarget = 0.5;
Agc::Agc()
: frameCount_(0), lastFrame_(0), iqMean_(0.0), lineDuration_(0s),
minExposureLines_(0), maxExposureLines_(0), filteredExposure_(0s),
- filteredExposureNoDg_(0s), currentExposure_(0s), currentExposureNoDg_(0s)
+ filteredExposureNoDg_(0s), currentExposure_(0s),
+ currentExposureNoDg_(0s), prevExposureValue_(0s)
{
}
@@ -62,6 +63,10 @@ int Agc::configure(IPAContext &context, const IPAConfigInfo &configInfo)
context.configuration.agc.minAnalogueGain;
context.frameContext.agc.exposure = minExposureLines_;
+ prevExposureValue_ = context.frameContext.agc.gain
+ * context.frameContext.agc.exposure
+ * lineDuration_;
+
return 0;
}
@@ -147,7 +152,7 @@ void Agc::lockExposureGain(uint32_t &exposure, double &analogueGain)
<< " Gain " << analogueGain
<< " Needed ev gain " << evGain;
- currentExposure_ = currentExposureNoDg_ * evGain;
+ currentExposure_ = prevExposureValue_ * evGain;
utils::Duration minShutterSpeed = minExposureLines_ * lineDuration_;
utils::Duration maxShutterSpeed = maxExposureLines_ * lineDuration_;
@@ -176,6 +181,16 @@ void Agc::lockExposureGain(uint32_t &exposure, double &analogueGain)
exposure = shutterTime / lineDuration_;
analogueGain = stepGain;
+
+ /*
+ * Update the exposure value for the next process call.
+ *
+ * \todo Obtain the values of the exposure time and analog gain
+ * that were actually used by the sensor, either from embedded
+ * data when available, or from the delayed controls
+ * infrastructure in case a slow down caused a mismatch.
+ */
+ prevExposureValue_ = shutterTime * analogueGain;
}
lastFrame_ = frameCount_;
}
diff --git a/src/ipa/ipu3/algorithms/agc.h b/src/ipa/ipu3/algorithms/agc.h
index cd26d08c..2ae88e9f 100644
--- a/src/ipa/ipu3/algorithms/agc.h
+++ b/src/ipa/ipu3/algorithms/agc.h
@@ -49,6 +49,7 @@ private:
utils::Duration filteredExposureNoDg_;
utils::Duration currentExposure_;
utils::Duration currentExposureNoDg_;
+ utils::Duration prevExposureValue_;
uint32_t stride_;
};