[{"id":25264,"web_url":"https://patchwork.libcamera.org/comment/25264/","msgid":"<Yzxdi84VZB1aPVkI@pendragon.ideasonboard.com>","date":"2022-10-04T16:21:31","subject":"Re: [libcamera-devel] [PATCH v3 7/7] ipa: raspberrypi: agc: Fix\n\tdigital gain calculation for manual mode","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Naush,\n\nThank you for the patch.\n\nOn Mon, Sep 26, 2022 at 10:57:37AM +0100, Naushir Patuck via libcamera-devel wrote:\n> The digital gain calculation uses a total exposure value computed with the\n> current AGC state. However, this is wrong in the case of manual shutter/gain\n> controls, as the total exposure value used must be the value computed when the\n> AGC sent the manual shutter/gain controls to the pipeline handler to action.\n> \n> To fix this, the IPA now adds the historical AgcStatus structure to the metadata\n> (tagged with \"agc.delayed_status\"). This historical AgcStatus structure contains\n> the total exposure value calculated when the AGC sent the manual shutter/gain\n> controls to the pipeline handler.\n\nHave you looked at the work we have recently merged that introduced a\nframe context queue in libipa ? This has allowed us to solve a very\nsimilar issue in the RkISP1 AWB, which needs to know the colour gains\nthat have been applied to the frame, and not just the latest gains (the\nhardware computes the AWB statistics after applying the colour\ngains...).\n\nThe issue was fixed in [1], with [2] introducing the frame context queue\nin the AWB algorithm, and [3] providing documentation about how the\nactive state and frame context collaborate. The frame context queue\nitself is very similar to the metadata array you introduce in patch 5/7\nin this series.\n\nWhile I have no doubt this series fixes your issue, I'm concerned about\nhow it relies on passing information through the DelayedControls class,\nwhich affects all pipeline handlers. The more we diverge in the usage of\nthat class, the more difficult per-frame control will be difficult to\nimplement. If the differences related to this issue between the\nRaspberry Pi on one side and RkISP1 and IPU3 on the other side were\nmostly in the IPA module I wouldn't be so concerned, as the IPA modules\ndiffer quite a lot already for historical reasons, but it expands beyond\nthe IPA side here.\n\nWould you be able to have a look at the frame context queue ? Should we\nlook together at how we could align the platforms better ?\n\n[1] https://git.libcamera.org/libcamera/libcamera.git/commit/?id=290ebeb59525eb7fdcc6f815d8dee6cbe3d8a314\n[2] https://git.libcamera.org/libcamera/libcamera.git/commit/?id=128f22bce55ba2baea082010bceaffdba23f3f0d\n[3] https://git.libcamera.org/libcamera/libcamera.git/commit/?id=a2f34f19578e8dae37cb7898710d15b83f176f94\n\n> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> Reviewed-by: David Plowman <david.plowman@raspberrypi.com>\n> Tested-by: David Plowman <david.plowman@raspberrypi.com>\n> ---\n>  src/ipa/raspberrypi/controller/rpi/agc.cpp | 10 ++++++++--\n>  src/ipa/raspberrypi/raspberrypi.cpp        | 11 +++++++++++\n>  2 files changed, 19 insertions(+), 2 deletions(-)\n> \n> diff --git a/src/ipa/raspberrypi/controller/rpi/agc.cpp b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> index bd54a639d637..b18bd7b5b19e 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> @@ -408,6 +408,12 @@ void Agc::switchMode(CameraMode const &cameraMode,\n>  \n>  void Agc::prepare(Metadata *imageMetadata)\n>  {\n> +\tDuration totalExposureValue = status_.totalExposureValue;\n> +\tAgcStatus delayedStatus;\n> +\n> +\tif (!imageMetadata->get(\"agc.delayed_status\", delayedStatus))\n> +\t\ttotalExposureValue = delayedStatus.totalExposureValue;\n> +\n>  \tstatus_.digitalGain = 1.0;\n>  \tfetchAwbStatus(imageMetadata); /* always fetch it so that Process knows it's been done */\n>  \n> @@ -418,8 +424,8 @@ void Agc::prepare(Metadata *imageMetadata)\n>  \t\t\tDuration actualExposure = deviceStatus.shutterSpeed *\n>  \t\t\t\t\t\t  deviceStatus.analogueGain;\n>  \t\t\tif (actualExposure) {\n> -\t\t\t\tstatus_.digitalGain = status_.totalExposureValue / actualExposure;\n> -\t\t\t\tLOG(RPiAgc, Debug) << \"Want total exposure \" << status_.totalExposureValue;\n> +\t\t\t\tstatus_.digitalGain = totalExposureValue / actualExposure;\n> +\t\t\t\tLOG(RPiAgc, Debug) << \"Want total exposure \" << totalExposureValue;\n>  \t\t\t\t/*\n>  \t\t\t\t * Never ask for a gain < 1.0, and also impose\n>  \t\t\t\t * some upper limit. Make it customisable?\n> diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp\n> index 0e80ef9c7b95..bc438e99eff6 100644\n> --- a/src/ipa/raspberrypi/raspberrypi.cpp\n> +++ b/src/ipa/raspberrypi/raspberrypi.cpp\n> @@ -1025,6 +1025,17 @@ void IPARPi::prepareISP(const ISPConfig &data)\n>  \t\tembeddedBuffer = it->second.planes()[0];\n>  \t}\n>  \n> +\t/*\n> +\t * AGC wants to know the algorithm status from the time it actioned the\n> +\t * sensor exposure/gain changes. So fetch it from the metadata list\n> +\t * indexed by the IPA cookie returned, and put it in the current frame\n> +\t * metadata.\n> +\t */\n> +\tAgcStatus agcStatus;\n> +\tRPiController::Metadata &delayedMetadata = rpiMetadata_[data.ipaCookie];\n> +\tif (!delayedMetadata.get<AgcStatus>(\"agc.status\", agcStatus))\n> +\t\trpiMetadata.set(\"agc.delayed_status\", agcStatus);\n> +\n>  \t/*\n>  \t * This may overwrite the DeviceStatus using values from the sensor\n>  \t * metadata, and may also do additional custom processing.","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 1A1FABD16B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  4 Oct 2022 16:21:37 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7FB6860AAB;\n\tTue,  4 Oct 2022 18:21:36 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 19C5C601C7\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  4 Oct 2022 18:21:35 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 74AFE2D9;\n\tTue,  4 Oct 2022 18:21:34 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1664900496;\n\tbh=WTEAf+S5wJnwvZjaF9/lIRdDjQSIXmviiQ5h0UKuWiQ=;\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=MHi9EKKGsvAI66hSnUsSEzmCCz9t4RoqdDLytsFPVh/8DBKItprNsGt1KupvNy3RP\n\tjGLYvmmMhENx29Y35REfC9BizOqM4Kv/fIAazhqeJCja0JbDH5SNfUL7O12xvTqRud\n\tlA0/vt3V9HMM1ocZfRjZYP3Prnh30ewqwmFqL6HzuRKghN1s3+iHxMIlyywrpI6uuh\n\t4YWEHKV2mBbpOWvLZTJS9X8NFrP58DxOlT+g0BhbhXv2FdVlTjJTMFjEPaS69JuiIF\n\tinCRA11lKU0xGfLL6sFrPUDYdXniJkrt8pFvrwiUBVnD3C+SsLqeClz8BjcaT04K0Y\n\tsPzuFpD/Owudw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1664900494;\n\tbh=WTEAf+S5wJnwvZjaF9/lIRdDjQSIXmviiQ5h0UKuWiQ=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=a84JcwtIqIs8AGvxQebL2kl5AFuHJkpnkpt3matMToE43Oj6S4cuYfcQbA2jhPfTf\n\tDNWYkzfppUYE8r0MBF1YXUvgKxNCPcHPB+K/FUGG7V2p8FF3agO83inq2S/GXwbjQR\n\tIar3sgnwKsyoRzEXS9vGPg0xThSZbUdyV51E8Js0="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"a84JcwtI\"; dkim-atps=neutral","Date":"Tue, 4 Oct 2022 19:21:31 +0300","To":"Naushir Patuck <naush@raspberrypi.com>","Message-ID":"<Yzxdi84VZB1aPVkI@pendragon.ideasonboard.com>","References":"<20220926095737.30506-1-naush@raspberrypi.com>\n\t<20220926095737.30506-8-naush@raspberrypi.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20220926095737.30506-8-naush@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH v3 7/7] ipa: raspberrypi: agc: Fix\n\tdigital gain calculation for manual 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":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":25345,"web_url":"https://patchwork.libcamera.org/comment/25345/","msgid":"<CAEmqJPqAn1JmbMfWPSr38VnDZ1g+3dMv5sjE2je610g8F3tdqA@mail.gmail.com>","date":"2022-10-07T14:46:52","subject":"Re: [libcamera-devel] [PATCH v3 7/7] ipa: raspberrypi: agc: Fix\n\tdigital gain calculation for manual mode","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi Laurent,\n\nOn Tue, 4 Oct 2022 at 17:21, Laurent Pinchart <\nlaurent.pinchart@ideasonboard.com> wrote:\n\n> Hi Naush,\n>\n> Thank you for the patch.\n>\n> On Mon, Sep 26, 2022 at 10:57:37AM +0100, Naushir Patuck via\n> libcamera-devel wrote:\n> > The digital gain calculation uses a total exposure value computed with\n> the\n> > current AGC state. However, this is wrong in the case of manual\n> shutter/gain\n> > controls, as the total exposure value used must be the value computed\n> when the\n> > AGC sent the manual shutter/gain controls to the pipeline handler to\n> action.\n> >\n> > To fix this, the IPA now adds the historical AgcStatus structure to the\n> metadata\n> > (tagged with \"agc.delayed_status\"). This historical AgcStatus structure\n> contains\n> > the total exposure value calculated when the AGC sent the manual\n> shutter/gain\n> > controls to the pipeline handler\n> Have you looked at the work we have recently merged that introduced a\n> frame context queue in libipa ? This has allowed us to solve a very\n> similar issue in the RkISP1 AWB, which needs to know the colour gains\n> that have been applied to the frame, and not just the latest gains (the\n> hardware computes the AWB statistics after applying the colour\n> gains...).\n>\n\n> The issue was fixed in [1], with [2] introducing the frame context queue\n> in the AWB algorithm, and [3] providing documentation about how the\n> active state and frame context collaborate. The frame context queue\n> itself is very similar to the metadata array you introduce in patch 5/7\n> in this series.\n>\n\nSorry for the slightly late response. I was aware of the frame context queue\nwork that was flying around, and I just had a bit of a look through the\nimplementation.\n\nThe frame context queue mechanism does indeed look very similar to my\napproach\nhere.  However, I think there are some fundamental differences:\n\n1) FCQ looks to be integrated more tightly with the IPA algorithms.  This\nwould\nbe an enormous change for us.\n\n2) FCQ seems to want to work in a look-ahead manner, from the docs:\n\n\"A frame context normally begins its lifetime when the corresponding request\n is queued, way before the frame is captured by the camera sensor.\"\n\nIn fact, one of my first approaches for this series was to do exactly this!\nHowever, we were not comfortable with this for a few reasons.  Most notably,\nit breaks our prepare/process pairing sequence of operation.  This would\ncause\nthe prepare to run on stats that may not be very recent, the delay being\nvariable\nbased on the number of requests in-flight.  This also effectively breaks the\napproach for our per-frame control implementation.  We will go into details\non\nthat later, but essentially we use a look-back approach instead of doing a\nlook-ahead as it seems far easier to implement.\n\n3) The FCQ does not directly account for sensor delays and sequencing when\nframe drops happen.  The DelayedControls gives us this for free.\n\nWe could do a half-way approach and store our controller metadata in the\nFCQ to\nreplace this RPiMetadataArray, but does it gain us much?\n\n\n>\n> While I have no doubt this series fixes your issue, I'm concerned about\n> how it relies on passing information through the DelayedControls class,\n> which affects all pipeline handlers. The more we diverge in the usage of\n> that class, the more difficult per-frame control will be difficult to\n> implement. If the differences related to this issue between the\n> Raspberry Pi on one side and RkISP1 and IPU3 on the other side were\n> mostly in the IPA module I wouldn't be so concerned, as the IPA modules\n> differ quite a lot already for historical reasons, but it expands beyond\n> the IPA side here.\n>\n\nThis is a valid concern here.  I certainly don't want to add functionality\nthat\nis specific to RPi in the core, and if this is the case, we need to revert\nback and\nthink of another approach.  However, I do think this generic cookie would\nbe a\nuseful addition for all pipeline handlers - fundamentally knowing when a\nframe\nhas returned with the controls applied, accounting for frame drops and\ndelays.\nNot to go too off topic, but our PFC implementation relies on this, and I\ncan see\nother implementations needing the same.  Again, I don't want to jump the gun\ntoo much on the PFC discussion just yet.\n\n\n> Would you be able to have a look at the frame context queue ? Should we\n> look together at how we could align the platforms better ?\n>\n\nYes, it would be ideal to consolidate something that can be commonly used by\nall IPAs.  I'll go through the existing implementation in more detail and\nprovide\nany suggestions for expansion.\n\nRegards,\nNaush\n\n\n>\n> [1]\n> https://git.libcamera.org/libcamera/libcamera.git/commit/?id=290ebeb59525eb7fdcc6f815d8dee6cbe3d8a314\n> [2]\n> https://git.libcamera.org/libcamera/libcamera.git/commit/?id=128f22bce55ba2baea082010bceaffdba23f3f0d\n> [3]\n> https://git.libcamera.org/libcamera/libcamera.git/commit/?id=a2f34f19578e8dae37cb7898710d15b83f176f94\n>\n> > Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> > Reviewed-by: David Plowman <david.plowman@raspberrypi.com>\n> > Tested-by: David Plowman <david.plowman@raspberrypi.com>\n> > ---\n> >  src/ipa/raspberrypi/controller/rpi/agc.cpp | 10 ++++++++--\n> >  src/ipa/raspberrypi/raspberrypi.cpp        | 11 +++++++++++\n> >  2 files changed, 19 insertions(+), 2 deletions(-)\n> >\n> > diff --git a/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> > index bd54a639d637..b18bd7b5b19e 100644\n> > --- a/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> > +++ b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> > @@ -408,6 +408,12 @@ void Agc::switchMode(CameraMode const &cameraMode,\n> >\n> >  void Agc::prepare(Metadata *imageMetadata)\n> >  {\n> > +     Duration totalExposureValue = status_.totalExposureValue;\n> > +     AgcStatus delayedStatus;\n> > +\n> > +     if (!imageMetadata->get(\"agc.delayed_status\", delayedStatus))\n> > +             totalExposureValue = delayedStatus.totalExposureValue;\n> > +\n> >       status_.digitalGain = 1.0;\n> >       fetchAwbStatus(imageMetadata); /* always fetch it so that Process\n> knows it's been done */\n> >\n> > @@ -418,8 +424,8 @@ void Agc::prepare(Metadata *imageMetadata)\n> >                       Duration actualExposure =\n> deviceStatus.shutterSpeed *\n> >\n>  deviceStatus.analogueGain;\n> >                       if (actualExposure) {\n> > -                             status_.digitalGain =\n> status_.totalExposureValue / actualExposure;\n> > -                             LOG(RPiAgc, Debug) << \"Want total exposure\n> \" << status_.totalExposureValue;\n> > +                             status_.digitalGain = totalExposureValue /\n> actualExposure;\n> > +                             LOG(RPiAgc, Debug) << \"Want total exposure\n> \" << totalExposureValue;\n> >                               /*\n> >                                * Never ask for a gain < 1.0, and also\n> impose\n> >                                * some upper limit. Make it customisable?\n> > diff --git a/src/ipa/raspberrypi/raspberrypi.cpp\n> b/src/ipa/raspberrypi/raspberrypi.cpp\n> > index 0e80ef9c7b95..bc438e99eff6 100644\n> > --- a/src/ipa/raspberrypi/raspberrypi.cpp\n> > +++ b/src/ipa/raspberrypi/raspberrypi.cpp\n> > @@ -1025,6 +1025,17 @@ void IPARPi::prepareISP(const ISPConfig &data)\n> >               embeddedBuffer = it->second.planes()[0];\n> >       }\n> >\n> > +     /*\n> > +      * AGC wants to know the algorithm status from the time it\n> actioned the\n> > +      * sensor exposure/gain changes. So fetch it from the metadata list\n> > +      * indexed by the IPA cookie returned, and put it in the current\n> frame\n> > +      * metadata.\n> > +      */\n> > +     AgcStatus agcStatus;\n> > +     RPiController::Metadata &delayedMetadata =\n> rpiMetadata_[data.ipaCookie];\n> > +     if (!delayedMetadata.get<AgcStatus>(\"agc.status\", agcStatus))\n> > +             rpiMetadata.set(\"agc.delayed_status\", agcStatus);\n> > +\n> >       /*\n> >        * This may overwrite the DeviceStatus using values from the sensor\n> >        * metadata, and may also do additional custom processing.\n>\n> --\n> Regards,\n>\n> Laurent Pinchart\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 4D01EC0DA4\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri,  7 Oct 2022 14:47:11 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 116E062D26;\n\tFri,  7 Oct 2022 16:47:11 +0200 (CEST)","from mail-lf1-x12c.google.com (mail-lf1-x12c.google.com\n\t[IPv6:2a00:1450:4864:20::12c])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 60AFE60A88\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  7 Oct 2022 16:47:09 +0200 (CEST)","by mail-lf1-x12c.google.com with SMTP id j4so7753754lfk.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 07 Oct 2022 07:47:09 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1665154031;\n\tbh=K45WYiiBSxzu+MI43/yW4rCCPrBCvUxJ7Id4YXK6Nzg=;\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=ZkvDOEgip86rMXOjk5QdJTTDUUWPbNg392KH9Y7uuYKCDuAqTYTigjhMfG/c++f1c\n\tt/JycgWBA1c92kNnlGPGKQ48r4pDOYhEEeLgq3IvxdWkCwMssUX/BG5YgVn/4ikxA7\n\tSBF2wnez5A0LwysQX3DUSegzik59ss5K1ivwooqR3gV0NcQm7AIyLs8iNooW1PrJqg\n\toYAliAvtml+kJCz0zg3sLVzgNzDG4wUJxALgRKrgaBl08rZcV/rv7Jmhe3k4HDwB2I\n\tvC/b2sXTGsvML+WUTPPynQW0odmHmIw7aMQVrTT1u5gIUCQqrFho5Ey02yLLlwxPFj\n\tE3eXY0MgbGxYQ==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:from:to:cc:subject:date:message-id:reply-to;\n\tbh=cZHY7oB6YoCpe1CIFmHeDOTB3TwToYBos/xeykwPjFo=;\n\tb=JxUY+OqO/OQub8iL+w68/YyxoD6CC/6HcrKm/60NrjqLxKYJv6j4ixri0upoZVYIcN\n\tcv0duOZxuwhntm316IJBSX3d8SYGkLQxj+zAZlcHnue/o7KP08Gib/hZnn02weJILdIa\n\tspFgp4PQIsLTx/sPCjGDVKPGDUX1Rhpc2vvAXViZ2SOOfczWxACvmgP+U3wndv+G3CQw\n\tGID7p0qFWtDttWRq69Iyqq2JXrve6pghH54p6liVTX3+K5IPhkFwASHEQ7t9vVH4lHeu\n\tEDNlxSOsrbDxp4Ej6pMPbPv79txHIGfja8h7APE05CZl3rsN3+wUxEZhTzZwL86jAmr3\n\tbpWQ=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"JxUY+OqO\"; dkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:x-gm-message-state:from:to:cc:subject:date:message-id\n\t:reply-to;\n\tbh=cZHY7oB6YoCpe1CIFmHeDOTB3TwToYBos/xeykwPjFo=;\n\tb=6XG3hoLzHpSvOuYrK9/cU5djl1JWPGLkz73L2tODCJHR9LL1xST1ZeevFpgIJL36ea\n\t86VHyREpuWQNV0g6g5OSXu+WV9L+fdv9KxlDsYUDFhXgRXktjSNiXcTrT2t+4OJ/0o+9\n\tQ+NcUsbqvOk1YiRK4b1qKb1yhendHLnrRGNFkEavZX6jocj+mKto4yyyHF/S1TePhADM\n\tACwE837a2jSeweb93DTa67Lvu4uO+UurarMnxPLtdYl+xlxXjbRfd2RUMsfIJy59yTTT\n\tSUuk5EBzTNK3zzzStKsP8ZdNJuRMFExo0BxPEkH0QytSodx+EqbRnX8X1pMTEHlPw6S7\n\tuWrQ==","X-Gm-Message-State":"ACrzQf1d2fyxjoa8ZyERdLuTeO8RGYKqeuKlXXCmtZG1SjBK8FADvkL0\n\tRI8crhj67coDuEX7KhuMjkJsHRGkYE0jYpE+CnlIySFXfp3Ruw==","X-Google-Smtp-Source":"AMsMyM7hi2hdxHJ0CiBiXHjhcIftyBBMuxweHs5XR+nZy0PXAJ91vvKMDEnirkqI5jrYHMVRcRXG9LBTGir2XCJqQCc=","X-Received":"by 2002:ac2:4c03:0:b0:4a2:2273:89c6 with SMTP id\n\tt3-20020ac24c03000000b004a2227389c6mr1806723lfq.245.1665154028631;\n\tFri, 07 Oct 2022 07:47:08 -0700 (PDT)","MIME-Version":"1.0","References":"<20220926095737.30506-1-naush@raspberrypi.com>\n\t<20220926095737.30506-8-naush@raspberrypi.com>\n\t<Yzxdi84VZB1aPVkI@pendragon.ideasonboard.com>","In-Reply-To":"<Yzxdi84VZB1aPVkI@pendragon.ideasonboard.com>","Date":"Fri, 7 Oct 2022 15:46:52 +0100","Message-ID":"<CAEmqJPqAn1JmbMfWPSr38VnDZ1g+3dMv5sjE2je610g8F3tdqA@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Content-Type":"multipart/alternative; boundary=\"0000000000005f92ca05ea72e2f1\"","Subject":"Re: [libcamera-devel] [PATCH v3 7/7] ipa: raspberrypi: agc: Fix\n\tdigital gain calculation for manual 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":"Naushir Patuck via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Naushir Patuck <naush@raspberrypi.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]