[{"id":33776,"web_url":"https://patchwork.libcamera.org/comment/33776/","msgid":"<wwrf5yrmmffg3y6s4ze77nnmftc6t4d2glg2yfmhiwksq6eh7b@cgdcxittvplv>","date":"2025-03-31T16:22:07","subject":"Re: [PATCH 8/9] libipa: agc_mean_luminance: Add exposure\n\tcompensation support","submitter":{"id":184,"url":"https://patchwork.libcamera.org/api/people/184/","name":"Stefan Klug","email":"stefan.klug@ideasonboard.com"},"content":"Hi all,\n\nI made a mistake in last-minute-variable-sorting and forgot to compile\n:-/. Will be added in v2.\n\nThis patch needs a fixup:\ndiff --git a/src/ipa/libipa/agc_mean_luminance.cpp b/src/ipa/libipa/agc_mean_luminance.cpp\nindex a498b646bdd5..f6cb7144b31a 100644\n--- a/src/ipa/libipa/agc_mean_luminance.cpp\n+++ b/src/ipa/libipa/agc_mean_luminance.cpp\n@@ -143,7 +143,7 @@ static constexpr double kMaxRelativeLuminanceTarget = 0.95;\n  */\n\n AgcMeanLuminance::AgcMeanLuminance()\n-       : frameCount_(0), filteredExposure_(0s), relativeLuminanceTarget_(0), exposureCompensation_(1.0)\n+       : exposureCompensation_(1.0), frameCount_(0), filteredExposure_(0s), relativeLuminanceTarget_(0)\n {\n }\n\nBest regards,\nStefan\n\n\nOn Mon, Mar 31, 2025 at 04:43:47PM +0200, Stefan Klug wrote:\n> Exposure compensation allows to over- or under-expose an\n> image by a given value (typically provided in EV). Add support\n> for that in agc_mean_luminance.\n> \n> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n> ---\n>  src/ipa/libipa/agc_mean_luminance.cpp | 23 +++++++++++++++++++++--\n>  src/ipa/libipa/agc_mean_luminance.h   |  6 ++++++\n>  2 files changed, 27 insertions(+), 2 deletions(-)\n> \n> diff --git a/src/ipa/libipa/agc_mean_luminance.cpp b/src/ipa/libipa/agc_mean_luminance.cpp\n> index 9154f083a510..a498b646bdd5 100644\n> --- a/src/ipa/libipa/agc_mean_luminance.cpp\n> +++ b/src/ipa/libipa/agc_mean_luminance.cpp\n> @@ -44,6 +44,15 @@ static constexpr uint32_t kNumStartupFrames = 10;\n>   */\n>  static constexpr double kDefaultRelativeLuminanceTarget = 0.16;\n>  \n> +/*\n> + * Maximum relative luminance target\n> + *\n> + * This value limits the relative luminance target after applying the exposure\n> + * compensation. Targeting a value above this limit results in saturation\n> + * and the inability to regulate properly.\n> + */\n> +static constexpr double kMaxRelativeLuminanceTarget = 0.95;\n> +\n>  /**\n>   * \\struct AgcMeanLuminance::AgcConstraint\n>   * \\brief The boundaries and target for an AeConstraintMode constraint\n> @@ -134,7 +143,7 @@ static constexpr double kDefaultRelativeLuminanceTarget = 0.16;\n>   */\n>  \n>  AgcMeanLuminance::AgcMeanLuminance()\n> -\t: frameCount_(0), filteredExposure_(0s), relativeLuminanceTarget_(0)\n> +\t: frameCount_(0), filteredExposure_(0s), relativeLuminanceTarget_(0), exposureCompensation_(1.0)\n>  {\n>  }\n>  \n> @@ -369,6 +378,15 @@ int AgcMeanLuminance::parseTuningData(const YamlObject &tuningData)\n>  \treturn parseExposureModes(tuningData);\n>  }\n>  \n> +/**\n> + * \\fn AgcMeanLuminance::setExposureCompensation()\n> + * \\brief Set the exposure compensation value\n> + * \\param[in] gain The exposure compensation gain\n> + *\n> + * This function sets the exposure compensation value to be used in the\n> + * AGC calculations. It is expressed as gain instead of EV.\n> + */\n> +\n>  /**\n>   * \\brief Set the ExposureModeHelper limits for this class\n>   * \\param[in] minExposureTime Minimum exposure time to allow\n> @@ -425,7 +443,8 @@ void AgcMeanLuminance::setLimits(utils::Duration minExposureTime,\n>   */\n>  double AgcMeanLuminance::estimateInitialGain() const\n>  {\n> -\tdouble yTarget = relativeLuminanceTarget_;\n> +\tdouble yTarget = std::min(relativeLuminanceTarget_ * exposureCompensation_,\n> +\t\t\t\t  kMaxRelativeLuminanceTarget);\n>  \tdouble yGain = 1.0;\n>  \n>  \t/*\n> diff --git a/src/ipa/libipa/agc_mean_luminance.h b/src/ipa/libipa/agc_mean_luminance.h\n> index c41391cb0b73..cad7ef845487 100644\n> --- a/src/ipa/libipa/agc_mean_luminance.h\n> +++ b/src/ipa/libipa/agc_mean_luminance.h\n> @@ -44,6 +44,11 @@ public:\n>  \n>  \tint parseTuningData(const YamlObject &tuningData);\n>  \n> +\tvoid setExposureCompensation(double gain)\n> +\t{\n> +\t\texposureCompensation_ = gain;\n> +\t}\n> +\n>  \tvoid setLimits(utils::Duration minExposureTime, utils::Duration maxExposureTime,\n>  \t\t       double minGain, double maxGain);\n>  \n> @@ -84,6 +89,7 @@ private:\n>  \t\t\t\t   double gain);\n>  \tutils::Duration filterExposure(utils::Duration exposureValue);\n>  \n> +\tdouble exposureCompensation_;\n>  \tuint64_t frameCount_;\n>  \tutils::Duration filteredExposure_;\n>  \tdouble relativeLuminanceTarget_;\n> -- \n> 2.43.0\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 9DC6AC323E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 31 Mar 2025 16:22:14 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id A23016897A;\n\tMon, 31 Mar 2025 18:22:13 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id E198968967\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 31 Mar 2025 18:22:11 +0200 (CEST)","from ideasonboard.com (unknown\n\t[IPv6:2a00:6020:448c:6c00:823a:c275:e8b5:b937])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 6D1C1725\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 31 Mar 2025 18:20:19 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"MXV8r7NC\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1743438019;\n\tbh=RRpzxouGszdRicWVE+clgmzOv14ylPOfmFqmiV+H9rs=;\n\th=Date:From:To:Subject:References:In-Reply-To:From;\n\tb=MXV8r7NCTuezmh0/vnjveDndA3G1c1F5IyWZZZz4eIa2pEXqWIWCQwNTfPwncCKCi\n\tw+EgZQPH8FOxusyVYuyYHsfJS6nxteMeWRJhOhNOB4wgokIwpaLgKSJ7BPq3a2nnpP\n\tHoF8Tj9XtoqBLmC0wYjJsq+mpGX6J7WJwgvQoh3o=","Date":"Mon, 31 Mar 2025 18:22:07 +0200","From":"Stefan Klug <stefan.klug@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH 8/9] libipa: agc_mean_luminance: Add exposure\n\tcompensation support","Message-ID":"<wwrf5yrmmffg3y6s4ze77nnmftc6t4d2glg2yfmhiwksq6eh7b@cgdcxittvplv>","References":"<20250331144352.736700-1-stefan.klug@ideasonboard.com>\n\t<20250331144352.736700-9-stefan.klug@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20250331144352.736700-9-stefan.klug@ideasonboard.com>","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":33820,"web_url":"https://patchwork.libcamera.org/comment/33820/","msgid":"<b4686818-ab66-4200-9f57-9401a972c56b@ideasonboard.com>","date":"2025-03-31T22:08:51","subject":"Re: [PATCH 8/9] libipa: agc_mean_luminance: Add exposure\n\tcompensation support","submitter":{"id":156,"url":"https://patchwork.libcamera.org/api/people/156/","name":"Dan Scally","email":"dan.scally@ideasonboard.com"},"content":"Hi Stefan\n\nOn 31/03/2025 15:43, Stefan Klug wrote:\n> Exposure compensation allows to over- or under-expose an\n> image by a given value (typically provided in EV). Add support\n\n\nGiven you're implementing it as gain instead, I would either drop \"typically provided in EV\" or \nexplain that you're not doing so.\n\n> for that in agc_mean_luminance.\n>\n> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n> ---\n>   src/ipa/libipa/agc_mean_luminance.cpp | 23 +++++++++++++++++++++--\n>   src/ipa/libipa/agc_mean_luminance.h   |  6 ++++++\n>   2 files changed, 27 insertions(+), 2 deletions(-)\n>\n> diff --git a/src/ipa/libipa/agc_mean_luminance.cpp b/src/ipa/libipa/agc_mean_luminance.cpp\n> index 9154f083a510..a498b646bdd5 100644\n> --- a/src/ipa/libipa/agc_mean_luminance.cpp\n> +++ b/src/ipa/libipa/agc_mean_luminance.cpp\n> @@ -44,6 +44,15 @@ static constexpr uint32_t kNumStartupFrames = 10;\n>    */\n>   static constexpr double kDefaultRelativeLuminanceTarget = 0.16;\n>   \n> +/*\n> + * Maximum relative luminance target\n> + *\n> + * This value limits the relative luminance target after applying the exposure\n> + * compensation. Targeting a value above this limit results in saturation\n> + * and the inability to regulate properly.\n> + */\n> +static constexpr double kMaxRelativeLuminanceTarget = 0.95;\n> +\n>   /**\n>    * \\struct AgcMeanLuminance::AgcConstraint\n>    * \\brief The boundaries and target for an AeConstraintMode constraint\n> @@ -134,7 +143,7 @@ static constexpr double kDefaultRelativeLuminanceTarget = 0.16;\n>    */\n>   \n>   AgcMeanLuminance::AgcMeanLuminance()\n> -\t: frameCount_(0), filteredExposure_(0s), relativeLuminanceTarget_(0)\n> +\t: frameCount_(0), filteredExposure_(0s), relativeLuminanceTarget_(0), exposureCompensation_(1.0)\n>   {\n>   }\n>   \n> @@ -369,6 +378,15 @@ int AgcMeanLuminance::parseTuningData(const YamlObject &tuningData)\n>   \treturn parseExposureModes(tuningData);\n>   }\n>   \n> +/**\n> + * \\fn AgcMeanLuminance::setExposureCompensation()\n> + * \\brief Set the exposure compensation value\n> + * \\param[in] gain The exposure compensation gain\n> + *\n> + * This function sets the exposure compensation value to be used in the\n> + * AGC calculations. It is expressed as gain instead of EV.\n> + */\n> +\n>   /**\n>    * \\brief Set the ExposureModeHelper limits for this class\n>    * \\param[in] minExposureTime Minimum exposure time to allow\n> @@ -425,7 +443,8 @@ void AgcMeanLuminance::setLimits(utils::Duration minExposureTime,\n>    */\n>   double AgcMeanLuminance::estimateInitialGain() const\n>   {\n> -\tdouble yTarget = relativeLuminanceTarget_;\n> +\tdouble yTarget = std::min(relativeLuminanceTarget_ * exposureCompensation_,\n> +\t\t\t\t  kMaxRelativeLuminanceTarget);\n\n\nThe capping is really a separate change to the one described in the commit message...I would \npersonally split them into separate commits, but failing that it ought to be described in the commit \nmessage. Either way (and if you split, keep the tag for both):\n\n\nReviewed-by: Daniel Scally <dan.scally@ideasonboard.com>\n\n>   \tdouble yGain = 1.0;\n>   \n>   \t/*\n> diff --git a/src/ipa/libipa/agc_mean_luminance.h b/src/ipa/libipa/agc_mean_luminance.h\n> index c41391cb0b73..cad7ef845487 100644\n> --- a/src/ipa/libipa/agc_mean_luminance.h\n> +++ b/src/ipa/libipa/agc_mean_luminance.h\n> @@ -44,6 +44,11 @@ public:\n>   \n>   \tint parseTuningData(const YamlObject &tuningData);\n>   \n> +\tvoid setExposureCompensation(double gain)\n> +\t{\n> +\t\texposureCompensation_ = gain;\n> +\t}\n> +\n>   \tvoid setLimits(utils::Duration minExposureTime, utils::Duration maxExposureTime,\n>   \t\t       double minGain, double maxGain);\n>   \n> @@ -84,6 +89,7 @@ private:\n>   \t\t\t\t   double gain);\n>   \tutils::Duration filterExposure(utils::Duration exposureValue);\n>   \n> +\tdouble exposureCompensation_;\n>   \tuint64_t frameCount_;\n>   \tutils::Duration filteredExposure_;\n>   \tdouble relativeLuminanceTarget_;","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 87820C3213\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 31 Mar 2025 22:08:56 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 3A32768981;\n\tTue,  1 Apr 2025 00:08:56 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 02B186897A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  1 Apr 2025 00:08:54 +0200 (CEST)","from [192.168.0.43]\n\t(cpc141996-chfd3-2-0-cust928.12-3.cable.virginm.net [86.13.91.161])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 568688DB\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  1 Apr 2025 00:07:02 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"pFY+R1g+\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1743458822;\n\tbh=ceOV/mDSswQFQMOHe0scIzA6b6XN6eslgIqw+YPnVJ4=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=pFY+R1g+u+FOuq3z8PhaTDDc+x4b7i220EyosLf3L4aOuvr7RfHKq9Txbb3v6Qo4x\n\t3ltV2zlnl1uftD1lMfFzpGts0flKdGN4QpSi9qXNT46Ezpch8enIx9O0/a0gZTh0LT\n\tYei0n4tMA6j/y1FEtd42R7NmP9Nd/wJtdOKi3pZw=","Message-ID":"<b4686818-ab66-4200-9f57-9401a972c56b@ideasonboard.com>","Date":"Mon, 31 Mar 2025 23:08:51 +0100","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 8/9] libipa: agc_mean_luminance: Add exposure\n\tcompensation support","To":"libcamera-devel@lists.libcamera.org","References":"<20250331144352.736700-1-stefan.klug@ideasonboard.com>\n\t<20250331144352.736700-9-stefan.klug@ideasonboard.com>","Content-Language":"en-US","From":"Dan Scally <dan.scally@ideasonboard.com>","Autocrypt":"addr=dan.scally@ideasonboard.com; keydata=\n\t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","In-Reply-To":"<20250331144352.736700-9-stefan.klug@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]