From patchwork Wed Aug 5 16:12:57 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 27638 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 3A945C3341 for ; Wed, 5 Aug 2026 16:13:48 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id A2B7068179; Wed, 5 Aug 2026 18:13:47 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="h5jI/CFO"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 50CFD68146 for ; Wed, 5 Aug 2026 18:13:34 +0200 (CEST) Received: from [192.168.125.177] (mob-109-113-25-35.net.vodafone.it [109.113.25.35]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 7E6D81C76; Wed, 5 Aug 2026 18:12:23 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1785946343; bh=70FZhClw7mS5xy+Y1CktDRCjvCls/+hWNvF/+aVuNwI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=h5jI/CFOqJM3HJkfxZRUQ5cBIeJKcUALaJfPKUlA5P8XuER1Qw6+G2Mebr6GeXtdr PEHqWF23Z1Y8N6sdmL7+Rmd7+5O4SrM4YmQiDB44laDuQqWRwAziQ4hh02P7JVExUv rDOQ2bYM+xdUZzDDBgxXQHlb1Q4QMVHkjfjp88lU= From: Jacopo Mondi Date: Wed, 05 Aug 2026 18:12:57 +0200 Subject: [PATCH v7 15/32] ipa: libipa: lsc: Move Interpolator to lsc_base MIME-Version: 1.0 Message-Id: <20260805-libipa-algorithms-v7-15-7425b5b795d4@ideasonboard.com> References: <20260805-libipa-algorithms-v7-0-7425b5b795d4@ideasonboard.com> In-Reply-To: <20260805-libipa-algorithms-v7-0-7425b5b795d4@ideasonboard.com> To: libcamera-devel@lists.libcamera.org, Stefan Klug , Milan Zamazal Cc: Jacopo Mondi , Kieran Bingham X-Mailer: b4 0.16-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=3386; i=jacopo.mondi@ideasonboard.com; h=from:subject:message-id; bh=70FZhClw7mS5xy+Y1CktDRCjvCls/+hWNvF/+aVuNwI=; b=owEBbQKS/ZANAwAKAXI0Bo8WoVY8AcsmYgBqc2EevQmOdSkLdiSNwij4euB2Xkn0hBv3W1PM/ hQ+4HrXVFOJAjMEAAEKAB0WIQS1xD1IgJogio9YOMByNAaPFqFWPAUCanNhHgAKCRByNAaPFqFW PPNKEACuJiug6abIlx2HrSTmGxESmEc84/cx20FcCzYz9L2rvkp1Vw5U32jhjThA+vlcWoYMw/5 RlFbLRYdHh7jFUZ3R3OuN5Ip0aFymkXHs5KhBlQ/3o+KH7Hq0V6avX0naGqa4NoiBhlcoVaBEZR 6jEFySq4/gSREYRBc1JZmmr61g7Z+yNVBObop4NQwvU/84cxza1uud1XLMdjIW9zyr3JyGKzcG1 TL+ZKkMoc/0olOYgLcOtqgU8wKIDYNfOpRqk2o6ecFVp7fPP/og6YqWuxJY3yh2kgSPUmFVGADl KK7F7eyNMPOzmhjUwtZ8WNiK2Pqi2Ow7963ufyOizQwKBaRulbjNoIgUtm80euZmyLjdNOiK3Xk O15tVg/lAKcEmhOB15Mw+y2IgL0IoAHI62o7lPSvQGxkwu6+DM61ZtMJSq+LpzSLeCNbrUUDVZq rdqVWr26IjrjWgQVeekApIjkqN7rJYlG6HxGXzuxqxKoCAA//5utd0I1wsa6It/s1eO0As6O+7b nJwriESG27pxo1vhe3L8hbHd2VxssAHwR11vmeQABdAW78BLQHoUrU2JPVeYjEV7fBQbF/7T+2X mrsWTl3aLjTuCrusgULQYessN8SFu4SJFmxVgPq+PIGVIo2q8WO0NLov2AGLT1KqNOZdDPIx1ey 3aegkLAF2j1KWdg== X-Developer-Key: i=jacopo.mondi@ideasonboard.com; a=openpgp; fpr=72392EDC88144A65C701EA9BA5826A2587AD026B X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Move the Interpolator: specialization from the RkISP1 IPA to the lsc_base header. Signed-off-by: Jacopo Mondi Reviewed-by: Kieran Bingham Reviewed-by: Stefan Klug --- src/ipa/libipa/lsc_base.cpp | 15 +++++++++++++++ src/ipa/libipa/lsc_base.h | 21 +++++++++++++++++++++ src/ipa/rkisp1/algorithms/lsc.cpp | 27 --------------------------- 3 files changed, 36 insertions(+), 27 deletions(-) diff --git a/src/ipa/libipa/lsc_base.cpp b/src/ipa/libipa/lsc_base.cpp index 26197f4effe5..b50460394925 100644 --- a/src/ipa/libipa/lsc_base.cpp +++ b/src/ipa/libipa/lsc_base.cpp @@ -49,6 +49,21 @@ namespace lsc { } /* namespace lsc */ +#ifndef __DOXYGEN__ +template<> +void Interpolator:: + interpolate(const lsc::Components &a, + const lsc::Components &b, + lsc::Components &dest, + double lambda) +{ + interpolateVector(a.r, b.r, dest.r, lambda); + interpolateVector(a.gr, b.gr, dest.gr, lambda); + interpolateVector(a.gb, b.gb, dest.gb, lambda); + interpolateVector(a.b, b.b, dest.b, lambda); +} +#endif + /** * \class LscImplementation * \brief Pure virtual base class for LSC algorithm implementations diff --git a/src/ipa/libipa/lsc_base.h b/src/ipa/libipa/lsc_base.h index 59b831e53fbb..ca7ad6e4051c 100644 --- a/src/ipa/libipa/lsc_base.h +++ b/src/ipa/libipa/lsc_base.h @@ -18,6 +18,8 @@ #include "libcamera/internal/value_node.h" +#include "interpolator.h" + namespace libcamera { namespace ipa { @@ -35,6 +37,25 @@ using ComponentsMap = std::map; } /* namespace lsc */ +#ifndef __DOXYGEN__ +template +void interpolateVector(const std::vector &a, const std::vector &b, + std::vector &dest, double lambda) +{ + ASSERT(a.size() == b.size()); + dest.resize(a.size()); + for (size_t i = 0; i < a.size(); i++) + dest[i] = a[i] * (1.0 - lambda) + b[i] * lambda; +} + +template<> +void Interpolator:: + interpolate(const lsc::Components &a, + const lsc::Components &b, + lsc::Components &dest, + double lambda); +#endif /* __DOXYGEN__ */ + class LscImplementation { public: diff --git a/src/ipa/rkisp1/algorithms/lsc.cpp b/src/ipa/rkisp1/algorithms/lsc.cpp index 84d2b1d3bdac..8d92ee89cdaf 100644 --- a/src/ipa/rkisp1/algorithms/lsc.cpp +++ b/src/ipa/rkisp1/algorithms/lsc.cpp @@ -25,33 +25,6 @@ namespace libcamera { -namespace ipa { - -template -void interpolateVector(const std::vector &a, const std::vector &b, - std::vector &dest, double lambda) -{ - ASSERT(a.size() == b.size()); - dest.resize(a.size()); - for (size_t i = 0; i < a.size(); i++) - dest[i] = a[i] * (1.0 - lambda) + b[i] * lambda; -} - -template<> -void Interpolator:: - interpolate(const lsc::Components &a, - const lsc::Components &b, - lsc::Components &dest, - double lambda) -{ - interpolateVector(a.r, b.r, dest.r, lambda); - interpolateVector(a.gr, b.gr, dest.gr, lambda); - interpolateVector(a.gb, b.gb, dest.gb, lambda); - interpolateVector(a.b, b.b, dest.b, lambda); -} - -} /* namespace ipa */ - namespace ipa::rkisp1::algorithms {