Patch Detail
Show a patch.
GET /api/patches/22976/?format=api
{ "id": 22976, "url": "https://patchwork.libcamera.org/api/patches/22976/?format=api", "web_url": "https://patchwork.libcamera.org/patch/22976/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20250319160146.61751-2-stefan.klug@ideasonboard.com>", "date": "2025-03-19T16:01:36", "name": "[1/2] ipa: rkisp1: agc: Fix metering modes", "commit_ref": "0539e88679df7454d761b607ea82b351e4747a8b", "pull_url": null, "state": "accepted", "archived": false, "hash": "4ee9331309080ff97cbba33411adf807063dfa10", "submitter": { "id": 184, "url": "https://patchwork.libcamera.org/api/people/184/?format=api", "name": "Stefan Klug", "email": "stefan.klug@ideasonboard.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/22976/mbox/", "series": [ { "id": 5070, "url": "https://patchwork.libcamera.org/api/series/5070/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5070", "date": "2025-03-19T16:01:35", "name": "rkisp1: Fix metering modes", "version": 1, "mbox": "https://patchwork.libcamera.org/series/5070/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/22976/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/22976/checks/", "tags": {}, "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 7709BC3301\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 19 Mar 2025 16:02:01 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 2FD2268950;\n\tWed, 19 Mar 2025 17:02:01 +0100 (CET)", "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 43B4E68950\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 19 Mar 2025 17:01:58 +0100 (CET)", "from ideasonboard.com (unknown\n\t[IPv6:2a00:6020:448c:6c00:760:e5ca:4814:99c7])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 622501E6;\n\tWed, 19 Mar 2025 17:00:15 +0100 (CET)" ], "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"onr8Soyr\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1742400015;\n\tbh=38PgVpMLCn1rU1JAGX96dX81FNIUPDUJkZQfAyhJte4=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=onr8Soyr8yOTnDsNMvPDeHm/KFZ0CrYDfbuzIemNZSCxDrNjrV9p6XBfRySJX+P8Z\n\tkJaUWDSn1TR4HKc0HPq9pP+tyN5o+49qb+zZUUEumX24P85NhQJdWNWlTjGrQskn9U\n\tR+Hfggtdd/XxVyg8tMY0OaDJH2zeE35nZ20Ihnec=", "From": "Stefan Klug <stefan.klug@ideasonboard.com>", "To": "libcamera-devel@lists.libcamera.org", "Cc": "Stefan Klug <stefan.klug@ideasonboard.com>", "Subject": "[PATCH 1/2] ipa: rkisp1: agc: Fix metering modes", "Date": "Wed, 19 Mar 2025 17:01:36 +0100", "Message-ID": "<20250319160146.61751-2-stefan.klug@ideasonboard.com>", "X-Mailer": "git-send-email 2.43.0", "In-Reply-To": "<20250319160146.61751-1-stefan.klug@ideasonboard.com>", "References": "<20250319160146.61751-1-stefan.klug@ideasonboard.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "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>" }, "content": "The weights for a given metering mode are applied to the histogram data\ninside the histogram statistics block. The AE statistics do not contain\nany weights. Therefore the weights are honored when AgcMeanLuminance\ncalculates the upper or lower constraints, but ignored in the\ncalculation of the frame luminance. Fix that by manually applying the\nweights in the luminance calculation.\n\nFixes: 4c5152843a2a (\"ipa: rkisp1: Derive rkisp1::algorithms::Agc from AgcMeanLuminance\")\nSigned-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n---\n src/ipa/rkisp1/algorithms/agc.cpp | 13 ++++++++++---\n src/ipa/rkisp1/algorithms/agc.h | 1 +\n 2 files changed, 11 insertions(+), 3 deletions(-)", "diff": "diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp\nindex 5a3ba0131cf1..101cad5d0893 100644\n--- a/src/ipa/rkisp1/algorithms/agc.cpp\n+++ b/src/ipa/rkisp1/algorithms/agc.cpp\n@@ -439,15 +439,20 @@ void Agc::fillMetadata(IPAContext &context, IPAFrameContext &frameContext,\n */\n double Agc::estimateLuminance(double gain) const\n {\n+\tASSERT(expMeans_.size() == weights_.size());\n \tdouble ySum = 0.0;\n+\tdouble wSum = 0.0;\n \n \t/* Sum the averages, saturated to 255. */\n-\tfor (uint8_t expMean : expMeans_)\n-\t\tySum += std::min(expMean * gain, 255.0);\n+\tfor (unsigned i = 0; i < expMeans_.size(); i++) {\n+\t\tdouble w = weights_[i];\n+\t\tySum += std::min(expMeans_[i] * gain, 255.0) * w;\n+\t\twSum += w;\n+\t}\n \n \t/* \\todo Weight with the AWB gains */\n \n-\treturn ySum / expMeans_.size() / 255;\n+\treturn ySum / wSum / 255;\n }\n \n /**\n@@ -515,6 +520,8 @@ void Agc::process(IPAContext &context, [[maybe_unused]] const uint32_t frame,\n \tHistogram hist({ params->hist.hist_bins, context.hw->numHistogramBins },\n \t\t [](uint32_t x) { return x >> 4; });\n \texpMeans_ = { params->ae.exp_mean, context.hw->numAeCells };\n+\tstd::vector<uint8_t> &modeWeights = meteringModes_.at(frameContext.agc.meteringMode);\n+\tweights_ = { modeWeights.data(), modeWeights.size() };\n \n \t/*\n \t * Set the AGC limits using the fixed exposure time and/or gain in\ndiff --git a/src/ipa/rkisp1/algorithms/agc.h b/src/ipa/rkisp1/algorithms/agc.h\nindex 62bcde999fe3..7867eed9c4e3 100644\n--- a/src/ipa/rkisp1/algorithms/agc.h\n+++ b/src/ipa/rkisp1/algorithms/agc.h\n@@ -55,6 +55,7 @@ private:\n \t\t\t\t utils::Duration frameDuration);\n \n \tSpan<const uint8_t> expMeans_;\n+\tSpan<const uint8_t> weights_;\n \n \tstd::map<int32_t, std::vector<uint8_t>> meteringModes_;\n };\n", "prefixes": [ "1/2" ] }