[{"id":26940,"web_url":"https://patchwork.libcamera.org/comment/26940/","msgid":"<zq5wgb37oweuqm33d6x3yy3oirx66noa3fbs2rod5jyt2id7sh@bobkphorvlug>","date":"2023-04-26T16:21:01","subject":"Re: [libcamera-devel] [PATCH 09/13] ipa: raspberrypi: agc: Move\n\tweights out of AGC","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Naush\n\nOn Wed, Apr 26, 2023 at 02:10:53PM +0100, Naushir Patuck via libcamera-devel wrote:\n> From: David Plowman <david.plowman@raspberrypi.com>\n>\n> The region weights for the the AGC zones were previously handled by the\n> AGC algorithm. Now it's the IPA (vc4.cpp) that applies them directly\n> to the statistics that we pass to the AGC.\n>\n> Signed-off-by: David Plowman <david.plowman@raspberrypi>\n> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n\nReviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n\nThanks\n   j\n\n> ---\n>  src/ipa/rpi/controller/agc_algorithm.h |  3 +++\n>  src/ipa/rpi/controller/rpi/agc.cpp     | 27 +++++++++++++++++---------\n>  src/ipa/rpi/controller/rpi/agc.h       |  1 +\n>  src/ipa/rpi/vc4/vc4.cpp                | 26 ++++++++++++++++++-------\n>  4 files changed, 41 insertions(+), 16 deletions(-)\n>\n> diff --git a/src/ipa/rpi/controller/agc_algorithm.h b/src/ipa/rpi/controller/agc_algorithm.h\n> index 36e6c11058ee..b6949daa7135 100644\n> --- a/src/ipa/rpi/controller/agc_algorithm.h\n> +++ b/src/ipa/rpi/controller/agc_algorithm.h\n> @@ -6,6 +6,8 @@\n>   */\n>  #pragma once\n>\n> +#include <vector>\n> +\n>  #include <libcamera/base/utils.h>\n>\n>  #include \"algorithm.h\"\n> @@ -18,6 +20,7 @@ public:\n>  \tAgcAlgorithm(Controller *controller) : Algorithm(controller) {}\n>  \t/* An AGC algorithm must provide the following: */\n>  \tvirtual unsigned int getConvergenceFrames() const = 0;\n> +\tvirtual std::vector<double> const &getWeights() const = 0;\n>  \tvirtual void setEv(double ev) = 0;\n>  \tvirtual void setFlickerPeriod(libcamera::utils::Duration flickerPeriod) = 0;\n>  \tvirtual void setFixedShutter(libcamera::utils::Duration fixedShutter) = 0;\n> diff --git a/src/ipa/rpi/controller/rpi/agc.cpp b/src/ipa/rpi/controller/rpi/agc.cpp\n> index e6fb7b8dbeb3..e79c82e2e65b 100644\n> --- a/src/ipa/rpi/controller/rpi/agc.cpp\n> +++ b/src/ipa/rpi/controller/rpi/agc.cpp\n> @@ -292,6 +292,18 @@ unsigned int Agc::getConvergenceFrames() const\n>  \t\treturn config_.convergenceFrames;\n>  }\n>\n> +std::vector<double> const &Agc::getWeights() const\n> +{\n> +\t/*\n> +\t * In case someone calls setMeteringMode and then this before the\n> +\t * algorithm has run and updated the meteringMode_ pointer.\n> +\t */\n> +\tauto it = config_.meteringModes.find(meteringModeName_);\n> +\tif (it == config_.meteringModes.end())\n> +\t\treturn meteringMode_->weights;\n> +\treturn it->second.weights;\n> +}\n> +\n>  void Agc::setEv(double ev)\n>  {\n>  \tev_ = ev;\n> @@ -595,19 +607,16 @@ static double computeInitialY(StatisticsPtr &stats, AwbStatus const &awb,\n>  \tASSERT(weights.size() == stats->agcRegions.numRegions());\n>\n>  \t/*\n> -\t * Note how the calculation below means that equal weights give you\n> -\t * \"average\" metering (i.e. all pixels equally important).\n> +\t * Note that the weights are applied by the IPA to the statistics directly,\n> +\t * before they are given to us here.\n>  \t */\n>  \tdouble rSum = 0, gSum = 0, bSum = 0, pixelSum = 0;\n>  \tfor (unsigned int i = 0; i < stats->agcRegions.numRegions(); i++) {\n>  \t\tauto &region = stats->agcRegions.get(i);\n> -\t\tdouble rAcc = std::min<double>(region.val.rSum * gain, (maxVal - 1) * region.counted);\n> -\t\tdouble gAcc = std::min<double>(region.val.gSum * gain, (maxVal - 1) * region.counted);\n> -\t\tdouble bAcc = std::min<double>(region.val.bSum * gain, (maxVal - 1) * region.counted);\n> -\t\trSum += rAcc * weights[i];\n> -\t\tgSum += gAcc * weights[i];\n> -\t\tbSum += bAcc * weights[i];\n> -\t\tpixelSum += region.counted * weights[i];\n> +\t\trSum += std::min<double>(region.val.rSum * gain, (maxVal - 1) * region.counted);\n> +\t\tgSum += std::min<double>(region.val.gSum * gain, (maxVal - 1) * region.counted);\n> +\t\tbSum += std::min<double>(region.val.bSum * gain, (maxVal - 1) * region.counted);\n> +\t\tpixelSum += region.counted;\n>  \t}\n>  \tif (pixelSum == 0.0) {\n>  \t\tLOG(RPiAgc, Warning) << \"computeInitialY: pixelSum is zero\";\n> diff --git a/src/ipa/rpi/controller/rpi/agc.h b/src/ipa/rpi/controller/rpi/agc.h\n> index 4e5f272fac78..939f97295a02 100644\n> --- a/src/ipa/rpi/controller/rpi/agc.h\n> +++ b/src/ipa/rpi/controller/rpi/agc.h\n> @@ -69,6 +69,7 @@ public:\n>  \tchar const *name() const override;\n>  \tint read(const libcamera::YamlObject &params) override;\n>  \tunsigned int getConvergenceFrames() const override;\n> +\tstd::vector<double> const &getWeights() const override;\n>  \tvoid setEv(double ev) override;\n>  \tvoid setFlickerPeriod(libcamera::utils::Duration flickerPeriod) override;\n>  \tvoid setMaxShutter(libcamera::utils::Duration maxShutter) override;\n> diff --git a/src/ipa/rpi/vc4/vc4.cpp b/src/ipa/rpi/vc4/vc4.cpp\n> index 0d929cda6c4a..0e022c2aeed3 100644\n> --- a/src/ipa/rpi/vc4/vc4.cpp\n> +++ b/src/ipa/rpi/vc4/vc4.cpp\n> @@ -211,13 +211,25 @@ RPiController::StatisticsPtr IpaVc4::platformProcessStats(Span<uint8_t> mem)\n>  \t\t\t\t\t\tstats->awb_stats[i].counted,\n>  \t\t\t\t\t\tstats->awb_stats[i].notcounted });\n>\n> -\tstatistics->agcRegions.init(hw.agcRegions);\n> -\tfor (i = 0; i < statistics->agcRegions.numRegions(); i++)\n> -\t\tstatistics->agcRegions.set(i, { { stats->agc_stats[i].r_sum << scale,\n> -\t\t\t\t\t\t  stats->agc_stats[i].g_sum << scale,\n> -\t\t\t\t\t\t  stats->agc_stats[i].b_sum << scale },\n> -\t\t\t\t\t\tstats->agc_stats[i].counted,\n> -\t\t\t\t\t\tstats->awb_stats[i].notcounted });\n> +\tRPiController::AgcAlgorithm *agc = dynamic_cast<RPiController::AgcAlgorithm *>(\n> +\t\tcontroller_.getAlgorithm(\"agc\"));\n> +\tif (!agc) {\n> +\t\tLOG(IPARPI, Debug) << \"No AGC algorithm - not copying statistics\";\n> +\t\tstatistics->agcRegions.init(0);\n> +\t} else {\n> +\t\tstatistics->agcRegions.init(hw.agcRegions);\n> +\t\tconst std::vector<double> &weights = agc->getWeights();\n> +\t\tfor (i = 0; i < statistics->agcRegions.numRegions(); i++) {\n> +\t\t\tuint64_t rSum = (stats->agc_stats[i].r_sum << scale) * weights[i];\n> +\t\t\tuint64_t gSum = (stats->agc_stats[i].g_sum << scale) * weights[i];\n> +\t\t\tuint64_t bSum = (stats->agc_stats[i].b_sum << scale) * weights[i];\n> +\t\t\tuint32_t counted = stats->agc_stats[i].counted * weights[i];\n> +\t\t\tuint32_t notcounted = stats->agc_stats[i].notcounted * weights[i];\n> +\t\t\tstatistics->agcRegions.set(i, { { rSum, gSum, bSum },\n> +\t\t\t\t\t\t\tcounted,\n> +\t\t\t\t\t\t\tnotcounted });\n> +\t\t}\n> +\t}\n>\n>  \tstatistics->focusRegions.init(hw.focusRegions);\n>  \tfor (i = 0; i < statistics->focusRegions.numRegions(); i++)\n> --\n> 2.34.1\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 D0C31C3272\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 26 Apr 2023 16:21:06 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 525EF627DC;\n\tWed, 26 Apr 2023 18:21:06 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C2C60627D4\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 26 Apr 2023 18:21:04 +0200 (CEST)","from ideasonboard.com (93-61-96-190.ip145.fastwebnet.it\n\t[93.61.96.190])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 4AD71D8B;\n\tWed, 26 Apr 2023 18:20:53 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1682526066;\n\tbh=cYg61HPlqyEl97t95+qTQ2ahaRSrivlIeDgPKRzAy2w=;\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=xxQBB2dxcmNo9ickYIdNL7i41DxxWJ1FxdtxCcVzrW9jdXSu+Bfkb0FfHk5C+BIcc\n\tOVlqouQBzRgVPTeR5hi9nGjJzDz/FQCOhfwbqRhcCnrsuJCxlZlMFZgBDqPskiveWY\n\tE5QFfC1SmG+wRkQW2O0b11BNHbeQJB72hvkJFk2AAOTqipehOTbMRvaDtCDXBSusnT\n\t7oJKxasNxjjlibaGz2h68GjKRz5SCx8IXhA6pWw7j84vgVozc7/ArqxaH54j6TVIio\n\t8QkLfamY2sw1m9Qibirvk0rUDndjvG+UHzBYT4pBWBG5Ew/gb0WFfgkiSj+f8xHtsT\n\tOYkqQyl4n1Mvg==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1682526053;\n\tbh=cYg61HPlqyEl97t95+qTQ2ahaRSrivlIeDgPKRzAy2w=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=rxSWOcptz82EQJvHKVt5n3YV/ruPCkrP2PqBrPLaUaq+YVg35ZWR/hdqPTptQL7si\n\tb+qpniuN8SOsffmY4Lpo6T59bjTMR4vkVNk2ivznAv+5bj/huv1NNz70JAdKFkrz2m\n\tum/6Yv+/ef/Pkg/SM1N1CRlzd3ZMKplSWr3zVOWc="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"rxSWOcpt\"; dkim-atps=neutral","Date":"Wed, 26 Apr 2023 18:21:01 +0200","To":"Naushir Patuck <naush@raspberrypi.com>","Message-ID":"<zq5wgb37oweuqm33d6x3yy3oirx66noa3fbs2rod5jyt2id7sh@bobkphorvlug>","References":"<20230426131057.21550-1-naush@raspberrypi.com>\n\t<20230426131057.21550-10-naush@raspberrypi.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20230426131057.21550-10-naush@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH 09/13] ipa: raspberrypi: agc: Move\n\tweights out of AGC","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":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":26966,"web_url":"https://patchwork.libcamera.org/comment/26966/","msgid":"<20230427134230.GA28489@pendragon.ideasonboard.com>","date":"2023-04-27T13:42:30","subject":"Re: [libcamera-devel] [PATCH 09/13] ipa: raspberrypi: agc: Move\n\tweights out of AGC","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Naush and David,\n\nThank you for the patch.\n\nOn Wed, Apr 26, 2023 at 02:10:53PM +0100, Naushir Patuck via libcamera-devel wrote:\n> From: David Plowman <david.plowman@raspberrypi.com>\n> \n> The region weights for the the AGC zones were previously handled by the\n> AGC algorithm. Now it's the IPA (vc4.cpp) that applies them directly\n> to the statistics that we pass to the AGC.\n\nIt doesn't need to be changed in this patch, but for future patches,\nplease use the imperative style, and use the present tense to describe\nthe current situation:\n\n----\nThe region weights for the the AGC zones are handled by the AGC\nalgorithm. Apply them directly in the IPA (vc4.cpp) to the statistics\nthat we pass to the AGC.\n----\n\nIf you end up submitting a new version of the series for unrelated\nreason you may want to update this commit message.\n\n> Signed-off-by: David Plowman <david.plowman@raspberrypi>\n> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> ---\n>  src/ipa/rpi/controller/agc_algorithm.h |  3 +++\n>  src/ipa/rpi/controller/rpi/agc.cpp     | 27 +++++++++++++++++---------\n>  src/ipa/rpi/controller/rpi/agc.h       |  1 +\n>  src/ipa/rpi/vc4/vc4.cpp                | 26 ++++++++++++++++++-------\n>  4 files changed, 41 insertions(+), 16 deletions(-)\n> \n> diff --git a/src/ipa/rpi/controller/agc_algorithm.h b/src/ipa/rpi/controller/agc_algorithm.h\n> index 36e6c11058ee..b6949daa7135 100644\n> --- a/src/ipa/rpi/controller/agc_algorithm.h\n> +++ b/src/ipa/rpi/controller/agc_algorithm.h\n> @@ -6,6 +6,8 @@\n>   */\n>  #pragma once\n>  \n> +#include <vector>\n> +\n>  #include <libcamera/base/utils.h>\n>  \n>  #include \"algorithm.h\"\n> @@ -18,6 +20,7 @@ public:\n>  \tAgcAlgorithm(Controller *controller) : Algorithm(controller) {}\n>  \t/* An AGC algorithm must provide the following: */\n>  \tvirtual unsigned int getConvergenceFrames() const = 0;\n> +\tvirtual std::vector<double> const &getWeights() const = 0;\n>  \tvirtual void setEv(double ev) = 0;\n>  \tvirtual void setFlickerPeriod(libcamera::utils::Duration flickerPeriod) = 0;\n>  \tvirtual void setFixedShutter(libcamera::utils::Duration fixedShutter) = 0;\n> diff --git a/src/ipa/rpi/controller/rpi/agc.cpp b/src/ipa/rpi/controller/rpi/agc.cpp\n> index e6fb7b8dbeb3..e79c82e2e65b 100644\n> --- a/src/ipa/rpi/controller/rpi/agc.cpp\n> +++ b/src/ipa/rpi/controller/rpi/agc.cpp\n> @@ -292,6 +292,18 @@ unsigned int Agc::getConvergenceFrames() const\n>  \t\treturn config_.convergenceFrames;\n>  }\n>  \n> +std::vector<double> const &Agc::getWeights() const\n> +{\n> +\t/*\n> +\t * In case someone calls setMeteringMode and then this before the\n> +\t * algorithm has run and updated the meteringMode_ pointer.\n> +\t */\n> +\tauto it = config_.meteringModes.find(meteringModeName_);\n> +\tif (it == config_.meteringModes.end())\n> +\t\treturn meteringMode_->weights;\n> +\treturn it->second.weights;\n> +}\n> +\n>  void Agc::setEv(double ev)\n>  {\n>  \tev_ = ev;\n> @@ -595,19 +607,16 @@ static double computeInitialY(StatisticsPtr &stats, AwbStatus const &awb,\n>  \tASSERT(weights.size() == stats->agcRegions.numRegions());\n>  \n>  \t/*\n> -\t * Note how the calculation below means that equal weights give you\n> -\t * \"average\" metering (i.e. all pixels equally important).\n> +\t * Note that the weights are applied by the IPA to the statistics directly,\n> +\t * before they are given to us here.\n>  \t */\n>  \tdouble rSum = 0, gSum = 0, bSum = 0, pixelSum = 0;\n>  \tfor (unsigned int i = 0; i < stats->agcRegions.numRegions(); i++) {\n>  \t\tauto &region = stats->agcRegions.get(i);\n> -\t\tdouble rAcc = std::min<double>(region.val.rSum * gain, (maxVal - 1) * region.counted);\n> -\t\tdouble gAcc = std::min<double>(region.val.gSum * gain, (maxVal - 1) * region.counted);\n> -\t\tdouble bAcc = std::min<double>(region.val.bSum * gain, (maxVal - 1) * region.counted);\n> -\t\trSum += rAcc * weights[i];\n> -\t\tgSum += gAcc * weights[i];\n> -\t\tbSum += bAcc * weights[i];\n> -\t\tpixelSum += region.counted * weights[i];\n> +\t\trSum += std::min<double>(region.val.rSum * gain, (maxVal - 1) * region.counted);\n> +\t\tgSum += std::min<double>(region.val.gSum * gain, (maxVal - 1) * region.counted);\n> +\t\tbSum += std::min<double>(region.val.bSum * gain, (maxVal - 1) * region.counted);\n> +\t\tpixelSum += region.counted;\n>  \t}\n>  \tif (pixelSum == 0.0) {\n>  \t\tLOG(RPiAgc, Warning) << \"computeInitialY: pixelSum is zero\";\n> diff --git a/src/ipa/rpi/controller/rpi/agc.h b/src/ipa/rpi/controller/rpi/agc.h\n> index 4e5f272fac78..939f97295a02 100644\n> --- a/src/ipa/rpi/controller/rpi/agc.h\n> +++ b/src/ipa/rpi/controller/rpi/agc.h\n> @@ -69,6 +69,7 @@ public:\n>  \tchar const *name() const override;\n>  \tint read(const libcamera::YamlObject &params) override;\n>  \tunsigned int getConvergenceFrames() const override;\n> +\tstd::vector<double> const &getWeights() const override;\n>  \tvoid setEv(double ev) override;\n>  \tvoid setFlickerPeriod(libcamera::utils::Duration flickerPeriod) override;\n>  \tvoid setMaxShutter(libcamera::utils::Duration maxShutter) override;\n> diff --git a/src/ipa/rpi/vc4/vc4.cpp b/src/ipa/rpi/vc4/vc4.cpp\n> index 0d929cda6c4a..0e022c2aeed3 100644\n> --- a/src/ipa/rpi/vc4/vc4.cpp\n> +++ b/src/ipa/rpi/vc4/vc4.cpp\n> @@ -211,13 +211,25 @@ RPiController::StatisticsPtr IpaVc4::platformProcessStats(Span<uint8_t> mem)\n>  \t\t\t\t\t\tstats->awb_stats[i].counted,\n>  \t\t\t\t\t\tstats->awb_stats[i].notcounted });\n>  \n> -\tstatistics->agcRegions.init(hw.agcRegions);\n> -\tfor (i = 0; i < statistics->agcRegions.numRegions(); i++)\n> -\t\tstatistics->agcRegions.set(i, { { stats->agc_stats[i].r_sum << scale,\n> -\t\t\t\t\t\t  stats->agc_stats[i].g_sum << scale,\n> -\t\t\t\t\t\t  stats->agc_stats[i].b_sum << scale },\n> -\t\t\t\t\t\tstats->agc_stats[i].counted,\n> -\t\t\t\t\t\tstats->awb_stats[i].notcounted });\n> +\tRPiController::AgcAlgorithm *agc = dynamic_cast<RPiController::AgcAlgorithm *>(\n> +\t\tcontroller_.getAlgorithm(\"agc\"));\n> +\tif (!agc) {\n> +\t\tLOG(IPARPI, Debug) << \"No AGC algorithm - not copying statistics\";\n> +\t\tstatistics->agcRegions.init(0);\n> +\t} else {\n> +\t\tstatistics->agcRegions.init(hw.agcRegions);\n> +\t\tconst std::vector<double> &weights = agc->getWeights();\n> +\t\tfor (i = 0; i < statistics->agcRegions.numRegions(); i++) {\n> +\t\t\tuint64_t rSum = (stats->agc_stats[i].r_sum << scale) * weights[i];\n> +\t\t\tuint64_t gSum = (stats->agc_stats[i].g_sum << scale) * weights[i];\n> +\t\t\tuint64_t bSum = (stats->agc_stats[i].b_sum << scale) * weights[i];\n> +\t\t\tuint32_t counted = stats->agc_stats[i].counted * weights[i];\n> +\t\t\tuint32_t notcounted = stats->agc_stats[i].notcounted * weights[i];\n> +\t\t\tstatistics->agcRegions.set(i, { { rSum, gSum, bSum },\n> +\t\t\t\t\t\t\tcounted,\n> +\t\t\t\t\t\t\tnotcounted });\n> +\t\t}\n> +\t}\n>  \n>  \tstatistics->focusRegions.init(hw.focusRegions);\n>  \tfor (i = 0; i < statistics->focusRegions.numRegions(); i++)","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 CEB09BDCBD\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 27 Apr 2023 13:42:21 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 42BD1627D6;\n\tThu, 27 Apr 2023 15:42:21 +0200 (CEST)","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 DADC2627B7\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 27 Apr 2023 15:42:19 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(133-32-181-51.west.xps.vectant.ne.jp [133.32.181.51])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id E42889DE;\n\tThu, 27 Apr 2023 15:42:06 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1682602941;\n\tbh=nxgWCyguGaREQpVOVU9e8pe6f4fVPjmP2UKMx8MLWLY=;\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=CNq7iGigWZAMNWyQ/4lHYyBCWPQJN70acry6aVFyAnxRBbLRN5l6S0v5DPRzDwj2S\n\tuQJl509tIrHfY/HbngKRQbU3N1Qv0bm0t5sf5JMUAQ1bn3x+90sJS7ZWhjmjBaMKBY\n\tdnzdyHmcwNqmJysWuQiw0XSesHejTAxZDcTr2uHl9abYeFYYjdErQTG/iMDSRjHRXk\n\tZiRenpQn++CVOp03qBd+6k7Y67vAkr/AQGnRQLKwJ0bxxgF70hnLo+jisRU25CAvDc\n\tp5srP5Rmduqhd2KhYg0VjfL+usp7ov1NdbTcx1szGhDZBaQSK58PKXWD7WKEHvV0iX\n\tdpxJo/BEOgu7Q==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1682602927;\n\tbh=nxgWCyguGaREQpVOVU9e8pe6f4fVPjmP2UKMx8MLWLY=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=PjhZXtA5DWMLxigHlM0J3sRBR4by8RPt3XRjB4N51RfajKxvdKUCzxPsA1sF5Hk/H\n\tvlkiKkcBi0jKIytAC0nexugtxImy6VA8y1vOePQPSr/oCHK8yRFFDAGrfCHSFLY9es\n\thvCFnUe2W0wEbQ+7vK+tEHmV3/V723Mt9Kk2fZEs="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"PjhZXtA5\"; dkim-atps=neutral","Date":"Thu, 27 Apr 2023 16:42:30 +0300","To":"Naushir Patuck <naush@raspberrypi.com>","Message-ID":"<20230427134230.GA28489@pendragon.ideasonboard.com>","References":"<20230426131057.21550-1-naush@raspberrypi.com>\n\t<20230426131057.21550-10-naush@raspberrypi.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20230426131057.21550-10-naush@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH 09/13] ipa: raspberrypi: agc: Move\n\tweights out of AGC","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>"}}]