[libcamera-devel] [PATCH 1/4] ipa: ipu3: Return filtered value
Jean-Michel Hautbois
jeanmichel.hautbois at ideasonboard.com
Thu Nov 25 11:21:40 CET 2021
When the current exposure value is calculated, it is cached and used by
filterExposure(). Use private filteredExposure_ and pass currentExposure
as a member variable.
In order to limit the use of filteredExposure_, return the value from
filterExposure().
While at it, remove a stale comment.
Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
---
src/ipa/ipu3/algorithms/agc.cpp | 31 ++++++++++++++++---------------
src/ipa/ipu3/algorithms/agc.h | 3 +--
2 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp
index 582f0ae1..2945a138 100644
--- a/src/ipa/ipu3/algorithms/agc.cpp
+++ b/src/ipa/ipu3/algorithms/agc.cpp
@@ -71,7 +71,7 @@ static constexpr double kRelativeLuminanceTarget = 0.16;
Agc::Agc()
: frameCount_(0), lineDuration_(0s), minShutterSpeed_(0s),
- maxShutterSpeed_(0s), filteredExposure_(0s), currentExposure_(0s)
+ maxShutterSpeed_(0s), filteredExposure_(0s)
{
}
@@ -143,7 +143,7 @@ double Agc::measureBrightness(const ipu3_uapi_stats_3a *stats,
/**
* \brief Apply a filter on the exposure value to limit the speed of changes
*/
-void Agc::filterExposure()
+utils::Duration Agc::filterExposure(utils::Duration currentExposure)
{
double speed = 0.2;
@@ -152,23 +152,24 @@ void Agc::filterExposure()
speed = 1.0;
if (filteredExposure_ == 0s) {
- /* DG stands for digital gain.*/
- filteredExposure_ = currentExposure_;
+ filteredExposure_ = currentExposure;
} else {
/*
* If we are close to the desired result, go faster to avoid making
* multiple micro-adjustments.
* \todo Make this customisable?
*/
- if (filteredExposure_ < 1.2 * currentExposure_ &&
- filteredExposure_ > 0.8 * currentExposure_)
+ if (filteredExposure_ < 1.2 * currentExposure &&
+ filteredExposure_ > 0.8 * currentExposure)
speed = sqrt(speed);
- filteredExposure_ = speed * currentExposure_ +
+ filteredExposure_ = speed * currentExposure +
filteredExposure_ * (1.0 - speed);
}
LOG(IPU3Agc, Debug) << "After filtering, total_exposure " << filteredExposure_;
+
+ return filteredExposure_;
}
/**
@@ -212,19 +213,19 @@ void Agc::computeExposure(IPAFrameContext &frameContext, double yGain,
* Calculate the current exposure value for the scene as the latest
* exposure value applied multiplied by the new estimated gain.
*/
- currentExposure_ = effectiveExposureValue * evGain;
+ utils::Duration currentExposure = effectiveExposureValue * evGain;
/* Clamp the exposure value to the min and max authorized */
utils::Duration maxTotalExposure = maxShutterSpeed_ * maxAnalogueGain_;
- currentExposure_ = std::min(currentExposure_, maxTotalExposure);
- LOG(IPU3Agc, Debug) << "Target total exposure " << currentExposure_
+ currentExposure = std::min(currentExposure, maxTotalExposure);
+ LOG(IPU3Agc, Debug) << "Target total exposure " << currentExposure
<< ", maximum is " << maxTotalExposure;
- /* \todo: estimate if we need to desaturate */
- filterExposure();
-
- /* Divide the exposure value as new exposure and gain values */
- utils::Duration exposureValue = filteredExposure_;
+ /*
+ * Divide the exposure value as new exposure and gain values
+ * \todo: estimate if we need to desaturate
+ */
+ utils::Duration exposureValue = filterExposure(currentExposure);
utils::Duration shutterTime;
/*
diff --git a/src/ipa/ipu3/algorithms/agc.h b/src/ipa/ipu3/algorithms/agc.h
index 96ec7005..84bfe045 100644
--- a/src/ipa/ipu3/algorithms/agc.h
+++ b/src/ipa/ipu3/algorithms/agc.h
@@ -33,7 +33,7 @@ public:
private:
double measureBrightness(const ipu3_uapi_stats_3a *stats,
const ipu3_uapi_grid_config &grid) const;
- void filterExposure();
+ utils::Duration filterExposure(utils::Duration currentExposure);
void computeExposure(IPAFrameContext &frameContext, double yGain,
double iqMeanGain);
double estimateLuminance(IPAFrameContext &frameContext,
@@ -51,7 +51,6 @@ private:
double maxAnalogueGain_;
utils::Duration filteredExposure_;
- utils::Duration currentExposure_;
uint32_t stride_;
};
--
2.32.0
More information about the libcamera-devel
mailing list