libipa: agc_mean_luminance: Add exposure compensation support

Exposure compensation allows to over- or under-expose an
image by a given value. Add support for that in agc_mean_luminance.

The added exposure compensation can lead to luminance target values that
are close or above saturation and are therefore never reachable. Add a
fix for that by limiting the maximum luminance target to 0.95.

Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
This commit is contained in:
Stefan Klug
2025-07-07 10:55:11 +02:00
parent a9b2ee2e00
commit 7b5d8bc849
2 changed files with 28 additions and 2 deletions

View File

@@ -44,6 +44,15 @@ static constexpr uint32_t kNumStartupFrames = 10;
*/
static constexpr double kDefaultRelativeLuminanceTarget = 0.16;
/*
* Maximum relative luminance target
*
* This value limits the relative luminance target after applying the exposure
* compensation. Targeting a value above this limit results in saturation
* and the inability to regulate properly.
*/
static constexpr double kMaxRelativeLuminanceTarget = 0.95;
/**
* \struct AgcMeanLuminance::AgcConstraint
* \brief The boundaries and target for an AeConstraintMode constraint
@@ -134,7 +143,8 @@ static constexpr double kDefaultRelativeLuminanceTarget = 0.16;
*/
AgcMeanLuminance::AgcMeanLuminance()
: frameCount_(0), filteredExposure_(0s), relativeLuminanceTarget_(0)
: exposureCompensation_(1.0), frameCount_(0), filteredExposure_(0s),
relativeLuminanceTarget_(0)
{
}
@@ -368,6 +378,15 @@ int AgcMeanLuminance::parseTuningData(const YamlObject &tuningData)
return parseExposureModes(tuningData);
}
/**
* \fn AgcMeanLuminance::setExposureCompensation()
* \brief Set the exposure compensation value
* \param[in] gain The exposure compensation gain
*
* This function sets the exposure compensation value to be used in the
* AGC calculations. It is expressed as gain instead of EV.
*/
/**
* \brief Set the ExposureModeHelper limits for this class
* \param[in] minExposureTime Minimum exposure time to allow
@@ -424,7 +443,8 @@ void AgcMeanLuminance::setLimits(utils::Duration minExposureTime,
*/
double AgcMeanLuminance::estimateInitialGain() const
{
double yTarget = relativeLuminanceTarget_;
double yTarget = std::min(relativeLuminanceTarget_ * exposureCompensation_,
kMaxRelativeLuminanceTarget);
double yGain = 1.0;
/*

View File

@@ -44,6 +44,11 @@ public:
int parseTuningData(const YamlObject &tuningData);
void setExposureCompensation(double gain)
{
exposureCompensation_ = gain;
}
void setLimits(utils::Duration minExposureTime, utils::Duration maxExposureTime,
double minGain, double maxGain);
@@ -84,6 +89,7 @@ private:
double gain);
utils::Duration filterExposure(utils::Duration exposureValue);
double exposureCompensation_;
uint64_t frameCount_;
utils::Duration filteredExposure_;
double relativeLuminanceTarget_;