{"id":22417,"url":"https://patchwork.libcamera.org/api/1.1/patches/22417/?format=json","web_url":"https://patchwork.libcamera.org/patch/22417/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20241219175729.293782-10-stefan.klug@ideasonboard.com>","date":"2024-12-19T17:57:26","name":"[v6,9/9] ipa: rpi: awb: Make it possible to set the colour temperature directly","commit_ref":null,"pull_url":null,"state":"accepted","archived":false,"hash":"e4582f7bc5819b831ca3f7bb828b7eef8b074d47","submitter":{"id":184,"url":"https://patchwork.libcamera.org/api/1.1/people/184/?format=json","name":"Stefan Klug","email":"stefan.klug@ideasonboard.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/22417/mbox/","series":[{"id":4919,"url":"https://patchwork.libcamera.org/api/1.1/series/4919/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=4919","date":"2024-12-19T17:57:17","name":"rkisp1: Add manual colour temperature control","version":6,"mbox":"https://patchwork.libcamera.org/series/4919/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/22417/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/22417/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 441C9C3309\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 19 Dec 2024 17:58:02 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id CC2EC68490;\n\tThu, 19 Dec 2024 18:58: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 3FE2A68484\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 19 Dec 2024 18:57:58 +0100 (CET)","from ideasonboard.com (unknown\n\t[IPv6:2a00:6020:448c:6c00:783:85f9:c998:cb11])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 61A7D163;\n\tThu, 19 Dec 2024 18:57:19 +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=\"RDY+9WTA\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1734631039;\n\tbh=K9lhLOINx1KLtkNJJh12tsv1fR7W7J2SUQfX43GMa6M=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=RDY+9WTAuWDuBPuKYEiK5YySkFDda1KtX7Z7Wfqd/05iPGn6DMmnvQco44r5lE+L6\n\tq/88uqa0w4tU8PVP7uFCExrCeW+QTOAIsrcPwKUgbB2ZBxFNbXJcFVD52GwuZeEzbV\n\tIQOWACmp1S1JV6bCEhnWKYUDWmplY1XT334IprLg=","From":"Stefan Klug <stefan.klug@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Cc":"David Plowman <david.plowman@raspberrypi.com>,\n\tNaushir Patuck <naush@raspberrypi.com>,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>,\n\tStefan Klug <stefan.klug@ideasonboard.com>","Subject":"[PATCH v6 9/9] ipa: rpi: awb: Make it possible to set the colour\n\ttemperature directly","Date":"Thu, 19 Dec 2024 18:57:26 +0100","Message-ID":"<20241219175729.293782-10-stefan.klug@ideasonboard.com>","X-Mailer":"git-send-email 2.43.0","In-Reply-To":"<20241219175729.293782-1-stefan.klug@ideasonboard.com>","References":"<20241219175729.293782-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":"From: David Plowman <david.plowman@raspberrypi.com>\n\nColourTemperature is now exported as a writable control so that\napplications can set it directly. The AWB algorithm class now requires\na method to be provided to perform this operation. The method should\nclamp the passed value to the calibrated range known to the algorithm.\n\nThe default range is set very wide to cover all conceivable future AWB\ncalibrations. It will always be clamped before use.\n\nSigned-off-by: David Plowman <david.plowman@raspberrypi.com>\nReviewed-by: Naushir Patuck <naush@raspberrypi.com>\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\nSigned-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\nTested-by: Stefan Klug <stefan.klug@ideasonboard.com>\n\n--- Changes in v6:\n- Added this commit from https://patchwork.libcamera.org/patch/19232/\n---\n src/ipa/rpi/common/ipa_base.cpp        | 20 ++++++++++++++++++++\n src/ipa/rpi/controller/awb_algorithm.h |  1 +\n src/ipa/rpi/controller/rpi/awb.cpp     | 18 ++++++++++++++++++\n src/ipa/rpi/controller/rpi/awb.h       |  1 +\n 4 files changed, 40 insertions(+)","diff":"diff --git a/src/ipa/rpi/common/ipa_base.cpp b/src/ipa/rpi/common/ipa_base.cpp\nindex 45e2a1d7a6eb..0c8aee699155 100644\n--- a/src/ipa/rpi/common/ipa_base.cpp\n+++ b/src/ipa/rpi/common/ipa_base.cpp\n@@ -81,6 +81,7 @@ const ControlInfoMap::Map ipaColourControls{\n \t{ &controls::AwbEnable, ControlInfo(false, true) },\n \t{ &controls::AwbMode, ControlInfo(controls::AwbModeValues) },\n \t{ &controls::ColourGains, ControlInfo(0.0f, 32.0f) },\n+\t{ &controls::ColourTemperature, ControlInfo(100, 100000) },\n \t{ &controls::Saturation, ControlInfo(0.0f, 32.0f, 1.0f) },\n };\n \n@@ -1011,6 +1012,25 @@ void IpaBase::applyControls(const ControlList &controls)\n \t\t\tbreak;\n \t\t}\n \n+\t\tcase controls::COLOUR_TEMPERATURE: {\n+\t\t\t/* Silently ignore this control for a mono sensor. */\n+\t\t\tif (monoSensor_)\n+\t\t\t\tbreak;\n+\n+\t\t\tauto temperatureK = ctrl.second.get<int32_t>();\n+\t\t\tRPiController::AwbAlgorithm *awb = dynamic_cast<RPiController::AwbAlgorithm *>(\n+\t\t\t\tcontroller_.getAlgorithm(\"awb\"));\n+\t\t\tif (!awb) {\n+\t\t\t\tLOG(IPARPI, Warning)\n+\t\t\t\t\t<< \"Could not set COLOUR_TEMPERATURE - no AWB algorithm\";\n+\t\t\t\tbreak;\n+\t\t\t}\n+\n+\t\t\tawb->setColourTemperature(temperatureK);\n+\t\t\t/* This metadata will get reported back automatically. */\n+\t\t\tbreak;\n+\t\t}\n+\n \t\tcase controls::BRIGHTNESS: {\n \t\t\tRPiController::ContrastAlgorithm *contrast = dynamic_cast<RPiController::ContrastAlgorithm *>(\n \t\t\t\tcontroller_.getAlgorithm(\"contrast\"));\ndiff --git a/src/ipa/rpi/controller/awb_algorithm.h b/src/ipa/rpi/controller/awb_algorithm.h\nindex 1779b0500a04..d941ed4e3476 100644\n--- a/src/ipa/rpi/controller/awb_algorithm.h\n+++ b/src/ipa/rpi/controller/awb_algorithm.h\n@@ -19,6 +19,7 @@ public:\n \tvirtual void initialValues(double &gainR, double &gainB) = 0;\n \tvirtual void setMode(std::string const &modeName) = 0;\n \tvirtual void setManualGains(double manualR, double manualB) = 0;\n+\tvirtual void setColourTemperature(double temperatureK) = 0;\n \tvirtual void enableAuto() = 0;\n \tvirtual void disableAuto() = 0;\n };\ndiff --git a/src/ipa/rpi/controller/rpi/awb.cpp b/src/ipa/rpi/controller/rpi/awb.cpp\nindex c277a1764112..8479ae40951d 100644\n--- a/src/ipa/rpi/controller/rpi/awb.cpp\n+++ b/src/ipa/rpi/controller/rpi/awb.cpp\n@@ -293,6 +293,24 @@ void Awb::setManualGains(double manualR, double manualB)\n \t}\n }\n \n+void Awb::setColourTemperature(double temperatureK)\n+{\n+\tif (!config_.bayes) {\n+\t\tLOG(RPiAwb, Warning) << \"AWB uncalibrated - cannot set colour temperature\";\n+\t\treturn;\n+\t}\n+\n+\ttemperatureK = config_.ctR.domain().clamp(temperatureK);\n+\tmanualR_ = 1 / config_.ctR.eval(temperatureK);\n+\tmanualB_ = 1 / config_.ctB.eval(temperatureK);\n+\n+\tsyncResults_.temperatureK = temperatureK;\n+\tsyncResults_.gainR = manualR_;\n+\tsyncResults_.gainG = 1.0;\n+\tsyncResults_.gainB = manualB_;\n+\tprevSyncResults_ = syncResults_;\n+}\n+\n void Awb::switchMode([[maybe_unused]] CameraMode const &cameraMode,\n \t\t     Metadata *metadata)\n {\ndiff --git a/src/ipa/rpi/controller/rpi/awb.h b/src/ipa/rpi/controller/rpi/awb.h\nindex 5d628b47c8a6..86640f8f8e21 100644\n--- a/src/ipa/rpi/controller/rpi/awb.h\n+++ b/src/ipa/rpi/controller/rpi/awb.h\n@@ -105,6 +105,7 @@ public:\n \tvoid initialValues(double &gainR, double &gainB) override;\n \tvoid setMode(std::string const &name) override;\n \tvoid setManualGains(double manualR, double manualB) override;\n+\tvoid setColourTemperature(double temperatureK) override;\n \tvoid enableAuto() override;\n \tvoid disableAuto() override;\n \tvoid switchMode(CameraMode const &cameraMode, Metadata *metadata) override;\n","prefixes":["v6","9/9"]}