[{"id":20029,"web_url":"https://patchwork.libcamera.org/comment/20029/","msgid":"<CAEmqJPooxYBR1Y+CQD3Yr-8-fmbLqfkPm+-jYsXgtz1kE54fcw@mail.gmail.com>","date":"2021-10-04T08:31:06","subject":"Re: [libcamera-devel] [PATCH v2 3/7] libcamera: pipeline:\n\traspberrypi: Support the new AE controls","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi Paul,\n\nThank you for your work.\n\nOn Fri, 1 Oct 2021 at 11:33, Paul Elder <paul.elder@ideasonboard.com> wrote:\n\n> Add support for the new AE controls in the raspberrypi pipeline handler,\n> and in the IPA.\n>\n> Bug: https://bugs.libcamera.org/show_bug.cgi?id=42\n> Bug: https://bugs.libcamera.org/show_bug.cgi?id=43\n> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n>\n> ---\n> Changes in v2:\n> - fix the rebase error where some uvc stuff was in rasberrypi\n> - i haven't yet taken in the comments to move the new Pause/Resume\n>   functions\n>\n> Initial versoin:\n> This is very hacky. I wasn't sure what the best way was to plumb it into\n> the raspberrypi IPA as it was a bit hairy...\n> ---\n>  include/libcamera/ipa/raspberrypi.h        |  3 +-\n>  src/ipa/raspberrypi/controller/rpi/agc.cpp | 18 +++++++++-\n>  src/ipa/raspberrypi/controller/rpi/agc.hpp |  5 +++\n>  src/ipa/raspberrypi/raspberrypi.cpp        | 42 +++++++++++++++++-----\n>  4 files changed, 58 insertions(+), 10 deletions(-)\n>\n> diff --git a/include/libcamera/ipa/raspberrypi.h\n> b/include/libcamera/ipa/raspberrypi.h\n> index 521eaecd..363ea038 100644\n> --- a/include/libcamera/ipa/raspberrypi.h\n> +++ b/include/libcamera/ipa/raspberrypi.h\n> @@ -28,8 +28,9 @@ namespace RPi {\n>   * unsupported control is encountered.\n>   */\n>  static const ControlInfoMap Controls({\n> -               { &controls::AeEnable, ControlInfo(false, true) },\n> +               { &controls::ExposureTimeMode,\n> ControlInfo(controls::ExposureTimeModeValues) },\n>                 { &controls::ExposureTime, ControlInfo(0, 999999) },\n> +               { &controls::AnalogueGainMode,\n> ControlInfo(controls::AnalogueGainModeValues) },\n>                 { &controls::AnalogueGain, ControlInfo(1.0f, 32.0f) },\n>                 { &controls::AeMeteringMode,\n> ControlInfo(controls::AeMeteringModeValues) },\n>                 { &controls::AeConstraintMode,\n> ControlInfo(controls::AeConstraintModeValues) },\n> diff --git a/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> index 289c1fce..b45ea454 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> @@ -203,14 +203,30 @@ bool Agc::IsPaused() const\n>  }\n>\n>  void Agc::Pause()\n> +{\n> +}\n> +\n> +void Agc::Resume()\n> +{\n> +}\n> +\n> +void Agc::PauseExposure()\n>\n\nOne small suggestion, could this be called PauseShutter() instead?  Helps\nclarify what part\nof the exposure is paused.\n\nThanks,\nNaush\n\n\n>  {\n>         fixed_shutter_ = status_.shutter_time;\n> +}\n> +\n> +void Agc::PauseGain()\n> +{\n>         fixed_analogue_gain_ = status_.analogue_gain;\n>  }\n>\n> -void Agc::Resume()\n> +void Agc::ResumeExposure()\n>  {\n>         fixed_shutter_ = 0s;\n> +}\n> +\n> +void Agc::ResumeGain()\n> +{\n>         fixed_analogue_gain_ = 0;\n>  }\n>\n> diff --git a/src/ipa/raspberrypi/controller/rpi/agc.hpp\n> b/src/ipa/raspberrypi/controller/rpi/agc.hpp\n> index 82063636..7ca3ca2f 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/agc.hpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/agc.hpp\n> @@ -92,6 +92,11 @@ public:\n>         void Prepare(Metadata *image_metadata) override;\n>         void Process(StatisticsPtr &stats, Metadata *image_metadata)\n> override;\n>\n> +       void PauseExposure();\n> +       void PauseGain();\n> +       void ResumeExposure();\n> +       void ResumeGain();\n> +\n>  private:\n>         void updateLockStatus(DeviceStatus const &device_status);\n>         AgcConfig config_;\n> diff --git a/src/ipa/raspberrypi/raspberrypi.cpp\n> b/src/ipa/raspberrypi/raspberrypi.cpp\n> index 047123ab..99935515 100644\n> --- a/src/ipa/raspberrypi/raspberrypi.cpp\n> +++ b/src/ipa/raspberrypi/raspberrypi.cpp\n> @@ -53,6 +53,8 @@\n>  #include \"sharpen_algorithm.hpp\"\n>  #include \"sharpen_status.h\"\n>\n> +#include \"controller/rpi/agc.hpp\"\n> +\n>  namespace libcamera {\n>\n>  using namespace std::literals::chrono_literals;\n> @@ -478,7 +480,10 @@ void IPARPi::reportMetadata()\n>\n>         AgcStatus *agcStatus =\n> rpiMetadata_.GetLocked<AgcStatus>(\"agc.status\");\n>         if (agcStatus) {\n> -               libcameraMetadata_.set(controls::AeLocked,\n> agcStatus->locked);\n> +               libcameraMetadata_.set(controls::AeState,\n> +                                      agcStatus->locked ?\n> +                                      controls::AeStateConverged :\n> +                                      controls::AeStateSearching);\n>                 libcameraMetadata_.set(controls::DigitalGain,\n> agcStatus->digital_gain);\n>         }\n>\n> @@ -623,20 +628,22 @@ void IPARPi::queueRequest(const ControlList\n> &controls)\n>                                   << \" = \" << ctrl.second.toString();\n>\n>                 switch (ctrl.first) {\n> -               case controls::AE_ENABLE: {\n> -                       RPiController::Algorithm *agc =\n> controller_.GetAlgorithm(\"agc\");\n> +               case controls::EXPOSURE_TIME_MODE: {\n> +                       RPiController::Algorithm *algo =\n> controller_.GetAlgorithm(\"agc\");\n> +                       RPiController::Agc *agc =\n> reinterpret_cast<RPiController::Agc *>(algo);\n>                         if (!agc) {\n>                                 LOG(IPARPI, Warning)\n> -                                       << \"Could not set AE_ENABLE - no\n> AGC algorithm\";\n> +                                       << \"Could not set\n> EXPOSURE_TIME_MODE - no AGC algorithm\";\n>                                 break;\n>                         }\n>\n> -                       if (ctrl.second.get<bool>() == false)\n> -                               agc->Pause();\n> +                       if (ctrl.second.get<int32_t>() ==\n> controls::ExposureTimeModeDisabled)\n> +                               agc->PauseExposure();\n>                         else\n> -                               agc->Resume();\n> +                               agc->ResumeExposure();\n>\n> -                       libcameraMetadata_.set(controls::AeEnable,\n> ctrl.second.get<bool>());\n> +                       libcameraMetadata_.set(controls::ExposureTimeMode,\n> +                                              ctrl.second.get<int32_t>());\n>                         break;\n>                 }\n>\n> @@ -656,6 +663,25 @@ void IPARPi::queueRequest(const ControlList &controls)\n>                         break;\n>                 }\n>\n> +               case controls::ANALOGUE_GAIN_MODE: {\n> +                       RPiController::Algorithm *algo =\n> controller_.GetAlgorithm(\"agc\");\n> +                       RPiController::Agc *agc =\n> reinterpret_cast<RPiController::Agc *>(algo);\n> +                       if (!agc) {\n> +                               LOG(IPARPI, Warning)\n> +                                       << \"Could not set\n> ANALOGUE_GAIN_MODE - no AGC algorithm\";\n> +                               break;\n> +                       }\n> +\n> +                       if (ctrl.second.get<int32_t>() ==\n> controls::AnalogueGainModeDisabled)\n> +                               agc->PauseGain();\n> +                       else\n> +                               agc->ResumeGain();\n> +\n> +                       libcameraMetadata_.set(controls::AnalogueGainMode,\n> +                                              ctrl.second.get<int32_t>());\n> +                       break;\n> +               }\n> +\n>                 case controls::ANALOGUE_GAIN: {\n>                         RPiController::AgcAlgorithm *agc =\n> dynamic_cast<RPiController::AgcAlgorithm *>(\n>                                 controller_.GetAlgorithm(\"agc\"));\n> --\n> 2.27.0\n>\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 41751C3243\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  4 Oct 2021 08:31:26 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id AA16E691B7;\n\tMon,  4 Oct 2021 10:31:25 +0200 (CEST)","from mail-lf1-x12d.google.com (mail-lf1-x12d.google.com\n\t[IPv6:2a00:1450:4864:20::12d])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 58A6D602DC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  4 Oct 2021 10:31:23 +0200 (CEST)","by mail-lf1-x12d.google.com with SMTP id e15so68280623lfr.10\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 04 Oct 2021 01:31:23 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=raspberrypi.com header.i=@raspberrypi.com\n\theader.b=\"p6ncAOJ5\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=mime-version:references:in-reply-to:from:date:message-id:subject:to\n\t:cc; bh=bQ+XIHGu3fA6vDzi2DGtjxqA54NYcMnMkoatvZQ+szc=;\n\tb=p6ncAOJ5tfMmaYR6rORrUlyVzgFvbfp8ZyE5FXCqofDV8E+sjpKjZpTh357usJ6qiO\n\t1RzoDbc9nBJdwuCcA00Y6bJfRVFxLSRGdxX2kbsM7Ew7t0nf8UED8RNBmRcEJlUAO/ju\n\tr3edtMxP/Qi7z0n6qYtvby+74MKFb9NUfWGvfFgzGclN/4OcGk6PboTnjKtJs0h4GR8/\n\tfaiRP965B7+WJv3WJqXr295xBel8BrxF1H6petca1c8xDbvqsaznIVQWq+wUYvCOKMFV\n\tEBfrMRl5Lnv58NXa2Qw5MdXrS13OYZR52zQzmFLkwloWKRKCBk7l4RReTnNhtdGL4dxY\n\tUsKA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=bQ+XIHGu3fA6vDzi2DGtjxqA54NYcMnMkoatvZQ+szc=;\n\tb=eNEe6TcdqG6mBTILJ2m3e52R/9tSOfK11kvA0qmOMv9UX47hLDpl3lSSBEkPLUQMfD\n\tzUYvQX6qkyiLvWjMr9cVbCHnplZtsN2CCkXnobAD6P48BUBbLc6oPGNp3QuWkSDIwfVj\n\tNdfIfYiMqoZ4scTT+d56TFEoJ9hEmLKHcCsrn83xah/2Qw8oHh6qeYidYUzxSPo6Fiv2\n\tyYfN1blBq/2tAAIMXP2BZUfyaBpL3BM9TQ8weQ4gBLB2hH883Y6DVe8BI5SpvNPCshoX\n\t7DtWDWpz8TocqxpEjDjyE6w2aonKIQzHgDuiOtBLFj4lrkUCm5yKG8w2XOWydKhIZEx4\n\tuCkw==","X-Gm-Message-State":"AOAM530wHow0ceJhBRAQu5qrjeJ2CybrxfALNHi9r84aI5o+bv6Zf++D\n\tasfBikOt4k723LQCEPagWX/ltf+9782G+RdKXwQa2Pachl8=","X-Google-Smtp-Source":"ABdhPJweDdfheE8YwgTo0psR8fm5CN+Q5+mtmRwEKRmtlzNygF94zGymmiJpAHGBZ1JFNDUJ8EGFx3u2z+pWoZ9nSXs=","X-Received":"by 2002:a05:6512:158a:: with SMTP id\n\tbp10mr12907804lfb.122.1633336282674; \n\tMon, 04 Oct 2021 01:31:22 -0700 (PDT)","MIME-Version":"1.0","References":"<20211001103325.1077590-1-paul.elder@ideasonboard.com>\n\t<20211001103325.1077590-4-paul.elder@ideasonboard.com>","In-Reply-To":"<20211001103325.1077590-4-paul.elder@ideasonboard.com>","From":"Naushir Patuck <naush@raspberrypi.com>","Date":"Mon, 4 Oct 2021 09:31:06 +0100","Message-ID":"<CAEmqJPooxYBR1Y+CQD3Yr-8-fmbLqfkPm+-jYsXgtz1kE54fcw@mail.gmail.com>","To":"Paul Elder <paul.elder@ideasonboard.com>","Content-Type":"multipart/alternative; boundary=\"000000000000ed8b4305cd82bc00\"","Subject":"Re: [libcamera-devel] [PATCH v2 3/7] libcamera: pipeline:\n\traspberrypi: Support the new AE controls","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":20032,"web_url":"https://patchwork.libcamera.org/comment/20032/","msgid":"<20211004090812.GF4221@pyrite.rasen.tech>","date":"2021-10-04T09:08:12","subject":"Re: [libcamera-devel] [PATCH v2 3/7] libcamera: pipeline:\n\traspberrypi: Support the new AE controls","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"Hi Naush,\n\nThanks for the feedback.\n\nOn Mon, Oct 04, 2021 at 09:31:06AM +0100, Naushir Patuck wrote:\n> Hi Paul,\n> \n> Thank you for your work.\n> \n> On Fri, 1 Oct 2021 at 11:33, Paul Elder <paul.elder@ideasonboard.com> wrote:\n> \n>     Add support for the new AE controls in the raspberrypi pipeline handler,\n>     and in the IPA.\n> \n>     Bug: https://bugs.libcamera.org/show_bug.cgi?id=42\n>     Bug: https://bugs.libcamera.org/show_bug.cgi?id=43\n>     Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n> \n>     ---\n>     Changes in v2:\n>     - fix the rebase error where some uvc stuff was in rasberrypi\n>     - i haven't yet taken in the comments to move the new Pause/Resume\n>       functions\n> \n>     Initial versoin:\n>     This is very hacky. I wasn't sure what the best way was to plumb it into\n>     the raspberrypi IPA as it was a bit hairy...\n>     ---\n>      include/libcamera/ipa/raspberrypi.h        |  3 +-\n>      src/ipa/raspberrypi/controller/rpi/agc.cpp | 18 +++++++++-\n>      src/ipa/raspberrypi/controller/rpi/agc.hpp |  5 +++\n>      src/ipa/raspberrypi/raspberrypi.cpp        | 42 +++++++++++++++++-----\n>      4 files changed, 58 insertions(+), 10 deletions(-)\n> \n>     diff --git a/include/libcamera/ipa/raspberrypi.h b/include/libcamera/ipa/\n>     raspberrypi.h\n>     index 521eaecd..363ea038 100644\n>     --- a/include/libcamera/ipa/raspberrypi.h\n>     +++ b/include/libcamera/ipa/raspberrypi.h\n>     @@ -28,8 +28,9 @@ namespace RPi {\n>       * unsupported control is encountered.\n>       */\n>      static const ControlInfoMap Controls({\n>     -               { &controls::AeEnable, ControlInfo(false, true) },\n>     +               { &controls::ExposureTimeMode, ControlInfo\n>     (controls::ExposureTimeModeValues) },\n>                     { &controls::ExposureTime, ControlInfo(0, 999999) },\n>     +               { &controls::AnalogueGainMode, ControlInfo\n>     (controls::AnalogueGainModeValues) },\n>                     { &controls::AnalogueGain, ControlInfo(1.0f, 32.0f) },\n>                     { &controls::AeMeteringMode, ControlInfo\n>     (controls::AeMeteringModeValues) },\n>                     { &controls::AeConstraintMode, ControlInfo\n>     (controls::AeConstraintModeValues) },\n>     diff --git a/src/ipa/raspberrypi/controller/rpi/agc.cpp b/src/ipa/\n>     raspberrypi/controller/rpi/agc.cpp\n>     index 289c1fce..b45ea454 100644\n>     --- a/src/ipa/raspberrypi/controller/rpi/agc.cpp\n>     +++ b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n>     @@ -203,14 +203,30 @@ bool Agc::IsPaused() const\n>      }\n> \n>      void Agc::Pause()\n>     +{\n>     +}\n>     +\n>     +void Agc::Resume()\n>     +{\n>     +}\n>     +\n>     +void Agc::PauseExposure()\n> \n> \n> One small suggestion, could this be called PauseShutter() instead?  Helps\n\nWe can call it whatever you want :D\n\nI stil need to move these to AgcAlgorithm. Is really just that and\nrenaming these sufficient?\n\n\nThanks,\n\nPaul\n\n> clarify what part\n> of the exposure is paused.\n> \n> Thanks,\n> Naush\n>  \n> \n>      {\n>             fixed_shutter_ = status_.shutter_time;\n>     +}\n>     +\n>     +void Agc::PauseGain()\n>     +{\n>             fixed_analogue_gain_ = status_.analogue_gain;\n>      }\n> \n>     -void Agc::Resume()\n>     +void Agc::ResumeExposure()\n>      {\n>             fixed_shutter_ = 0s;\n>     +}\n>     +\n>     +void Agc::ResumeGain()\n>     +{\n>             fixed_analogue_gain_ = 0;\n>      }\n> \n>     diff --git a/src/ipa/raspberrypi/controller/rpi/agc.hpp b/src/ipa/\n>     raspberrypi/controller/rpi/agc.hpp\n>     index 82063636..7ca3ca2f 100644\n>     --- a/src/ipa/raspberrypi/controller/rpi/agc.hpp\n>     +++ b/src/ipa/raspberrypi/controller/rpi/agc.hpp\n>     @@ -92,6 +92,11 @@ public:\n>             void Prepare(Metadata *image_metadata) override;\n>             void Process(StatisticsPtr &stats, Metadata *image_metadata)\n>     override;\n> \n>     +       void PauseExposure();\n>     +       void PauseGain();\n>     +       void ResumeExposure();\n>     +       void ResumeGain();\n>     +\n>      private:\n>             void updateLockStatus(DeviceStatus const &device_status);\n>             AgcConfig config_;\n>     diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/\n>     raspberrypi.cpp\n>     index 047123ab..99935515 100644\n>     --- a/src/ipa/raspberrypi/raspberrypi.cpp\n>     +++ b/src/ipa/raspberrypi/raspberrypi.cpp\n>     @@ -53,6 +53,8 @@\n>      #include \"sharpen_algorithm.hpp\"\n>      #include \"sharpen_status.h\"\n> \n>     +#include \"controller/rpi/agc.hpp\"\n>     +\n>      namespace libcamera {\n> \n>      using namespace std::literals::chrono_literals;\n>     @@ -478,7 +480,10 @@ void IPARPi::reportMetadata()\n> \n>             AgcStatus *agcStatus = rpiMetadata_.GetLocked<AgcStatus>\n>     (\"agc.status\");\n>             if (agcStatus) {\n>     -               libcameraMetadata_.set(controls::AeLocked, agcStatus->\n>     locked);\n>     +               libcameraMetadata_.set(controls::AeState,\n>     +                                      agcStatus->locked ?\n>     +                                      controls::AeStateConverged :\n>     +                                      controls::AeStateSearching);\n>                     libcameraMetadata_.set(controls::DigitalGain, agcStatus->\n>     digital_gain);\n>             }\n> \n>     @@ -623,20 +628,22 @@ void IPARPi::queueRequest(const ControlList &\n>     controls)\n>                                       << \" = \" << ctrl.second.toString();\n> \n>                     switch (ctrl.first) {\n>     -               case controls::AE_ENABLE: {\n>     -                       RPiController::Algorithm *agc =\n>     controller_.GetAlgorithm(\"agc\");\n>     +               case controls::EXPOSURE_TIME_MODE: {\n>     +                       RPiController::Algorithm *algo =\n>     controller_.GetAlgorithm(\"agc\");\n>     +                       RPiController::Agc *agc = reinterpret_cast\n>     <RPiController::Agc *>(algo);\n>                             if (!agc) {\n>                                     LOG(IPARPI, Warning)\n>     -                                       << \"Could not set AE_ENABLE - no\n>     AGC algorithm\";\n>     +                                       << \"Could not set\n>     EXPOSURE_TIME_MODE - no AGC algorithm\";\n>                                     break;\n>                             }\n> \n>     -                       if (ctrl.second.get<bool>() == false)\n>     -                               agc->Pause();\n>     +                       if (ctrl.second.get<int32_t>() ==\n>     controls::ExposureTimeModeDisabled)\n>     +                               agc->PauseExposure();\n>                             else\n>     -                               agc->Resume();\n>     +                               agc->ResumeExposure();\n> \n>     -                       libcameraMetadata_.set(controls::AeEnable,\n>     ctrl.second.get<bool>());\n>     +                       libcameraMetadata_.set(controls::ExposureTimeMode,\n>     +                                              ctrl.second.get<int32_t>());\n>                             break;\n>                     }\n> \n>     @@ -656,6 +663,25 @@ void IPARPi::queueRequest(const ControlList &controls)\n>                             break;\n>                     }\n> \n>     +               case controls::ANALOGUE_GAIN_MODE: {\n>     +                       RPiController::Algorithm *algo =\n>     controller_.GetAlgorithm(\"agc\");\n>     +                       RPiController::Agc *agc = reinterpret_cast\n>     <RPiController::Agc *>(algo);\n>     +                       if (!agc) {\n>     +                               LOG(IPARPI, Warning)\n>     +                                       << \"Could not set\n>     ANALOGUE_GAIN_MODE - no AGC algorithm\";\n>     +                               break;\n>     +                       }\n>     +\n>     +                       if (ctrl.second.get<int32_t>() ==\n>     controls::AnalogueGainModeDisabled)\n>     +                               agc->PauseGain();\n>     +                       else\n>     +                               agc->ResumeGain();\n>     +\n>     +                       libcameraMetadata_.set(controls::AnalogueGainMode,\n>     +                                              ctrl.second.get<int32_t>());\n>     +                       break;\n>     +               }\n>     +\n>                     case controls::ANALOGUE_GAIN: {\n>                             RPiController::AgcAlgorithm *agc = dynamic_cast\n>     <RPiController::AgcAlgorithm *>(\n>                                     controller_.GetAlgorithm(\"agc\"));\n>     --\n>     2.27.0\n> \n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id E1BF1BDC71\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  4 Oct 2021 09:08:21 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4A6E1691B9;\n\tMon,  4 Oct 2021 11:08:21 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3C4F9602DC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  4 Oct 2021 11:08:20 +0200 (CEST)","from pyrite.rasen.tech (unknown\n\t[IPv6:2400:4051:61:600:2c71:1b79:d06d:5032])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id E37525A1;\n\tMon,  4 Oct 2021 11:08:18 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"MegB/jEs\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1633338499;\n\tbh=H1K3dCoKb+ZDRN9UUWjDrmzV1OXe7hjOb8ouYUA1slQ=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=MegB/jEsWrJymLAqQIITaD35rR1nCGFetr9wqaNZRKyN7J7TQjL5V0oLQ3AaEKUtz\n\t4+4vyAF2fDEqZdg1rUvkR8quVOqamw9j2sKCJFBgVc3TKiF9K1V3gBCFmdPKeRZ+2K\n\tSxpxUeJBHcAt6qs+JfG9EHeLZrsA7E3zS+LpTaD4=","Date":"Mon, 4 Oct 2021 18:08:12 +0900","From":"paul.elder@ideasonboard.com","To":"Naushir Patuck <naush@raspberrypi.com>","Message-ID":"<20211004090812.GF4221@pyrite.rasen.tech>","References":"<20211001103325.1077590-1-paul.elder@ideasonboard.com>\n\t<20211001103325.1077590-4-paul.elder@ideasonboard.com>\n\t<CAEmqJPooxYBR1Y+CQD3Yr-8-fmbLqfkPm+-jYsXgtz1kE54fcw@mail.gmail.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<CAEmqJPooxYBR1Y+CQD3Yr-8-fmbLqfkPm+-jYsXgtz1kE54fcw@mail.gmail.com>","Subject":"Re: [libcamera-devel] [PATCH v2 3/7] libcamera: pipeline:\n\traspberrypi: Support the new AE controls","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]