Patch Detail
Show a patch.
GET /api/1.1/patches/22625/?format=api
{ "id": 22625, "url": "https://patchwork.libcamera.org/api/1.1/patches/22625/?format=api", "web_url": "https://patchwork.libcamera.org/patch/22625/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/1.1/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": "<20250123114204.79321-11-stefan.klug@ideasonboard.com>", "date": "2025-01-23T11:41:00", "name": "[v2,10/17] ipa: rkisp1: Add support for bayes AWB algorithm from libipa", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "7d5db56380816754dc8792f98f063cef5f8f5a7f", "submitter": { "id": 184, "url": "https://patchwork.libcamera.org/api/1.1/people/184/?format=api", "name": "Stefan Klug", "email": "stefan.klug@ideasonboard.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/22625/mbox/", "series": [ { "id": 4966, "url": "https://patchwork.libcamera.org/api/1.1/series/4966/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=4966", "date": "2025-01-23T11:40:50", "name": "Add Bayesian AWB algorithm to libipa and rkisp1", "version": 2, "mbox": "https://patchwork.libcamera.org/series/4966/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/22625/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/22625/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 E5962C3317\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 23 Jan 2025 11:42:42 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8523E68572;\n\tThu, 23 Jan 2025 12:42:42 +0100 (CET)", "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6DE1F6856C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 23 Jan 2025 12:42:40 +0100 (CET)", "from ideasonboard.com (unknown\n\t[IPv6:2a00:6020:448c:6c00:c0a:33cd:b453:5d3f])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 000AA134C;\n\tThu, 23 Jan 2025 12:41:36 +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=\"QbU1DQZu\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1737632497;\n\tbh=OYOLbYo26r1XY6je1zy4ggkTl/orvQ0+x8C/m1NNU64=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=QbU1DQZuayIf6KDGc5dylwwUFXLzGfcwQESNC7ckhNuBazwc20U2PFxCoXdoWH72d\n\tubpH+XwXI2gNbvYfCIPACUcGkR6nCwYYaMym/Kpu7NKOZBDVbyAeR0cT7/8qeMpZ82\n\tXaJcBFciwETZf/13UpvNy0B6EKd4E5lC4p6XPaYI=", "From": "Stefan Klug <stefan.klug@ideasonboard.com>", "To": "libcamera-devel@lists.libcamera.org", "Cc": "Stefan Klug <stefan.klug@ideasonboard.com>,\n\tPaul Elder <paul.elder@ideasonboard.com>,\n\tDaniel Scally <dan.scally@ideasonboard.com>", "Subject": "[PATCH v2 10/17] ipa: rkisp1: Add support for bayes AWB algorithm\n\tfrom libipa", "Date": "Thu, 23 Jan 2025 12:41:00 +0100", "Message-ID": "<20250123114204.79321-11-stefan.klug@ideasonboard.com>", "X-Mailer": "git-send-email 2.43.0", "In-Reply-To": "<20250123114204.79321-1-stefan.klug@ideasonboard.com>", "References": "<20250123114204.79321-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": "Now that libipa contains a bayes AWB algorithm, add it as supported\nalgorithm to the rkisp1 ipa.\n\nThe decision between the grey world algorithm and the bayesian is done\nbased on the \"algorithm\" property of the \"Awb\" algorithm in the tuning\nfile. If the lux value in the frameContext is set by the Lux algorithm\nit is taken into account. If the lux value is 0 the prior likelihood\nestimation gets ignored in the AWB calculations.\n\nSigned-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\nReviewed-by: Paul Elder <paul.elder@ideasonboard.com>\nReviewed-by: Daniel Scally <dan.scally@ideasonboard.com>\n\n---\n\nChanges in v2:\n- Collected tags\n---\n src/ipa/rkisp1/algorithms/awb.cpp | 52 +++++++++++++++++++++++--------\n 1 file changed, 39 insertions(+), 13 deletions(-)", "diff": "diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp\nindex b21d0d4c03bb..55e1b43c8cd2 100644\n--- a/src/ipa/rkisp1/algorithms/awb.cpp\n+++ b/src/ipa/rkisp1/algorithms/awb.cpp\n@@ -16,6 +16,7 @@\n \n #include <libcamera/ipa/core_ipa_interface.h>\n \n+#include \"libipa/awb_bayes.h\"\n #include \"libipa/awb_grey.h\"\n #include \"libipa/colours.h\"\n \n@@ -45,13 +46,23 @@ class RkISP1AwbStats : public AwbStats\n {\n public:\n \tRkISP1AwbStats(const RGB<double> &rgbMeans)\n-\t\t: rgbMeans_(rgbMeans) {}\n+\t\t: rgbMeans_(rgbMeans)\n+\t{\n+\t\trg_ = rgbMeans_.r() / rgbMeans_.g();\n+\t\tbg_ = rgbMeans_.b() / rgbMeans_.g();\n+\t}\n \n-\tdouble computeColourError([[maybe_unused]] const RGB<double> &gains) const override\n+\tdouble computeColourError(const RGB<double> &gains) const override\n \t{\n-\t\tLOG(RkISP1Awb, Error)\n-\t\t\t<< \"RkISP1AwbStats::computeColourError is not implemented\";\n-\t\treturn 0.0;\n+\t\t/*\n+\t\t* Compute the sum of the squared colour error (non-greyness) as it\n+\t\t* appears in the log likelihood equation.\n+\t\t*/\n+\t\tdouble deltaR = gains.r() * rg_ - 1.0;\n+\t\tdouble deltaB = gains.b() * bg_ - 1.0;\n+\t\tdouble delta2 = deltaR * deltaR + deltaB * deltaB;\n+\n+\t\treturn delta2;\n \t}\n \n \tRGB<double> getRGBMeans() const override\n@@ -61,6 +72,8 @@ public:\n \n private:\n \tRGB<double> rgbMeans_;\n+\tdouble rg_;\n+\tdouble bg_;\n };\n \n Awb::Awb()\n@@ -78,13 +91,30 @@ int Awb::init(IPAContext &context, const YamlObject &tuningData)\n \t\t\t\t\t\t\t kMaxColourTemperature,\n \t\t\t\t\t\t\t kDefaultColourTemperature);\n \n-\tawbAlgo_ = std::make_unique<AwbGrey>();\n+\tif (!tuningData.contains(\"algorithm\"))\n+\t\tLOG(RkISP1Awb, Info) << \"No awb algorithm specified.\"\n+\t\t\t\t << \" Default to grey world\";\n+\n+\tauto mode = tuningData[\"algorithm\"].get<std::string>(\"grey\");\n+\tif (mode == \"grey\") {\n+\t\tawbAlgo_ = std::make_unique<AwbGrey>();\n+\t} else if (mode == \"bayes\") {\n+\t\tawbAlgo_ = std::make_unique<AwbBayes>();\n+\t} else {\n+\t\tLOG(RkISP1Awb, Error) << \"Unknown awb algorithm: \" << mode;\n+\t\treturn -EINVAL;\n+\t}\n+\tLOG(RkISP1Awb, Debug) << \"Using awb algorithm: \" << mode;\n+\n \tint ret = awbAlgo_->init(tuningData);\n \tif (ret) {\n \t\tLOG(RkISP1Awb, Error) << \"Failed to init awb algorithm\";\n \t\treturn ret;\n \t}\n \n+\tconst auto &src = awbAlgo_->controls();\n+\tcmap.insert(src.begin(), src.end());\n+\n \treturn 0;\n }\n \n@@ -131,6 +161,8 @@ void Awb::queueRequest(IPAContext &context,\n \t\t\t<< (*awbEnable ? \"Enabling\" : \"Disabling\") << \" AWB\";\n \t}\n \n+\tawbAlgo_->handleControls(controls);\n+\n \tframeContext.awb.autoEnabled = awb.autoEnabled;\n \n \tif (awb.autoEnabled)\n@@ -271,14 +303,8 @@ void Awb::process(IPAContext &context,\n \t rgbMeans.b() < kMeanMinThreshold)\n \t\treturn;\n \n-\t/*\n-\t * \\Todo: Hardcode lux to a fixed value, until an estimation is\n-\t * implemented.\n-\t */\n-\tint lux = 1000;\n-\n \tRkISP1AwbStats awbStats{ rgbMeans };\n-\tAwbResult awbResult = awbAlgo_->calculateAwb(awbStats, lux);\n+\tAwbResult awbResult = awbAlgo_->calculateAwb(awbStats, frameContext.lux.lux);\n \n \tactiveState.awb.temperatureK = awbResult.colourTemperature;\n \n", "prefixes": [ "v2", "10/17" ] }