[{"id":5335,"web_url":"https://patchwork.libcamera.org/comment/5335/","msgid":"<20200622230438.GK5852@pendragon.ideasonboard.com>","date":"2020-06-22T23:04:38","subject":"Re: [libcamera-devel] [PATCH v2 3/4] libcamera: ipa: raspberrypi:\n\tadd sharpness strength control to Raspberry Pi IPAs","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi David,\n\nThank you for the patch.\n\nTo try and keep the subject line short, how about\n\n\"libcamera: ipa: raspberrypi: Add sharpness strength control\"\n\nas the prefix implies it's for the Raspberry Pi IPA ? By the way, I\ndon't think there's any written rule, but we tend to capitalize the\nsentence in the subject line after the prefix.\n\nOn Mon, Jun 22, 2020 at 02:55:49PM +0100, David Plowman wrote:\n> The sharpness control is, loosely speaking, a gain applied to\n> the amount of sharpening added to an image. We also report the\n> sharpness setting used back to the caller in metadata.\n> \n> Signed-off-by: David Plowman <david.plowman@raspberrypi.com>\n> ---\n>  .../raspberrypi/controller/rpi/sharpen.cpp    | 30 +++++++++++++++----\n>  .../raspberrypi/controller/rpi/sharpen.hpp    |  6 ++--\n>  .../controller/sharpen_algorithm.hpp          | 21 +++++++++++++\n>  .../raspberrypi/controller/sharpen_status.h   |  2 ++\n>  4 files changed, 52 insertions(+), 7 deletions(-)\n>  create mode 100644 src/ipa/raspberrypi/controller/sharpen_algorithm.hpp\n> \n> diff --git a/src/ipa/raspberrypi/controller/rpi/sharpen.cpp b/src/ipa/raspberrypi/controller/rpi/sharpen.cpp\n> index 4c2fdb3..cd93529 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/sharpen.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/sharpen.cpp\n> @@ -17,7 +17,7 @@ using namespace RPi;\n>  #define NAME \"rpi.sharpen\"\n>  \n>  Sharpen::Sharpen(Controller *controller)\n> -\t: Algorithm(controller)\n> +\t: SharpenAlgorithm(controller), user_strength_(1.0)\n>  {\n>  }\n>  \n> @@ -42,14 +42,34 @@ void Sharpen::Read(boost::property_tree::ptree const &params)\n>  \tlimit_ = params.get<double>(\"limit\", 1.0);\n>  }\n>  \n> +void Sharpen::SetStrength(double strength)\n> +{\n> +\t// Note that this method is how an application sets the overall\n> +\t// sharpening \"strength\". We call this the \"user strength\" field\n> +\t// as there already is a strength_ field - being an internal gain\n> +\t// parameter that gets passed to the ISP control code.\n> +\tuser_strength_ = strength;\n> +}\n> +\n>  void Sharpen::Prepare(Metadata *image_metadata)\n>  {\n> +\t// The user_strength affects the algorithm's internal gain directly, but\n> +\t// we adjust the limit and threshold less aggressively. Using a sqrt\n> +\t// function is an arbitrary but gentle way of accomplishing this.\n> +\tdouble user_strength = user_strength_;\n> +\tif (user_strength < 0.0)\n> +\t\tuser_strength = 0.0;\n\nI was going to question if this was required, as the minimum is 0.0,\nonly to realize that the libcamera core doesn't enforce constraints on\ncontrols. This is something we need to fix in the core, should we drop\nthe check here ? You could then drop the local variable.\n\n> +\tdouble user_strength_sqrt = sqrt(user_strength);\n>  \tstruct SharpenStatus status;\n>  \t// Binned modes seem to need the sharpening toned down with this\n> -\t// pipeline.\n> -\tstatus.threshold = threshold_ * mode_factor_;\n> -\tstatus.strength = strength_ / mode_factor_;\n> -\tstatus.limit = limit_ / mode_factor_;\n> +\t// pipeline, thus we use the mode_factor here. Also avoid\n> +\t// divide-by-zero with the user_strength_sqrt.\n> +\tstatus.threshold = threshold_ * mode_factor_ /\n> +\t\tstd::max(0.01, user_strength_sqrt);\n\nIf the user strength is very small this would be a large number. I\nwonder if it could overflow the range supported by the hardware, but as\nthe limit would be very low, I suppose it would likely not matter. Could\nyou confirm the hardware won't get confused ?\n\n> +\tstatus.strength = strength_ / mode_factor_ * user_strength;\n> +\tstatus.limit = limit_ / mode_factor_ * user_strength_sqrt;\n> +\t// Finally, report any application-supplied parameters that were used.\n> +\tstatus.user_strength = user_strength;\n>  \timage_metadata->Set(\"sharpen.status\", status);\n>  }\n>  \n> diff --git a/src/ipa/raspberrypi/controller/rpi/sharpen.hpp b/src/ipa/raspberrypi/controller/rpi/sharpen.hpp\n> index a3bf899..e9a71fd 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/sharpen.hpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/sharpen.hpp\n> @@ -6,20 +6,21 @@\n>   */\n>  #pragma once\n>  \n> -#include \"../algorithm.hpp\"\n> +#include \"../sharpen_algorithm.hpp\"\n>  #include \"../sharpen_status.h\"\n>  \n>  // This is our implementation of the \"sharpen algorithm\".\n>  \n>  namespace RPi {\n>  \n> -class Sharpen : public Algorithm\n> +class Sharpen : public SharpenAlgorithm\n>  {\n>  public:\n>  \tSharpen(Controller *controller);\n>  \tchar const *Name() const override;\n>  \tvoid SwitchMode(CameraMode const &camera_mode, Metadata *metadata) override;\n>  \tvoid Read(boost::property_tree::ptree const &params) override;\n> +\tvoid SetStrength(double strength) override;\n>  \tvoid Prepare(Metadata *image_metadata) override;\n>  \n>  private:\n> @@ -27,6 +28,7 @@ private:\n>  \tdouble strength_;\n>  \tdouble limit_;\n>  \tdouble mode_factor_;\n> +\tstd::atomic<double> user_strength_;\n\nThis this need to be an atomic variable, as it's only accessed from\nPrepare and SetStrengh, both called from IPARPi::processEvent() only ?\n\n>  };\n>  \n>  } // namespace RPi\n> diff --git a/src/ipa/raspberrypi/controller/sharpen_algorithm.hpp b/src/ipa/raspberrypi/controller/sharpen_algorithm.hpp\n> new file mode 100644\n> index 0000000..3b27a74\n> --- /dev/null\n> +++ b/src/ipa/raspberrypi/controller/sharpen_algorithm.hpp\n> @@ -0,0 +1,21 @@\n> +/* SPDX-License-Identifier: BSD-2-Clause */\n> +/*\n> + * Copyright (C) 2020, Raspberry Pi (Trading) Limited\n> + *\n> + * sharpen_algorithm.hpp - sharpness control algorithm interface\n> + */\n> +#pragma once\n> +\n> +#include \"algorithm.hpp\"\n> +\n> +namespace RPi {\n> +\n> +class SharpenAlgorithm : public Algorithm\n> +{\n> +public:\n> +\tSharpenAlgorithm(Controller *controller) : Algorithm(controller) {}\n> +\t// A sharpness control algorithm must provide the following:\n> +\tvirtual void SetStrength(double strength) = 0;\n> +};\n> +\n> +} // namespace RPi\n> diff --git a/src/ipa/raspberrypi/controller/sharpen_status.h b/src/ipa/raspberrypi/controller/sharpen_status.h\n> index 6de80f4..7501b19 100644\n> --- a/src/ipa/raspberrypi/controller/sharpen_status.h\n> +++ b/src/ipa/raspberrypi/controller/sharpen_status.h\n> @@ -19,6 +19,8 @@ struct SharpenStatus {\n>  \tdouble strength;\n>  \t// upper limit of the allowed sharpening response\n>  \tdouble limit;\n> +\t// The sharpening strength requested by the user or application.\n> +\tdouble user_strength;\n>  };\n>  \n>  #ifdef __cplusplus","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["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 F28B8603BE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 23 Jun 2020 01:05:02 +0200 (CEST)","from pendragon.ideasonboard.com (81-175-216-236.bb.dnainternet.fi\n\t[81.175.216.236])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 6F057327;\n\tTue, 23 Jun 2020 01:05:02 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"VqSn1Xqf\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1592867102;\n\tbh=/nlo0hrBKp/7udEzmm7Fb5c1AGJGi7NMrS8INnuruXs=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=VqSn1XqfAEb4ei/MRR3Vadqil5d6mU6VwgLcrz8S3c+IPx1nbZS1kIgnHzNIoXpTz\n\t+8URtp/eJC0k777gnus3BvK1k6oRm8pCxMjeL3la/oe1XF/uv2YBg2gKBCY+u3Ov+1\n\tqW3RPSBsXrvDji8jFrq6Ul6bKHfYp9Gka4OKvYh8=","Date":"Tue, 23 Jun 2020 02:04:38 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"David Plowman <david.plowman@raspberrypi.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20200622230438.GK5852@pendragon.ideasonboard.com>","References":"<20200622135550.10788-1-david.plowman@raspberrypi.com>\n\t<20200622135550.10788-4-david.plowman@raspberrypi.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20200622135550.10788-4-david.plowman@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH v2 3/4] libcamera: ipa: raspberrypi:\n\tadd sharpness strength control to Raspberry Pi IPAs","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>","X-List-Received-Date":"Mon, 22 Jun 2020 23:05:03 -0000"}},{"id":5347,"web_url":"https://patchwork.libcamera.org/comment/5347/","msgid":"<CAHW6GYL-kOWhak6--kP2gYwA4fUXr2uQK0zHACW6YvmVJJueiw@mail.gmail.com>","date":"2020-06-23T08:36:46","subject":"Re: [libcamera-devel] [PATCH v2 3/4] libcamera: ipa: raspberrypi:\n\tadd sharpness strength control to Raspberry Pi IPAs","submitter":{"id":42,"url":"https://patchwork.libcamera.org/api/people/42/","name":"David Plowman","email":"david.plowman@raspberrypi.com"},"content":"Hi Laurent\n\nThanks again for the comments.\n\nOn Tue, 23 Jun 2020 at 00:05, Laurent Pinchart\n<laurent.pinchart@ideasonboard.com> wrote:\n>\n> Hi David,\n>\n> Thank you for the patch.\n>\n> To try and keep the subject line short, how about\n>\n> \"libcamera: ipa: raspberrypi: Add sharpness strength control\"\n>\n> as the prefix implies it's for the Raspberry Pi IPA ? By the way, I\n> don't think there's any written rule, but we tend to capitalize the\n> sentence in the subject line after the prefix.\n\nSure, no need to repeat Raspberry Pi and all that. I'll fix up both\ncomments in v3!\n\n>\n> On Mon, Jun 22, 2020 at 02:55:49PM +0100, David Plowman wrote:\n> > The sharpness control is, loosely speaking, a gain applied to\n> > the amount of sharpening added to an image. We also report the\n> > sharpness setting used back to the caller in metadata.\n> >\n> > Signed-off-by: David Plowman <david.plowman@raspberrypi.com>\n> > ---\n> >  .../raspberrypi/controller/rpi/sharpen.cpp    | 30 +++++++++++++++----\n> >  .../raspberrypi/controller/rpi/sharpen.hpp    |  6 ++--\n> >  .../controller/sharpen_algorithm.hpp          | 21 +++++++++++++\n> >  .../raspberrypi/controller/sharpen_status.h   |  2 ++\n> >  4 files changed, 52 insertions(+), 7 deletions(-)\n> >  create mode 100644 src/ipa/raspberrypi/controller/sharpen_algorithm.hpp\n> >\n> > diff --git a/src/ipa/raspberrypi/controller/rpi/sharpen.cpp b/src/ipa/raspberrypi/controller/rpi/sharpen.cpp\n> > index 4c2fdb3..cd93529 100644\n> > --- a/src/ipa/raspberrypi/controller/rpi/sharpen.cpp\n> > +++ b/src/ipa/raspberrypi/controller/rpi/sharpen.cpp\n> > @@ -17,7 +17,7 @@ using namespace RPi;\n> >  #define NAME \"rpi.sharpen\"\n> >\n> >  Sharpen::Sharpen(Controller *controller)\n> > -     : Algorithm(controller)\n> > +     : SharpenAlgorithm(controller), user_strength_(1.0)\n> >  {\n> >  }\n> >\n> > @@ -42,14 +42,34 @@ void Sharpen::Read(boost::property_tree::ptree const &params)\n> >       limit_ = params.get<double>(\"limit\", 1.0);\n> >  }\n> >\n> > +void Sharpen::SetStrength(double strength)\n> > +{\n> > +     // Note that this method is how an application sets the overall\n> > +     // sharpening \"strength\". We call this the \"user strength\" field\n> > +     // as there already is a strength_ field - being an internal gain\n> > +     // parameter that gets passed to the ISP control code.\n> > +     user_strength_ = strength;\n> > +}\n> > +\n> >  void Sharpen::Prepare(Metadata *image_metadata)\n> >  {\n> > +     // The user_strength affects the algorithm's internal gain directly, but\n> > +     // we adjust the limit and threshold less aggressively. Using a sqrt\n> > +     // function is an arbitrary but gentle way of accomplishing this.\n> > +     double user_strength = user_strength_;\n> > +     if (user_strength < 0.0)\n> > +             user_strength = 0.0;\n>\n> I was going to question if this was required, as the minimum is 0.0,\n> only to realize that the libcamera core doesn't enforce constraints on\n> controls. This is something we need to fix in the core, should we drop\n> the check here ? You could then drop the local variable.\n\nI don't feel terribly strongly - maybe if we make that change in the\ncore then we can fix up this sort of thing when we next revisit the\naffected files? Until then I'm inclined to leave it unless anyone\nobjects...\n\n>\n> > +     double user_strength_sqrt = sqrt(user_strength);\n> >       struct SharpenStatus status;\n> >       // Binned modes seem to need the sharpening toned down with this\n> > -     // pipeline.\n> > -     status.threshold = threshold_ * mode_factor_;\n> > -     status.strength = strength_ / mode_factor_;\n> > -     status.limit = limit_ / mode_factor_;\n> > +     // pipeline, thus we use the mode_factor here. Also avoid\n> > +     // divide-by-zero with the user_strength_sqrt.\n> > +     status.threshold = threshold_ * mode_factor_ /\n> > +             std::max(0.01, user_strength_sqrt);\n>\n> If the user strength is very small this would be a large number. I\n> wonder if it could overflow the range supported by the hardware, but as\n> the limit would be very low, I suppose it would likely not matter. Could\n> you confirm the hardware won't get confused ?\n\nYes, it actually travels through to the GPU with quite a lot of bits,\nand then gets clamped over there before values are programmed\ninto the ISP registers.\n\n>\n> > +     status.strength = strength_ / mode_factor_ * user_strength;\n> > +     status.limit = limit_ / mode_factor_ * user_strength_sqrt;\n> > +     // Finally, report any application-supplied parameters that were used.\n> > +     status.user_strength = user_strength;\n> >       image_metadata->Set(\"sharpen.status\", status);\n> >  }\n> >\n> > diff --git a/src/ipa/raspberrypi/controller/rpi/sharpen.hpp b/src/ipa/raspberrypi/controller/rpi/sharpen.hpp\n> > index a3bf899..e9a71fd 100644\n> > --- a/src/ipa/raspberrypi/controller/rpi/sharpen.hpp\n> > +++ b/src/ipa/raspberrypi/controller/rpi/sharpen.hpp\n> > @@ -6,20 +6,21 @@\n> >   */\n> >  #pragma once\n> >\n> > -#include \"../algorithm.hpp\"\n> > +#include \"../sharpen_algorithm.hpp\"\n> >  #include \"../sharpen_status.h\"\n> >\n> >  // This is our implementation of the \"sharpen algorithm\".\n> >\n> >  namespace RPi {\n> >\n> > -class Sharpen : public Algorithm\n> > +class Sharpen : public SharpenAlgorithm\n> >  {\n> >  public:\n> >       Sharpen(Controller *controller);\n> >       char const *Name() const override;\n> >       void SwitchMode(CameraMode const &camera_mode, Metadata *metadata) override;\n> >       void Read(boost::property_tree::ptree const &params) override;\n> > +     void SetStrength(double strength) override;\n> >       void Prepare(Metadata *image_metadata) override;\n> >\n> >  private:\n> > @@ -27,6 +28,7 @@ private:\n> >       double strength_;\n> >       double limit_;\n> >       double mode_factor_;\n> > +     std::atomic<double> user_strength_;\n>\n> This this need to be an atomic variable, as it's only accessed from\n> Prepare and SetStrengh, both called from IPARPi::processEvent() only ?\n\nWell, I suppose that's true. Of course all this code comes from our\npre-libcamera days (was there such a time??) when the API model was\nthat applications call our control algorithms directly (and\nasynchronously), so there's probably quite a bit of this in\npractically every \"control setting\" function that we have.\n\nAnyway, I propose to fix this one up now (in v3 of this patch), and\nwill leave the others until such time as we have a need to touch the\nfiles in question, if folks are OK with that.\n\nThanks again\nDavid\n\n>\n> >  };\n> >\n> >  } // namespace RPi\n> > diff --git a/src/ipa/raspberrypi/controller/sharpen_algorithm.hpp b/src/ipa/raspberrypi/controller/sharpen_algorithm.hpp\n> > new file mode 100644\n> > index 0000000..3b27a74\n> > --- /dev/null\n> > +++ b/src/ipa/raspberrypi/controller/sharpen_algorithm.hpp\n> > @@ -0,0 +1,21 @@\n> > +/* SPDX-License-Identifier: BSD-2-Clause */\n> > +/*\n> > + * Copyright (C) 2020, Raspberry Pi (Trading) Limited\n> > + *\n> > + * sharpen_algorithm.hpp - sharpness control algorithm interface\n> > + */\n> > +#pragma once\n> > +\n> > +#include \"algorithm.hpp\"\n> > +\n> > +namespace RPi {\n> > +\n> > +class SharpenAlgorithm : public Algorithm\n> > +{\n> > +public:\n> > +     SharpenAlgorithm(Controller *controller) : Algorithm(controller) {}\n> > +     // A sharpness control algorithm must provide the following:\n> > +     virtual void SetStrength(double strength) = 0;\n> > +};\n> > +\n> > +} // namespace RPi\n> > diff --git a/src/ipa/raspberrypi/controller/sharpen_status.h b/src/ipa/raspberrypi/controller/sharpen_status.h\n> > index 6de80f4..7501b19 100644\n> > --- a/src/ipa/raspberrypi/controller/sharpen_status.h\n> > +++ b/src/ipa/raspberrypi/controller/sharpen_status.h\n> > @@ -19,6 +19,8 @@ struct SharpenStatus {\n> >       double strength;\n> >       // upper limit of the allowed sharpening response\n> >       double limit;\n> > +     // The sharpening strength requested by the user or application.\n> > +     double user_strength;\n> >  };\n> >\n> >  #ifdef __cplusplus\n>\n> --\n> Regards,\n>\n> Laurent Pinchart","headers":{"Return-Path":"<david.plowman@raspberrypi.com>","Received":["from mail-ot1-x342.google.com (mail-ot1-x342.google.com\n\t[IPv6:2607:f8b0:4864:20::342])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D7A2F603BA\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 23 Jun 2020 10:36:59 +0200 (CEST)","by mail-ot1-x342.google.com with SMTP id k15so15774349otp.8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 23 Jun 2020 01:36:59 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"ZVwP3cSN\"; 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=1lP5kFm41nBOPfl8ZrCghAQQikan2jTeTSSrMOMgbPo=;\n\tb=ZVwP3cSNuO9yJOpSWXuBGcmqIu6Fa+7cbuGuA0GkqWjNGV6GCnROml+12Lm9nIHcDL\n\tMXuQElibQKIA8ZhI6nB/KphFuyLmansglH9/NpghmZZdQKureRV7dJ3fYuLiu5tpiCBD\n\tBuPnIfTfp4v+O427FAmZYaOmn905iABuQ086NgoW53wJZ/NVuQPX1NKopnjwZBJ5eEgX\n\tlFLgu80WTnUFkJIP+KgYz6kiQgT3NT1enK3BKifXWiwEmjML5lzNYJI7qiQf2+VAlsbH\n\t3XCUe9DBGWpEzgIma0zTTkVihZYVUSzMp95kSxsxFueT3pDXLtMf/aTJEq03oDRZE4YS\n\t5alQ==","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=1lP5kFm41nBOPfl8ZrCghAQQikan2jTeTSSrMOMgbPo=;\n\tb=POZos1hjp0qSW6IrDg+bxPdib4nE2P5KIk4ua5hMUcGR0NCOESFDr/5WQaeJCD/6/3\n\tvDjJxRdAh+A0piTmpVvpTCGuaPfLb3mCaeoZcMzqvRUTkmq658uyD8jjaRD3jPZDciit\n\t13kIZWpNWkeAVpIjdFLGdA6+Hhu6z4ZffAqQqs3UOWOiIrhzw4i76l21wMdJHR5Y0knQ\n\twbEydBiW19BbLC72G9TAeRmfpub6eA1U+HTQaaGd0x18CYyKnqHw0aWE94VI5IzUjJHs\n\tyrY7FX9TBvKfFNbo+7QZX8oCsZjqNv+/SAVkIN6JX/wJ00P280zlHsxaFhwLxLYz+MgH\n\t2gyg==","X-Gm-Message-State":"AOAM530g0eGbijDNWU+QpYJRZJm82JvIdN0RQ2tjU3+R6xuv5rX/DK4K\n\tRfSREwdjw3JNoICcXCv8y4hTGlGv8PKAHlCGyXS2LRyjlF0=","X-Google-Smtp-Source":"ABdhPJztOs5jBki/54DJ7k9q2NbmKP5zye+voRJROUlIt4lCrj98ZUbvJdAo8txEJgDwYTF3kZDDfCFjDByMb+bAiWk=","X-Received":"by 2002:a9d:5604:: with SMTP id\n\te4mr17264085oti.166.1592901418405; \n\tTue, 23 Jun 2020 01:36:58 -0700 (PDT)","MIME-Version":"1.0","References":"<20200622135550.10788-1-david.plowman@raspberrypi.com>\n\t<20200622135550.10788-4-david.plowman@raspberrypi.com>\n\t<20200622230438.GK5852@pendragon.ideasonboard.com>","In-Reply-To":"<20200622230438.GK5852@pendragon.ideasonboard.com>","From":"David Plowman <david.plowman@raspberrypi.com>","Date":"Tue, 23 Jun 2020 09:36:46 +0100","Message-ID":"<CAHW6GYL-kOWhak6--kP2gYwA4fUXr2uQK0zHACW6YvmVJJueiw@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"UTF-8\"","Subject":"Re: [libcamera-devel] [PATCH v2 3/4] libcamera: ipa: raspberrypi:\n\tadd sharpness strength control to Raspberry Pi IPAs","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>","X-List-Received-Date":"Tue, 23 Jun 2020 08:37:00 -0000"}}]