[{"id":38531,"web_url":"https://patchwork.libcamera.org/comment/38531/","msgid":"<adYYtMx9_XFKyKIh@zed>","date":"2026-04-08T09:02:18","subject":"Re: [PATCH 12/13] ipa: libipa: awb: convert to common queueRequest","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Kieran\n\nOn Tue, Apr 07, 2026 at 11:01:15PM +0100, Kieran Bingham wrote:\n> Move the now duplicated implementation for both soft IPA and rkisp1 IPA\n> for managing requests at queue time into the common libipa AWB implementation.\n\nrequests ?\n\n>\n> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> ---\n>  src/ipa/libipa/awb.cpp            | 59 +++++++++++++++++++++++++++++++++++++++\n>  src/ipa/libipa/awb.h              |  5 ++++\n>  src/ipa/rkisp1/algorithms/awb.cpp | 49 ++------------------------------\n>  src/ipa/simple/algorithms/awb.cpp | 52 ++++------------------------------\n>  4 files changed, 72 insertions(+), 93 deletions(-)\n>\n> diff --git a/src/ipa/libipa/awb.cpp b/src/ipa/libipa/awb.cpp\n> index d0c577958caebc0b7e24fe58506da964df2200fe..cac6b4bd206faa4f32680e16c7522685cfd30cac 100644\n> --- a/src/ipa/libipa/awb.cpp\n> +++ b/src/ipa/libipa/awb.cpp\n> @@ -168,6 +168,65 @@ int AwbAlgorithm::configure(awb::ActiveState &state, awb::Session &session)\n>  \treturn 0;\n>  }\n>\n> +/**\n> + * \\brief Provide control values to the algorithm\n> + * \\param[in] state The AWB specific active state shared across frames\n> + * \\param[in] frame The frame number to apply the control values\n> + * \\param[in] frameContext The current frame's AWB specific context\n> + * \\param[in] controls The list of user controls\n> + */\n> +void AwbAlgorithm::queueRequest(awb::ActiveState &state,\n> +\t\t\t\t[[maybe_unused]] const uint32_t frame,\n\nShould we aim at maintaining compatibility with the\nAlgorithm::queuRequest() interface or unused parameters should be dropped ?\n\n> +\t\t\t\tawb::FrameContext &frameContext,\n> +\t\t\t\tconst ControlList &controls)\n> +{\n> +\tconst auto &awbEnable = controls.get(controls::AwbEnable);\n> +\tif (awbEnable && *awbEnable != state.autoEnabled) {\n> +\t\tstate.autoEnabled = *awbEnable;\n> +\n> +\t\tLOG(Awb, Debug)\n> +\t\t\t<< (*awbEnable ? \"Enabling\" : \"Disabling\") << \" AWB\";\n> +\t}\n> +\n> +\t/* Handle controls from subclass algo (Grey or Bayes) */\n> +\thandleControls(controls);\n> +\n> +\tframeContext.autoEnabled = state.autoEnabled;\n> +\n> +\t/* Todo: Check to see if we should always parse the following controls */\n\nDoes this still apply ?\n\n> +\tif (frameContext.autoEnabled)\n> +\t\treturn;\n> +\n> +\tconst auto &colourGains = controls.get(controls::ColourGains);\n> +\tconst auto &colourTemperature = controls.get(controls::ColourTemperature);\n> +\tbool update = false;\n> +\tif (colourGains) {\n> +\t\tstate.manual.gains.r() = (*colourGains)[0];\n> +\t\tstate.manual.gains.b() = (*colourGains)[1];\n> +\t\t/*\n> +\t\t * \\todo Colour temperature reported in metadata is now\n> +\t\t * incorrect, as we can't deduce the temperature from the gains.\n> +\t\t * This will be fixed with the bayes AWB algorithm.\n\nhas it been fixed ? however I understand this is a copy of the\nexisting code..\n\nReviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n\nThanks\n  j\n\n> +\t\t */\n> +\t\tupdate = true;\n> +\t} else if (colourTemperature) {\n> +\t\tstate.manual.temperatureK = *colourTemperature;\n> +\t\tconst auto &gains = gainsFromColourTemperature(*colourTemperature);\n> +\t\tif (gains) {\n> +\t\t\tstate.manual.gains.r() = gains->r();\n> +\t\t\tstate.manual.gains.b() = gains->b();\n> +\t\t\tupdate = true;\n> +\t\t}\n> +\t}\n> +\n> +\tif (update)\n> +\t\tLOG(Awb, Debug)\n> +\t\t\t<< \"Set colour gains to \" << state.manual.gains;\n> +\n> +\tframeContext.gains = state.manual.gains;\n> +\tframeContext.temperatureK = state.manual.temperatureK;\n> +}\n> +\n>  /**\n>   * \\fn AwbAlgorithm::calculateAwb()\n>   * \\brief Calculate AWB data from the given statistics\n> diff --git a/src/ipa/libipa/awb.h b/src/ipa/libipa/awb.h\n> index 4ceae537686f8f4c93686fab4b9efbc06e112b1d..0256ff8ca3429288c317d3ee940255c4a5391357 100644\n> --- a/src/ipa/libipa/awb.h\n> +++ b/src/ipa/libipa/awb.h\n> @@ -68,6 +68,11 @@ public:\n>\n>  \tint configure(awb::ActiveState &state, awb::Session &session);\n>\n> +\tvoid queueRequest(awb::ActiveState &state,\n> +\t\t\t  [[maybe_unused]] const uint32_t frame,\n> +\t\t\t  awb::FrameContext &frameContext,\n> +\t\t\t  const ControlList &controls);\n> +\n>  \tvirtual AwbResult calculateAwb(const AwbStats &stats, unsigned int lux) = 0;\n>  \tvirtual std::optional<RGB<double>> gainsFromColourTemperature(double colourTemperature) = 0;\n>\n> diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp\n> index 86d5dfed3e1c2bb587705f05362229db3cdadafd..b91132fc6177650b9338867359583bf5429ea7e5 100644\n> --- a/src/ipa/rkisp1/algorithms/awb.cpp\n> +++ b/src/ipa/rkisp1/algorithms/awb.cpp\n> @@ -146,55 +146,12 @@ int Awb::configure(IPAContext &context,\n>   * \\copydoc libcamera::ipa::Algorithm::queueRequest\n>   */\n>  void Awb::queueRequest(IPAContext &context,\n> -\t\t       [[maybe_unused]] const uint32_t frame,\n> +\t\t       const uint32_t frame,\n>  \t\t       IPAFrameContext &frameContext,\n>  \t\t       const ControlList &controls)\n>  {\n> -\tauto &awb = context.activeState.awb;\n> -\n> -\tconst auto &awbEnable = controls.get(controls::AwbEnable);\n> -\tif (awbEnable && *awbEnable != awb.autoEnabled) {\n> -\t\tawb.autoEnabled = *awbEnable;\n> -\n> -\t\tLOG(RkISP1Awb, Debug)\n> -\t\t\t<< (*awbEnable ? \"Enabling\" : \"Disabling\") << \" AWB\";\n> -\t}\n> -\n> -\tawbAlgo_->handleControls(controls);\n> -\n> -\tframeContext.awb.autoEnabled = awb.autoEnabled;\n> -\n> -\tif (awb.autoEnabled)\n> -\t\treturn;\n> -\n> -\tconst auto &colourGains = controls.get(controls::ColourGains);\n> -\tconst auto &colourTemperature = controls.get(controls::ColourTemperature);\n> -\tbool update = false;\n> -\tif (colourGains) {\n> -\t\tawb.manual.gains.r() = (*colourGains)[0];\n> -\t\tawb.manual.gains.b() = (*colourGains)[1];\n> -\t\t/*\n> -\t\t * \\todo Colour temperature reported in metadata is now\n> -\t\t * incorrect, as we can't deduce the temperature from the gains.\n> -\t\t * This will be fixed with the bayes AWB algorithm.\n> -\t\t */\n> -\t\tupdate = true;\n> -\t} else if (colourTemperature) {\n> -\t\tawb.manual.temperatureK = *colourTemperature;\n> -\t\tconst auto &gains = awbAlgo_->gainsFromColourTemperature(*colourTemperature);\n> -\t\tif (gains) {\n> -\t\t\tawb.manual.gains.r() = gains->r();\n> -\t\t\tawb.manual.gains.b() = gains->b();\n> -\t\t\tupdate = true;\n> -\t\t}\n> -\t}\n> -\n> -\tif (update)\n> -\t\tLOG(RkISP1Awb, Debug)\n> -\t\t\t<< \"Set colour gains to \" << awb.manual.gains;\n> -\n> -\tframeContext.awb.gains = awb.manual.gains;\n> -\tframeContext.awb.temperatureK = awb.manual.temperatureK;\n> +\tawbAlgo_->queueRequest(context.activeState.awb, frame, frameContext.awb,\n> +\t\t\t       controls);\n>  }\n>\n>  /**\n> diff --git a/src/ipa/simple/algorithms/awb.cpp b/src/ipa/simple/algorithms/awb.cpp\n> index 230b7807075941f086911549066e39c0a04dff5c..d8516871562724fc65ffbb67161ff4fd988c4b1c 100644\n> --- a/src/ipa/simple/algorithms/awb.cpp\n> +++ b/src/ipa/simple/algorithms/awb.cpp\n> @@ -114,55 +114,13 @@ int Awb::configure(IPAContext &context,\n>   * \\copydoc libcamera::ipa::Algorithm::queueRequest\n>   */\n>  void Awb::queueRequest(IPAContext &context,\n> -\t\t       [[maybe_unused]] const uint32_t frame,\n> -\t\t       [[maybe_unused]] IPAFrameContext &frameContext,\n> +\t\t       const uint32_t frame,\n> +\t\t       IPAFrameContext &frameContext,\n>  \t\t       const ControlList &controls)\n>  {\n> -\tauto &awb = context.activeState.awb;\n> -\n> -\tconst auto &awbEnable = controls.get(controls::AwbEnable);\n> -\tif (awbEnable && *awbEnable != awb.autoEnabled) {\n> -\t\tawb.autoEnabled = *awbEnable;\n> -\n> -\t\tLOG(IPASoftAwb, Debug)\n> -\t\t\t<< (*awbEnable ? \"Enabling\" : \"Disabling\") << \" AWB\";\n> -\t}\n> -\n> -\tawbAlgo_->handleControls(controls);\n> -\n> -\tframeContext.awb.autoEnabled = awb.autoEnabled;\n> -\n> -\tif (awb.autoEnabled)\n> -\t\treturn;\n> -\n> -\tconst auto &colourGains = controls.get(controls::ColourGains);\n> -\tconst auto &colourTemperature = controls.get(controls::ColourTemperature);\n> -\tbool update = false;\n> -\tif (colourGains) {\n> -\t\tawb.manual.gains.r() = (*colourGains)[0];\n> -\t\tawb.manual.gains.b() = (*colourGains)[1];\n> -\t\t/*\n> -\t\t * \\todo Colour temperature reported in metadata is now\n> -\t\t * incorrect, as we can't deduce the temperature from the gains.\n> -\t\t * This will be fixed with the bayes AWB algorithm.\n> -\t\t */\n> -\t\tupdate = true;\n> -\t} else if (colourTemperature) {\n> -\t\tawb.manual.temperatureK = *colourTemperature;\n> -\t\tconst auto &gains = awbAlgo_->gainsFromColourTemperature(*colourTemperature);\n> -\t\tif (gains) {\n> -\t\t\tawb.manual.gains.r() = gains->r();\n> -\t\t\tawb.manual.gains.b() = gains->b();\n> -\t\t\tupdate = true;\n> -\t\t}\n> -\t}\n> -\n> -\tif (update)\n> -\t\tLOG(IPASoftAwb, Debug)\n> -\t\t\t<< \"Set colour gains to \" << awb.manual.gains;\n> -\n> -\tframeContext.awb.gains = awb.manual.gains;\n> -\tframeContext.awb.temperatureK = awb.manual.temperatureK;\n> +\tawbAlgo_->queueRequest(context.activeState.awb,\n> +\t\t\t       frame, frameContext.awb,\n> +\t\t\t       controls);\n>  }\n>\n>  void Awb::prepare(IPAContext &context,\n>\n> --\n> 2.53.0\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 60F00BEFBE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  8 Apr 2026 09:02:24 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 345CE62DC1;\n\tWed,  8 Apr 2026 11:02:23 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id CACD662647\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  8 Apr 2026 11:02:21 +0200 (CEST)","from ideasonboard.com (mob-109-113-47-41.net.vodafone.it\n\t[109.113.47.41])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 7545315E9;\n\tWed,  8 Apr 2026 11:00:53 +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=\"Ku1Rqxk8\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1775638853;\n\tbh=/KyxY/BQrzPb3HJzCW/YaH/kdySw63W1oiRArnaRo+o=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=Ku1Rqxk8xZ+czf6ib+4I0PuzQsRB4Q3OQ2O8Pn97DvXGGQkXyhppYN2dBps05eD4C\n\tfG5heRRONRUSSs1dKtUpDS69J1J8FLkXxgWV4TZ8KLx1KCbydo/bpxREvNGeY1A275\n\tluoTH9JTd/frRNGvsr+S4w0rXTRc6rxP1V/EIcVs=","Date":"Wed, 8 Apr 2026 11:02:18 +0200","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH 12/13] ipa: libipa: awb: convert to common queueRequest","Message-ID":"<adYYtMx9_XFKyKIh@zed>","References":"<20260407-kbingham-awb-split-v1-0-a39af3f4dc20@ideasonboard.com>\n\t<20260407-kbingham-awb-split-v1-12-a39af3f4dc20@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20260407-kbingham-awb-split-v1-12-a39af3f4dc20@ideasonboard.com>","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":38542,"web_url":"https://patchwork.libcamera.org/comment/38542/","msgid":"<177566903006.575056.8647071728338029932@ping.linuxembedded.co.uk>","date":"2026-04-08T17:23:50","subject":"Re: [PATCH 12/13] ipa: libipa: awb: convert to common queueRequest","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Jacopo Mondi (2026-04-08 10:02:18)\n> Hi Kieran\n> \n> On Tue, Apr 07, 2026 at 11:01:15PM +0100, Kieran Bingham wrote:\n> > Move the now duplicated implementation for both soft IPA and rkisp1 IPA\n> > for managing requests at queue time into the common libipa AWB implementation.\n> \n> requests ?\n\nI don't understand this question mark. Yes, this is queueReqeust which\nparses requests ?\n\n> \n> >\n> > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> > ---\n> >  src/ipa/libipa/awb.cpp            | 59 +++++++++++++++++++++++++++++++++++++++\n> >  src/ipa/libipa/awb.h              |  5 ++++\n> >  src/ipa/rkisp1/algorithms/awb.cpp | 49 ++------------------------------\n> >  src/ipa/simple/algorithms/awb.cpp | 52 ++++------------------------------\n> >  4 files changed, 72 insertions(+), 93 deletions(-)\n> >\n> > diff --git a/src/ipa/libipa/awb.cpp b/src/ipa/libipa/awb.cpp\n> > index d0c577958caebc0b7e24fe58506da964df2200fe..cac6b4bd206faa4f32680e16c7522685cfd30cac 100644\n> > --- a/src/ipa/libipa/awb.cpp\n> > +++ b/src/ipa/libipa/awb.cpp\n> > @@ -168,6 +168,65 @@ int AwbAlgorithm::configure(awb::ActiveState &state, awb::Session &session)\n> >       return 0;\n> >  }\n> >\n> > +/**\n> > + * \\brief Provide control values to the algorithm\n> > + * \\param[in] state The AWB specific active state shared across frames\n> > + * \\param[in] frame The frame number to apply the control values\n> > + * \\param[in] frameContext The current frame's AWB specific context\n> > + * \\param[in] controls The list of user controls\n> > + */\n> > +void AwbAlgorithm::queueRequest(awb::ActiveState &state,\n> > +                             [[maybe_unused]] const uint32_t frame,\n> \n> Should we aim at maintaining compatibility with the\n> Algorithm::queuRequest() interface or unused parameters should be dropped ?\n\nI didn't want to pass things like the bigger contexts, but the frame\nindex seemed important in my head so I've kept it for now.\n\nI don't know why or what it's important for, but I anticipate it will be\nimportant with more per-frame-control concepts or for knowing the\nsequencing/timing/something ...\n\nI guess they're easy enough to add later if needed ... I'd be keen to\nknow what Stefan thinks here as he's done a lot of rework around timings\nlately\n\n> \n> > +                             awb::FrameContext &frameContext,\n> > +                             const ControlList &controls)\n> > +{\n> > +     const auto &awbEnable = controls.get(controls::AwbEnable);\n> > +     if (awbEnable && *awbEnable != state.autoEnabled) {\n> > +             state.autoEnabled = *awbEnable;\n> > +\n> > +             LOG(Awb, Debug)\n> > +                     << (*awbEnable ? \"Enabling\" : \"Disabling\") << \" AWB\";\n> > +     }\n> > +\n> > +     /* Handle controls from subclass algo (Grey or Bayes) */\n> > +     handleControls(controls);\n> > +\n> > +     frameContext.autoEnabled = state.autoEnabled;\n> > +\n> > +     /* Todo: Check to see if we should always parse the following controls */\n> \n> Does this still apply ?\n> \n> > +     if (frameContext.autoEnabled)\n> > +             return;\n> > +\n> > +     const auto &colourGains = controls.get(controls::ColourGains);\n> > +     const auto &colourTemperature = controls.get(controls::ColourTemperature);\n> > +     bool update = false;\n> > +     if (colourGains) {\n> > +             state.manual.gains.r() = (*colourGains)[0];\n> > +             state.manual.gains.b() = (*colourGains)[1];\n> > +             /*\n> > +              * \\todo Colour temperature reported in metadata is now\n> > +              * incorrect, as we can't deduce the temperature from the gains.\n> > +              * This will be fixed with the bayes AWB algorithm.\n> \n> has it been fixed ? however I understand this is a copy of the\n> existing code..\n\nI don't know - indeed, I'm just trying to move existing code around to\nreduce copying in each module. Still worth checking, but I'd still do it\non top and not in this patch anyway.\n\n> \n> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n> \n> Thanks\n>   j\n> \n> > +              */\n> > +             update = true;\n> > +     } else if (colourTemperature) {\n> > +             state.manual.temperatureK = *colourTemperature;\n> > +             const auto &gains = gainsFromColourTemperature(*colourTemperature);\n> > +             if (gains) {\n> > +                     state.manual.gains.r() = gains->r();\n> > +                     state.manual.gains.b() = gains->b();\n> > +                     update = true;\n> > +             }\n> > +     }\n> > +\n> > +     if (update)\n> > +             LOG(Awb, Debug)\n> > +                     << \"Set colour gains to \" << state.manual.gains;\n> > +\n> > +     frameContext.gains = state.manual.gains;\n> > +     frameContext.temperatureK = state.manual.temperatureK;\n> > +}\n> > +\n> >  /**\n> >   * \\fn AwbAlgorithm::calculateAwb()\n> >   * \\brief Calculate AWB data from the given statistics\n> > diff --git a/src/ipa/libipa/awb.h b/src/ipa/libipa/awb.h\n> > index 4ceae537686f8f4c93686fab4b9efbc06e112b1d..0256ff8ca3429288c317d3ee940255c4a5391357 100644\n> > --- a/src/ipa/libipa/awb.h\n> > +++ b/src/ipa/libipa/awb.h\n> > @@ -68,6 +68,11 @@ public:\n> >\n> >       int configure(awb::ActiveState &state, awb::Session &session);\n> >\n> > +     void queueRequest(awb::ActiveState &state,\n> > +                       [[maybe_unused]] const uint32_t frame,\n> > +                       awb::FrameContext &frameContext,\n> > +                       const ControlList &controls);\n> > +\n> >       virtual AwbResult calculateAwb(const AwbStats &stats, unsigned int lux) = 0;\n> >       virtual std::optional<RGB<double>> gainsFromColourTemperature(double colourTemperature) = 0;\n> >\n> > diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp\n> > index 86d5dfed3e1c2bb587705f05362229db3cdadafd..b91132fc6177650b9338867359583bf5429ea7e5 100644\n> > --- a/src/ipa/rkisp1/algorithms/awb.cpp\n> > +++ b/src/ipa/rkisp1/algorithms/awb.cpp\n> > @@ -146,55 +146,12 @@ int Awb::configure(IPAContext &context,\n> >   * \\copydoc libcamera::ipa::Algorithm::queueRequest\n> >   */\n> >  void Awb::queueRequest(IPAContext &context,\n> > -                    [[maybe_unused]] const uint32_t frame,\n> > +                    const uint32_t frame,\n> >                      IPAFrameContext &frameContext,\n> >                      const ControlList &controls)\n> >  {\n> > -     auto &awb = context.activeState.awb;\n> > -\n> > -     const auto &awbEnable = controls.get(controls::AwbEnable);\n> > -     if (awbEnable && *awbEnable != awb.autoEnabled) {\n> > -             awb.autoEnabled = *awbEnable;\n> > -\n> > -             LOG(RkISP1Awb, Debug)\n> > -                     << (*awbEnable ? \"Enabling\" : \"Disabling\") << \" AWB\";\n> > -     }\n> > -\n> > -     awbAlgo_->handleControls(controls);\n> > -\n> > -     frameContext.awb.autoEnabled = awb.autoEnabled;\n> > -\n> > -     if (awb.autoEnabled)\n> > -             return;\n> > -\n> > -     const auto &colourGains = controls.get(controls::ColourGains);\n> > -     const auto &colourTemperature = controls.get(controls::ColourTemperature);\n> > -     bool update = false;\n> > -     if (colourGains) {\n> > -             awb.manual.gains.r() = (*colourGains)[0];\n> > -             awb.manual.gains.b() = (*colourGains)[1];\n> > -             /*\n> > -              * \\todo Colour temperature reported in metadata is now\n> > -              * incorrect, as we can't deduce the temperature from the gains.\n> > -              * This will be fixed with the bayes AWB algorithm.\n> > -              */\n> > -             update = true;\n> > -     } else if (colourTemperature) {\n> > -             awb.manual.temperatureK = *colourTemperature;\n> > -             const auto &gains = awbAlgo_->gainsFromColourTemperature(*colourTemperature);\n> > -             if (gains) {\n> > -                     awb.manual.gains.r() = gains->r();\n> > -                     awb.manual.gains.b() = gains->b();\n> > -                     update = true;\n> > -             }\n> > -     }\n> > -\n> > -     if (update)\n> > -             LOG(RkISP1Awb, Debug)\n> > -                     << \"Set colour gains to \" << awb.manual.gains;\n> > -\n> > -     frameContext.awb.gains = awb.manual.gains;\n> > -     frameContext.awb.temperatureK = awb.manual.temperatureK;\n> > +     awbAlgo_->queueRequest(context.activeState.awb, frame, frameContext.awb,\n> > +                            controls);\n> >  }\n> >\n> >  /**\n> > diff --git a/src/ipa/simple/algorithms/awb.cpp b/src/ipa/simple/algorithms/awb.cpp\n> > index 230b7807075941f086911549066e39c0a04dff5c..d8516871562724fc65ffbb67161ff4fd988c4b1c 100644\n> > --- a/src/ipa/simple/algorithms/awb.cpp\n> > +++ b/src/ipa/simple/algorithms/awb.cpp\n> > @@ -114,55 +114,13 @@ int Awb::configure(IPAContext &context,\n> >   * \\copydoc libcamera::ipa::Algorithm::queueRequest\n> >   */\n> >  void Awb::queueRequest(IPAContext &context,\n> > -                    [[maybe_unused]] const uint32_t frame,\n> > -                    [[maybe_unused]] IPAFrameContext &frameContext,\n> > +                    const uint32_t frame,\n> > +                    IPAFrameContext &frameContext,\n> >                      const ControlList &controls)\n> >  {\n> > -     auto &awb = context.activeState.awb;\n> > -\n> > -     const auto &awbEnable = controls.get(controls::AwbEnable);\n> > -     if (awbEnable && *awbEnable != awb.autoEnabled) {\n> > -             awb.autoEnabled = *awbEnable;\n> > -\n> > -             LOG(IPASoftAwb, Debug)\n> > -                     << (*awbEnable ? \"Enabling\" : \"Disabling\") << \" AWB\";\n> > -     }\n> > -\n> > -     awbAlgo_->handleControls(controls);\n> > -\n> > -     frameContext.awb.autoEnabled = awb.autoEnabled;\n> > -\n> > -     if (awb.autoEnabled)\n> > -             return;\n> > -\n> > -     const auto &colourGains = controls.get(controls::ColourGains);\n> > -     const auto &colourTemperature = controls.get(controls::ColourTemperature);\n> > -     bool update = false;\n> > -     if (colourGains) {\n> > -             awb.manual.gains.r() = (*colourGains)[0];\n> > -             awb.manual.gains.b() = (*colourGains)[1];\n> > -             /*\n> > -              * \\todo Colour temperature reported in metadata is now\n> > -              * incorrect, as we can't deduce the temperature from the gains.\n> > -              * This will be fixed with the bayes AWB algorithm.\n> > -              */\n> > -             update = true;\n> > -     } else if (colourTemperature) {\n> > -             awb.manual.temperatureK = *colourTemperature;\n> > -             const auto &gains = awbAlgo_->gainsFromColourTemperature(*colourTemperature);\n> > -             if (gains) {\n> > -                     awb.manual.gains.r() = gains->r();\n> > -                     awb.manual.gains.b() = gains->b();\n> > -                     update = true;\n> > -             }\n> > -     }\n> > -\n> > -     if (update)\n> > -             LOG(IPASoftAwb, Debug)\n> > -                     << \"Set colour gains to \" << awb.manual.gains;\n> > -\n> > -     frameContext.awb.gains = awb.manual.gains;\n> > -     frameContext.awb.temperatureK = awb.manual.temperatureK;\n> > +     awbAlgo_->queueRequest(context.activeState.awb,\n> > +                            frame, frameContext.awb,\n> > +                            controls);\n> >  }\n> >\n> >  void Awb::prepare(IPAContext &context,\n> >\n> > --\n> > 2.53.0\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 013E9BDCBD\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  8 Apr 2026 17:23:54 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 30B7962DF4;\n\tWed,  8 Apr 2026 19:23:54 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id F114562CE6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  8 Apr 2026 19:23:52 +0200 (CEST)","from monstersaurus.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 904BF2D5;\n\tWed,  8 Apr 2026 19:22:24 +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=\"YEvNxlv6\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1775668944;\n\tbh=Mzl13kkb4xUHcQpXDzk/Mqw2Iz57kgTitDOliXL/+/8=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=YEvNxlv6ZXmQ4PSoabxBB8XXtA94TgKDgoPSPwvg6/BxwNhNJoFgrYn9etE2sUPWO\n\tJKGke46cg6idkCescVf/jR/OcXwFVPNoEghgBuPZ4tAxisLwGfVERXlXA6EBfNoVOJ\n\tzaWfqgUHxZyVLOHRmOMUZhghQ6bJdtxCVvcLzR9w=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<adYYtMx9_XFKyKIh@zed>","References":"<20260407-kbingham-awb-split-v1-0-a39af3f4dc20@ideasonboard.com>\n\t<20260407-kbingham-awb-split-v1-12-a39af3f4dc20@ideasonboard.com>\n\t<adYYtMx9_XFKyKIh@zed>","Subject":"Re: [PATCH 12/13] ipa: libipa: awb: convert to common queueRequest","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","Date":"Wed, 08 Apr 2026 18:23:50 +0100","Message-ID":"<177566903006.575056.8647071728338029932@ping.linuxembedded.co.uk>","User-Agent":"alot/0.9.1","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":38560,"web_url":"https://patchwork.libcamera.org/comment/38560/","msgid":"<addTjRihBO0oXh_D@zed>","date":"2026-04-09T07:23:17","subject":"Re: [PATCH 12/13] ipa: libipa: awb: convert to common queueRequest","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Kieran\n\nOn Wed, Apr 08, 2026 at 06:23:50PM +0100, Kieran Bingham wrote:\n> Quoting Jacopo Mondi (2026-04-08 10:02:18)\n> > Hi Kieran\n> >\n> > On Tue, Apr 07, 2026 at 11:01:15PM +0100, Kieran Bingham wrote:\n> > > Move the now duplicated implementation for both soft IPA and rkisp1 IPA\n> > > for managing requests at queue time into the common libipa AWB implementation.\n> >\n> > requests ?\n>\n> I don't understand this question mark. Yes, this is queueReqeust which\n> parses requests ?\n\nI'm not sure either :) Maybe I mis-read \"requests\" in the commit message\n\n>\n> >\n> > >\n> > > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> > > ---\n> > >  src/ipa/libipa/awb.cpp            | 59 +++++++++++++++++++++++++++++++++++++++\n> > >  src/ipa/libipa/awb.h              |  5 ++++\n> > >  src/ipa/rkisp1/algorithms/awb.cpp | 49 ++------------------------------\n> > >  src/ipa/simple/algorithms/awb.cpp | 52 ++++------------------------------\n> > >  4 files changed, 72 insertions(+), 93 deletions(-)\n> > >\n> > > diff --git a/src/ipa/libipa/awb.cpp b/src/ipa/libipa/awb.cpp\n> > > index d0c577958caebc0b7e24fe58506da964df2200fe..cac6b4bd206faa4f32680e16c7522685cfd30cac 100644\n> > > --- a/src/ipa/libipa/awb.cpp\n> > > +++ b/src/ipa/libipa/awb.cpp\n> > > @@ -168,6 +168,65 @@ int AwbAlgorithm::configure(awb::ActiveState &state, awb::Session &session)\n> > >       return 0;\n> > >  }\n> > >\n> > > +/**\n> > > + * \\brief Provide control values to the algorithm\n> > > + * \\param[in] state The AWB specific active state shared across frames\n> > > + * \\param[in] frame The frame number to apply the control values\n> > > + * \\param[in] frameContext The current frame's AWB specific context\n> > > + * \\param[in] controls The list of user controls\n> > > + */\n> > > +void AwbAlgorithm::queueRequest(awb::ActiveState &state,\n> > > +                             [[maybe_unused]] const uint32_t frame,\n> >\n> > Should we aim at maintaining compatibility with the\n> > Algorithm::queuRequest() interface or unused parameters should be dropped ?\n>\n> I didn't want to pass things like the bigger contexts, but the frame\n> index seemed important in my head so I've kept it for now.\n>\n> I don't know why or what it's important for, but I anticipate it will be\n> important with more per-frame-control concepts or for knowing the\n> sequencing/timing/something ...\n>\n> I guess they're easy enough to add later if needed ... I'd be keen to\n> know what Stefan thinks here as he's done a lot of rework around timings\n> lately\n\nBoth options work for me\n\n>\n> >\n> > > +                             awb::FrameContext &frameContext,\n> > > +                             const ControlList &controls)\n> > > +{\n> > > +     const auto &awbEnable = controls.get(controls::AwbEnable);\n> > > +     if (awbEnable && *awbEnable != state.autoEnabled) {\n> > > +             state.autoEnabled = *awbEnable;\n> > > +\n> > > +             LOG(Awb, Debug)\n> > > +                     << (*awbEnable ? \"Enabling\" : \"Disabling\") << \" AWB\";\n> > > +     }\n> > > +\n> > > +     /* Handle controls from subclass algo (Grey or Bayes) */\n> > > +     handleControls(controls);\n> > > +\n> > > +     frameContext.autoEnabled = state.autoEnabled;\n> > > +\n> > > +     /* Todo: Check to see if we should always parse the following controls */\n> >\n> > Does this still apply ?\n> >\n> > > +     if (frameContext.autoEnabled)\n> > > +             return;\n> > > +\n> > > +     const auto &colourGains = controls.get(controls::ColourGains);\n> > > +     const auto &colourTemperature = controls.get(controls::ColourTemperature);\n> > > +     bool update = false;\n> > > +     if (colourGains) {\n> > > +             state.manual.gains.r() = (*colourGains)[0];\n> > > +             state.manual.gains.b() = (*colourGains)[1];\n> > > +             /*\n> > > +              * \\todo Colour temperature reported in metadata is now\n> > > +              * incorrect, as we can't deduce the temperature from the gains.\n> > > +              * This will be fixed with the bayes AWB algorithm.\n> >\n> > has it been fixed ? however I understand this is a copy of the\n> > existing code..\n>\n> I don't know - indeed, I'm just trying to move existing code around to\n> reduce copying in each module. Still worth checking, but I'd still do it\n> on top and not in this patch anyway.\n>\n> >\n> > Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n> >\n> > Thanks\n> >   j\n> >\n> > > +              */\n> > > +             update = true;\n> > > +     } else if (colourTemperature) {\n> > > +             state.manual.temperatureK = *colourTemperature;\n> > > +             const auto &gains = gainsFromColourTemperature(*colourTemperature);\n> > > +             if (gains) {\n> > > +                     state.manual.gains.r() = gains->r();\n> > > +                     state.manual.gains.b() = gains->b();\n> > > +                     update = true;\n> > > +             }\n> > > +     }\n> > > +\n> > > +     if (update)\n> > > +             LOG(Awb, Debug)\n> > > +                     << \"Set colour gains to \" << state.manual.gains;\n> > > +\n> > > +     frameContext.gains = state.manual.gains;\n> > > +     frameContext.temperatureK = state.manual.temperatureK;\n> > > +}\n> > > +\n> > >  /**\n> > >   * \\fn AwbAlgorithm::calculateAwb()\n> > >   * \\brief Calculate AWB data from the given statistics\n> > > diff --git a/src/ipa/libipa/awb.h b/src/ipa/libipa/awb.h\n> > > index 4ceae537686f8f4c93686fab4b9efbc06e112b1d..0256ff8ca3429288c317d3ee940255c4a5391357 100644\n> > > --- a/src/ipa/libipa/awb.h\n> > > +++ b/src/ipa/libipa/awb.h\n> > > @@ -68,6 +68,11 @@ public:\n> > >\n> > >       int configure(awb::ActiveState &state, awb::Session &session);\n> > >\n> > > +     void queueRequest(awb::ActiveState &state,\n> > > +                       [[maybe_unused]] const uint32_t frame,\n> > > +                       awb::FrameContext &frameContext,\n> > > +                       const ControlList &controls);\n> > > +\n> > >       virtual AwbResult calculateAwb(const AwbStats &stats, unsigned int lux) = 0;\n> > >       virtual std::optional<RGB<double>> gainsFromColourTemperature(double colourTemperature) = 0;\n> > >\n> > > diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp\n> > > index 86d5dfed3e1c2bb587705f05362229db3cdadafd..b91132fc6177650b9338867359583bf5429ea7e5 100644\n> > > --- a/src/ipa/rkisp1/algorithms/awb.cpp\n> > > +++ b/src/ipa/rkisp1/algorithms/awb.cpp\n> > > @@ -146,55 +146,12 @@ int Awb::configure(IPAContext &context,\n> > >   * \\copydoc libcamera::ipa::Algorithm::queueRequest\n> > >   */\n> > >  void Awb::queueRequest(IPAContext &context,\n> > > -                    [[maybe_unused]] const uint32_t frame,\n> > > +                    const uint32_t frame,\n> > >                      IPAFrameContext &frameContext,\n> > >                      const ControlList &controls)\n> > >  {\n> > > -     auto &awb = context.activeState.awb;\n> > > -\n> > > -     const auto &awbEnable = controls.get(controls::AwbEnable);\n> > > -     if (awbEnable && *awbEnable != awb.autoEnabled) {\n> > > -             awb.autoEnabled = *awbEnable;\n> > > -\n> > > -             LOG(RkISP1Awb, Debug)\n> > > -                     << (*awbEnable ? \"Enabling\" : \"Disabling\") << \" AWB\";\n> > > -     }\n> > > -\n> > > -     awbAlgo_->handleControls(controls);\n> > > -\n> > > -     frameContext.awb.autoEnabled = awb.autoEnabled;\n> > > -\n> > > -     if (awb.autoEnabled)\n> > > -             return;\n> > > -\n> > > -     const auto &colourGains = controls.get(controls::ColourGains);\n> > > -     const auto &colourTemperature = controls.get(controls::ColourTemperature);\n> > > -     bool update = false;\n> > > -     if (colourGains) {\n> > > -             awb.manual.gains.r() = (*colourGains)[0];\n> > > -             awb.manual.gains.b() = (*colourGains)[1];\n> > > -             /*\n> > > -              * \\todo Colour temperature reported in metadata is now\n> > > -              * incorrect, as we can't deduce the temperature from the gains.\n> > > -              * This will be fixed with the bayes AWB algorithm.\n> > > -              */\n> > > -             update = true;\n> > > -     } else if (colourTemperature) {\n> > > -             awb.manual.temperatureK = *colourTemperature;\n> > > -             const auto &gains = awbAlgo_->gainsFromColourTemperature(*colourTemperature);\n> > > -             if (gains) {\n> > > -                     awb.manual.gains.r() = gains->r();\n> > > -                     awb.manual.gains.b() = gains->b();\n> > > -                     update = true;\n> > > -             }\n> > > -     }\n> > > -\n> > > -     if (update)\n> > > -             LOG(RkISP1Awb, Debug)\n> > > -                     << \"Set colour gains to \" << awb.manual.gains;\n> > > -\n> > > -     frameContext.awb.gains = awb.manual.gains;\n> > > -     frameContext.awb.temperatureK = awb.manual.temperatureK;\n> > > +     awbAlgo_->queueRequest(context.activeState.awb, frame, frameContext.awb,\n> > > +                            controls);\n> > >  }\n> > >\n> > >  /**\n> > > diff --git a/src/ipa/simple/algorithms/awb.cpp b/src/ipa/simple/algorithms/awb.cpp\n> > > index 230b7807075941f086911549066e39c0a04dff5c..d8516871562724fc65ffbb67161ff4fd988c4b1c 100644\n> > > --- a/src/ipa/simple/algorithms/awb.cpp\n> > > +++ b/src/ipa/simple/algorithms/awb.cpp\n> > > @@ -114,55 +114,13 @@ int Awb::configure(IPAContext &context,\n> > >   * \\copydoc libcamera::ipa::Algorithm::queueRequest\n> > >   */\n> > >  void Awb::queueRequest(IPAContext &context,\n> > > -                    [[maybe_unused]] const uint32_t frame,\n> > > -                    [[maybe_unused]] IPAFrameContext &frameContext,\n> > > +                    const uint32_t frame,\n> > > +                    IPAFrameContext &frameContext,\n> > >                      const ControlList &controls)\n> > >  {\n> > > -     auto &awb = context.activeState.awb;\n> > > -\n> > > -     const auto &awbEnable = controls.get(controls::AwbEnable);\n> > > -     if (awbEnable && *awbEnable != awb.autoEnabled) {\n> > > -             awb.autoEnabled = *awbEnable;\n> > > -\n> > > -             LOG(IPASoftAwb, Debug)\n> > > -                     << (*awbEnable ? \"Enabling\" : \"Disabling\") << \" AWB\";\n> > > -     }\n> > > -\n> > > -     awbAlgo_->handleControls(controls);\n> > > -\n> > > -     frameContext.awb.autoEnabled = awb.autoEnabled;\n> > > -\n> > > -     if (awb.autoEnabled)\n> > > -             return;\n> > > -\n> > > -     const auto &colourGains = controls.get(controls::ColourGains);\n> > > -     const auto &colourTemperature = controls.get(controls::ColourTemperature);\n> > > -     bool update = false;\n> > > -     if (colourGains) {\n> > > -             awb.manual.gains.r() = (*colourGains)[0];\n> > > -             awb.manual.gains.b() = (*colourGains)[1];\n> > > -             /*\n> > > -              * \\todo Colour temperature reported in metadata is now\n> > > -              * incorrect, as we can't deduce the temperature from the gains.\n> > > -              * This will be fixed with the bayes AWB algorithm.\n> > > -              */\n> > > -             update = true;\n> > > -     } else if (colourTemperature) {\n> > > -             awb.manual.temperatureK = *colourTemperature;\n> > > -             const auto &gains = awbAlgo_->gainsFromColourTemperature(*colourTemperature);\n> > > -             if (gains) {\n> > > -                     awb.manual.gains.r() = gains->r();\n> > > -                     awb.manual.gains.b() = gains->b();\n> > > -                     update = true;\n> > > -             }\n> > > -     }\n> > > -\n> > > -     if (update)\n> > > -             LOG(IPASoftAwb, Debug)\n> > > -                     << \"Set colour gains to \" << awb.manual.gains;\n> > > -\n> > > -     frameContext.awb.gains = awb.manual.gains;\n> > > -     frameContext.awb.temperatureK = awb.manual.temperatureK;\n> > > +     awbAlgo_->queueRequest(context.activeState.awb,\n> > > +                            frame, frameContext.awb,\n> > > +                            controls);\n> > >  }\n> > >\n> > >  void Awb::prepare(IPAContext &context,\n> > >\n> > > --\n> > > 2.53.0\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 D401FBEFBE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  9 Apr 2026 07:23:22 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9E7A162E3E;\n\tThu,  9 Apr 2026 09:23: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 1742F6271A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  9 Apr 2026 09:23:20 +0200 (CEST)","from ideasonboard.com (net-93-65-100-155.cust.vodafonedsl.it\n\t[93.65.100.155])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 502B1225;\n\tThu,  9 Apr 2026 09:21:51 +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=\"e4L0g4ud\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1775719311;\n\tbh=BBLlQ+HJxkebg+OaopDnA3s0n07YSdbLyaXpu2/ENtY=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=e4L0g4udEZ6vkVak/cKxV02syTDiao2OUmg5Ed24plokjhMcSLqhBxsNeOzpnilp6\n\tdqc54Du81IFd/jWurMieT9eK+dnfxzZl9YHTypMwq3jw4EQCQlAXmg9pcUPm1qkxuv\n\t9+2upUNpOih6zO3f4ve6ChFNbqaFYw906L/lr0xI=","Date":"Thu, 9 Apr 2026 09:23:17 +0200","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>, \n\tlibcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH 12/13] ipa: libipa: awb: convert to common queueRequest","Message-ID":"<addTjRihBO0oXh_D@zed>","References":"<20260407-kbingham-awb-split-v1-0-a39af3f4dc20@ideasonboard.com>\n\t<20260407-kbingham-awb-split-v1-12-a39af3f4dc20@ideasonboard.com>\n\t<adYYtMx9_XFKyKIh@zed>\n\t<177566903006.575056.8647071728338029932@ping.linuxembedded.co.uk>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<177566903006.575056.8647071728338029932@ping.linuxembedded.co.uk>","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":38788,"web_url":"https://patchwork.libcamera.org/comment/38788/","msgid":"<7e754317-cfc1-4b0a-8fe3-a8826718079f@oss.qualcomm.com>","date":"2026-05-07T14:39:53","subject":"Re: [PATCH 12/13] ipa: libipa: awb: convert to common queueRequest","submitter":{"id":242,"url":"https://patchwork.libcamera.org/api/people/242/","name":"Hans de Goede","email":"johannes.goede@oss.qualcomm.com"},"content":"Hi,\n\nOn 8-Apr-26 00:01, Kieran Bingham wrote:\n> Move the now duplicated implementation for both soft IPA and rkisp1 IPA\n> for managing requests at queue time into the common libipa AWB implementation.\n> \n> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> ---\n>  src/ipa/libipa/awb.cpp            | 59 +++++++++++++++++++++++++++++++++++++++\n>  src/ipa/libipa/awb.h              |  5 ++++\n>  src/ipa/rkisp1/algorithms/awb.cpp | 49 ++------------------------------\n>  src/ipa/simple/algorithms/awb.cpp | 52 ++++------------------------------\n>  4 files changed, 72 insertions(+), 93 deletions(-)\n> \n> diff --git a/src/ipa/libipa/awb.cpp b/src/ipa/libipa/awb.cpp\n> index d0c577958caebc0b7e24fe58506da964df2200fe..cac6b4bd206faa4f32680e16c7522685cfd30cac 100644\n> --- a/src/ipa/libipa/awb.cpp\n> +++ b/src/ipa/libipa/awb.cpp\n> @@ -168,6 +168,65 @@ int AwbAlgorithm::configure(awb::ActiveState &state, awb::Session &session)\n>  \treturn 0;\n>  }\n>  \n> +/**\n> + * \\brief Provide control values to the algorithm\n> + * \\param[in] state The AWB specific active state shared across frames\n> + * \\param[in] frame The frame number to apply the control values\n> + * \\param[in] frameContext The current frame's AWB specific context\n> + * \\param[in] controls The list of user controls\n> + */\n> +void AwbAlgorithm::queueRequest(awb::ActiveState &state,\n> +\t\t\t\t[[maybe_unused]] const uint32_t frame,\n> +\t\t\t\tawb::FrameContext &frameContext,\n> +\t\t\t\tconst ControlList &controls)\n> +{\n> +\tconst auto &awbEnable = controls.get(controls::AwbEnable);\n> +\tif (awbEnable && *awbEnable != state.autoEnabled) {\n> +\t\tstate.autoEnabled = *awbEnable;\n> +\n> +\t\tLOG(Awb, Debug)\n> +\t\t\t<< (*awbEnable ? \"Enabling\" : \"Disabling\") << \" AWB\";\n> +\t}\n> +\n> +\t/* Handle controls from subclass algo (Grey or Bayes) */\n> +\thandleControls(controls);\n> +\n> +\tframeContext.autoEnabled = state.autoEnabled;\n> +\n> +\t/* Todo: Check to see if we should always parse the following controls */\n> +\tif (frameContext.autoEnabled)\n> +\t\treturn;\n> +\n> +\tconst auto &colourGains = controls.get(controls::ColourGains);\n> +\tconst auto &colourTemperature = controls.get(controls::ColourTemperature);\n> +\tbool update = false;\n> +\tif (colourGains) {\n> +\t\tstate.manual.gains.r() = (*colourGains)[0];\n> +\t\tstate.manual.gains.b() = (*colourGains)[1];\n> +\t\t/*\n> +\t\t * \\todo Colour temperature reported in metadata is now\n> +\t\t * incorrect, as we can't deduce the temperature from the gains.\n> +\t\t * This will be fixed with the bayes AWB algorithm.\n> +\t\t */\n> +\t\tupdate = true;\n> +\t} else if (colourTemperature) {\n> +\t\tstate.manual.temperatureK = *colourTemperature;\n> +\t\tconst auto &gains = gainsFromColourTemperature(*colourTemperature);\n> +\t\tif (gains) {\n> +\t\t\tstate.manual.gains.r() = gains->r();\n> +\t\t\tstate.manual.gains.b() = gains->b();\n> +\t\t\tupdate = true;\n> +\t\t}\n> +\t}\n> +\n> +\tif (update)\n> +\t\tLOG(Awb, Debug)\n> +\t\t\t<< \"Set colour gains to \" << state.manual.gains;\n> +\n> +\tframeContext.gains = state.manual.gains;\n> +\tframeContext.temperatureK = state.manual.temperatureK;\n> +}\n> +\n>  /**\n>   * \\fn AwbAlgorithm::calculateAwb()\n>   * \\brief Calculate AWB data from the given statistics\n> diff --git a/src/ipa/libipa/awb.h b/src/ipa/libipa/awb.h\n> index 4ceae537686f8f4c93686fab4b9efbc06e112b1d..0256ff8ca3429288c317d3ee940255c4a5391357 100644\n> --- a/src/ipa/libipa/awb.h\n> +++ b/src/ipa/libipa/awb.h\n> @@ -68,6 +68,11 @@ public:\n>  \n>  \tint configure(awb::ActiveState &state, awb::Session &session);\n>  \n> +\tvoid queueRequest(awb::ActiveState &state,\n> +\t\t\t  [[maybe_unused]] const uint32_t frame,\n> +\t\t\t  awb::FrameContext &frameContext,\n> +\t\t\t  const ControlList &controls);\n> +\n\nNit: [[maybe_unused]] is only necessary for the implementation of the method,\nnot for the prototype declaration in the class {} declaration.\n\nOtherwise the patch looks good to me:\n\nReviewed-by: Hans de Goede <johannes.goede@oss.qualcomm.com>\n\nRegards,\n\nHans\n\n\n\n\n>  \tvirtual AwbResult calculateAwb(const AwbStats &stats, unsigned int lux) = 0;\n>  \tvirtual std::optional<RGB<double>> gainsFromColourTemperature(double colourTemperature) = 0;\n>  \n> diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp\n> index 86d5dfed3e1c2bb587705f05362229db3cdadafd..b91132fc6177650b9338867359583bf5429ea7e5 100644\n> --- a/src/ipa/rkisp1/algorithms/awb.cpp\n> +++ b/src/ipa/rkisp1/algorithms/awb.cpp\n> @@ -146,55 +146,12 @@ int Awb::configure(IPAContext &context,\n>   * \\copydoc libcamera::ipa::Algorithm::queueRequest\n>   */\n>  void Awb::queueRequest(IPAContext &context,\n> -\t\t       [[maybe_unused]] const uint32_t frame,\n> +\t\t       const uint32_t frame,\n>  \t\t       IPAFrameContext &frameContext,\n>  \t\t       const ControlList &controls)\n>  {\n> -\tauto &awb = context.activeState.awb;\n> -\n> -\tconst auto &awbEnable = controls.get(controls::AwbEnable);\n> -\tif (awbEnable && *awbEnable != awb.autoEnabled) {\n> -\t\tawb.autoEnabled = *awbEnable;\n> -\n> -\t\tLOG(RkISP1Awb, Debug)\n> -\t\t\t<< (*awbEnable ? \"Enabling\" : \"Disabling\") << \" AWB\";\n> -\t}\n> -\n> -\tawbAlgo_->handleControls(controls);\n> -\n> -\tframeContext.awb.autoEnabled = awb.autoEnabled;\n> -\n> -\tif (awb.autoEnabled)\n> -\t\treturn;\n> -\n> -\tconst auto &colourGains = controls.get(controls::ColourGains);\n> -\tconst auto &colourTemperature = controls.get(controls::ColourTemperature);\n> -\tbool update = false;\n> -\tif (colourGains) {\n> -\t\tawb.manual.gains.r() = (*colourGains)[0];\n> -\t\tawb.manual.gains.b() = (*colourGains)[1];\n> -\t\t/*\n> -\t\t * \\todo Colour temperature reported in metadata is now\n> -\t\t * incorrect, as we can't deduce the temperature from the gains.\n> -\t\t * This will be fixed with the bayes AWB algorithm.\n> -\t\t */\n> -\t\tupdate = true;\n> -\t} else if (colourTemperature) {\n> -\t\tawb.manual.temperatureK = *colourTemperature;\n> -\t\tconst auto &gains = awbAlgo_->gainsFromColourTemperature(*colourTemperature);\n> -\t\tif (gains) {\n> -\t\t\tawb.manual.gains.r() = gains->r();\n> -\t\t\tawb.manual.gains.b() = gains->b();\n> -\t\t\tupdate = true;\n> -\t\t}\n> -\t}\n> -\n> -\tif (update)\n> -\t\tLOG(RkISP1Awb, Debug)\n> -\t\t\t<< \"Set colour gains to \" << awb.manual.gains;\n> -\n> -\tframeContext.awb.gains = awb.manual.gains;\n> -\tframeContext.awb.temperatureK = awb.manual.temperatureK;\n> +\tawbAlgo_->queueRequest(context.activeState.awb, frame, frameContext.awb,\n> +\t\t\t       controls);\n>  }\n>  \n>  /**\n> diff --git a/src/ipa/simple/algorithms/awb.cpp b/src/ipa/simple/algorithms/awb.cpp\n> index 230b7807075941f086911549066e39c0a04dff5c..d8516871562724fc65ffbb67161ff4fd988c4b1c 100644\n> --- a/src/ipa/simple/algorithms/awb.cpp\n> +++ b/src/ipa/simple/algorithms/awb.cpp\n> @@ -114,55 +114,13 @@ int Awb::configure(IPAContext &context,\n>   * \\copydoc libcamera::ipa::Algorithm::queueRequest\n>   */\n>  void Awb::queueRequest(IPAContext &context,\n> -\t\t       [[maybe_unused]] const uint32_t frame,\n> -\t\t       [[maybe_unused]] IPAFrameContext &frameContext,\n> +\t\t       const uint32_t frame,\n> +\t\t       IPAFrameContext &frameContext,\n>  \t\t       const ControlList &controls)\n>  {\n> -\tauto &awb = context.activeState.awb;\n> -\n> -\tconst auto &awbEnable = controls.get(controls::AwbEnable);\n> -\tif (awbEnable && *awbEnable != awb.autoEnabled) {\n> -\t\tawb.autoEnabled = *awbEnable;\n> -\n> -\t\tLOG(IPASoftAwb, Debug)\n> -\t\t\t<< (*awbEnable ? \"Enabling\" : \"Disabling\") << \" AWB\";\n> -\t}\n> -\n> -\tawbAlgo_->handleControls(controls);\n> -\n> -\tframeContext.awb.autoEnabled = awb.autoEnabled;\n> -\n> -\tif (awb.autoEnabled)\n> -\t\treturn;\n> -\n> -\tconst auto &colourGains = controls.get(controls::ColourGains);\n> -\tconst auto &colourTemperature = controls.get(controls::ColourTemperature);\n> -\tbool update = false;\n> -\tif (colourGains) {\n> -\t\tawb.manual.gains.r() = (*colourGains)[0];\n> -\t\tawb.manual.gains.b() = (*colourGains)[1];\n> -\t\t/*\n> -\t\t * \\todo Colour temperature reported in metadata is now\n> -\t\t * incorrect, as we can't deduce the temperature from the gains.\n> -\t\t * This will be fixed with the bayes AWB algorithm.\n> -\t\t */\n> -\t\tupdate = true;\n> -\t} else if (colourTemperature) {\n> -\t\tawb.manual.temperatureK = *colourTemperature;\n> -\t\tconst auto &gains = awbAlgo_->gainsFromColourTemperature(*colourTemperature);\n> -\t\tif (gains) {\n> -\t\t\tawb.manual.gains.r() = gains->r();\n> -\t\t\tawb.manual.gains.b() = gains->b();\n> -\t\t\tupdate = true;\n> -\t\t}\n> -\t}\n> -\n> -\tif (update)\n> -\t\tLOG(IPASoftAwb, Debug)\n> -\t\t\t<< \"Set colour gains to \" << awb.manual.gains;\n> -\n> -\tframeContext.awb.gains = awb.manual.gains;\n> -\tframeContext.awb.temperatureK = awb.manual.temperatureK;\n> +\tawbAlgo_->queueRequest(context.activeState.awb,\n> +\t\t\t       frame, frameContext.awb,\n> +\t\t\t       controls);\n>  }\n>  \n>  void Awb::prepare(IPAContext &context,\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 A96E7BE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  7 May 2026 14:40:01 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 558A563022;\n\tThu,  7 May 2026 16:40:00 +0200 (CEST)","from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com\n\t[205.220.180.131])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5A3E862010\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  7 May 2026 16:39:58 +0200 (CEST)","from pps.filterd (m0279873.ppops.net [127.0.0.1])\n\tby mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n\t647APvqJ150997 for <libcamera-devel@lists.libcamera.org>;\n\tThu, 7 May 2026 14:39:57 GMT","from mail-vs1-f72.google.com (mail-vs1-f72.google.com\n\t[209.85.217.72])\n\tby mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e0kctta1q-1\n\t(version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT)\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 07 May 2026 14:39:57 +0000 (GMT)","by mail-vs1-f72.google.com with SMTP id\n\tada2fe7eead31-5fae584a130so1514977137.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 07 May 2026 07:39:56 -0700 (PDT)","from ?IPV6:2001:1c00:c32:7800:5bfa:a036:83f0:f9ec?\n\t(2001-1c00-0c32-7800-5bfa-a036-83f0-f9ec.cable.dynamic.v6.ziggo.nl.\n\t[2001:1c00:c32:7800:5bfa:a036:83f0:f9ec])\n\tby smtp.gmail.com with ESMTPSA id\n\t4fb4d7f45d1cf-67cd90ef9d7sm2248513a12.8.2026.05.07.07.39.54\n\t(version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n\tThu, 07 May 2026 07:39:54 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=qualcomm.com header.i=@qualcomm.com\n\theader.b=\"gasPn2PJ\"; dkim=pass (2048-bit key;\n\tunprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n\theader.b=\"DwB7GhSo\"; dkim-atps=neutral","DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h=\n\tcontent-transfer-encoding:content-type:date:from:in-reply-to\n\t:message-id:mime-version:references:subject:to; s=qcppdkim1; bh=\n\te8WeXdZQZSDho16TcG+LkHIF64mY9BxxbuGA7zq7T0Q=; b=gasPn2PJNLPquj4p\n\tgATIzhCz90XTVCh4rz18YJ0wW2G1EcqPERwV0p84ptEWudjcPVa0Zov+6s6xAWn+\n\t4T15/KLSoax6fySWt3AXtXIwvjAGHlJGXVL/U79xvR7TuaZmoyD/SyB2H9hs08+j\n\t/ichMpKnY8qtio1INaHpEGyh0XhxPsWek51GLP/hSvHzw/aVllZpieyGCjpC51s/\n\tT4HriQ2DRf0Ua1wgj3vWJI2z5HnfWVkm3pd+TWl0+BaQmeumVfhOWy3IVbWXZkBT\n\tmxezofN2Af6x9FygyVrHyNOscAaUDaYwo63J1hYvPqK2cYjTMvSh+yp35C8kIRFn\n\tTDfCHA==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=oss.qualcomm.com; s=google; t=1778164796; x=1778769596;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:in-reply-to:content-language:references\n\t:to:subject:from:user-agent:mime-version:date:message-id:from:to:cc\n\t:subject:date:message-id:reply-to;\n\tbh=e8WeXdZQZSDho16TcG+LkHIF64mY9BxxbuGA7zq7T0Q=;\n\tb=DwB7GhSoMd83bofKF9X1qm3IAi4DbXgqIAw61tR0oPZAOFoOzzGDXvpDOggYbwcmxx\n\t2jyrS64DIucHL8U++poQu5GQbWAIPBjBJ5S8wHzmZC3F3ScYGERU+WqtnKMR947pzxI6\n\t1wcs7baSBv5VCQFWA7A4nfO+3CXhZrPFGzSJoN3G+N7XGmpZ1QbmDuF5gMR+whrbsWpN\n\t043NON6OwqWeoWPFoROrw+K6ClMgxB0+Ej8WTgNDi68DhTnS9B7GnUNDFUR/hxhSk1Hk\n\tiCFSz3eSUNh44ppCsaKtAb7hALGFf/HH3pwr/qKU1pjJC5oFS4CLCy0ILFt0vjTwLxYH\n\tyz9A=="],"X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20251104; t=1778164796; x=1778769596;\n\th=content-transfer-encoding:in-reply-to:content-language:references\n\t:to:subject:from:user-agent:mime-version:date:message-id:x-gm-gg\n\t:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;\n\tbh=e8WeXdZQZSDho16TcG+LkHIF64mY9BxxbuGA7zq7T0Q=;\n\tb=kJ2v4va2nUekKXTHXQkjNIwmLCIlyX8XZAt9z6Hz60jfJZnRHwE2Z6MVbrIVbr/Qm+\n\tRwuWUDXLrYyPZKP3CHbCJ7vnXZVlYVBoud4z2/ie25/tc9VvEmcs2b0rmkPFnbcP++iJ\n\tk75P7K5lVub4kyuNE3b9rdYgeXgUJJ8rGfkr+KkorP5CKfpa8rwPtMrP/3rof39vlrZ5\n\tTBkp+1UiuG8tfxP15IJGnvfl0hYHK3M7VqILDGg3APqBLKfPHjqP9JdZYUkLVU7j26qk\n\tdV8+p/KN5Aa5uBCaJEJP+UA9UFasDdOgsqWqCLlF/wfmPBpbHDUsunN76ZSYwPeE8s2x\n\tBo5g==","X-Forwarded-Encrypted":"i=1;\n\tAFNElJ+z1+Z9NLi616WhOPk/n1N+KqIYe1FNA62XZyigDnHxosqpTDzLSgeZvjW2wh2Z5iVWx3t1IOI0B1fLzNTljiU=@lists.libcamera.org","X-Gm-Message-State":"AOJu0YzlVIDmtb++fHAq/Kf2rP7yZj1JlEZbPzNbigiHdDBT4h6KPaZ8\n\t8PRzjOR86L1sjtd1CegAiYsRwPW+CbPtTpR+tU5So6q+uWRiyqMj7lwe8aJPGOcr16PINP7BTvM\n\tPed1DQMtNuaz+xLkOVBZbYFpXMpXV5ZBTi4mVUXnoAC59z+eCATTRkPH7x55ngm7+B9wzfDjkMy\n\tHm","X-Gm-Gg":"AeBDieu0FzLlx+JF+eXA1fUmXB5vJN2ZbKwtv9KY2Vqa33B6Lsv2/fGEa1OaY4wbNOL\n\tcKXQRg4xkaJ6RP216/D2zHUHrNnhcknLT3OIKTawOpRLHUq3vOdxDciD7g3l9NGKWFP94knVvg1\n\tTxwT2RbtxPEmAohNLIAHm6HvqAGgZXnh/JS/8fDlPjqJYReMt3catGuuu47md4Qhe9IYC2CMgxH\n\t6w8bNyK/g+7SBdq03wSVV+RhQa01zgSuEWEErJrYhlvAMSnXLLtX5zeNdoMEr8YZdvUjzgqVGrT\n\tS7M3HmHVDBqVEnXo7Qihl2IwkHaXFoYzPrLsFaSWSXm8dSdiAHOaEFXi88QGsYa6DSBNjbWbJLj\n\tRJ7Jjksubq1GTQWWkfu+AMjohq2tbgkjIp9RqQkiUoAffIFPGPr5yZSwrx/S7ZTiJtFweiuX5rI\n\tGRP+UXf4yu0TvNcadUNkX1KU/Irqum1odDzDzS5kmqIDyreGiuICyhGwGlOwM5ExNDfWFXAg9yC\n\tvZitXhy5jpfk9cfaqxP5a1kbXw=","X-Received":["by 2002:a05:6102:442c:b0:603:273f:3576 with SMTP id\n\tada2fe7eead31-630f8ee79a1mr4539433137.10.1778164796129; \n\tThu, 07 May 2026 07:39:56 -0700 (PDT)","by 2002:a05:6102:442c:b0:603:273f:3576 with SMTP id\n\tada2fe7eead31-630f8ee79a1mr4539361137.10.1778164795473; \n\tThu, 07 May 2026 07:39:55 -0700 (PDT)"],"Message-ID":"<7e754317-cfc1-4b0a-8fe3-a8826718079f@oss.qualcomm.com>","Date":"Thu, 7 May 2026 16:39:53 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","From":"johannes.goede@oss.qualcomm.com","Subject":"Re: [PATCH 12/13] ipa: libipa: awb: convert to common queueRequest","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20260407-kbingham-awb-split-v1-0-a39af3f4dc20@ideasonboard.com>\n\t<20260407-kbingham-awb-split-v1-12-a39af3f4dc20@ideasonboard.com>","Content-Language":"en-US, nl","In-Reply-To":"<20260407-kbingham-awb-split-v1-12-a39af3f4dc20@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"7bit","X-Authority-Analysis":"v=2.4 cv=XsPK/1F9 c=1 sm=1 tr=0 ts=69fca43d cx=c_pps\n\ta=DUEm7b3gzWu7BqY5nP7+9g==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10\n\ta=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22\n\ta=u7WPNUs3qKkmUXheDGA7:22 a=rJkE3RaqiGZ5pbrm-msn:22 a=P1BnusSwAAAA:8\n\ta=EUspDBNiAAAA:8 a=DDIkvi_FRhenowOA-_IA:9 a=QEXdDO2ut3YA:10\n\ta=-aSRE8QhW-JAV6biHavz:22 a=D0XLA9XvdZm18NrgonBM:22","X-Proofpoint-GUID":"DHHELUcX5wABz9wswkpDjCVgx4s3NO7-","X-Proofpoint-ORIG-GUID":"DHHELUcX5wABz9wswkpDjCVgx4s3NO7-","X-Proofpoint-Spam-Details-Enc":"AW1haW4tMjYwNTA3MDE0NiBTYWx0ZWRfX09V94ivcq2qb\n\tdVOTf8wO3C2faiy+EYbMPujg+D/L9JdU7bJfE4tkNdHRf2l+2VP+jGbjEohXBwSyqgznwdAdfuH\n\tzD0RyLcubA5yNon4pxKaD/DIIzKVtpPKkvHjVo6v0W+XoBPEVmj4cqr5+iQwJRTJTydTMHx5dIG\n\tALEGqcZ/JdyLRcDAMvs102mjybq9Wsev42bSD0lqsTE9XHR55tN+0GTzBRU8g4UkeIatRUqM0S1\n\t3H50wLOU1w/BgrSremsTqLOSX6XYKnvJ85jQf86ACqD74Z/OhRbZVJtq5frvm6OusMaRfhxjneg\n\tb0BAm0ZTMiyNKT8WD7pGq9ngmICYq6HhvHzaWtEhf0qsNZemI9AoByujAuuahupS57VYZ/ku4Bi\n\t3cxW2P1jTRRju22wh6AJ9mji8jGg+V9hHz3A5hl60DYIC9iI2/iQFBjdoUndtRgNBwVnby9KEBt\n\tb9IckQxBlyAgiuSWSIg==","X-Proofpoint-Virus-Version":"vendor=baseguard\n\tengine=ICAP:2.0.293, Aquarius:18.0.1143, Hydra:6.1.51,\n\tFMLib:17.12.100.49\n\tdefinitions=2026-05-07_01,2026-05-06_01,2025-10-01_01","X-Proofpoint-Spam-Details":"rule=outbound_notspam policy=outbound score=0\n\tlowpriorityscore=0 impostorscore=0 adultscore=0 suspectscore=0\n\tphishscore=0\n\tpriorityscore=1501 malwarescore=0 bulkscore=0 spamscore=0\n\tclxscore=1015\n\tclassifier=typeunknown authscore=0 authtc= authcc= route=outbound\n\tadjust=0\n\treason=mlx scancount=1 engine=8.22.0-2604200000\n\tdefinitions=main-2605070146","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]