{"id":25864,"url":"https://patchwork.libcamera.org/api/patches/25864/?format=json","web_url":"https://patchwork.libcamera.org/patch/25864/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/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":"<20260120-sklug-lsc-resampling-v2-dev-v4-9-2411c4be6d6d@ideasonboard.com>","date":"2026-01-20T08:45:51","name":"[v4,09/14] ipa: rkisp1: lsc: Handle quantization locally","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"5a1af328df8c9d2a7b27b44c9105ab612fec156c","submitter":{"id":184,"url":"https://patchwork.libcamera.org/api/people/184/?format=json","name":"Stefan Klug","email":"stefan.klug@ideasonboard.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/25864/mbox/","series":[{"id":5720,"url":"https://patchwork.libcamera.org/api/series/5720/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=5720","date":"2026-01-20T08:45:42","name":"Add resampling support for polynomial LSC data","version":4,"mbox":"https://patchwork.libcamera.org/series/5720/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/25864/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/25864/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 1F10FBDCBF\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 20 Jan 2026 08:46:21 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id CCF5761FDA;\n\tTue, 20 Jan 2026 09:46:20 +0100 (CET)","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 15A6C61FDA\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 20 Jan 2026 09:46:19 +0100 (CET)","from ideasonboard.com (unknown\n\t[IPv6:2a00:6020:448c:6c00:7f76:a386:d798:7544])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 18505177D; \n\tTue, 20 Jan 2026 09:45:48 +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=\"UdyVK0F+\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1768898748;\n\tbh=eL+k2EL2JfpXoL5X7gV7awPUpsFnyOfOlJ50FdFvmZQ=;\n\th=From:Date:Subject:References:In-Reply-To:To:Cc:From;\n\tb=UdyVK0F+1WuT3wdpzyiNWPrUNnnIgs9FLTGtucTlNhzqvcvLoWJF7e25W5vsNlmS+\n\tVziKtyHFNoFgqwhJ4KWIzRPmtQIsTdhO2s4T2EuRvHI3SGyM5Ay8SjECRaAMMCJmL1\n\t64vIW6cDXh2stgCQB9JoQBHVDu51RJ8WNyb2dRjU=","From":"Stefan Klug <stefan.klug@ideasonboard.com>","Date":"Tue, 20 Jan 2026 09:45:51 +0100","Subject":"[PATCH v4 09/14] ipa: rkisp1: lsc: Handle quantization locally","MIME-Version":"1.0","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"8bit","Message-Id":"<20260120-sklug-lsc-resampling-v2-dev-v4-9-2411c4be6d6d@ideasonboard.com>","References":"<20260120-sklug-lsc-resampling-v2-dev-v4-0-2411c4be6d6d@ideasonboard.com>","In-Reply-To":"<20260120-sklug-lsc-resampling-v2-dev-v4-0-2411c4be6d6d@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Cc":"Stefan Klug <stefan.klug@ideasonboard.com>, Kieran Bingham\n\t<kieran.bingham@ideasonboard.com>, =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?=\n\t<barnabas.pocze@ideasonboard.com>","X-Mailer":"b4 0.14.2","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 quantization functionality in the Interpolator type hinders in\nwriting nice code. Don't use it and implement the functionality directly\nin the algorithm.\n\nWhile at it, reduce the threshold to half of the quantization step size,\notherwise it might happen that we skip a full quantization step. Rename\nthe kColourTemperatureChangeThreshhold to kColourTemperatureQuantization\nto better express the usecase.\n\nSigned-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\nReviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n\n---\n\nChanges in v4:\n- Small fix in commit message\n- Replaced manual std::abs(signed diff) by utils::abs_diff()\n- Collected tag\n\nChanges in v3:\n- Reduce threshold to quantization step/2\n- Drop unnecessary static modifier\n- Collected tag\n\nChanges in v2:\n- Added this patch\n---\n src/ipa/rkisp1/algorithms/lsc.cpp | 24 +++++++++++++++++-------\n 1 file changed, 17 insertions(+), 7 deletions(-)","diff":"diff --git a/src/ipa/rkisp1/algorithms/lsc.cpp b/src/ipa/rkisp1/algorithms/lsc.cpp\nindex c42f74557c7364935254d75ee1fb923d176e0dbd..b7c2ebe43dc0de6716a90b50153cc4dee5d717af 100644\n--- a/src/ipa/rkisp1/algorithms/lsc.cpp\n+++ b/src/ipa/rkisp1/algorithms/lsc.cpp\n@@ -70,7 +70,7 @@ LOG_DEFINE_CATEGORY(RkISP1Lsc)\n \n namespace {\n \n-constexpr int kColourTemperatureChangeThreshhold = 10;\n+constexpr int kColourTemperatureQuantization = 10;\n \n class LscPolynomialLoader\n {\n@@ -308,12 +308,16 @@ std::vector<double> parseSizes(const YamlObject &tuningData,\n \treturn sizes;\n }\n \n+unsigned int quantize(unsigned int value, unsigned int step)\n+{\n+\treturn std::lround(value / static_cast<double>(step)) * step;\n+}\n+\n } /* namespace */\n \n LensShadingCorrection::LensShadingCorrection()\n \t: lastAppliedCt_(0), lastAppliedQuantizedCt_(0)\n {\n-\tsets_.setQuantization(kColourTemperatureChangeThreshhold);\n }\n \n /**\n@@ -426,17 +430,23 @@ void LensShadingCorrection::prepare([[maybe_unused]] IPAContext &context,\n \t\t\t\t    RkISP1Params *params)\n {\n \tuint32_t ct = frameContext.awb.temperatureK;\n-\tif (std::abs(static_cast<int>(ct) - static_cast<int>(lastAppliedCt_)) <\n-\t    kColourTemperatureChangeThreshhold)\n+\tunsigned int quantizedCt = quantize(ct, kColourTemperatureQuantization);\n+\n+\t/*\n+\t * Add a threshold so that oscillations around a quantization step don't\n+\t * lead to constant changes.\n+\t */\n+\tif (utils::abs_diff(ct, lastAppliedCt_) < kColourTemperatureQuantization / 2)\n \t\treturn;\n-\tunsigned int quantizedCt;\n-\tconst Components &set = sets_.getInterpolated(ct, &quantizedCt);\n-\tif (lastAppliedQuantizedCt_ == quantizedCt)\n+\n+\tif (quantizedCt == lastAppliedQuantizedCt_)\n \t\treturn;\n \n \tauto config = params->block<BlockType::Lsc>();\n \tconfig.setEnabled(true);\n \tsetParameters(*config);\n+\n+\tconst Components &set = sets_.getInterpolated(quantizedCt);\n \tcopyTable(*config, set);\n \n \tlastAppliedCt_ = ct;\n","prefixes":["v4","09/14"]}