[libcamera-devel] [PATCH 2/3] src: ipa: raspberrypi: Improve behaviour when AE disabled
Naushir Patuck
naush at raspberrypi.com
Thu Nov 26 10:45:34 CET 2020
Hi David,
Thank you for the patch.
On Wed, 25 Nov 2020 at 11:36, David Plowman <david.plowman at raspberrypi.com>
wrote:
> AE/AGC "disabled" is now implemented by leaving it running but fixing
> the exposure/gain to the last values we requested. This behaves better
> when, for example, a fixed shutter or gain is then specified - the
> other value remains fixed and doesn't start floating again.
>
> Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
> ---
> src/ipa/raspberrypi/raspberrypi.cpp | 48 ++++++++++++++++++-----------
> 1 file changed, 30 insertions(+), 18 deletions(-)
>
> diff --git a/src/ipa/raspberrypi/raspberrypi.cpp
> b/src/ipa/raspberrypi/raspberrypi.cpp
> index 9853a343..30516665 100644
> --- a/src/ipa/raspberrypi/raspberrypi.cpp
> +++ b/src/ipa/raspberrypi/raspberrypi.cpp
> @@ -67,7 +67,8 @@ public:
> IPARPi()
> : lastMode_({}), controller_(), controllerInit_(false),
> frameCount_(0), checkCount_(0), mistrustCount_(0),
> - lsTable_(nullptr)
> + lsTable_(nullptr),
> + lastShutter_(0), lastGain_(0)
> {
> }
>
> @@ -145,6 +146,10 @@ private:
> /* LS table allocation passed in from the pipeline handler. */
> FileDescriptor lsTableHandle_;
> void *lsTable_;
> +
> + /* For enabling/disabling the AEC/AGC algorithm. */
> + uint32_t lastShutter_;
> + float lastGain_;
> };
>
> int IPARPi::init(const IPASettings &settings)
> @@ -493,12 +498,22 @@ void IPARPi::queueRequest(const ControlList
> &controls)
>
> switch (ctrl.first) {
> case controls::AE_ENABLE: {
> - RPiController::Algorithm *agc =
> controller_.GetAlgorithm("agc");
> + RPiController::AgcAlgorithm *agc =
> dynamic_cast<RPiController::AgcAlgorithm *>(
> + controller_.GetAlgorithm("agc"));
> ASSERT(agc);
> - if (ctrl.second.get<bool>() == false)
> - agc->Pause();
> - else
> - agc->Resume();
> +
> + /*
> + * We always run the AGC even if it's "disabled".
> + * Both exposure and gain are "fixed" to the last
> + * values it produced.
> + */
> + if (ctrl.second.get<bool>() == false) {
> + agc->SetFixedShutter(lastShutter_);
> + agc->SetFixedAnalogueGain(lastGain_);
> + } else {
> + agc->SetFixedShutter(0);
> + agc->SetFixedAnalogueGain(0);
> + }
>
I wonder if we could do this within the AGC controller itself? So we keep
the existing Pause()/Resume() logic in the IPA, and have the AGC do the
above block on the appropriate API call. This way the IPA would not need
to track the last used exposure/gain values that are already stored within
the AGC block?
The rest of the changes would still be valid with this tweak.
Regards,
Naush
>
> libcameraMetadata_.set(controls::AeEnable,
> ctrl.second.get<bool>());
> break;
> @@ -510,13 +525,10 @@ void IPARPi::queueRequest(const ControlList
> &controls)
> ASSERT(agc);
>
> /* This expects units of micro-seconds. */
> - agc->SetFixedShutter(ctrl.second.get<int32_t>());
> + int32_t shutter = ctrl.second.get<int32_t>();
> + agc->SetFixedShutter(shutter);
>
> - /* For the manual values to take effect, AGC must
> be unpaused. */
> - if (agc->IsPaused())
> - agc->Resume();
> -
> - libcameraMetadata_.set(controls::ExposureTime,
> ctrl.second.get<int32_t>());
> + libcameraMetadata_.set(controls::ExposureTime,
> shutter);
> break;
> }
>
> @@ -524,14 +536,11 @@ void IPARPi::queueRequest(const ControlList
> &controls)
> RPiController::AgcAlgorithm *agc =
> dynamic_cast<RPiController::AgcAlgorithm *>(
> controller_.GetAlgorithm("agc"));
> ASSERT(agc);
> -
> agc->SetFixedAnalogueGain(ctrl.second.get<float>());
>
> - /* For the manual values to take effect, AGC must
> be unpaused. */
> - if (agc->IsPaused())
> - agc->Resume();
> + float gain = ctrl.second.get<float>();
> + agc->SetFixedAnalogueGain(gain);
>
> - libcameraMetadata_.set(controls::AnalogueGain,
> - ctrl.second.get<float>());
> + libcameraMetadata_.set(controls::AnalogueGain,
> gain);
> break;
> }
>
> @@ -861,6 +870,9 @@ void IPARPi::applyAWB(const struct AwbStatus
> *awbStatus, ControlList &ctrls)
>
> void IPARPi::applyAGC(const struct AgcStatus *agcStatus, ControlList
> &ctrls)
> {
> + lastShutter_ = agcStatus->shutter_time;
> + lastGain_ = agcStatus->analogue_gain;
> +
> int32_t gainCode = helper_->GainCode(agcStatus->analogue_gain);
> int32_t exposureLines =
> helper_->ExposureLines(agcStatus->shutter_time);
>
> --
> 2.20.1
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20201126/337fa52b/attachment.htm>
More information about the libcamera-devel
mailing list