[{"id":26683,"web_url":"https://patchwork.libcamera.org/comment/26683/","msgid":"<20230320205356.csoprurfxrgn3wlw@uno.localdomain>","date":"2023-03-20T20:53:56","subject":"Re: [libcamera-devel] [PATCH v4 05/10] ipa: af_hill_climbing: Add\n\t\"Windows\" metering mode","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Daniel\n\nOn Tue, Mar 14, 2023 at 03:48:29PM +0100, Daniel Semkowicz wrote:\n> Add support for setting user defined auto focus window in the\n> AfHillClimbing. This enables usage of AfMetering and AfWindows controls.\n> Each time, there is a need for changing the window configuration in the\n> ISP, the signal is emitted. Platform layer that wants to use\n> the \"Windows\" metering mode, needs to connect to this signal\n> and configure the ISP on each emission.\n>\n> Currently only one window is supported.\n\nI wonder... shouldn't window hadling be left to the platform layer ?\nIn other words, should the \"common\" Af::queueRequest() parse the\nwindowing controls and then signal the platform layers, or either\nshould parsing of windowing controls be done in\nRkISP1::Af::queueRequest() before (or after) having called the common\nclass implementation of queueRequest ?\n>\n> Signed-off-by: Daniel Semkowicz <dse@thaumatec.com>\n> ---\n>  .../libipa/algorithms/af_hill_climbing.cpp    | 52 +++++++++++++++++--\n>  src/ipa/libipa/algorithms/af_hill_climbing.h  | 12 ++++-\n>  2 files changed, 58 insertions(+), 6 deletions(-)\n>\n> diff --git a/src/ipa/libipa/algorithms/af_hill_climbing.cpp b/src/ipa/libipa/algorithms/af_hill_climbing.cpp\n> index 2b99afef..3421f240 100644\n> --- a/src/ipa/libipa/algorithms/af_hill_climbing.cpp\n> +++ b/src/ipa/libipa/algorithms/af_hill_climbing.cpp\n> @@ -83,15 +83,28 @@ int AfHillClimbing::init(const YamlObject &tuningData)\n>   * \\brief Configure the AfHillClimbing with sensor and lens information\n>   * \\param[in] minFocusPosition Minimum position supported by camera lens\n>   * \\param[in] maxFocusPosition Maximum position supported by camera lens\n> + * \\param[in] outputSize Camera sensor output size\n>   *\n>   * This method should be called in the libcamera::ipa::Algorithm::configure()\n>   * method of the platform layer.\n>   */\n>  void AfHillClimbing::configure(int32_t minFocusPosition,\n> -\t\t\t       int32_t maxFocusPosition)\n> +\t\t\t       int32_t maxFocusPosition,\n> +\t\t\t       const Size &outputSize)\n>  {\n>  \tminLensPosition_ = minFocusPosition;\n>  \tmaxLensPosition_ = maxFocusPosition;\n> +\n> +\t/*\n> +\t * Default AF window of 3/4 size of the camera sensor output,\n> +\t * placed at the center\n> +\t */\n> +\tdefaultWindow_ = Rectangle(outputSize.width / 8,\n> +\t\t\t\t   outputSize.height / 8,\n> +\t\t\t\t   3 * outputSize.width / 4,\n> +\t\t\t\t   3 * outputSize.height / 4);\n> +\n> +\twindowUpdateRequested.emit(defaultWindow_);\n>  }\n>\n>  /**\n> @@ -165,6 +178,14 @@ void AfHillClimbing::setFramesToSkip(uint32_t n)\n>  \t\tframesToSkip_ = n;\n>  }\n>\n> +/**\n> + * \\var AfHillClimbing::windowUpdateRequested\n> + * \\brief Signal emitted when change in AF window was requested\n> + *\n> + * Platform layer supporting AF windows should connect to this signal\n> + * and configure the ISP with new window on each emition.\n> + */\n> +\n>  void AfHillClimbing::setMode(controls::AfModeEnum mode)\n>  {\n>  \tif (mode == mode_)\n> @@ -190,14 +211,35 @@ void AfHillClimbing::setSpeed([[maybe_unused]] controls::AfSpeedEnum speed)\n>  \tLOG(Af, Error) << __FUNCTION__ << \" not implemented!\";\n>  }\n>\n> -void AfHillClimbing::setMeteringMode([[maybe_unused]] controls::AfMeteringEnum metering)\n> +void AfHillClimbing::setMeteringMode(controls::AfMeteringEnum metering)\n>  {\n> -\tLOG(Af, Error) << __FUNCTION__ << \" not implemented!\";\n> +\tif (metering == meteringMode_)\n> +\t\treturn;\n> +\n> +\tif (metering == controls::AfMeteringWindows) {\n> +\t\twindowUpdateRequested.emit(userWindow_);\n> +\t} else {\n> +\t\twindowUpdateRequested.emit(defaultWindow_);\n> +\t}\n> +\n> +\tmeteringMode_ = metering;\n>  }\n>\n> -void AfHillClimbing::setWindows([[maybe_unused]] Span<const Rectangle> windows)\n> +void AfHillClimbing::setWindows(Span<const Rectangle> windows)\n>  {\n> -\tLOG(Af, Error) << __FUNCTION__ << \" not implemented!\";\n> +\tif (windows.size() != 1) {\n> +\t\tLOG(Af, Error) << \"Only one AF window is supported\";\n> +\t\treturn;\n> +\t}\n> +\n> +\t/* \\todo Check if window size is valid for ISP */\n> +\n> +\tLOG(Af, Debug) << \"setWindows: \" << windows[0];\n> +\n> +\tuserWindow_ = windows[0];\n> +\n> +\tif (meteringMode_ == controls::AfMeteringWindows)\n> +\t\twindowUpdateRequested.emit(userWindow_);\n>  }\n>\n>  void AfHillClimbing::setTrigger(controls::AfTriggerEnum trigger)\n> diff --git a/src/ipa/libipa/algorithms/af_hill_climbing.h b/src/ipa/libipa/algorithms/af_hill_climbing.h\n> index b361e5a1..4f507010 100644\n> --- a/src/ipa/libipa/algorithms/af_hill_climbing.h\n> +++ b/src/ipa/libipa/algorithms/af_hill_climbing.h\n> @@ -10,6 +10,7 @@\n>  #pragma once\n>\n>  #include <libcamera/base/log.h>\n> +#include <libcamera/base/signal.h>\n>\n>  #include \"af.h\"\n>\n> @@ -25,13 +26,16 @@ class AfHillClimbing : public Af\n>  {\n>  public:\n>  \tint init(const YamlObject &tuningData);\n> -\tvoid configure(int32_t minFocusPosition, int32_t maxFocusPosition);\n> +\tvoid configure(int32_t minFocusPosition, int32_t maxFocusPosition,\n> +\t\t       const Size &outputSize);\n>  \tint32_t process(double currentContrast);\n>  \tvoid setFramesToSkip(uint32_t n);\n>\n>  \tcontrols::AfStateEnum state() final { return state_; }\n>  \tcontrols::AfPauseStateEnum pauseState() final { return pauseState_; }\n>\n> +\tSignal<const Rectangle &> windowUpdateRequested;\n> +\n>  private:\n>  \tvoid setMode(controls::AfModeEnum mode) final;\n>  \tvoid setRange(controls::AfRangeEnum range) final;\n> @@ -54,6 +58,7 @@ private:\n>  \tcontrols::AfModeEnum mode_ = controls::AfModeManual;\n>  \tcontrols::AfStateEnum state_ = controls::AfStateIdle;\n>  \tcontrols::AfPauseStateEnum pauseState_ = controls::AfPauseStateRunning;\n> +\tcontrols::AfMeteringEnum meteringMode_ = controls::AfMeteringAuto;\n>\n>  \t/* VCM step configuration. It is the current setting of the VCM step. */\n>  \tint32_t lensPosition_ = 0;\n> @@ -87,6 +92,11 @@ private:\n>\n>  \t/* Max ratio of variance change, 0.0 < maxChange_ < 1.0 */\n>  \tdouble maxChange_;\n> +\n> +\t/* Default AF window */\n> +\tRectangle defaultWindow_;\n> +\t/* AF window set by user using AF_WINDOWS control */\n> +\tRectangle userWindow_;\n>  };\n>\n>  } /* namespace ipa::common::algorithms */\n> --\n> 2.39.2\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 57A58C0F1B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 20 Mar 2023 20:54:03 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 71624626E3;\n\tMon, 20 Mar 2023 21:54:02 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D7C1061ED4\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 20 Mar 2023 21:54:00 +0100 (CET)","from ideasonboard.com (host-87-18-61-243.retail.telecomitalia.it\n\t[87.18.61.243])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 212EC10A;\n\tMon, 20 Mar 2023 21:54:00 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1679345642;\n\tbh=5eoVCWqJ+AqfBXzNvfL24TvnHuV7Z73bTP/GyZmOYQk=;\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=xz6T0vqpaiFbe/3iC4ABGJjkXbuBMdpwcFKJxMlIIElYwM1PTNF6zPDx7uPq6N4od\n\tqBmSxsLuFD8Pj7jD2YylToqYKWaPN1A9HUQJIoWBUZD8MP1wsy5vUEwl56GWQzqwwV\n\tPtruMJ3zjY1FDOA1S3YtYf3OxOn7t69Sacm4AnPUGVj+lPsjFSk/3VbKze2wvyQ681\n\trIxG34ZiJ5YpQROZyDT+mHQGQbPg5G0Xfas9LpcRc/xvQ8IcFriq10ZDdMxbR7K8mN\n\t4/Hi3V29qd3hHK5EB4Yxo7xa1Mn4eA1P+jxS2ot2aHpsW1DUcJQ29PhqwJfiI4ZMnI\n\t2ZOgLmFmkN7oA==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1679345640;\n\tbh=5eoVCWqJ+AqfBXzNvfL24TvnHuV7Z73bTP/GyZmOYQk=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=prO+JqFusZv3v9eqJseAkv3q4gEqSzTS4I2pAhcrxL0GeElW03nYhuWdXdLvAQN2Y\n\tO9yoMO6SgIqoZmpO8OeNAxeKRL5rulnKD3058vg00kHXrOukrcUXAJmj4bk90qf2zF\n\tuoHp7gXZLAkYRE1/Cf3lWd4bIqLWyixJ2eZLbBdA="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"prO+JqFu\"; dkim-atps=neutral","Date":"Mon, 20 Mar 2023 21:53:56 +0100","To":"Daniel Semkowicz <dse@thaumatec.com>","Message-ID":"<20230320205356.csoprurfxrgn3wlw@uno.localdomain>","References":"<20230314144834.85193-1-dse@thaumatec.com>\n\t<20230314144834.85193-6-dse@thaumatec.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20230314144834.85193-6-dse@thaumatec.com>","Subject":"Re: [libcamera-devel] [PATCH v4 05/10] ipa: af_hill_climbing: Add\n\t\"Windows\" metering mode","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":"Jacopo Mondi via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","Cc":"jacopo.mondi@ideasonboard.com, libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":26692,"web_url":"https://patchwork.libcamera.org/comment/26692/","msgid":"<CAHgnY3kdvPYEDop9uDJNa8PcXR_Ey591KKJWHV5KnhKE3Ksa7Q@mail.gmail.com>","date":"2023-03-21T07:45:13","subject":"Re: [libcamera-devel] [PATCH v4 05/10] ipa: af_hill_climbing: Add\n\t\"Windows\" metering mode","submitter":{"id":126,"url":"https://patchwork.libcamera.org/api/people/126/","name":"Daniel Semkowicz","email":"dse@thaumatec.com"},"content":"Hi Jacopo,\n\nOn Mon, Mar 20, 2023 at 9:54 PM Jacopo Mondi\n<jacopo.mondi@ideasonboard.com> wrote:\n>\n> Hi Daniel\n>\n> On Tue, Mar 14, 2023 at 03:48:29PM +0100, Daniel Semkowicz wrote:\n> > Add support for setting user defined auto focus window in the\n> > AfHillClimbing. This enables usage of AfMetering and AfWindows controls.\n> > Each time, there is a need for changing the window configuration in the\n> > ISP, the signal is emitted. Platform layer that wants to use\n> > the \"Windows\" metering mode, needs to connect to this signal\n> > and configure the ISP on each emission.\n> >\n> > Currently only one window is supported.\n>\n> I wonder... shouldn't window hadling be left to the platform layer ?\n> In other words, should the \"common\" Af::queueRequest() parse the\n> windowing controls and then signal the platform layers, or either\n> should parsing of windowing controls be done in\n> RkISP1::Af::queueRequest() before (or after) having called the common\n> class implementation of queueRequest ?\n\nThere is a simple state machine for window mode. This will need to be\nduplicated in each platform implementation. This is why I see it fits\nbetter in this place.\nDo you see any obstacles that could make this code unusable for other\nplatforms?\n\n> >\n> > Signed-off-by: Daniel Semkowicz <dse@thaumatec.com>\n> > ---\n> >  .../libipa/algorithms/af_hill_climbing.cpp    | 52 +++++++++++++++++--\n> >  src/ipa/libipa/algorithms/af_hill_climbing.h  | 12 ++++-\n> >  2 files changed, 58 insertions(+), 6 deletions(-)\n> >\n> > diff --git a/src/ipa/libipa/algorithms/af_hill_climbing.cpp b/src/ipa/libipa/algorithms/af_hill_climbing.cpp\n> > index 2b99afef..3421f240 100644\n> > --- a/src/ipa/libipa/algorithms/af_hill_climbing.cpp\n> > +++ b/src/ipa/libipa/algorithms/af_hill_climbing.cpp\n> > @@ -83,15 +83,28 @@ int AfHillClimbing::init(const YamlObject &tuningData)\n> >   * \\brief Configure the AfHillClimbing with sensor and lens information\n> >   * \\param[in] minFocusPosition Minimum position supported by camera lens\n> >   * \\param[in] maxFocusPosition Maximum position supported by camera lens\n> > + * \\param[in] outputSize Camera sensor output size\n> >   *\n> >   * This method should be called in the libcamera::ipa::Algorithm::configure()\n> >   * method of the platform layer.\n> >   */\n> >  void AfHillClimbing::configure(int32_t minFocusPosition,\n> > -                            int32_t maxFocusPosition)\n> > +                            int32_t maxFocusPosition,\n> > +                            const Size &outputSize)\n> >  {\n> >       minLensPosition_ = minFocusPosition;\n> >       maxLensPosition_ = maxFocusPosition;\n> > +\n> > +     /*\n> > +      * Default AF window of 3/4 size of the camera sensor output,\n> > +      * placed at the center\n> > +      */\n> > +     defaultWindow_ = Rectangle(outputSize.width / 8,\n> > +                                outputSize.height / 8,\n> > +                                3 * outputSize.width / 4,\n> > +                                3 * outputSize.height / 4);\n> > +\n> > +     windowUpdateRequested.emit(defaultWindow_);\n> >  }\n> >\n> >  /**\n> > @@ -165,6 +178,14 @@ void AfHillClimbing::setFramesToSkip(uint32_t n)\n> >               framesToSkip_ = n;\n> >  }\n> >\n> > +/**\n> > + * \\var AfHillClimbing::windowUpdateRequested\n> > + * \\brief Signal emitted when change in AF window was requested\n> > + *\n> > + * Platform layer supporting AF windows should connect to this signal\n> > + * and configure the ISP with new window on each emition.\n> > + */\n> > +\n> >  void AfHillClimbing::setMode(controls::AfModeEnum mode)\n> >  {\n> >       if (mode == mode_)\n> > @@ -190,14 +211,35 @@ void AfHillClimbing::setSpeed([[maybe_unused]] controls::AfSpeedEnum speed)\n> >       LOG(Af, Error) << __FUNCTION__ << \" not implemented!\";\n> >  }\n> >\n> > -void AfHillClimbing::setMeteringMode([[maybe_unused]] controls::AfMeteringEnum metering)\n> > +void AfHillClimbing::setMeteringMode(controls::AfMeteringEnum metering)\n> >  {\n> > -     LOG(Af, Error) << __FUNCTION__ << \" not implemented!\";\n> > +     if (metering == meteringMode_)\n> > +             return;\n> > +\n> > +     if (metering == controls::AfMeteringWindows) {\n> > +             windowUpdateRequested.emit(userWindow_);\n> > +     } else {\n> > +             windowUpdateRequested.emit(defaultWindow_);\n> > +     }\n> > +\n> > +     meteringMode_ = metering;\n> >  }\n> >\n> > -void AfHillClimbing::setWindows([[maybe_unused]] Span<const Rectangle> windows)\n> > +void AfHillClimbing::setWindows(Span<const Rectangle> windows)\n> >  {\n> > -     LOG(Af, Error) << __FUNCTION__ << \" not implemented!\";\n> > +     if (windows.size() != 1) {\n> > +             LOG(Af, Error) << \"Only one AF window is supported\";\n> > +             return;\n> > +     }\n> > +\n> > +     /* \\todo Check if window size is valid for ISP */\n> > +\n> > +     LOG(Af, Debug) << \"setWindows: \" << windows[0];\n> > +\n> > +     userWindow_ = windows[0];\n> > +\n> > +     if (meteringMode_ == controls::AfMeteringWindows)\n> > +             windowUpdateRequested.emit(userWindow_);\n> >  }\n> >\n> >  void AfHillClimbing::setTrigger(controls::AfTriggerEnum trigger)\n> > diff --git a/src/ipa/libipa/algorithms/af_hill_climbing.h b/src/ipa/libipa/algorithms/af_hill_climbing.h\n> > index b361e5a1..4f507010 100644\n> > --- a/src/ipa/libipa/algorithms/af_hill_climbing.h\n> > +++ b/src/ipa/libipa/algorithms/af_hill_climbing.h\n> > @@ -10,6 +10,7 @@\n> >  #pragma once\n> >\n> >  #include <libcamera/base/log.h>\n> > +#include <libcamera/base/signal.h>\n> >\n> >  #include \"af.h\"\n> >\n> > @@ -25,13 +26,16 @@ class AfHillClimbing : public Af\n> >  {\n> >  public:\n> >       int init(const YamlObject &tuningData);\n> > -     void configure(int32_t minFocusPosition, int32_t maxFocusPosition);\n> > +     void configure(int32_t minFocusPosition, int32_t maxFocusPosition,\n> > +                    const Size &outputSize);\n> >       int32_t process(double currentContrast);\n> >       void setFramesToSkip(uint32_t n);\n> >\n> >       controls::AfStateEnum state() final { return state_; }\n> >       controls::AfPauseStateEnum pauseState() final { return pauseState_; }\n> >\n> > +     Signal<const Rectangle &> windowUpdateRequested;\n> > +\n> >  private:\n> >       void setMode(controls::AfModeEnum mode) final;\n> >       void setRange(controls::AfRangeEnum range) final;\n> > @@ -54,6 +58,7 @@ private:\n> >       controls::AfModeEnum mode_ = controls::AfModeManual;\n> >       controls::AfStateEnum state_ = controls::AfStateIdle;\n> >       controls::AfPauseStateEnum pauseState_ = controls::AfPauseStateRunning;\n> > +     controls::AfMeteringEnum meteringMode_ = controls::AfMeteringAuto;\n> >\n> >       /* VCM step configuration. It is the current setting of the VCM step. */\n> >       int32_t lensPosition_ = 0;\n> > @@ -87,6 +92,11 @@ private:\n> >\n> >       /* Max ratio of variance change, 0.0 < maxChange_ < 1.0 */\n> >       double maxChange_;\n> > +\n> > +     /* Default AF window */\n> > +     Rectangle defaultWindow_;\n> > +     /* AF window set by user using AF_WINDOWS control */\n> > +     Rectangle userWindow_;\n> >  };\n> >\n> >  } /* namespace ipa::common::algorithms */\n> > --\n> > 2.39.2\n> >\n\nBest regards\nDaniel","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 17360C0F2A\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 21 Mar 2023 07:45:27 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 32218626E3;\n\tTue, 21 Mar 2023 08:45:26 +0100 (CET)","from mail-ed1-x531.google.com (mail-ed1-x531.google.com\n\t[IPv6:2a00:1450:4864:20::531])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id CAF0261ECE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 21 Mar 2023 08:45:24 +0100 (CET)","by mail-ed1-x531.google.com with SMTP id x3so56057524edb.10\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 21 Mar 2023 00:45:24 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1679384726;\n\tbh=9zf6kr/xAvBCaCsPlrpAKPThHUlVNHFkUxxL7p3NKDc=;\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=UVfMSVCluJODZkneHESvxkGFsgKQlCxIosH5AlIaByGtTRlmgmyzdWENeTagyjBYj\n\tHwNzhs3HubcEnoZwwAvrko3kFfqEcoRujhWo+m1ObyH4feqX1pLjD4W4eJR5Ob63vx\n\tX/Wuifk0bX1nFHUlzgoDnROqkVM1/Rt8XOSXnWgfzmi8YgTYbZv1gnq4hYupJJAObd\n\tsWlQz/eJ5ejRB9BigUtmdZ3aIWXyWW3+lag1FvFdVWBcHyTQGecpkVaRqIeBvqec76\n\tYRzR9tuPSZwyNXBHar3CcjkdBoJC2talmRz5TuL4iynVLW4rc4hf94RMYzU+5Hdw5z\n\tKM9nIuchXwnyg==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=thaumatec-com.20210112.gappssmtp.com; s=20210112; t=1679384724;\n\th=content-transfer-encoding:cc:to:subject:message-id:date:from\n\t:in-reply-to:references:mime-version:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=yi5ptbruOD4ET9fSHvXEZGdnzO8bkmcnjJLZXKafeLg=;\n\tb=osHvNjT+8g75j1+6T9GXh+U9nNT4S3q9qX5gx7SUhPB5C/bJ2LeNksa+lfqUtF0LYj\n\tKmLbw9z53FqT0iSjvb3AEXHimn3Y4D2b8IyyroXnv9oj4JtiisVGJfZ1xwmmz4C+WkR2\n\tHMCx9savsMp+Uy2wreJlmDLiO0OROQLSGxLfWC/gC8DlmWQoovTmHTJWiLnoL1p24Qls\n\tCxihxPSASPU4Z8As9Jp7a7/fzm9ImqRvz/vUbKSpEwwTdJi1kg1FX+EsduvLuaoWmpKY\n\t6muy4p3k7k3bwdqrtabzIZtt/EXQ4wxUuQzcnAi+BBv3Q1UXcBqhnN3lPFPVtBJzdvwT\n\tGFGA=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected)\n\theader.d=thaumatec-com.20210112.gappssmtp.com\n\theader.i=@thaumatec-com.20210112.gappssmtp.com header.b=\"osHvNjT+\"; \n\tdkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112; t=1679384724;\n\th=content-transfer-encoding:cc:to:subject:message-id:date:from\n\t:in-reply-to:references:mime-version:x-gm-message-state:from:to:cc\n\t:subject:date:message-id:reply-to;\n\tbh=yi5ptbruOD4ET9fSHvXEZGdnzO8bkmcnjJLZXKafeLg=;\n\tb=HC4UT77Qp47eeLoxF3XDTMxJ1RQtxTb+nbcWS9PPPfZPSjhp5GC8DZuOgbCEh4vALj\n\t5H+fmdvJe/0NiloTbhOdNV7pLK9zKFhB3RrvHJ6Zsee4OzMyIL15nFT8bB2lGXa6umm0\n\t2ID5C7URZWJS+Q5XX0sEoyeciFfcOZjIu0JQ+xdRvrKHfIpJoQBRjhKm1Vt8RwPphto9\n\tOsfQ58R8OggDS7P6IzBO9f3FFkg3pLYV2EplHyI7h+crLwuuNz8+oZlBz/3933Km1yIy\n\tO2mSfSZt+jBAjsyPwbHW1U+pvhDRcACjQ4Otky2BgDfLmHKvbMOF9C9/wIkjGU6XZBGR\n\t+5EA==","X-Gm-Message-State":"AO0yUKUnm7Zd8semB6NFBe64stxFkhmgWsWqC9GW1rEHjCm1zrQNDQ7q\n\tjJ1fn/fiBf0Q2jGBkSR9ESMQhd04ce5Sxy4e2yYp8Q==","X-Google-Smtp-Source":"AK7set/ObaG5u3RqEcjmC0rVEAgO9kS6qtFoBSldfhV6xCuLx1Y/2kwqg2yohyUMt+CqlkhDZhmTYF5yiUdSvz2467U=","X-Received":"by 2002:a17:907:788e:b0:932:4577:6705 with SMTP id\n\tku14-20020a170907788e00b0093245776705mr905930ejc.6.1679384724264;\n\tTue, 21 Mar 2023 00:45:24 -0700 (PDT)","MIME-Version":"1.0","References":"<20230314144834.85193-1-dse@thaumatec.com>\n\t<20230314144834.85193-6-dse@thaumatec.com>\n\t<20230320205356.csoprurfxrgn3wlw@uno.localdomain>","In-Reply-To":"<20230320205356.csoprurfxrgn3wlw@uno.localdomain>","Date":"Tue, 21 Mar 2023 08:45:13 +0100","Message-ID":"<CAHgnY3kdvPYEDop9uDJNa8PcXR_Ey591KKJWHV5KnhKE3Ksa7Q@mail.gmail.com>","To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable","Subject":"Re: [libcamera-devel] [PATCH v4 05/10] ipa: af_hill_climbing: Add\n\t\"Windows\" metering mode","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":"Daniel Semkowicz via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Daniel Semkowicz <dse@thaumatec.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]