{"id":25789,"url":"https://patchwork.libcamera.org/api/1.1/patches/25789/?format=json","web_url":"https://patchwork.libcamera.org/patch/25789/","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":"<20260114-sklug-lsc-resampling-v2-dev-v3-9-80cd24f4dd61@ideasonboard.com>","date":"2026-01-14T11:58:02","name":"[v3,09/15] ipa: rkisp1: lsc: Handle quantization locally","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"fedc081a3d20645c1cef8ef504759960f0f19b71","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/25789/mbox/","series":[{"id":5707,"url":"https://patchwork.libcamera.org/api/1.1/series/5707/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=5707","date":"2026-01-14T11:57:53","name":"Add resampling support for polynomial LSC data","version":3,"mbox":"https://patchwork.libcamera.org/series/5707/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/25789/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/25789/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 10626C3226\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 14 Jan 2026 11:58:28 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B9B9F61FCF;\n\tWed, 14 Jan 2026 12:58:27 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B1B4C61FB9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 14 Jan 2026 12:58:25 +0100 (CET)","from ideasonboard.com (unknown\n\t[IPv6:2a00:6020:448c:6c00:b781:dff2:957:7831])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 0790F316;\n\tWed, 14 Jan 2026 12:57:59 +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=\"Rw1I3Vct\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1768391879;\n\tbh=Roq0HS8t5ZHiOGNOCWixxddzZZncwjZ5zGsFl752i7A=;\n\th=From:Date:Subject:References:In-Reply-To:To:Cc:From;\n\tb=Rw1I3Vct58g+DNbc79XYV/1P99Hh8IeluygvUbYmkWL2Bxm1R3zz6zAleuu/ey6+u\n\txx6SKEO3ITc0C0QveZ5ItAdZ/0y5zpyGp3sZBDWCEC5W4ED1ii9+8J0q/nDyrw5s+l\n\tTU/a2eJrnTvzJdjdZY3wExDQhdsVsfsKcism98BY=","From":"Stefan Klug <stefan.klug@ideasonboard.com>","Date":"Wed, 14 Jan 2026 12:58:02 +0100","Subject":"[PATCH v3 09/15] ipa: rkisp1: lsc: Handle quantization locally","MIME-Version":"1.0","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"7bit","Message-Id":"<20260114-sklug-lsc-resampling-v2-dev-v3-9-80cd24f4dd61@ideasonboard.com>","References":"<20260114-sklug-lsc-resampling-v2-dev-v3-0-80cd24f4dd61@ideasonboard.com>","In-Reply-To":"<20260114-sklug-lsc-resampling-v2-dev-v3-0-80cd24f4dd61@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Cc":"Stefan Klug <stefan.klug@ideasonboard.com>, \n\tKieran Bingham <kieran.bingham@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 hinders in writing\nnice code. Don't use it and implement the functionality directly in the\nalgorithm.\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>\n\n---\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 | 25 ++++++++++++++++++-------\n 1 file changed, 18 insertions(+), 7 deletions(-)","diff":"diff --git a/src/ipa/rkisp1/algorithms/lsc.cpp b/src/ipa/rkisp1/algorithms/lsc.cpp\nindex c42f74557c7364935254d75ee1fb923d176e0dbd..77ed0a95209ac13e82f4ee43f7a22095bb5fd65f 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,24 @@ 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+\tint ctDiff = static_cast<int>(ct) - static_cast<int>(lastAppliedCt_);\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 (std::abs(ctDiff) < 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":["v3","09/15"]}