[libcamera-devel] [PATCH v2 2/2] ipa: raspberrypi: Handle AEC/AGC flicker controls
Naushir Patuck
naush at raspberrypi.com
Mon Mar 13 10:06:25 CET 2023
Hi David,
Thanks for the work!
On Thu, 26 Jan 2023 at 13:46, David Plowman via libcamera-devel <
libcamera-devel at lists.libcamera.org> wrote:
> We handle the flicker modes by passing the correct period to the
> AEC/AGC algorithm which already contains the necessary code. The
> "Auto" mode is currently unsupported.
>
> Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
>
Reviewed-by: Naushir Patuck <naush at raspberrypi.com>
> ---
> src/ipa/raspberrypi/raspberrypi.cpp | 80 +++++++++++++++++++++++++++++
> 1 file changed, 80 insertions(+)
>
> diff --git a/src/ipa/raspberrypi/raspberrypi.cpp
> b/src/ipa/raspberrypi/raspberrypi.cpp
> index 5f7397e2..477d72ba 100644
> --- a/src/ipa/raspberrypi/raspberrypi.cpp
> +++ b/src/ipa/raspberrypi/raspberrypi.cpp
> @@ -86,6 +86,8 @@ static 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(controls::AeFlickerModeValues) },
> + { &controls::AeFlickerPeriod, ControlInfo(0, 1000000) },
> { &controls::AwbEnable, ControlInfo(false, true) },
> { &controls::ColourGains, ControlInfo(0.0f, 32.0f) },
> { &controls::AwbMode, ControlInfo(controls::AwbModeValues) },
> @@ -218,6 +220,12 @@ private:
>
> /* Maximum gain code for the sensor. */
> uint32_t maxSensorGainCode_;
> +
> + /* The current state of flicker avoidance. */
> + struct FlickerState {
> + int32_t mode;
> + Duration period;
> + } flickerState_;
> };
>
> int IPARPi::init(const IPASettings &settings, bool lensPresent,
> IPAInitResult *result)
> @@ -946,6 +954,78 @@ void IPARPi::queueRequest(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 AE_FLICKER_MODE
> - 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::FlickerFreq50Hz: {
> + agc->setFlickerPeriod(10000 * 1.0us);
> +
> + break;
> + }
> +
> + case controls::FlickerFreq60Hz: {
> + agc->setFlickerPeriod(8333.333 * 1.0us);
> +
> + break;
> + }
> +
> + case controls::FlickerCustom: {
> +
> agc->setFlickerPeriod(flickerState_.period);
> +
> + 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
> AE_FLICKER_PERIOD - no AGC algorithm";
> + break;
> + }
> +
> + uint32_t period = ctrl.second.get<int32_t>();
> + flickerState_.period = period * 1.0us;
> +
> + /*
> + * We note that it makes no difference if the mode
> gets set to "custom"
> + * first, and the period updated after, or vice
> versa.
> + */
> + if (flickerState_.mode == controls::FlickerCustom)
> +
> agc->setFlickerPeriod(flickerState_.period);
> +
> + break;
> + }
> +
> case controls::AWB_ENABLE: {
> RPiController::AwbAlgorithm *awb =
> dynamic_cast<RPiController::AwbAlgorithm *>(
> controller_.getAlgorithm("awb"));
> --
> 2.30.2
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20230313/3b23aadf/attachment.htm>
More information about the libcamera-devel
mailing list