[{"id":25840,"web_url":"https://patchwork.libcamera.org/comment/25840/","msgid":"<CAHW6GYL6xYpgjdm1McuSRi4r7TyjjxRiL9zhpOqwznRu-u_cog@mail.gmail.com>","date":"2022-11-21T14:52:29","subject":"Re: [libcamera-devel] [PATCH] ipa: raspberrypi: Remove generic\n\t\"pause\" mechanism from Algorithm","submitter":{"id":42,"url":"https://patchwork.libcamera.org/api/people/42/","name":"David Plowman","email":"david.plowman@raspberrypi.com"},"content":"Hi Nick\n\nThanks for the update!\n\nOn Mon, 21 Nov 2022 at 14:47, Nick Hollinghurst via libcamera-devel\n<libcamera-devel@lists.libcamera.org> wrote:\n>\n> No existing Algorithm used the base pause(), resume() functions\n> or the paused_ flag, nor is there a need or a generic pause API.\n\nShould that be \"a need for a generic pause API\"?\n\n> Remove these. The AGC and AWB algorithms now have methods named\n> disableAuto(), enableAuto() which better describe their functionality.\n>\n> Signed-off-by: Nick Hollinghurst <nick.hollinghurst@raspberrypi.com>\n\nBut trivial nit-picks aside:\n\nReviewed-by: David Plowman <david.plowman@raspberrypi.com>\n\nThanks!\nDavid\n\n> ---\n>  src/ipa/raspberrypi/controller/agc_algorithm.h |  2 ++\n>  src/ipa/raspberrypi/controller/algorithm.h     |  6 +-----\n>  src/ipa/raspberrypi/controller/awb_algorithm.h |  2 ++\n>  src/ipa/raspberrypi/controller/controller.cpp  |  6 ++----\n>  src/ipa/raspberrypi/controller/rpi/agc.cpp     | 13 ++++---------\n>  src/ipa/raspberrypi/controller/rpi/agc.h       |  6 ++----\n>  src/ipa/raspberrypi/controller/rpi/awb.cpp     | 11 +++--------\n>  src/ipa/raspberrypi/controller/rpi/awb.h       |  6 ++----\n>  src/ipa/raspberrypi/raspberrypi.cpp            | 14 ++++++++------\n>  9 files changed, 26 insertions(+), 40 deletions(-)\n>\n> diff --git a/src/ipa/raspberrypi/controller/agc_algorithm.h b/src/ipa/raspberrypi/controller/agc_algorithm.h\n> index 3a91444c..36e6c110 100644\n> --- a/src/ipa/raspberrypi/controller/agc_algorithm.h\n> +++ b/src/ipa/raspberrypi/controller/agc_algorithm.h\n> @@ -26,6 +26,8 @@ public:\n>         virtual void setMeteringMode(std::string const &meteringModeName) = 0;\n>         virtual void setExposureMode(std::string const &exposureModeName) = 0;\n>         virtual void setConstraintMode(std::string const &contraintModeName) = 0;\n> +       virtual void enableAuto() = 0;\n> +       virtual void disableAuto() = 0;\n>  };\n>\n>  } /* namespace RPiController */\n> diff --git a/src/ipa/raspberrypi/controller/algorithm.h b/src/ipa/raspberrypi/controller/algorithm.h\n> index cbbb13ba..4f327598 100644\n> --- a/src/ipa/raspberrypi/controller/algorithm.h\n> +++ b/src/ipa/raspberrypi/controller/algorithm.h\n> @@ -27,14 +27,11 @@ class Algorithm\n>  {\n>  public:\n>         Algorithm(Controller *controller)\n> -               : controller_(controller), paused_(false)\n> +               : controller_(controller)\n>         {\n>         }\n>         virtual ~Algorithm() = default;\n>         virtual char const *name() const = 0;\n> -       virtual bool isPaused() const { return paused_; }\n> -       virtual void pause() { paused_ = true; }\n> -       virtual void resume() { paused_ = false; }\n>         virtual int read(const libcamera::YamlObject &params);\n>         virtual void initialise();\n>         virtual void switchMode(CameraMode const &cameraMode, Metadata *metadata);\n> @@ -47,7 +44,6 @@ public:\n>\n>  private:\n>         Controller *controller_;\n> -       bool paused_;\n>  };\n>\n>  /*\n> diff --git a/src/ipa/raspberrypi/controller/awb_algorithm.h b/src/ipa/raspberrypi/controller/awb_algorithm.h\n> index 48e08b60..8462c4db 100644\n> --- a/src/ipa/raspberrypi/controller/awb_algorithm.h\n> +++ b/src/ipa/raspberrypi/controller/awb_algorithm.h\n> @@ -18,6 +18,8 @@ public:\n>         virtual unsigned int getConvergenceFrames() const = 0;\n>         virtual void setMode(std::string const &modeName) = 0;\n>         virtual void setManualGains(double manualR, double manualB) = 0;\n> +       virtual void enableAuto() = 0;\n> +       virtual void disableAuto() = 0;\n>  };\n>\n>  } /* namespace RPiController */\n> diff --git a/src/ipa/raspberrypi/controller/controller.cpp b/src/ipa/raspberrypi/controller/controller.cpp\n> index f4892786..e9156785 100644\n> --- a/src/ipa/raspberrypi/controller/controller.cpp\n> +++ b/src/ipa/raspberrypi/controller/controller.cpp\n> @@ -108,16 +108,14 @@ void Controller::prepare(Metadata *imageMetadata)\n>  {\n>         assert(switchModeCalled_);\n>         for (auto &algo : algorithms_)\n> -               if (!algo->isPaused())\n> -                       algo->prepare(imageMetadata);\n> +               algo->prepare(imageMetadata);\n>  }\n>\n>  void Controller::process(StatisticsPtr stats, Metadata *imageMetadata)\n>  {\n>         assert(switchModeCalled_);\n>         for (auto &algo : algorithms_)\n> -               if (!algo->isPaused())\n> -                       algo->process(stats, imageMetadata);\n> +               algo->process(stats, imageMetadata);\n>  }\n>\n>  Metadata &Controller::getGlobalMetadata()\n> diff --git a/src/ipa/raspberrypi/controller/rpi/agc.cpp b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> index bd54a639..a30e50c1 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> @@ -270,18 +270,13 @@ int Agc::read(const libcamera::YamlObject &params)\n>         return 0;\n>  }\n>\n> -bool Agc::isPaused() const\n> -{\n> -       return false;\n> -}\n> -\n> -void Agc::pause()\n> +void Agc::disableAuto()\n>  {\n>         fixedShutter_ = status_.shutterTime;\n>         fixedAnalogueGain_ = status_.analogueGain;\n>  }\n>\n> -void Agc::resume()\n> +void Agc::enableAuto()\n>  {\n>         fixedShutter_ = 0s;\n>         fixedAnalogueGain_ = 0;\n> @@ -317,14 +312,14 @@ void Agc::setMaxShutter(Duration maxShutter)\n>  void Agc::setFixedShutter(Duration fixedShutter)\n>  {\n>         fixedShutter_ = fixedShutter;\n> -       /* Set this in case someone calls Pause() straight after. */\n> +       /* Set this in case someone calls disableAuto() straight after. */\n>         status_.shutterTime = clipShutter(fixedShutter_);\n>  }\n>\n>  void Agc::setFixedAnalogueGain(double fixedAnalogueGain)\n>  {\n>         fixedAnalogueGain_ = fixedAnalogueGain;\n> -       /* Set this in case someone calls Pause() straight after. */\n> +       /* Set this in case someone calls disableAuto() straight after. */\n>         status_.analogueGain = fixedAnalogueGain;\n>  }\n>\n> diff --git a/src/ipa/raspberrypi/controller/rpi/agc.h b/src/ipa/raspberrypi/controller/rpi/agc.h\n> index 6d6b0e5a..cf04da19 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/agc.h\n> +++ b/src/ipa/raspberrypi/controller/rpi/agc.h\n> @@ -75,10 +75,6 @@ public:\n>         Agc(Controller *controller);\n>         char const *name() const override;\n>         int read(const libcamera::YamlObject &params) override;\n> -       /* AGC handles \"pausing\" for itself. */\n> -       bool isPaused() const override;\n> -       void pause() override;\n> -       void resume() override;\n>         unsigned int getConvergenceFrames() const override;\n>         void setEv(double ev) override;\n>         void setFlickerPeriod(libcamera::utils::Duration flickerPeriod) override;\n> @@ -88,6 +84,8 @@ public:\n>         void setMeteringMode(std::string const &meteringModeName) override;\n>         void setExposureMode(std::string const &exposureModeName) override;\n>         void setConstraintMode(std::string const &contraintModeName) override;\n> +       void enableAuto() override;\n> +       void disableAuto() override;\n>         void switchMode(CameraMode const &cameraMode, Metadata *metadata) override;\n>         void prepare(Metadata *imageMetadata) override;\n>         void process(StatisticsPtr &stats, Metadata *imageMetadata) override;\n> diff --git a/src/ipa/raspberrypi/controller/rpi/awb.cpp b/src/ipa/raspberrypi/controller/rpi/awb.cpp\n> index 8d8ddf09..4f6af4ba 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/awb.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/awb.cpp\n> @@ -222,21 +222,16 @@ void Awb::initialise()\n>         asyncResults_ = syncResults_;\n>  }\n>\n> -bool Awb::isPaused() const\n> +void Awb::disableAuto()\n>  {\n> -       return false;\n> -}\n> -\n> -void Awb::pause()\n> -{\n> -       /* \"Pause\" by fixing everything to the most recent values. */\n> +       /* Freeze the most recent values, and treat them as manual gains */\n>         manualR_ = syncResults_.gainR = prevSyncResults_.gainR;\n>         manualB_ = syncResults_.gainB = prevSyncResults_.gainB;\n>         syncResults_.gainG = prevSyncResults_.gainG;\n>         syncResults_.temperatureK = prevSyncResults_.temperatureK;\n>  }\n>\n> -void Awb::resume()\n> +void Awb::enableAuto()\n>  {\n>         manualR_ = 0.0;\n>         manualB_ = 0.0;\n> diff --git a/src/ipa/raspberrypi/controller/rpi/awb.h b/src/ipa/raspberrypi/controller/rpi/awb.h\n> index 30acd89d..2254c3ed 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/awb.h\n> +++ b/src/ipa/raspberrypi/controller/rpi/awb.h\n> @@ -93,13 +93,11 @@ public:\n>         char const *name() const override;\n>         void initialise() override;\n>         int read(const libcamera::YamlObject &params) override;\n> -       /* AWB handles \"pausing\" for itself. */\n> -       bool isPaused() const override;\n> -       void pause() override;\n> -       void resume() override;\n>         unsigned int getConvergenceFrames() const override;\n>         void setMode(std::string const &name) override;\n>         void setManualGains(double manualR, double manualB) override;\n> +       void enableAuto() override;\n> +       void disableAuto() override;\n>         void switchMode(CameraMode const &cameraMode, Metadata *metadata) override;\n>         void prepare(Metadata *imageMetadata) override;\n>         void process(StatisticsPtr &stats, Metadata *imageMetadata) override;\n> diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp\n> index b74f1ecf..beb076dc 100644\n> --- a/src/ipa/raspberrypi/raspberrypi.cpp\n> +++ b/src/ipa/raspberrypi/raspberrypi.cpp\n> @@ -706,7 +706,8 @@ void IPARPi::queueRequest(const ControlList &controls)\n>\n>                 switch (ctrl.first) {\n>                 case controls::AE_ENABLE: {\n> -                       RPiController::Algorithm *agc = controller_.getAlgorithm(\"agc\");\n> +                       RPiController::AgcAlgorithm *agc = dynamic_cast<RPiController::AgcAlgorithm *>(\n> +                               controller_.getAlgorithm(\"agc\"));\n>                         if (!agc) {\n>                                 LOG(IPARPI, Warning)\n>                                         << \"Could not set AE_ENABLE - no AGC algorithm\";\n> @@ -714,9 +715,9 @@ void IPARPi::queueRequest(const ControlList &controls)\n>                         }\n>\n>                         if (ctrl.second.get<bool>() == false)\n> -                               agc->pause();\n> +                               agc->disableAuto();\n>                         else\n> -                               agc->resume();\n> +                               agc->enableAuto();\n>\n>                         libcameraMetadata_.set(controls::AeEnable, ctrl.second.get<bool>());\n>                         break;\n> @@ -835,7 +836,8 @@ void IPARPi::queueRequest(const ControlList &controls)\n>                 }\n>\n>                 case controls::AWB_ENABLE: {\n> -                       RPiController::Algorithm *awb = controller_.getAlgorithm(\"awb\");\n> +                       RPiController::AwbAlgorithm *awb = dynamic_cast<RPiController::AwbAlgorithm *>(\n> +                               controller_.getAlgorithm(\"awb\"));\n>                         if (!awb) {\n>                                 LOG(IPARPI, Warning)\n>                                         << \"Could not set AWB_ENABLE - no AWB algorithm\";\n> @@ -843,9 +845,9 @@ void IPARPi::queueRequest(const ControlList &controls)\n>                         }\n>\n>                         if (ctrl.second.get<bool>() == false)\n> -                               awb->pause();\n> +                               awb->disableAuto();\n>                         else\n> -                               awb->resume();\n> +                               awb->enableAuto();\n>\n>                         libcameraMetadata_.set(controls::AwbEnable,\n>                                                ctrl.second.get<bool>());\n> --\n> 2.20.1\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 B9F87BD16B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 21 Nov 2022 14:52:44 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 09E0A63311;\n\tMon, 21 Nov 2022 15:52:44 +0100 (CET)","from mail-pj1-x102e.google.com (mail-pj1-x102e.google.com\n\t[IPv6:2607:f8b0:4864:20::102e])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 7552263097\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 21 Nov 2022 15:52:42 +0100 (CET)","by mail-pj1-x102e.google.com with SMTP id mv18so2974848pjb.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 21 Nov 2022 06:52:42 -0800 (PST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1669042364;\n\tbh=Tbdkp72wzUAO2LY3X5QbmuJQudghTRjLJpZ1OLlGhUk=;\n\th=References:In-Reply-To:Date:To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=IUOzsHIZcuLJ77PbKAGy89C9K7ib0rLUvUjfbuQaXx4ivAVKRCnqb/78ypeOFSNgr\n\t0AdWA8+nXDkWng6PT4xXDr5KIyH+S0/9cg+Sp8zsGo8YvwCQ9NtOZLtvZcuMYmPjqq\n\tUV84S7RUN2G+ooQxakiyDypvmEtJr/EZi08OKyXZ+zK+q6Y24oVKzqWB3Mqogj/8aF\n\tnPVut8YgKgOJxNB82ICDW2LrQo7kH2TAzUZ2VDZ9DtIZHQPnAqWHOEbz1et7FrA/DY\n\tQ/mogLYWxUzSyXkYK3AbIa3OBmXFlmZp/NFgUA1zO32hTFHSAjCzqsnJkSG8Tcfwlt\n\tpu4WgoqMUjL6w==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:from:to:cc:subject:date:message-id:reply-to;\n\tbh=Sy2/diq47vgRN2s/Moy22p6ALeTkDBK8uvL+ZpEflnQ=;\n\tb=qUkxrmdmSlaQiYdN8WtHbWOJP8mlLzo2VJpmSFGesXXeCH1u/MbJ58CfPVUYkmlCLm\n\tnJLjyrAEw5g5JvevDLH+VGcU6pditrCBqEe7SHY+oikfxcKvNRKU69MUMcyPi4nteVm+\n\tZKHigZX6NnVBEe+h208M/LYqmW7H8jAD1Yux8BUa62/ewEzzZneS7zdbHPfzEEFkit2n\n\tTlWlmlDfb3C/Q0PRjgThnGigwNziN06sU+9eVFfyZQJryf5J202kC4HMfckL8UZhlYcf\n\tMbV0EFa0y/hSGF+Hupc+yn9Jr2G6t2a5BM5oiCsWyCEmFLsFBpx1WBro2noQrFBudeat\n\txzAg=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"qUkxrmdm\"; dkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:x-gm-message-state:from:to:cc:subject:date:message-id\n\t:reply-to;\n\tbh=Sy2/diq47vgRN2s/Moy22p6ALeTkDBK8uvL+ZpEflnQ=;\n\tb=pyu82UDfaHE7SPp4IKvxh53QqkqtYPcaVQA6rw6yrxlYvGmrIEb9fWhdpCO8o8vYcq\n\tJ9CS6wNcM4sTMEwxU7+0kQZfOPQLhFnh2oKeyni3CmTDApnBuM4CTNwtw/PnqoMbM2T2\n\t+9CTSxPSevqgjgoqLP7h8W4lwYVH+7ZxE/ggZ4cNDUgy5L21irmSP6w8vlY0KS399Yvd\n\t0IXim0XTYFOKIVTT/gtSJxsdh5CRZohJlca2oZUrvKNYUPKRz7XxFAIzivvCXRrwjrVt\n\t0uehnIRBastz7BMjfbIons6LNAMWO+rxCkEUS6/6rJ4GZzdkqV4bnTKr7yqUo64wvAy/\n\tWU2A==","X-Gm-Message-State":"ANoB5plrUaMk05DhDvQri+dURPDOjkBTW6xki9P/nl6aXmaie4YwR/EC\n\t0SWWtYZf9SLiQuH12jCod3NO6oZ59P4VBPXgDOJZOQ==","X-Google-Smtp-Source":"AA0mqf7h09NM6IsSGv01lEFUF7Rxz1+2ln2iXx/qba7acZ4rD9KxMOTvfxpux+uYgnX0IgAjfD4qSIs4OT7JrWqemAU=","X-Received":"by 2002:a17:902:d4c8:b0:186:9d71:228c with SMTP id\n\to8-20020a170902d4c800b001869d71228cmr77924plg.109.1669042360808;\n\tMon, 21 Nov 2022 06:52:40 -0800 (PST)","MIME-Version":"1.0","References":"<20221121144729.3264-1-nick.hollinghurst@raspberrypi.com>","In-Reply-To":"<20221121144729.3264-1-nick.hollinghurst@raspberrypi.com>","Date":"Mon, 21 Nov 2022 14:52:29 +0000","Message-ID":"<CAHW6GYL6xYpgjdm1McuSRi4r7TyjjxRiL9zhpOqwznRu-u_cog@mail.gmail.com>","To":"Nick Hollinghurst <nick.hollinghurst@raspberrypi.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Subject":"Re: [libcamera-devel] [PATCH] ipa: raspberrypi: Remove generic\n\t\"pause\" mechanism from Algorithm","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>","From":"David Plowman via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"David Plowman <david.plowman@raspberrypi.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":25841,"web_url":"https://patchwork.libcamera.org/comment/25841/","msgid":"<CAEmqJPpysAF4P-ftyRqAoBcMHWDywXofQS1eWC3pqn71YjWY7A@mail.gmail.com>","date":"2022-11-21T15:28:03","subject":"Re: [libcamera-devel] [PATCH] ipa: raspberrypi: Remove generic\n\t\"pause\" mechanism from Algorithm","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi Nick,\n\nThank you for your patch.\n\n\nOn Mon, 21 Nov 2022 at 14:47, Nick Hollinghurst via libcamera-devel <\nlibcamera-devel@lists.libcamera.org> wrote:\n\n> No existing Algorithm used the base pause(), resume() functions\n> or the paused_ flag, nor is there a need or a generic pause API.\n> Remove these. The AGC and AWB algorithms now have methods named\n> disableAuto(), enableAuto() which better describe their functionality.\n>\n> Signed-off-by: Nick Hollinghurst <nick.hollinghurst@raspberrypi.com>\n>\n\nReviewed-by: Naushir Patuck <naush@raspberrypi.com>\n\n\n> ---\n>  src/ipa/raspberrypi/controller/agc_algorithm.h |  2 ++\n>  src/ipa/raspberrypi/controller/algorithm.h     |  6 +-----\n>  src/ipa/raspberrypi/controller/awb_algorithm.h |  2 ++\n>  src/ipa/raspberrypi/controller/controller.cpp  |  6 ++----\n>  src/ipa/raspberrypi/controller/rpi/agc.cpp     | 13 ++++---------\n>  src/ipa/raspberrypi/controller/rpi/agc.h       |  6 ++----\n>  src/ipa/raspberrypi/controller/rpi/awb.cpp     | 11 +++--------\n>  src/ipa/raspberrypi/controller/rpi/awb.h       |  6 ++----\n>  src/ipa/raspberrypi/raspberrypi.cpp            | 14 ++++++++------\n>  9 files changed, 26 insertions(+), 40 deletions(-)\n>\n> diff --git a/src/ipa/raspberrypi/controller/agc_algorithm.h\n> b/src/ipa/raspberrypi/controller/agc_algorithm.h\n> index 3a91444c..36e6c110 100644\n> --- a/src/ipa/raspberrypi/controller/agc_algorithm.h\n> +++ b/src/ipa/raspberrypi/controller/agc_algorithm.h\n> @@ -26,6 +26,8 @@ public:\n>         virtual void setMeteringMode(std::string const &meteringModeName)\n> = 0;\n>         virtual void setExposureMode(std::string const &exposureModeName)\n> = 0;\n>         virtual void setConstraintMode(std::string const\n> &contraintModeName) = 0;\n> +       virtual void enableAuto() = 0;\n> +       virtual void disableAuto() = 0;\n>  };\n>\n>  } /* namespace RPiController */\n> diff --git a/src/ipa/raspberrypi/controller/algorithm.h\n> b/src/ipa/raspberrypi/controller/algorithm.h\n> index cbbb13ba..4f327598 100644\n> --- a/src/ipa/raspberrypi/controller/algorithm.h\n> +++ b/src/ipa/raspberrypi/controller/algorithm.h\n> @@ -27,14 +27,11 @@ class Algorithm\n>  {\n>  public:\n>         Algorithm(Controller *controller)\n> -               : controller_(controller), paused_(false)\n> +               : controller_(controller)\n>         {\n>         }\n>         virtual ~Algorithm() = default;\n>         virtual char const *name() const = 0;\n> -       virtual bool isPaused() const { return paused_; }\n> -       virtual void pause() { paused_ = true; }\n> -       virtual void resume() { paused_ = false; }\n>         virtual int read(const libcamera::YamlObject &params);\n>         virtual void initialise();\n>         virtual void switchMode(CameraMode const &cameraMode, Metadata\n> *metadata);\n> @@ -47,7 +44,6 @@ public:\n>\n>  private:\n>         Controller *controller_;\n> -       bool paused_;\n>  };\n>\n>  /*\n> diff --git a/src/ipa/raspberrypi/controller/awb_algorithm.h\n> b/src/ipa/raspberrypi/controller/awb_algorithm.h\n> index 48e08b60..8462c4db 100644\n> --- a/src/ipa/raspberrypi/controller/awb_algorithm.h\n> +++ b/src/ipa/raspberrypi/controller/awb_algorithm.h\n> @@ -18,6 +18,8 @@ public:\n>         virtual unsigned int getConvergenceFrames() const = 0;\n>         virtual void setMode(std::string const &modeName) = 0;\n>         virtual void setManualGains(double manualR, double manualB) = 0;\n> +       virtual void enableAuto() = 0;\n> +       virtual void disableAuto() = 0;\n>  };\n>\n>  } /* namespace RPiController */\n> diff --git a/src/ipa/raspberrypi/controller/controller.cpp\n> b/src/ipa/raspberrypi/controller/controller.cpp\n> index f4892786..e9156785 100644\n> --- a/src/ipa/raspberrypi/controller/controller.cpp\n> +++ b/src/ipa/raspberrypi/controller/controller.cpp\n> @@ -108,16 +108,14 @@ void Controller::prepare(Metadata *imageMetadata)\n>  {\n>         assert(switchModeCalled_);\n>         for (auto &algo : algorithms_)\n> -               if (!algo->isPaused())\n> -                       algo->prepare(imageMetadata);\n> +               algo->prepare(imageMetadata);\n>  }\n>\n>  void Controller::process(StatisticsPtr stats, Metadata *imageMetadata)\n>  {\n>         assert(switchModeCalled_);\n>         for (auto &algo : algorithms_)\n> -               if (!algo->isPaused())\n> -                       algo->process(stats, imageMetadata);\n> +               algo->process(stats, imageMetadata);\n>  }\n>\n>  Metadata &Controller::getGlobalMetadata()\n> diff --git a/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> index bd54a639..a30e50c1 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> @@ -270,18 +270,13 @@ int Agc::read(const libcamera::YamlObject &params)\n>         return 0;\n>  }\n>\n> -bool Agc::isPaused() const\n> -{\n> -       return false;\n> -}\n> -\n> -void Agc::pause()\n> +void Agc::disableAuto()\n>  {\n>         fixedShutter_ = status_.shutterTime;\n>         fixedAnalogueGain_ = status_.analogueGain;\n>  }\n>\n> -void Agc::resume()\n> +void Agc::enableAuto()\n>  {\n>         fixedShutter_ = 0s;\n>         fixedAnalogueGain_ = 0;\n> @@ -317,14 +312,14 @@ void Agc::setMaxShutter(Duration maxShutter)\n>  void Agc::setFixedShutter(Duration fixedShutter)\n>  {\n>         fixedShutter_ = fixedShutter;\n> -       /* Set this in case someone calls Pause() straight after. */\n> +       /* Set this in case someone calls disableAuto() straight after. */\n>         status_.shutterTime = clipShutter(fixedShutter_);\n>  }\n>\n>  void Agc::setFixedAnalogueGain(double fixedAnalogueGain)\n>  {\n>         fixedAnalogueGain_ = fixedAnalogueGain;\n> -       /* Set this in case someone calls Pause() straight after. */\n> +       /* Set this in case someone calls disableAuto() straight after. */\n>         status_.analogueGain = fixedAnalogueGain;\n>  }\n>\n> diff --git a/src/ipa/raspberrypi/controller/rpi/agc.h\n> b/src/ipa/raspberrypi/controller/rpi/agc.h\n> index 6d6b0e5a..cf04da19 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/agc.h\n> +++ b/src/ipa/raspberrypi/controller/rpi/agc.h\n> @@ -75,10 +75,6 @@ public:\n>         Agc(Controller *controller);\n>         char const *name() const override;\n>         int read(const libcamera::YamlObject &params) override;\n> -       /* AGC handles \"pausing\" for itself. */\n> -       bool isPaused() const override;\n> -       void pause() override;\n> -       void resume() override;\n>         unsigned int getConvergenceFrames() const override;\n>         void setEv(double ev) override;\n>         void setFlickerPeriod(libcamera::utils::Duration flickerPeriod)\n> override;\n> @@ -88,6 +84,8 @@ public:\n>         void setMeteringMode(std::string const &meteringModeName) override;\n>         void setExposureMode(std::string const &exposureModeName) override;\n>         void setConstraintMode(std::string const &contraintModeName)\n> override;\n> +       void enableAuto() override;\n> +       void disableAuto() override;\n>         void switchMode(CameraMode const &cameraMode, Metadata *metadata)\n> override;\n>         void prepare(Metadata *imageMetadata) override;\n>         void process(StatisticsPtr &stats, Metadata *imageMetadata)\n> override;\n> diff --git a/src/ipa/raspberrypi/controller/rpi/awb.cpp\n> b/src/ipa/raspberrypi/controller/rpi/awb.cpp\n> index 8d8ddf09..4f6af4ba 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/awb.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/awb.cpp\n> @@ -222,21 +222,16 @@ void Awb::initialise()\n>         asyncResults_ = syncResults_;\n>  }\n>\n> -bool Awb::isPaused() const\n> +void Awb::disableAuto()\n>  {\n> -       return false;\n> -}\n> -\n> -void Awb::pause()\n> -{\n> -       /* \"Pause\" by fixing everything to the most recent values. */\n> +       /* Freeze the most recent values, and treat them as manual gains */\n>         manualR_ = syncResults_.gainR = prevSyncResults_.gainR;\n>         manualB_ = syncResults_.gainB = prevSyncResults_.gainB;\n>         syncResults_.gainG = prevSyncResults_.gainG;\n>         syncResults_.temperatureK = prevSyncResults_.temperatureK;\n>  }\n>\n> -void Awb::resume()\n> +void Awb::enableAuto()\n>  {\n>         manualR_ = 0.0;\n>         manualB_ = 0.0;\n> diff --git a/src/ipa/raspberrypi/controller/rpi/awb.h\n> b/src/ipa/raspberrypi/controller/rpi/awb.h\n> index 30acd89d..2254c3ed 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/awb.h\n> +++ b/src/ipa/raspberrypi/controller/rpi/awb.h\n> @@ -93,13 +93,11 @@ public:\n>         char const *name() const override;\n>         void initialise() override;\n>         int read(const libcamera::YamlObject &params) override;\n> -       /* AWB handles \"pausing\" for itself. */\n> -       bool isPaused() const override;\n> -       void pause() override;\n> -       void resume() override;\n>         unsigned int getConvergenceFrames() const override;\n>         void setMode(std::string const &name) override;\n>         void setManualGains(double manualR, double manualB) override;\n> +       void enableAuto() override;\n> +       void disableAuto() override;\n>         void switchMode(CameraMode const &cameraMode, Metadata *metadata)\n> override;\n>         void prepare(Metadata *imageMetadata) override;\n>         void process(StatisticsPtr &stats, Metadata *imageMetadata)\n> override;\n> diff --git a/src/ipa/raspberrypi/raspberrypi.cpp\n> b/src/ipa/raspberrypi/raspberrypi.cpp\n> index b74f1ecf..beb076dc 100644\n> --- a/src/ipa/raspberrypi/raspberrypi.cpp\n> +++ b/src/ipa/raspberrypi/raspberrypi.cpp\n> @@ -706,7 +706,8 @@ void IPARPi::queueRequest(const ControlList &controls)\n>\n>                 switch (ctrl.first) {\n>                 case controls::AE_ENABLE: {\n> -                       RPiController::Algorithm *agc =\n> controller_.getAlgorithm(\"agc\");\n> +                       RPiController::AgcAlgorithm *agc =\n> dynamic_cast<RPiController::AgcAlgorithm *>(\n> +                               controller_.getAlgorithm(\"agc\"));\n>                         if (!agc) {\n>                                 LOG(IPARPI, Warning)\n>                                         << \"Could not set AE_ENABLE - no\n> AGC algorithm\";\n> @@ -714,9 +715,9 @@ void IPARPi::queueRequest(const ControlList &controls)\n>                         }\n>\n>                         if (ctrl.second.get<bool>() == false)\n> -                               agc->pause();\n> +                               agc->disableAuto();\n>                         else\n> -                               agc->resume();\n> +                               agc->enableAuto();\n>\n>                         libcameraMetadata_.set(controls::AeEnable,\n> ctrl.second.get<bool>());\n>                         break;\n> @@ -835,7 +836,8 @@ void IPARPi::queueRequest(const ControlList &controls)\n>                 }\n>\n>                 case controls::AWB_ENABLE: {\n> -                       RPiController::Algorithm *awb =\n> controller_.getAlgorithm(\"awb\");\n> +                       RPiController::AwbAlgorithm *awb =\n> dynamic_cast<RPiController::AwbAlgorithm *>(\n> +                               controller_.getAlgorithm(\"awb\"));\n>                         if (!awb) {\n>                                 LOG(IPARPI, Warning)\n>                                         << \"Could not set AWB_ENABLE - no\n> AWB algorithm\";\n> @@ -843,9 +845,9 @@ void IPARPi::queueRequest(const ControlList &controls)\n>                         }\n>\n>                         if (ctrl.second.get<bool>() == false)\n> -                               awb->pause();\n> +                               awb->disableAuto();\n>                         else\n> -                               awb->resume();\n> +                               awb->enableAuto();\n>\n>                         libcameraMetadata_.set(controls::AwbEnable,\n>                                                ctrl.second.get<bool>());\n> --\n> 2.20.1\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 94073BE08B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 21 Nov 2022 15:28:21 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4083C6331A;\n\tMon, 21 Nov 2022 16:28:21 +0100 (CET)","from mail-io1-xd2c.google.com (mail-io1-xd2c.google.com\n\t[IPv6:2607:f8b0:4864:20::d2c])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id AD74763097\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 21 Nov 2022 16:28:19 +0100 (CET)","by mail-io1-xd2c.google.com with SMTP id 11so8887161iou.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 21 Nov 2022 07:28:19 -0800 (PST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1669044501;\n\tbh=59z0GFCRoyJF7wxn0nmDjKqBcnJNenXPEIP0YFJhjJE=;\n\th=References:In-Reply-To:Date:To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=YeCwtWruoimxldANsop5c2Zi4qVA1NgDyXlEYNNxVPtFPVb2GnVSIU294UAvMyO7a\n\tAC4VA2Rx4IJSwtDhK49Z7d2vaJJpIAGp2ioiBUzc7G3jFpCIAodYz9ysqfqAtW158a\n\tQTdlTVjyIMore7nj0LQzM2DZtsFDWDj3ANkSfzF35yk+7qZHmUyCwJMWjt6cHPloCi\n\tfzsNSWHkThRcXLcLlNlzKhUSuPylp9yM4sePbifIF10fioeM8fiNx0wfdSbTegu8BN\n\tuFL2rAMMuZcS5dX7O+HDCUSRCA/fXz7SX6FJYSSbhZzyFXhbbVN+T8Z2AC4mIJN5Lu\n\t+N91KoPDQzGFg==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:from:to:cc:subject:date:message-id:reply-to;\n\tbh=9lwBDrsY+Zq617Beh8dJsDsKs9VKfTLQedw+8qffuO8=;\n\tb=FzPyPvnzjEQsm0olI+dQN+sLuckPKvTdJPPHG3NN5B1vW1V58vDewwbR+fWUWLQmsx\n\tbQJ0LgLtgC+R6ddb0+pQN5rWmdcSn9XZRYf0dsdRIMpA6NSmCo26pqwM+YtpFHHzQcrY\n\tA89u4bELhmRAN8f8GmmyBbWeWAg7KU9ucEEDbXxRa+d95jVvo8uG8DKpRnH2yOIel2em\n\tDho8d3+uKSGFgAiWobHFaHCkAaWzy4ok07atVhcEAcQARDuJUL45QfgLnRoW0iIBbpM5\n\tSQMYr3ghggjVqXy9j+mQo6rHLqeq6HAcnS0y6oc0vgvOUbrzXEWC2gYv3/RUgmGuLPqi\n\tV6Dw=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"FzPyPvnz\"; dkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:x-gm-message-state:from:to:cc:subject:date:message-id\n\t:reply-to;\n\tbh=9lwBDrsY+Zq617Beh8dJsDsKs9VKfTLQedw+8qffuO8=;\n\tb=S6iwT9A/C6lZJ0/3k6GOxwqtKCW4DBsF5rtfTlB4tJoimADMxXxGDa2SaySQtjhnfY\n\tKUYgx0p4UALBvSaB43zXC9R5juBgMGLwBeXw2PXLZNZhrUWSxFEqZZObiR7DBTbEoMCw\n\twRDwBiZTASO0Z8T0UwqeBkgBBngpy+o7urQqkh/PoJz+L1Nrukg0WL/vOxo1aH1OT0wa\n\tFUJ8ki1lrA6TsIx5t6otWqdDhLVR94COIqNSZR9fO4VIrAmKwUT8Ghz9YnKiH0qxGNre\n\tArW2rZz1dC7vYYvP/0GUPIN1baG4h9IvXhVVux64JTQnWTDPyFmL1vQkNu3NaIUDNLIQ\n\tXGkQ==","X-Gm-Message-State":"ANoB5pkbKUQkQJ/Mwu3o0YqzguLbScXTBFxnZoBddVXxrO/ONuncTwj9\n\txJ8oq02vHhe6ZKcdNmDkpv4I+u9KLj4x0o1VI8PCW1dl46s=","X-Google-Smtp-Source":"AA0mqf4WG2EFd6Wo9jC3WJzwlc6Cq79Rokz4R2ddO2WznKGFsd43mejgH0Cg0uDdNpqPmW/E4U7liKNETvJwFyLmQDM=","X-Received":"by 2002:a6b:da07:0:b0:6bb:8ed4:ac6c with SMTP id\n\tx7-20020a6bda07000000b006bb8ed4ac6cmr1184976iob.6.1669044498583;\n\tMon, 21 Nov 2022 07:28:18 -0800 (PST)","MIME-Version":"1.0","References":"<20221121144729.3264-1-nick.hollinghurst@raspberrypi.com>","In-Reply-To":"<20221121144729.3264-1-nick.hollinghurst@raspberrypi.com>","Date":"Mon, 21 Nov 2022 15:28:03 +0000","Message-ID":"<CAEmqJPpysAF4P-ftyRqAoBcMHWDywXofQS1eWC3pqn71YjWY7A@mail.gmail.com>","To":"Nick Hollinghurst <nick.hollinghurst@raspberrypi.com>","Content-Type":"multipart/alternative; boundary=\"00000000000073ef0f05edfcb42c\"","Subject":"Re: [libcamera-devel] [PATCH] ipa: raspberrypi: Remove generic\n\t\"pause\" mechanism from Algorithm","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>","From":"Naushir Patuck via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Naushir Patuck <naush@raspberrypi.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":25842,"web_url":"https://patchwork.libcamera.org/comment/25842/","msgid":"<Y3ubQv/PMphR6E23@pendragon.ideasonboard.com>","date":"2022-11-21T15:37:38","subject":"Re: [libcamera-devel] [PATCH] ipa: raspberrypi: Remove generic\n\t\"pause\" mechanism from Algorithm","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Nick,\n\nThank you for the patch.\n\nOn Mon, Nov 21, 2022 at 02:47:29PM +0000, Nick Hollinghurst via libcamera-devel wrote:\n> No existing Algorithm used the base pause(), resume() functions\n> or the paused_ flag, nor is there a need or a generic pause API.\n\nI've fixed the typo reported by David and pushed the patch.\n\n> Remove these. The AGC and AWB algorithms now have methods named\n> disableAuto(), enableAuto() which better describe their functionality.\n> \n> Signed-off-by: Nick Hollinghurst <nick.hollinghurst@raspberrypi.com>\n> ---\n>  src/ipa/raspberrypi/controller/agc_algorithm.h |  2 ++\n>  src/ipa/raspberrypi/controller/algorithm.h     |  6 +-----\n>  src/ipa/raspberrypi/controller/awb_algorithm.h |  2 ++\n>  src/ipa/raspberrypi/controller/controller.cpp  |  6 ++----\n>  src/ipa/raspberrypi/controller/rpi/agc.cpp     | 13 ++++---------\n>  src/ipa/raspberrypi/controller/rpi/agc.h       |  6 ++----\n>  src/ipa/raspberrypi/controller/rpi/awb.cpp     | 11 +++--------\n>  src/ipa/raspberrypi/controller/rpi/awb.h       |  6 ++----\n>  src/ipa/raspberrypi/raspberrypi.cpp            | 14 ++++++++------\n>  9 files changed, 26 insertions(+), 40 deletions(-)\n> \n> diff --git a/src/ipa/raspberrypi/controller/agc_algorithm.h b/src/ipa/raspberrypi/controller/agc_algorithm.h\n> index 3a91444c..36e6c110 100644\n> --- a/src/ipa/raspberrypi/controller/agc_algorithm.h\n> +++ b/src/ipa/raspberrypi/controller/agc_algorithm.h\n> @@ -26,6 +26,8 @@ public:\n>  \tvirtual void setMeteringMode(std::string const &meteringModeName) = 0;\n>  \tvirtual void setExposureMode(std::string const &exposureModeName) = 0;\n>  \tvirtual void setConstraintMode(std::string const &contraintModeName) = 0;\n> +\tvirtual void enableAuto() = 0;\n> +\tvirtual void disableAuto() = 0;\n>  };\n>  \n>  } /* namespace RPiController */\n> diff --git a/src/ipa/raspberrypi/controller/algorithm.h b/src/ipa/raspberrypi/controller/algorithm.h\n> index cbbb13ba..4f327598 100644\n> --- a/src/ipa/raspberrypi/controller/algorithm.h\n> +++ b/src/ipa/raspberrypi/controller/algorithm.h\n> @@ -27,14 +27,11 @@ class Algorithm\n>  {\n>  public:\n>  \tAlgorithm(Controller *controller)\n> -\t\t: controller_(controller), paused_(false)\n> +\t\t: controller_(controller)\n>  \t{\n>  \t}\n>  \tvirtual ~Algorithm() = default;\n>  \tvirtual char const *name() const = 0;\n> -\tvirtual bool isPaused() const { return paused_; }\n> -\tvirtual void pause() { paused_ = true; }\n> -\tvirtual void resume() { paused_ = false; }\n>  \tvirtual int read(const libcamera::YamlObject &params);\n>  \tvirtual void initialise();\n>  \tvirtual void switchMode(CameraMode const &cameraMode, Metadata *metadata);\n> @@ -47,7 +44,6 @@ public:\n>  \n>  private:\n>  \tController *controller_;\n> -\tbool paused_;\n>  };\n>  \n>  /*\n> diff --git a/src/ipa/raspberrypi/controller/awb_algorithm.h b/src/ipa/raspberrypi/controller/awb_algorithm.h\n> index 48e08b60..8462c4db 100644\n> --- a/src/ipa/raspberrypi/controller/awb_algorithm.h\n> +++ b/src/ipa/raspberrypi/controller/awb_algorithm.h\n> @@ -18,6 +18,8 @@ public:\n>  \tvirtual unsigned int getConvergenceFrames() const = 0;\n>  \tvirtual void setMode(std::string const &modeName) = 0;\n>  \tvirtual void setManualGains(double manualR, double manualB) = 0;\n> +\tvirtual void enableAuto() = 0;\n> +\tvirtual void disableAuto() = 0;\n>  };\n>  \n>  } /* namespace RPiController */\n> diff --git a/src/ipa/raspberrypi/controller/controller.cpp b/src/ipa/raspberrypi/controller/controller.cpp\n> index f4892786..e9156785 100644\n> --- a/src/ipa/raspberrypi/controller/controller.cpp\n> +++ b/src/ipa/raspberrypi/controller/controller.cpp\n> @@ -108,16 +108,14 @@ void Controller::prepare(Metadata *imageMetadata)\n>  {\n>  \tassert(switchModeCalled_);\n>  \tfor (auto &algo : algorithms_)\n> -\t\tif (!algo->isPaused())\n> -\t\t\talgo->prepare(imageMetadata);\n> +\t\talgo->prepare(imageMetadata);\n>  }\n>  \n>  void Controller::process(StatisticsPtr stats, Metadata *imageMetadata)\n>  {\n>  \tassert(switchModeCalled_);\n>  \tfor (auto &algo : algorithms_)\n> -\t\tif (!algo->isPaused())\n> -\t\t\talgo->process(stats, imageMetadata);\n> +\t\talgo->process(stats, imageMetadata);\n>  }\n>  \n>  Metadata &Controller::getGlobalMetadata()\n> diff --git a/src/ipa/raspberrypi/controller/rpi/agc.cpp b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> index bd54a639..a30e50c1 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> @@ -270,18 +270,13 @@ int Agc::read(const libcamera::YamlObject &params)\n>  \treturn 0;\n>  }\n>  \n> -bool Agc::isPaused() const\n> -{\n> -\treturn false;\n> -}\n> -\n> -void Agc::pause()\n> +void Agc::disableAuto()\n>  {\n>  \tfixedShutter_ = status_.shutterTime;\n>  \tfixedAnalogueGain_ = status_.analogueGain;\n>  }\n>  \n> -void Agc::resume()\n> +void Agc::enableAuto()\n>  {\n>  \tfixedShutter_ = 0s;\n>  \tfixedAnalogueGain_ = 0;\n> @@ -317,14 +312,14 @@ void Agc::setMaxShutter(Duration maxShutter)\n>  void Agc::setFixedShutter(Duration fixedShutter)\n>  {\n>  \tfixedShutter_ = fixedShutter;\n> -\t/* Set this in case someone calls Pause() straight after. */\n> +\t/* Set this in case someone calls disableAuto() straight after. */\n>  \tstatus_.shutterTime = clipShutter(fixedShutter_);\n>  }\n>  \n>  void Agc::setFixedAnalogueGain(double fixedAnalogueGain)\n>  {\n>  \tfixedAnalogueGain_ = fixedAnalogueGain;\n> -\t/* Set this in case someone calls Pause() straight after. */\n> +\t/* Set this in case someone calls disableAuto() straight after. */\n>  \tstatus_.analogueGain = fixedAnalogueGain;\n>  }\n>  \n> diff --git a/src/ipa/raspberrypi/controller/rpi/agc.h b/src/ipa/raspberrypi/controller/rpi/agc.h\n> index 6d6b0e5a..cf04da19 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/agc.h\n> +++ b/src/ipa/raspberrypi/controller/rpi/agc.h\n> @@ -75,10 +75,6 @@ public:\n>  \tAgc(Controller *controller);\n>  \tchar const *name() const override;\n>  \tint read(const libcamera::YamlObject &params) override;\n> -\t/* AGC handles \"pausing\" for itself. */\n> -\tbool isPaused() const override;\n> -\tvoid pause() override;\n> -\tvoid resume() override;\n>  \tunsigned int getConvergenceFrames() const override;\n>  \tvoid setEv(double ev) override;\n>  \tvoid setFlickerPeriod(libcamera::utils::Duration flickerPeriod) override;\n> @@ -88,6 +84,8 @@ public:\n>  \tvoid setMeteringMode(std::string const &meteringModeName) override;\n>  \tvoid setExposureMode(std::string const &exposureModeName) override;\n>  \tvoid setConstraintMode(std::string const &contraintModeName) override;\n> +\tvoid enableAuto() override;\n> +\tvoid disableAuto() override;\n>  \tvoid switchMode(CameraMode const &cameraMode, Metadata *metadata) override;\n>  \tvoid prepare(Metadata *imageMetadata) override;\n>  \tvoid process(StatisticsPtr &stats, Metadata *imageMetadata) override;\n> diff --git a/src/ipa/raspberrypi/controller/rpi/awb.cpp b/src/ipa/raspberrypi/controller/rpi/awb.cpp\n> index 8d8ddf09..4f6af4ba 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/awb.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/awb.cpp\n> @@ -222,21 +222,16 @@ void Awb::initialise()\n>  \tasyncResults_ = syncResults_;\n>  }\n>  \n> -bool Awb::isPaused() const\n> +void Awb::disableAuto()\n>  {\n> -\treturn false;\n> -}\n> -\n> -void Awb::pause()\n> -{\n> -\t/* \"Pause\" by fixing everything to the most recent values. */\n> +\t/* Freeze the most recent values, and treat them as manual gains */\n>  \tmanualR_ = syncResults_.gainR = prevSyncResults_.gainR;\n>  \tmanualB_ = syncResults_.gainB = prevSyncResults_.gainB;\n>  \tsyncResults_.gainG = prevSyncResults_.gainG;\n>  \tsyncResults_.temperatureK = prevSyncResults_.temperatureK;\n>  }\n>  \n> -void Awb::resume()\n> +void Awb::enableAuto()\n>  {\n>  \tmanualR_ = 0.0;\n>  \tmanualB_ = 0.0;\n> diff --git a/src/ipa/raspberrypi/controller/rpi/awb.h b/src/ipa/raspberrypi/controller/rpi/awb.h\n> index 30acd89d..2254c3ed 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/awb.h\n> +++ b/src/ipa/raspberrypi/controller/rpi/awb.h\n> @@ -93,13 +93,11 @@ public:\n>  \tchar const *name() const override;\n>  \tvoid initialise() override;\n>  \tint read(const libcamera::YamlObject &params) override;\n> -\t/* AWB handles \"pausing\" for itself. */\n> -\tbool isPaused() const override;\n> -\tvoid pause() override;\n> -\tvoid resume() override;\n>  \tunsigned int getConvergenceFrames() const override;\n>  \tvoid setMode(std::string const &name) override;\n>  \tvoid setManualGains(double manualR, double manualB) override;\n> +\tvoid enableAuto() override;\n> +\tvoid disableAuto() override;\n>  \tvoid switchMode(CameraMode const &cameraMode, Metadata *metadata) override;\n>  \tvoid prepare(Metadata *imageMetadata) override;\n>  \tvoid process(StatisticsPtr &stats, Metadata *imageMetadata) override;\n> diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp\n> index b74f1ecf..beb076dc 100644\n> --- a/src/ipa/raspberrypi/raspberrypi.cpp\n> +++ b/src/ipa/raspberrypi/raspberrypi.cpp\n> @@ -706,7 +706,8 @@ void IPARPi::queueRequest(const ControlList &controls)\n>  \n>  \t\tswitch (ctrl.first) {\n>  \t\tcase controls::AE_ENABLE: {\n> -\t\t\tRPiController::Algorithm *agc = controller_.getAlgorithm(\"agc\");\n> +\t\t\tRPiController::AgcAlgorithm *agc = dynamic_cast<RPiController::AgcAlgorithm *>(\n> +\t\t\t\tcontroller_.getAlgorithm(\"agc\"));\n>  \t\t\tif (!agc) {\n>  \t\t\t\tLOG(IPARPI, Warning)\n>  \t\t\t\t\t<< \"Could not set AE_ENABLE - no AGC algorithm\";\n> @@ -714,9 +715,9 @@ void IPARPi::queueRequest(const ControlList &controls)\n>  \t\t\t}\n>  \n>  \t\t\tif (ctrl.second.get<bool>() == false)\n> -\t\t\t\tagc->pause();\n> +\t\t\t\tagc->disableAuto();\n>  \t\t\telse\n> -\t\t\t\tagc->resume();\n> +\t\t\t\tagc->enableAuto();\n>  \n>  \t\t\tlibcameraMetadata_.set(controls::AeEnable, ctrl.second.get<bool>());\n>  \t\t\tbreak;\n> @@ -835,7 +836,8 @@ void IPARPi::queueRequest(const ControlList &controls)\n>  \t\t}\n>  \n>  \t\tcase controls::AWB_ENABLE: {\n> -\t\t\tRPiController::Algorithm *awb = controller_.getAlgorithm(\"awb\");\n> +\t\t\tRPiController::AwbAlgorithm *awb = dynamic_cast<RPiController::AwbAlgorithm *>(\n> +\t\t\t\tcontroller_.getAlgorithm(\"awb\"));\n>  \t\t\tif (!awb) {\n>  \t\t\t\tLOG(IPARPI, Warning)\n>  \t\t\t\t\t<< \"Could not set AWB_ENABLE - no AWB algorithm\";\n> @@ -843,9 +845,9 @@ void IPARPi::queueRequest(const ControlList &controls)\n>  \t\t\t}\n>  \n>  \t\t\tif (ctrl.second.get<bool>() == false)\n> -\t\t\t\tawb->pause();\n> +\t\t\t\tawb->disableAuto();\n>  \t\t\telse\n> -\t\t\t\tawb->resume();\n> +\t\t\t\tawb->enableAuto();\n>  \n>  \t\t\tlibcameraMetadata_.set(controls::AwbEnable,\n>  \t\t\t\t\t       ctrl.second.get<bool>());","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 2C60ABD16B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 21 Nov 2022 15:37:56 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 84BB763311;\n\tMon, 21 Nov 2022 16:37:55 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 363DC63097\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 21 Nov 2022 16:37:54 +0100 (CET)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 9DBB42D9;\n\tMon, 21 Nov 2022 16:37:53 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1669045075;\n\tbh=6k4XpGADNekN+tt8povyy4CI0+7vcXUwjTVtBm4vj9I=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=rlLzg4yICABn+DkVpADdIGbgaFNB1vq+U/7tAixu3uZJYako3oV1j0MNXEah78XCQ\n\tlbXNVPoKYxwUSP49dsawWyAqQvvUvfBXwrKSB9PmwNvzv+SMPmyIsy5NN3amd3xT7B\n\tbl7u8TJb0ahHs7I21sRdnMu7f5hbMpNc+53tCHczYVFp1CKOIy4L+q5yK4IejqLV6a\n\tu6CQTfHQeRWWCVxIVrbJ1auK8E0z1I066Q/xF94q2J+7zB6u1plh7q5KUNE7TTEOkm\n\tCgNw9tL7GCoXrGhs+NTa5Kb1Kq41LcxR7eQgsSlZA7YKhpNHSZc5Ew2BmrpD2x0iGo\n\tnwwRMux+UbzHQ==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1669045073;\n\tbh=6k4XpGADNekN+tt8povyy4CI0+7vcXUwjTVtBm4vj9I=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=V1GOlvfkgrnTgwZvn5qiW33HRrVS4XcKTk2F49zzmPxG5GhoyHnVPkyHO20a5ABBL\n\tCKRd1Cc1FokSjOCcVcltmavnfNCA9TqYphclqVq0wa/mDtUsB6DHLodYEvRK/P8hP0\n\tw3urUHvL9hRoCtM3emgLVCyBMgG9bxhoeC9Uo08E="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"V1GOlvfk\"; dkim-atps=neutral","Date":"Mon, 21 Nov 2022 17:37:38 +0200","To":"Nick Hollinghurst <nick.hollinghurst@raspberrypi.com>","Message-ID":"<Y3ubQv/PMphR6E23@pendragon.ideasonboard.com>","References":"<20221121144729.3264-1-nick.hollinghurst@raspberrypi.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20221121144729.3264-1-nick.hollinghurst@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH] ipa: raspberrypi: Remove generic\n\t\"pause\" mechanism from Algorithm","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>","From":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]