[{"id":13741,"web_url":"https://patchwork.libcamera.org/comment/13741/","msgid":"<CAEmqJPoHd=cvy1dGwD1z_fmSZcmnQ5yVBan7BdSE3FSa_EzF2Q@mail.gmail.com>","date":"2020-11-17T11:05:54","subject":"Re: [libcamera-devel] [PATCH 10/10] libcamera: src: ipa:\n\traspberrypi: agc: Improve AE locked logic","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi David,\n\nOn Mon, 16 Nov 2020 at 16:49, David Plowman <david.plowman@raspberrypi.com>\nwrote:\n\n> Previously we required that the sensor absolutely reaches the target\n> exposure, but this can fail if frame rates or analogue gains are\n> limited. Instead insist only that we get several frames with the same\n> exposure time, analogue gain and that the algorithm's target exposure\n> hasn't changed either.\n>\n> Signed-off-by: David Plowman <david.plowman@raspberrypi.com>\n> ---\n>  src/ipa/raspberrypi/controller/rpi/agc.cpp | 65 +++++++++++++---------\n>  src/ipa/raspberrypi/controller/rpi/agc.hpp |  3 +\n>  2 files changed, 42 insertions(+), 26 deletions(-)\n>\n> diff --git a/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> index 93b46a28..7be74763 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> @@ -164,6 +164,8 @@ Agc::Agc(Controller *controller)\n>         flicker_period_ = 0.0;\n>         fixed_shutter_ = 0;\n>         fixed_analogue_gain_ = 0.0;\n> +       memset(&last_device_status_, 0, sizeof(last_device_status_));\n> +       last_target_exposure_ = 0.0;\n>\n\nSet last_target_exposure_ in the initialiser list?\n\n\n>  }\n>\n>  char const *Agc::Name() const\n> @@ -264,8 +266,6 @@ void Agc::SwitchMode([[maybe_unused]] CameraMode const\n> &camera_mode,\n>\n>  void Agc::Prepare(Metadata *image_metadata)\n>  {\n> -       int lock_count = lock_count_;\n> -       lock_count_ = 0;\n>         status_.digital_gain = 1.0;\n>         fetchAwbStatus(image_metadata); // always fetch it so that Process\n> knows it's been done\n>\n> @@ -289,32 +289,10 @@ void Agc::Prepare(Metadata *image_metadata)\n>                                 LOG(RPiAgc, Debug) << \"Use digital_gain \"\n> << status_.digital_gain;\n>                                 LOG(RPiAgc, Debug) << \"Effective exposure\n> \" << actual_exposure * status_.digital_gain;\n>                                 // Decide whether AEC/AGC has converged.\n> -                               // Insist AGC is steady for MAX_LOCK_COUNT\n> -                               // frames before we say we are \"locked\".\n> -                               // (The hard-coded constants may need to\n> -                               // become customisable.)\n> -                               if (status_.target_exposure_value) {\n> -#define MAX_LOCK_COUNT 3\n> -                                       double err = 0.10 *\n> status_.target_exposure_value + 200;\n> -                                       if (actual_exposure <\n> -\n>  status_.target_exposure_value + err &&\n> -                                           actual_exposure >\n> -\n>  status_.target_exposure_value - err)\n> -                                               lock_count_ =\n> -\n>  std::min(lock_count + 1,\n> -\n> MAX_LOCK_COUNT);\n> -                                       else if (actual_exposure <\n> -\n> status_.target_exposure_value + 1.5 * err &&\n> -                                                actual_exposure >\n> -\n> status_.target_exposure_value - 1.5 * err)\n> -                                               lock_count_ = lock_count;\n> -                                       LOG(RPiAgc, Debug) << \"Lock count:\n> \" << lock_count_;\n> -                               }\n> +                               updateLockStatus(device_status);\n>                         }\n>                 } else\n> -                       LOG(RPiAgc, Debug) << Name() << \": no device\n> metadata\";\n> -               status_.locked = lock_count_ >= MAX_LOCK_COUNT;\n> -               //printf(\"%s\\n\", status_.locked ? \"+++++++++\" : \"-\");\n> +                       LOG(RPiAgc, Warning) << Name() << \": no device\n> metadata\";\n>                 image_metadata->Set(\"agc.status\", status_);\n>         }\n>  }\n> @@ -345,6 +323,41 @@ void Agc::Process(StatisticsPtr &stats, Metadata\n> *image_metadata)\n>         writeAndFinish(image_metadata, desaturate);\n>  }\n>\n> +void Agc::updateLockStatus(DeviceStatus const &device_status)\n> +{\n> +       const double ERROR_FACTOR = 0.10; // make these customisable?\n> +       const int MAX_LOCK_COUNT = 5;\n> +\n> +       // Add 200us to the exposure time error to allow for line\n> quantisation.\n> +       double exposure_error = last_device_status_.shutter_speed *\n> ERROR_FACTOR + 200;\n> +       double gain_error = last_device_status_.analogue_gain *\n> ERROR_FACTOR;\n> +       double target_error = last_target_exposure_ * ERROR_FACTOR;\n> +\n> +       // Note that we don't know the exposure/gain limits of the sensor,\n> so\n> +       // the values we keep requesting may be unachievable. For this\n> reason\n> +       // we only insist that we're close to values in the past few\n> frames.\n> +       if (device_status.shutter_speed >\n> last_device_status_.shutter_speed - exposure_error &&\n> +           device_status.shutter_speed <\n> last_device_status_.shutter_speed + exposure_error &&\n> +           device_status.analogue_gain >\n> last_device_status_.analogue_gain - gain_error &&\n> +           device_status.analogue_gain <\n> last_device_status_.analogue_gain + gain_error &&\n> +           status_.target_exposure_value > last_target_exposure_ -\n> target_error &&\n> +           status_.target_exposure_value < last_target_exposure_ +\n> target_error)\n> +               lock_count_ = std::min(lock_count_ + 1, MAX_LOCK_COUNT);\n> +       else if (device_status.shutter_speed <\n> last_device_status_.shutter_speed - 1.5 * exposure_error ||\n> +                device_status.shutter_speed >\n> last_device_status_.shutter_speed + 1.5 * exposure_error ||\n> +                device_status.analogue_gain <\n> last_device_status_.analogue_gain - 1.5 * gain_error ||\n> +                device_status.analogue_gain >\n> last_device_status_.analogue_gain + 1.5 * gain_error ||\n> +                status_.target_exposure_value < last_target_exposure_ -\n> 1.5 * target_error ||\n> +                status_.target_exposure_value > last_target_exposure_ +\n> 1.5 * target_error)\n> +               lock_count_ = 0;\n>\n\nDoes the 1.5 factor need to be a const?\n\n\n> +\n> +       last_device_status_ = device_status;\n> +       last_target_exposure_ = status_.target_exposure_value;\n> +\n> +       LOG(RPiAgc, Debug) << \"Lock count updated to \" << lock_count_;\n> +       status_.locked = lock_count_ >= MAX_LOCK_COUNT;\n>\n\nOnly need a == here :)\n\n\n> +}\n> +\n>  static void copy_string(std::string const &s, char *d, size_t size)\n>  {\n>         size_t length = s.copy(d, size - 1);\n> diff --git a/src/ipa/raspberrypi/controller/rpi/agc.hpp\n> b/src/ipa/raspberrypi/controller/rpi/agc.hpp\n> index 859a9650..47ebb324 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/agc.hpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/agc.hpp\n> @@ -82,6 +82,7 @@ public:\n>         void Process(StatisticsPtr &stats, Metadata *image_metadata)\n> override;\n>\n>  private:\n> +       void updateLockStatus(DeviceStatus const &device_status);\n>         AgcConfig config_;\n>         void housekeepConfig();\n>         void fetchCurrentExposure(Metadata *image_metadata);\n> @@ -111,6 +112,8 @@ private:\n>         ExposureValues filtered_; // these values are filtered towards\n> target\n>         AgcStatus status_;\n>         int lock_count_;\n> +       DeviceStatus last_device_status_;\n> +       double last_target_exposure_;\n>         // Below here the \"settings\" that applications can change.\n>         std::string metering_mode_name_;\n>         std::string exposure_mode_name_;\n> --\n> 2.20.1\n>\n\nApart from the minor nits:\n\nReviewed-by: Naushir Patuck <naush@raspberrypi.com>\n\n\n>\n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel\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 57012BE082\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 17 Nov 2020 11:06:12 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 243C66332C;\n\tTue, 17 Nov 2020 12:06:12 +0100 (CET)","from mail-lf1-x142.google.com (mail-lf1-x142.google.com\n\t[IPv6:2a00:1450:4864:20::142])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 4A9E56033B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 17 Nov 2020 12:06:11 +0100 (CET)","by mail-lf1-x142.google.com with SMTP id w142so29483518lff.8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 17 Nov 2020 03:06:11 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=raspberrypi.com header.i=@raspberrypi.com\n\theader.b=\"OjDATxLv\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=mime-version:references:in-reply-to:from:date:message-id:subject:to\n\t:cc; bh=QVXd+6+l9kEUNLsVApB/I+kGMTVtJf4tzKSY0dpMuhE=;\n\tb=OjDATxLvy1b02Ct8k2VgK40Cj1nP7N1ussnREU2Xo8F3JQYe1XLxUK0xntYqgoPULj\n\twNHtBlYYUYJzeXIuuE21brRarfGHYZdunoZhK+A9zNZdg//ZReann558HHJe4IrngsI2\n\tknDiEwSjzZqLJBlyb8iNphjAxCxkvRd5rhBKFyIM3LSna52Ml+/31TE8oKtYnH0wseua\n\tQDx1M8ixWxe/o9wXXROge1cN//lfNo8HP/yO88edBVcnyGkpAMcXL06VnxE5yPUG3bxH\n\tPMwswwWjmQt8cCW1T9mbKapIK57+I03qeD9Q78/kTP1yokBW1HmZbOM9heTr7MJPTPtD\n\ti+Zw==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=QVXd+6+l9kEUNLsVApB/I+kGMTVtJf4tzKSY0dpMuhE=;\n\tb=WyXlPc1iSCDpKbdKUXKjqLQ4GnzaGujFG1KOSfCESYEXbUHOqfb3c6sE98ZsdvnBBC\n\tJeOGCwbmKy6ord8OM/T+y9QV+oGkx8xDbSf0dWTR8KZ/0uuJY4T027RVBD6RJnPy7C7S\n\t62kX49ecZzF/BN6KD1TchRH+LT76zSKbgui6r2Kdxs+DV8vMx2MqFU0l7Br0blOqPYLd\n\tnAYP+NG457M04md3Kd0R1B9ZOfMp2akuDSv3KEn9rJPkoN9udzWuq/VmD005q+xHCSYD\n\tMFFmB4LJRwB+5/U9FT9ZrgwO+4PmQZJBhExylGYBREKho0dLhiiv8dO5wdqh4Ar6NRQl\n\tZGLg==","X-Gm-Message-State":"AOAM531rogLz4bHuzzocdJhoZYGxyiHtc0QkWZA+Je4bHSC8WkAf+RUB\n\tfL9M2GD4WmsyxSqCrqYRakRPZrv2dK2fHBfkVJ4u0lYLbxM=","X-Google-Smtp-Source":"ABdhPJybjZxaMiN+ckUiwWOY7hmXojxcrdw1jnVqyzYSZ8ZoSF/U1qlKNgBGUaVX1d6dTdpHJF9wH2lekVMSbFeBJRM=","X-Received":"by 2002:a05:6512:4c5:: with SMTP id\n\tw5mr1510838lfq.215.1605611170782; \n\tTue, 17 Nov 2020 03:06:10 -0800 (PST)","MIME-Version":"1.0","References":"<20201116164918.2055-1-david.plowman@raspberrypi.com>\n\t<20201116164918.2055-11-david.plowman@raspberrypi.com>","In-Reply-To":"<20201116164918.2055-11-david.plowman@raspberrypi.com>","From":"Naushir Patuck <naush@raspberrypi.com>","Date":"Tue, 17 Nov 2020 11:05:54 +0000","Message-ID":"<CAEmqJPoHd=cvy1dGwD1z_fmSZcmnQ5yVBan7BdSE3FSa_EzF2Q@mail.gmail.com>","To":"David Plowman <david.plowman@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH 10/10] libcamera: src: ipa:\n\traspberrypi: agc: Improve AE locked logic","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"multipart/mixed;\n\tboundary=\"===============8219174428669929520==\"","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":13793,"web_url":"https://patchwork.libcamera.org/comment/13793/","msgid":"<CAHW6GYJ8vux3dRuhSpA749J=a5s1X06sQE2hmJyTXRm4Tij54A@mail.gmail.com>","date":"2020-11-18T22:11:21","subject":"Re: [libcamera-devel] [PATCH 10/10] libcamera: src: ipa:\n\traspberrypi: agc: Improve AE locked logic","submitter":{"id":42,"url":"https://patchwork.libcamera.org/api/people/42/","name":"David Plowman","email":"david.plowman@raspberrypi.com"},"content":"Hi Naush\n\nThanks for the feedback on all those patches. I'll try and push an\nupdated version out on Friday with those fixes, plus any other\ncomments that arrive!\n\nDavid\n\nOn Tue, 17 Nov 2020 at 11:06, Naushir Patuck <naush@raspberrypi.com> wrote:\n>\n> Hi David,\n>\n> On Mon, 16 Nov 2020 at 16:49, David Plowman <david.plowman@raspberrypi.com> wrote:\n>>\n>> Previously we required that the sensor absolutely reaches the target\n>> exposure, but this can fail if frame rates or analogue gains are\n>> limited. Instead insist only that we get several frames with the same\n>> exposure time, analogue gain and that the algorithm's target exposure\n>> hasn't changed either.\n>>\n>> Signed-off-by: David Plowman <david.plowman@raspberrypi.com>\n>> ---\n>>  src/ipa/raspberrypi/controller/rpi/agc.cpp | 65 +++++++++++++---------\n>>  src/ipa/raspberrypi/controller/rpi/agc.hpp |  3 +\n>>  2 files changed, 42 insertions(+), 26 deletions(-)\n>>\n>> diff --git a/src/ipa/raspberrypi/controller/rpi/agc.cpp b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n>> index 93b46a28..7be74763 100644\n>> --- a/src/ipa/raspberrypi/controller/rpi/agc.cpp\n>> +++ b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n>> @@ -164,6 +164,8 @@ Agc::Agc(Controller *controller)\n>>         flicker_period_ = 0.0;\n>>         fixed_shutter_ = 0;\n>>         fixed_analogue_gain_ = 0.0;\n>> +       memset(&last_device_status_, 0, sizeof(last_device_status_));\n>> +       last_target_exposure_ = 0.0;\n>\n>\n> Set last_target_exposure_ in the initialiser list?\n>\n>>\n>>  }\n>>\n>>  char const *Agc::Name() const\n>> @@ -264,8 +266,6 @@ void Agc::SwitchMode([[maybe_unused]] CameraMode const &camera_mode,\n>>\n>>  void Agc::Prepare(Metadata *image_metadata)\n>>  {\n>> -       int lock_count = lock_count_;\n>> -       lock_count_ = 0;\n>>         status_.digital_gain = 1.0;\n>>         fetchAwbStatus(image_metadata); // always fetch it so that Process knows it's been done\n>>\n>> @@ -289,32 +289,10 @@ void Agc::Prepare(Metadata *image_metadata)\n>>                                 LOG(RPiAgc, Debug) << \"Use digital_gain \" << status_.digital_gain;\n>>                                 LOG(RPiAgc, Debug) << \"Effective exposure \" << actual_exposure * status_.digital_gain;\n>>                                 // Decide whether AEC/AGC has converged.\n>> -                               // Insist AGC is steady for MAX_LOCK_COUNT\n>> -                               // frames before we say we are \"locked\".\n>> -                               // (The hard-coded constants may need to\n>> -                               // become customisable.)\n>> -                               if (status_.target_exposure_value) {\n>> -#define MAX_LOCK_COUNT 3\n>> -                                       double err = 0.10 * status_.target_exposure_value + 200;\n>> -                                       if (actual_exposure <\n>> -                                                   status_.target_exposure_value + err &&\n>> -                                           actual_exposure >\n>> -                                                   status_.target_exposure_value - err)\n>> -                                               lock_count_ =\n>> -                                                       std::min(lock_count + 1,\n>> -                                                                MAX_LOCK_COUNT);\n>> -                                       else if (actual_exposure <\n>> -                                                        status_.target_exposure_value + 1.5 * err &&\n>> -                                                actual_exposure >\n>> -                                                        status_.target_exposure_value - 1.5 * err)\n>> -                                               lock_count_ = lock_count;\n>> -                                       LOG(RPiAgc, Debug) << \"Lock count: \" << lock_count_;\n>> -                               }\n>> +                               updateLockStatus(device_status);\n>>                         }\n>>                 } else\n>> -                       LOG(RPiAgc, Debug) << Name() << \": no device metadata\";\n>> -               status_.locked = lock_count_ >= MAX_LOCK_COUNT;\n>> -               //printf(\"%s\\n\", status_.locked ? \"+++++++++\" : \"-\");\n>> +                       LOG(RPiAgc, Warning) << Name() << \": no device metadata\";\n>>                 image_metadata->Set(\"agc.status\", status_);\n>>         }\n>>  }\n>> @@ -345,6 +323,41 @@ void Agc::Process(StatisticsPtr &stats, Metadata *image_metadata)\n>>         writeAndFinish(image_metadata, desaturate);\n>>  }\n>>\n>> +void Agc::updateLockStatus(DeviceStatus const &device_status)\n>> +{\n>> +       const double ERROR_FACTOR = 0.10; // make these customisable?\n>> +       const int MAX_LOCK_COUNT = 5;\n>> +\n>> +       // Add 200us to the exposure time error to allow for line quantisation.\n>> +       double exposure_error = last_device_status_.shutter_speed * ERROR_FACTOR + 200;\n>> +       double gain_error = last_device_status_.analogue_gain * ERROR_FACTOR;\n>> +       double target_error = last_target_exposure_ * ERROR_FACTOR;\n>> +\n>> +       // Note that we don't know the exposure/gain limits of the sensor, so\n>> +       // the values we keep requesting may be unachievable. For this reason\n>> +       // we only insist that we're close to values in the past few frames.\n>> +       if (device_status.shutter_speed > last_device_status_.shutter_speed - exposure_error &&\n>> +           device_status.shutter_speed < last_device_status_.shutter_speed + exposure_error &&\n>> +           device_status.analogue_gain > last_device_status_.analogue_gain - gain_error &&\n>> +           device_status.analogue_gain < last_device_status_.analogue_gain + gain_error &&\n>> +           status_.target_exposure_value > last_target_exposure_ - target_error &&\n>> +           status_.target_exposure_value < last_target_exposure_ + target_error)\n>> +               lock_count_ = std::min(lock_count_ + 1, MAX_LOCK_COUNT);\n>> +       else if (device_status.shutter_speed < last_device_status_.shutter_speed - 1.5 * exposure_error ||\n>> +                device_status.shutter_speed > last_device_status_.shutter_speed + 1.5 * exposure_error ||\n>> +                device_status.analogue_gain < last_device_status_.analogue_gain - 1.5 * gain_error ||\n>> +                device_status.analogue_gain > last_device_status_.analogue_gain + 1.5 * gain_error ||\n>> +                status_.target_exposure_value < last_target_exposure_ - 1.5 * target_error ||\n>> +                status_.target_exposure_value > last_target_exposure_ + 1.5 * target_error)\n>> +               lock_count_ = 0;\n>\n>\n> Does the 1.5 factor need to be a const?\n>\n>>\n>> +\n>> +       last_device_status_ = device_status;\n>> +       last_target_exposure_ = status_.target_exposure_value;\n>> +\n>> +       LOG(RPiAgc, Debug) << \"Lock count updated to \" << lock_count_;\n>> +       status_.locked = lock_count_ >= MAX_LOCK_COUNT;\n>\n>\n> Only need a == here :)\n>\n>>\n>> +}\n>> +\n>>  static void copy_string(std::string const &s, char *d, size_t size)\n>>  {\n>>         size_t length = s.copy(d, size - 1);\n>> diff --git a/src/ipa/raspberrypi/controller/rpi/agc.hpp b/src/ipa/raspberrypi/controller/rpi/agc.hpp\n>> index 859a9650..47ebb324 100644\n>> --- a/src/ipa/raspberrypi/controller/rpi/agc.hpp\n>> +++ b/src/ipa/raspberrypi/controller/rpi/agc.hpp\n>> @@ -82,6 +82,7 @@ public:\n>>         void Process(StatisticsPtr &stats, Metadata *image_metadata) override;\n>>\n>>  private:\n>> +       void updateLockStatus(DeviceStatus const &device_status);\n>>         AgcConfig config_;\n>>         void housekeepConfig();\n>>         void fetchCurrentExposure(Metadata *image_metadata);\n>> @@ -111,6 +112,8 @@ private:\n>>         ExposureValues filtered_; // these values are filtered towards target\n>>         AgcStatus status_;\n>>         int lock_count_;\n>> +       DeviceStatus last_device_status_;\n>> +       double last_target_exposure_;\n>>         // Below here the \"settings\" that applications can change.\n>>         std::string metering_mode_name_;\n>>         std::string exposure_mode_name_;\n>> --\n>> 2.20.1\n>\n>\n> Apart from the minor nits:\n>\n> Reviewed-by: Naushir Patuck <naush@raspberrypi.com>\n>\n>>\n>>\n>> _______________________________________________\n>> libcamera-devel mailing list\n>> libcamera-devel@lists.libcamera.org\n>> https://lists.libcamera.org/listinfo/libcamera-devel","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 39C30BE08A\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 18 Nov 2020 22:11:35 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id A34347E9B0;\n\tWed, 18 Nov 2020 23:11:34 +0100 (CET)","from mail-ot1-x343.google.com (mail-ot1-x343.google.com\n\t[IPv6:2607:f8b0:4864:20::343])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 2B6A763092\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 18 Nov 2020 23:11:33 +0100 (CET)","by mail-ot1-x343.google.com with SMTP id o3so3362241ota.8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 18 Nov 2020 14:11:32 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=raspberrypi.com header.i=@raspberrypi.com\n\theader.b=\"dsD0nol3\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=mime-version:references:in-reply-to:from:date:message-id:subject:to\n\t:cc; bh=AMKTgul03dcy705eyCe+izWtgTERtdtkFhj/QsqTFFQ=;\n\tb=dsD0nol3WFPrQ4MH4T+2jfD+O2ZArpqGrkbx+B+QipVSMeoAkxmE1Tz0mOra4L6s/5\n\t3+ox4Btrr38vg5fXz7dMzQNLlNCASe4nR3M03czGsYzQqwvnnveG0EAgYiVmIGZ6PWHG\n\tGBC9M3AKthH18bsvXVoaXJO1bBQxe1Dj+/94YiyngbyZzqgozOS+oMtnNa5L44EzwoYK\n\tmzqCrY/YxzrDw1eqNeRCMECAdB58MSffrO6imRpRSiUh0U3bjQvwdAMe32paro8OH4hs\n\teFCZdV3acZR1OIH3e5AUW9zAjojsm1rnduJocb3Yx1NLhSVuJzBRJG6qWHZcqGDFo2UG\n\t4v2g==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=AMKTgul03dcy705eyCe+izWtgTERtdtkFhj/QsqTFFQ=;\n\tb=V6BUF4VtDFVIPoqchgZAIMnLeCuKayCHrJZ56bnmP96IcLTtBEmsK7TsvjEfdxYOgg\n\tKqHs1ApMjfZYcq/+a4CjjttsSpkcsohQYRjsQamhj+ltNrOtphWMWNt5HyPeIXBau1XM\n\txinIYm8oHvrEIxiFj39GA5qUYZ/ZzQMnajGhsPvSVVBrrGFs6kegDmVH4id7pQ8ANy8j\n\tY3G1ANgvvgahE0wdrFBN6Zn7USCZcFzF53q1aeUnCN+YpmZlONpo6191J/BjAqAFi8j9\n\t9Rr5aD/bLwtisqvqwhLopOwZegXIE+3X1RoTIxjpAGMPyTjLVEnM18bgYkCGWx8hXwr+\n\ty73Q==","X-Gm-Message-State":"AOAM530BdhljgRuQ+38Icc1FAITMmtQcHmkgqlRTgVZ5MiHWXnwF2ucA\n\t1XYusZQtZ9aTVcdz720M0Azph9SZD8FyrA8trjjeCA==","X-Google-Smtp-Source":"ABdhPJwjnr4QjbGjwerPs5Cl+3f/T2KteaqjpGbHyni7JmP+CP2OJE/m5Pi4YzK7aCM1OFblb6cjm4E/RG/mM/nX52k=","X-Received":"by 2002:a9d:6f8f:: with SMTP id\n\th15mr8165874otq.166.1605737491511; \n\tWed, 18 Nov 2020 14:11:31 -0800 (PST)","MIME-Version":"1.0","References":"<20201116164918.2055-1-david.plowman@raspberrypi.com>\n\t<20201116164918.2055-11-david.plowman@raspberrypi.com>\n\t<CAEmqJPoHd=cvy1dGwD1z_fmSZcmnQ5yVBan7BdSE3FSa_EzF2Q@mail.gmail.com>","In-Reply-To":"<CAEmqJPoHd=cvy1dGwD1z_fmSZcmnQ5yVBan7BdSE3FSa_EzF2Q@mail.gmail.com>","From":"David Plowman <david.plowman@raspberrypi.com>","Date":"Wed, 18 Nov 2020 22:11:21 +0000","Message-ID":"<CAHW6GYJ8vux3dRuhSpA749J=a5s1X06sQE2hmJyTXRm4Tij54A@mail.gmail.com>","To":"Naushir Patuck <naush@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH 10/10] libcamera: src: ipa:\n\traspberrypi: agc: Improve AE locked logic","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]