{"id":26020,"url":"https://patchwork.libcamera.org/api/1.1/patches/26020/?format=json","web_url":"https://patchwork.libcamera.org/patch/26020/","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":"<20260128-sklug-lsc-resampling-v2-dev-v6-9-af7d95f03d22@ideasonboard.com>","date":"2026-01-28T16:00:26","name":"[v6,09/15] ipa: rkisp1: lsc: Handle quantization locally","commit_ref":null,"pull_url":null,"state":"accepted","archived":false,"hash":"5a1af328df8c9d2a7b27b44c9105ab612fec156c","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/26020/mbox/","series":[{"id":5751,"url":"https://patchwork.libcamera.org/api/1.1/series/5751/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=5751","date":"2026-01-28T16:00:17","name":"Add resampling support for polynomial LSC data","version":6,"mbox":"https://patchwork.libcamera.org/series/5751/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/26020/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/26020/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 20D9BC3200\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 28 Jan 2026 16:00:53 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C7C9061FEE;\n\tWed, 28 Jan 2026 17:00:52 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D22B461FD3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 28 Jan 2026 17:00:50 +0100 (CET)","from ideasonboard.com (unknown\n\t[IPv6:2a00:6020:448c:6c00:1a60:e70f:ec38:13a9])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id CD2A02813; \n\tWed, 28 Jan 2026 17:00:13 +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=\"cV12atsf\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1769616013;\n\tbh=IDs+b0zQ8yuVkCkQntDCcy1ZyW1qjFmEW5gRQy3Fhu4=;\n\th=From:Date:Subject:References:In-Reply-To:To:Cc:From;\n\tb=cV12atsfzKs51Zlv0IVTZ3S05EWGaXLNd6BsIQJClKmX0/ej53gOhfBqaX+9Npqhn\n\tdZIssr/8kAUGaPaFQeBElzkdXA/dSwZ2ceRoQ44BmLNFQMLINHuK1TCYzqp+XH4fi/\n\tmCTFYXe/jbpABv/8SaYSsVzUmjMsuMI6wX3RABLs=","From":"Stefan Klug <stefan.klug@ideasonboard.com>","Date":"Wed, 28 Jan 2026 17:00:26 +0100","Subject":"[PATCH v6 09/15] ipa: rkisp1: lsc: Handle quantization locally","MIME-Version":"1.0","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"8bit","Message-Id":"<20260128-sklug-lsc-resampling-v2-dev-v6-9-af7d95f03d22@ideasonboard.com>","References":"<20260128-sklug-lsc-resampling-v2-dev-v6-0-af7d95f03d22@ideasonboard.com>","In-Reply-To":"<20260128-sklug-lsc-resampling-v2-dev-v6-0-af7d95f03d22@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 99e1e05f1d8b8157c2bbb8ee2f94cedb152009ca..daf5c9a9b8fddf290a55471c4dce608f1b8ec82a 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":["v6","09/15"]}