Message ID | 20250815102945.1602071-17-stefan.klug@ideasonboard.com |
---|---|
State | New |
Headers | show |
Series |
|
Related | show |
Quoting Stefan Klug (2025-08-15 19:29:36) > Add support for additional constraints added at runtime. This is for > example useful for WDR use cases where you want to add a upper s/a /an / > constraint to limit the amount of saturated pixels. > > Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@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(-) > > diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp > index da045640d569..b0d89541da85 100644 > --- a/src/ipa/ipu3/algorithms/agc.cpp > +++ b/src/ipa/ipu3/algorithms/agc.cpp > @@ -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; > diff --git a/src/ipa/libipa/agc_mean_luminance.cpp b/src/ipa/libipa/agc_mean_luminance.cpp > index 2bfafe9b2d02..5cd5d9ad2012 100644 > --- a/src/ipa/libipa/agc_mean_luminance.cpp > +++ b/src/ipa/libipa/agc_mean_luminance.cpp > @@ -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; > } > diff --git a/src/ipa/libipa/agc_mean_luminance.h b/src/ipa/libipa/agc_mean_luminance.h > index 950b7b893754..d7ec548e3e58 100644 > --- a/src/ipa/libipa/agc_mean_luminance.h > +++ b/src/ipa/libipa/agc_mean_luminance.h > @@ -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_; > diff --git a/src/ipa/mali-c55/algorithms/agc.cpp b/src/ipa/mali-c55/algorithms/agc.cpp > index 88f8664c9823..f60fddac3f04 100644 > --- a/src/ipa/mali-c55/algorithms/agc.cpp > +++ b/src/ipa/mali-c55/algorithms/agc.cpp > @@ -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(); > > diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp > index ba617a4e6e0c..d566a3fbef4a 100644 > --- a/src/ipa/rkisp1/algorithms/agc.cpp > +++ b/src/ipa/rkisp1/algorithms/agc.cpp > @@ -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 > -- > 2.48.1 >
diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp index da045640d569..b0d89541da85 100644 --- a/src/ipa/ipu3/algorithms/agc.cpp +++ b/src/ipa/ipu3/algorithms/agc.cpp @@ -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; diff --git a/src/ipa/libipa/agc_mean_luminance.cpp b/src/ipa/libipa/agc_mean_luminance.cpp index 2bfafe9b2d02..5cd5d9ad2012 100644 --- a/src/ipa/libipa/agc_mean_luminance.cpp +++ b/src/ipa/libipa/agc_mean_luminance.cpp @@ -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; } diff --git a/src/ipa/libipa/agc_mean_luminance.h b/src/ipa/libipa/agc_mean_luminance.h index 950b7b893754..d7ec548e3e58 100644 --- a/src/ipa/libipa/agc_mean_luminance.h +++ b/src/ipa/libipa/agc_mean_luminance.h @@ -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_; diff --git a/src/ipa/mali-c55/algorithms/agc.cpp b/src/ipa/mali-c55/algorithms/agc.cpp index 88f8664c9823..f60fddac3f04 100644 --- a/src/ipa/mali-c55/algorithms/agc.cpp +++ b/src/ipa/mali-c55/algorithms/agc.cpp @@ -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(); diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp index ba617a4e6e0c..d566a3fbef4a 100644 --- a/src/ipa/rkisp1/algorithms/agc.cpp +++ b/src/ipa/rkisp1/algorithms/agc.cpp @@ -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(-)