ipa: rpi: common: Handle AEC/AGC flicker controls
We handle the flicker modes by passing the correct period to the AEC/AGC algorithm which already contains the necessary code. The "Auto" mode, as well as reporting the detected flicker period via the "AeFlickerDetected" metadata, are unsupported for now. Signed-off-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
This commit is contained in:
parent
6fdbf3f38c
commit
a2eadc40a7
2 changed files with 69 additions and 1 deletions
|
@ -61,6 +61,10 @@ const ControlInfoMap::Map ipaControls{
|
|||
{ &controls::AeConstraintMode, ControlInfo(controls::AeConstraintModeValues) },
|
||||
{ &controls::AeExposureMode, ControlInfo(controls::AeExposureModeValues) },
|
||||
{ &controls::ExposureValue, ControlInfo(-8.0f, 8.0f, 0.0f) },
|
||||
{ &controls::AeFlickerMode, ControlInfo(static_cast<int>(controls::FlickerOff),
|
||||
static_cast<int>(controls::FlickerManual),
|
||||
static_cast<int>(controls::FlickerOff)) },
|
||||
{ &controls::AeFlickerPeriod, ControlInfo(100, 1000000) },
|
||||
{ &controls::Brightness, ControlInfo(-1.0f, 1.0f, 0.0f) },
|
||||
{ &controls::Contrast, ControlInfo(0.0f, 32.0f, 1.0f) },
|
||||
{ &controls::Sharpness, ControlInfo(0.0f, 16.0f, 1.0f) },
|
||||
|
@ -97,7 +101,7 @@ namespace ipa::RPi {
|
|||
|
||||
IpaBase::IpaBase()
|
||||
: controller_(), frameCount_(0), mistrustCount_(0), lastRunTimestamp_(0),
|
||||
firstStart_(true)
|
||||
firstStart_(true), flickerState_({ 0, 0s })
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -812,6 +816,64 @@ void IpaBase::applyControls(const ControlList &controls)
|
|||
break;
|
||||
}
|
||||
|
||||
case controls::AE_FLICKER_MODE: {
|
||||
RPiController::AgcAlgorithm *agc = dynamic_cast<RPiController::AgcAlgorithm *>(
|
||||
controller_.getAlgorithm("agc"));
|
||||
if (!agc) {
|
||||
LOG(IPARPI, Warning)
|
||||
<< "Could not set AeFlickerMode - no AGC algorithm";
|
||||
break;
|
||||
}
|
||||
|
||||
int32_t mode = ctrl.second.get<int32_t>();
|
||||
bool modeValid = true;
|
||||
|
||||
switch (mode) {
|
||||
case controls::FlickerOff:
|
||||
agc->setFlickerPeriod(0us);
|
||||
|
||||
break;
|
||||
|
||||
case controls::FlickerManual:
|
||||
agc->setFlickerPeriod(flickerState_.manualPeriod);
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG(IPARPI, Error) << "Flicker mode " << mode << " is not supported";
|
||||
modeValid = false;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (modeValid)
|
||||
flickerState_.mode = mode;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case controls::AE_FLICKER_PERIOD: {
|
||||
RPiController::AgcAlgorithm *agc = dynamic_cast<RPiController::AgcAlgorithm *>(
|
||||
controller_.getAlgorithm("agc"));
|
||||
if (!agc) {
|
||||
LOG(IPARPI, Warning)
|
||||
<< "Could not set AeFlickerPeriod - no AGC algorithm";
|
||||
break;
|
||||
}
|
||||
|
||||
uint32_t manualPeriod = ctrl.second.get<int32_t>();
|
||||
flickerState_.manualPeriod = manualPeriod * 1.0us;
|
||||
|
||||
/*
|
||||
* We note that it makes no difference if the mode gets set to "manual"
|
||||
* first, and the period updated after, or vice versa.
|
||||
*/
|
||||
if (flickerState_.mode == controls::FlickerManual)
|
||||
agc->setFlickerPeriod(flickerState_.manualPeriod);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case controls::AWB_ENABLE: {
|
||||
/* Silently ignore this control for a mono sensor. */
|
||||
if (monoSensor_)
|
||||
|
|
|
@ -116,6 +116,12 @@ private:
|
|||
/* Frame duration (1/fps) limits. */
|
||||
utils::Duration minFrameDuration_;
|
||||
utils::Duration maxFrameDuration_;
|
||||
|
||||
/* The current state of flicker avoidance. */
|
||||
struct FlickerState {
|
||||
int32_t mode;
|
||||
utils::Duration manualPeriod;
|
||||
} flickerState_;
|
||||
};
|
||||
|
||||
} /* namespace ipa::RPi */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue