summaryrefslogtreecommitdiff
path: root/src/ipa/rkisp1/algorithms/agc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ipa/rkisp1/algorithms/agc.cpp')
-rw-r--r--src/ipa/rkisp1/algorithms/agc.cpp48
1 files changed, 20 insertions, 28 deletions
diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp
index 87021451..f12f8b60 100644
--- a/src/ipa/rkisp1/algorithms/agc.cpp
+++ b/src/ipa/rkisp1/algorithms/agc.cpp
@@ -42,11 +42,9 @@ LOG_DEFINE_CATEGORY(RkISP1Agc)
int Agc::parseMeteringModes(IPAContext &context, const YamlObject &tuningData)
{
- if (!tuningData.isDictionary()) {
- LOG(RkISP1Agc, Error)
+ if (!tuningData.isDictionary())
+ LOG(RkISP1Agc, Warning)
<< "'AeMeteringMode' parameter not found in tuning file";
- return -EINVAL;
- }
for (const auto &[key, value] : tuningData.asDict()) {
if (controls::AeMeteringModeNameValueMap.find(key) ==
@@ -86,7 +84,8 @@ int Agc::parseMeteringModes(IPAContext &context, const YamlObject &tuningData)
return 0;
}
-uint8_t Agc::computeHistogramPredivider(Size &size, enum rkisp1_cif_isp_histogram_mode mode)
+uint8_t Agc::computeHistogramPredivider(const Size &size,
+ enum rkisp1_cif_isp_histogram_mode mode)
{
/*
* The maximum number of pixels that could potentially be in one bin is
@@ -116,12 +115,7 @@ uint8_t Agc::computeHistogramPredivider(Size &size, enum rkisp1_cif_isp_histogra
int count = mode == RKISP1_CIF_ISP_HISTOGRAM_MODE_RGB_COMBINED ? 3 : 1;
double factor = size.width * size.height * count / 65536.0;
double root = std::sqrt(factor);
- uint8_t predivider;
-
- if (std::pow(std::floor(root), 2) < factor)
- predivider = static_cast<uint8_t>(std::ceil(root));
- else
- predivider = static_cast<uint8_t>(std::floor(root));
+ uint8_t predivider = static_cast<uint8_t>(std::ceil(root));
return std::clamp<uint8_t>(predivider, 3, 127);
}
@@ -154,6 +148,7 @@ int Agc::init(IPAContext &context, const YamlObject &tuningData)
if (ret)
return ret;
+ context.ctrlMap[&controls::AeEnable] = ControlInfo(false, true);
context.ctrlMap.merge(controls());
return 0;
@@ -188,7 +183,7 @@ int Agc::configure(IPAContext &context, const IPACameraSensorInfo &configInfo)
* except it's computed in the IPA and not here so we'd have to
* recompute it.
*/
- context.activeState.agc.maxShutterSpeed = context.configuration.sensor.maxShutterSpeed;
+ context.activeState.agc.maxFrameDuration = context.configuration.sensor.maxShutterSpeed;
/*
* Define the measurement window for AGC as a centered rectangle
@@ -255,36 +250,31 @@ void Agc::queueRequest(IPAContext &context,
const auto &meteringMode = controls.get(controls::AeMeteringMode);
if (meteringMode) {
- frameContext.agc.update = agc.meteringMode != *meteringMode;
+ frameContext.agc.updateMetering = agc.meteringMode != *meteringMode;
agc.meteringMode =
static_cast<controls::AeMeteringModeEnum>(*meteringMode);
}
frameContext.agc.meteringMode = agc.meteringMode;
const auto &exposureMode = controls.get(controls::AeExposureMode);
- if (exposureMode) {
- frameContext.agc.update = agc.exposureMode != *exposureMode;
+ if (exposureMode)
agc.exposureMode =
static_cast<controls::AeExposureModeEnum>(*exposureMode);
- }
frameContext.agc.exposureMode = agc.exposureMode;
const auto &constraintMode = controls.get(controls::AeConstraintMode);
- if (constraintMode) {
- frameContext.agc.update = agc.constraintMode != *constraintMode;
+ if (constraintMode)
agc.constraintMode =
static_cast<controls::AeConstraintModeEnum>(*constraintMode);
- }
frameContext.agc.constraintMode = agc.constraintMode;
const auto &frameDurationLimits = controls.get(controls::FrameDurationLimits);
if (frameDurationLimits) {
- utils::Duration maxShutterSpeed =
+ utils::Duration maxFrameDuration =
std::chrono::milliseconds((*frameDurationLimits).back());
- frameContext.agc.update = agc.maxShutterSpeed != maxShutterSpeed;
- agc.maxShutterSpeed = maxShutterSpeed;
+ agc.maxFrameDuration = maxFrameDuration;
}
- frameContext.agc.maxShutterSpeed = agc.maxShutterSpeed;
+ frameContext.agc.maxFrameDuration = agc.maxFrameDuration;
}
/**
@@ -298,7 +288,7 @@ void Agc::prepare(IPAContext &context, const uint32_t frame,
frameContext.agc.gain = context.activeState.agc.automatic.gain;
}
- if (frame > 0 && !frameContext.agc.update)
+ if (frame > 0 && !frameContext.agc.updateMetering)
return;
/* Configure the measurement window. */
@@ -431,8 +421,10 @@ void Agc::process(IPAContext &context, [[maybe_unused]] const uint32_t frame,
[](uint32_t x) { return x >> 4; });
expMeans_ = { params->ae.exp_mean, context.hw->numAeCells };
- utils::Duration maxShutterSpeed = std::min(context.configuration.sensor.maxShutterSpeed,
- frameContext.agc.maxShutterSpeed);
+ utils::Duration maxShutterSpeed =
+ std::clamp(frameContext.agc.maxFrameDuration,
+ context.configuration.sensor.minShutterSpeed,
+ context.configuration.sensor.maxShutterSpeed);
setLimits(context.configuration.sensor.minShutterSpeed,
maxShutterSpeed,
context.configuration.sensor.minAnalogueGain,
@@ -450,8 +442,8 @@ void Agc::process(IPAContext &context, [[maybe_unused]] const uint32_t frame,
utils::Duration shutterTime;
double aGain, dGain;
std::tie(shutterTime, aGain, dGain) =
- calculateNewEv(context.activeState.agc.constraintMode,
- context.activeState.agc.exposureMode,
+ calculateNewEv(frameContext.agc.constraintMode,
+ frameContext.agc.exposureMode,
hist, effectiveExposureValue);
LOG(RkISP1Agc, Debug)