ipa: rkisp1: agc: Implement ExposureValue control
Now that agc_mean_luminance supports exposure correction, implement the corresponding ExposureValue control for rkisp1. Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
This commit is contained in:
@@ -157,6 +157,7 @@ int Agc::init(IPAContext &context, const YamlObject &tuningData)
|
||||
ControlValue(controls::AnalogueGainModeAuto));
|
||||
/* \todo Move this to the Camera class */
|
||||
context.ctrlMap[&controls::AeEnable] = ControlInfo(false, true, true);
|
||||
context.ctrlMap[&controls::ExposureValue] = ControlInfo(-8.0f, 8.0f, 0.0f);
|
||||
context.ctrlMap.merge(controls());
|
||||
|
||||
return 0;
|
||||
@@ -179,6 +180,7 @@ int Agc::configure(IPAContext &context, const IPACameraSensorInfo &configInfo)
|
||||
context.activeState.agc.manual.exposure = context.activeState.agc.automatic.exposure;
|
||||
context.activeState.agc.autoExposureEnabled = !context.configuration.raw;
|
||||
context.activeState.agc.autoGainEnabled = !context.configuration.raw;
|
||||
context.activeState.agc.exposureValue = 0.0;
|
||||
|
||||
context.activeState.agc.constraintMode =
|
||||
static_cast<controls::AeConstraintModeEnum>(constraintModes().begin()->first);
|
||||
@@ -301,6 +303,11 @@ void Agc::queueRequest(IPAContext &context,
|
||||
static_cast<controls::AeConstraintModeEnum>(*constraintMode);
|
||||
frameContext.agc.constraintMode = agc.constraintMode;
|
||||
|
||||
const auto &exposureValue = controls.get(controls::ExposureValue);
|
||||
if (exposureValue)
|
||||
agc.exposureValue = *exposureValue;
|
||||
frameContext.agc.exposureValue = agc.exposureValue;
|
||||
|
||||
const auto &frameDurationLimits = controls.get(controls::FrameDurationLimits);
|
||||
if (frameDurationLimits) {
|
||||
/* Limit the control value to the limits in ControlInfo */
|
||||
@@ -407,6 +414,7 @@ void Agc::fillMetadata(IPAContext &context, IPAFrameContext &frameContext,
|
||||
metadata.set(controls::AeMeteringMode, frameContext.agc.meteringMode);
|
||||
metadata.set(controls::AeExposureMode, frameContext.agc.exposureMode);
|
||||
metadata.set(controls::AeConstraintMode, frameContext.agc.constraintMode);
|
||||
metadata.set(controls::ExposureValue, frameContext.agc.exposureValue);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -556,6 +564,8 @@ void Agc::process(IPAContext &context, [[maybe_unused]] const uint32_t frame,
|
||||
double analogueGain = frameContext.sensor.gain;
|
||||
utils::Duration effectiveExposureValue = exposureTime * analogueGain;
|
||||
|
||||
setExposureCompensation(pow(2.0, frameContext.agc.exposureValue));
|
||||
|
||||
utils::Duration newExposureTime;
|
||||
double aGain, dGain;
|
||||
std::tie(newExposureTime, aGain, dGain) =
|
||||
|
||||
@@ -81,6 +81,7 @@ struct IPAActiveState {
|
||||
|
||||
bool autoExposureEnabled;
|
||||
bool autoGainEnabled;
|
||||
double exposureValue;
|
||||
controls::AeConstraintModeEnum constraintMode;
|
||||
controls::AeExposureModeEnum exposureMode;
|
||||
controls::AeMeteringModeEnum meteringMode;
|
||||
@@ -129,6 +130,7 @@ struct IPAFrameContext : public FrameContext {
|
||||
struct {
|
||||
uint32_t exposure;
|
||||
double gain;
|
||||
double exposureValue;
|
||||
uint32_t vblank;
|
||||
bool autoExposureEnabled;
|
||||
bool autoGainEnabled;
|
||||
|
||||
Reference in New Issue
Block a user