@@ -117,7 +117,7 @@ int Agc::configure(IPAContext &context,
/* \todo Run this again when FrameDurationLimits is passed in */
setLimits(minExposureTime_, maxExposureTime_, minAnalogueGain_,
- maxAnalogueGain_);
+ maxAnalogueGain_, {});
resetFrameCount();
return 0;
@@ -7,6 +7,7 @@
#include "agc_mean_luminance.h"
+#include <algorithm>
#include <cmath>
#include <libcamera/base/log.h>
@@ -414,10 +415,13 @@ int AgcMeanLuminance::parseTuningData(const YamlObject &tuningData)
*/
void AgcMeanLuminance::setLimits(utils::Duration minExposureTime,
utils::Duration maxExposureTime,
- double minGain, double maxGain)
+ double minGain, double maxGain,
+ std::vector<AgcMeanLuminance::AgcConstraint> constraints)
{
for (auto &[id, helper] : exposureModeHelpers_)
helper->setLimits(minExposureTime, maxExposureTime, minGain, maxGain);
+
+ additionalConstraints_ = std::move(constraints);
}
/**
@@ -495,8 +499,7 @@ double AgcMeanLuminance::constraintClampGain(uint32_t constraintModeIndex,
const Histogram &hist,
double gain)
{
- std::vector<AgcConstraint> &constraints = constraintModes_[constraintModeIndex];
- for (const AgcConstraint &constraint : constraints) {
+ auto applyConstraint = [&gain, &hist](const AgcConstraint &constraint) {
double newGain = constraint.yTarget * hist.bins() /
hist.interQuantileMean(constraint.qLo, constraint.qHi);
@@ -515,7 +518,12 @@ double AgcMeanLuminance::constraintClampGain(uint32_t constraintModeIndex,
<< newGain;
gain = newGain;
}
- }
+ };
+
+ std::vector<AgcConstraint> &constraints = constraintModes_[constraintModeIndex];
+ std::for_each(constraints.begin(), constraints.end(), applyConstraint);
+
+ std::for_each(additionalConstraints_.begin(), additionalConstraints_.end(), applyConstraint);
return gain;
}
@@ -51,7 +51,7 @@ public:
}
void setLimits(utils::Duration minExposureTime, utils::Duration maxExposureTime,
- double minGain, double maxGain);
+ double minGain, double maxGain, std::vector<AgcConstraint> constraints);
std::map<int32_t, std::vector<AgcConstraint>> constraintModes()
{
@@ -97,6 +97,7 @@ private:
utils::Duration filteredExposure_;
double relativeLuminanceTarget_;
+ std::vector<AgcConstraint> additionalConstraints_;
std::map<int32_t, std::vector<AgcConstraint>> constraintModes_;
std::map<int32_t, std::shared_ptr<ExposureModeHelper>> exposureModeHelpers_;
ControlInfoMap::Map controls_;
@@ -173,7 +173,8 @@ int Agc::configure(IPAContext &context,
setLimits(context.configuration.agc.minShutterSpeed,
context.configuration.agc.maxShutterSpeed,
context.configuration.agc.minAnalogueGain,
- context.configuration.agc.maxAnalogueGain);
+ context.configuration.agc.maxAnalogueGain,
+ {});
resetFrameCount();
@@ -205,7 +205,7 @@ int Agc::configure(IPAContext &context, const IPACameraSensorInfo &configInfo)
setLimits(context.configuration.sensor.minExposureTime,
context.configuration.sensor.maxExposureTime,
context.configuration.sensor.minAnalogueGain,
- context.configuration.sensor.maxAnalogueGain);
+ context.configuration.sensor.maxAnalogueGain, {});
resetFrameCount();
@@ -589,7 +589,7 @@ void Agc::process(IPAContext &context, [[maybe_unused]] const uint32_t frame,
maxAnalogueGain = frameContext.agc.gain;
}
- setLimits(minExposureTime, maxExposureTime, minAnalogueGain, maxAnalogueGain);
+ setLimits(minExposureTime, maxExposureTime, minAnalogueGain, maxAnalogueGain, {});
/*
* The Agc algorithm needs to know the effective exposure value that was
Add support for additional constraints added at runtime. This is for example useful for WDR use cases where you want to add a upper constraint to limit the amount of saturated pixels. Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com> --- Changes in v3: - Added this patch --- src/ipa/ipu3/algorithms/agc.cpp | 2 +- src/ipa/libipa/agc_mean_luminance.cpp | 16 ++++++++++++---- src/ipa/libipa/agc_mean_luminance.h | 3 ++- src/ipa/mali-c55/algorithms/agc.cpp | 3 ++- src/ipa/rkisp1/algorithms/agc.cpp | 4 ++-- 5 files changed, 19 insertions(+), 9 deletions(-)