From patchwork Tue Apr 7 22:01:14 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 26495 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 4AF02BDCBD for ; Tue, 7 Apr 2026 22:03:02 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 684C562DB3; Wed, 8 Apr 2026 00:02:57 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="nL2GjPH9"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id B8E5B62DB6 for ; Wed, 8 Apr 2026 00:02:43 +0200 (CEST) Received: from [192.168.0.204] (ams.linuxembedded.co.uk [209.38.108.23]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id C1F7D2598; Wed, 8 Apr 2026 00:01:15 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1775599275; bh=ACGMEBHGXk8xztCJFbq3gIfrocN+U7dV5cite7ZFeJI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=nL2GjPH9SKXK5XVZ2lAiiBCsy3gjNcSThBhuuxa/MeRlVy/TM3C8LqHS6fIUhfdKZ lR9t7Dd8f1vOuHVqCRAceROVjxPh6IGOw4TQR1wmuNHNJjStbP1KkBoDpnRNiCwekv t1HRBQnSWUx/PlWBPkKRlVddI8v4XPyoIKevZG+c= From: Kieran Bingham Date: Tue, 07 Apr 2026 23:01:14 +0100 Subject: [PATCH 11/13] ipa: libipa: awb: Move configure to common MIME-Version: 1.0 Message-Id: <20260407-kbingham-awb-split-v1-11-a39af3f4dc20@ideasonboard.com> References: <20260407-kbingham-awb-split-v1-0-a39af3f4dc20@ideasonboard.com> In-Reply-To: <20260407-kbingham-awb-split-v1-0-a39af3f4dc20@ideasonboard.com> To: libcamera-devel@lists.libcamera.org Cc: Kieran Bingham X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1775599360; l=5011; i=kieran.bingham@ideasonboard.com; s=20260204; h=from:subject:message-id; bh=ACGMEBHGXk8xztCJFbq3gIfrocN+U7dV5cite7ZFeJI=; b=kIQxN28QMXXNFfvy3Zrr+V5bTB+XYTHqzJ20nW/u8TOiuUSkVC+dcB1WYg7xR1eem771schDs DypABzgo5smC3OkXt1u6SMPPs4Afv3DeRCIbmx/L9XhmHDMfkJwNwfG X-Developer-Key: i=kieran.bingham@ideasonboard.com; a=ed25519; pk=IOxS2C6nWHNjLfkDR71Iesk904i6wJDfEERqV7hDBdY= 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" Refactor the AWB configuration to use the common implementation supplied by libipa awb module. Signed-off-by: Kieran Bingham --- src/ipa/libipa/awb.cpp | 29 +++++++++++++++++++++++++++++ src/ipa/libipa/awb.h | 3 +++ src/ipa/rkisp1/algorithms/awb.cpp | 13 +------------ src/ipa/simple/algorithms/awb.cpp | 16 ++-------------- 4 files changed, 35 insertions(+), 26 deletions(-) diff --git a/src/ipa/libipa/awb.cpp b/src/ipa/libipa/awb.cpp index f215bea0b59483eadf95572f073928a4eb1275f4..d0c577958caebc0b7e24fe58506da964df2200fe 100644 --- a/src/ipa/libipa/awb.cpp +++ b/src/ipa/libipa/awb.cpp @@ -11,6 +11,8 @@ #include +constexpr int32_t kDefaultColourTemperature = 5000; + /** * \file awb.h * \brief Base classes for AWB algorithms @@ -139,6 +141,33 @@ namespace ipa { * \return 0 on success, a negative error code otherwise */ +/** + * \brief Configure the Awb algorithm given an IPAConfigInfo + * \param[in] state The AWB specific active state shared across frames + * \param[in] session The AWB specific session configuration + * + * Configure and initialise the AWB algorithm module. + * + * \return 0 if successful, an error code otherwise + */ +int AwbAlgorithm::configure(awb::ActiveState &state, awb::Session &session) +{ + state.manual.gains = RGB{ 1.0 }; + auto gains = gainsFromColourTemperature(kDefaultColourTemperature); + if (gains) + state.automatic.gains = *gains; + else + state.automatic.gains = RGB{ 1.0 }; + + state.autoEnabled = true; + state.manual.temperatureK = kDefaultColourTemperature; + state.automatic.temperatureK = kDefaultColourTemperature; + + session.enabled = true; + + return 0; +} + /** * \fn AwbAlgorithm::calculateAwb() * \brief Calculate AWB data from the given statistics diff --git a/src/ipa/libipa/awb.h b/src/ipa/libipa/awb.h index 764be849270bcd42ecdf67aea3d13afa170c7499..4ceae537686f8f4c93686fab4b9efbc06e112b1d 100644 --- a/src/ipa/libipa/awb.h +++ b/src/ipa/libipa/awb.h @@ -65,6 +65,9 @@ public: virtual ~AwbAlgorithm() = default; virtual int init(const YamlObject &tuningData) = 0; + + int configure(awb::ActiveState &state, awb::Session &session); + virtual AwbResult calculateAwb(const AwbStats &stats, unsigned int lux) = 0; virtual std::optional> gainsFromColourTemperature(double colourTemperature) = 0; diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp index f83da545be856c08cd758dc20a5ace91344101cf..86d5dfed3e1c2bb587705f05362229db3cdadafd 100644 --- a/src/ipa/rkisp1/algorithms/awb.cpp +++ b/src/ipa/rkisp1/algorithms/awb.cpp @@ -128,16 +128,7 @@ int Awb::init(IPAContext &context, const YamlObject &tuningData) int Awb::configure(IPAContext &context, const IPACameraSensorInfo &configInfo) { - context.activeState.awb.manual.gains = RGB{ 1.0 }; - auto gains = awbAlgo_->gainsFromColourTemperature(kDefaultColourTemperature); - if (gains) - context.activeState.awb.automatic.gains = *gains; - else - context.activeState.awb.automatic.gains = RGB{ 1.0 }; - - context.activeState.awb.autoEnabled = true; - context.activeState.awb.manual.temperatureK = kDefaultColourTemperature; - context.activeState.awb.automatic.temperatureK = kDefaultColourTemperature; + awbAlgo_->configure(context.activeState.awb, context.configuration.awb); /* * Define the measurement window for AWB as a centered rectangle @@ -148,8 +139,6 @@ int Awb::configure(IPAContext &context, context.configuration.awb.measureWindow.h_size = 3 * configInfo.outputSize.width / 4; context.configuration.awb.measureWindow.v_size = 3 * configInfo.outputSize.height / 4; - context.configuration.awb.enabled = true; - return 0; } diff --git a/src/ipa/simple/algorithms/awb.cpp b/src/ipa/simple/algorithms/awb.cpp index 90c05e86bae6eefe4874feeb1263af07acd5fcfc..230b7807075941f086911549066e39c0a04dff5c 100644 --- a/src/ipa/simple/algorithms/awb.cpp +++ b/src/ipa/simple/algorithms/awb.cpp @@ -106,20 +106,8 @@ int Awb::init(IPAContext &context, const YamlObject &tuningData) int Awb::configure(IPAContext &context, [[maybe_unused]] const IPAConfigInfo &configInfo) { - context.activeState.awb.manual.gains = RGB{ 1.0 }; - auto gains = awbAlgo_->gainsFromColourTemperature(kDefaultColourTemperature); - if (gains) - context.activeState.awb.automatic.gains = *gains; - else - context.activeState.awb.automatic.gains = RGB{ 1.0 }; - - context.activeState.awb.autoEnabled = true; - context.activeState.awb.manual.temperatureK = kDefaultColourTemperature; - context.activeState.awb.automatic.temperatureK = kDefaultColourTemperature; - - context.configuration.awb.enabled = true; - - return 0; + return awbAlgo_->configure(context.activeState.awb, + context.configuration.awb); } /**