From patchwork Mon Sep 28 11:14:01 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Scally X-Patchwork-Id: 28391 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 21CA7BDCBC for ; Mon, 28 Sep 2026 11:14:27 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id DD50968A43; Mon, 28 Sep 2026 13:14:23 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="mw+UUH8p"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id AD03168A51 for ; Mon, 28 Sep 2026 13:14:15 +0200 (CEST) Received: from [127.0.1.1] (chfd-03-b2-v4wan-176392-cust229.vm15.cable.virginm.net [82.19.20.230]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 709C0C24; Mon, 28 Sep 2026 13:12:25 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1790593945; bh=AIdl7JndoiShxJBnbhZgI3egG9CKzymwaobBMbbGXD4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=mw+UUH8p4XHNAVwRxeUenS9DPhDGI9dICdOg2f2gnXvOQZWR8nVpjXIwUxq/ukZ5W N/ukpim0f7ixxA0WqkiPbPBLySw/iyn0wtGVTsKjzKoNNshEM0OELdaNZw04E9065t ei/ih8s71CnGVTGxOdAafpMrABOwOqMRNbcft/Qw= From: Daniel Scally Date: Mon, 28 Sep 2026 12:14:01 +0100 Subject: [PATCH 5/5] ipa: libipa: awb: Add AwbTrigger control MIME-Version: 1.0 Message-Id: <20260928-awb-state-v1-5-9b1bb8b9e51b@ideasonboard.com> References: <20260928-awb-state-v1-0-9b1bb8b9e51b@ideasonboard.com> In-Reply-To: <20260928-awb-state-v1-0-9b1bb8b9e51b@ideasonboard.com> To: libcamera-devel@lists.libcamera.org Cc: Daniel Scally X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2727; i=dan.scally@ideasonboard.com; h=from:subject:message-id; bh=AIdl7JndoiShxJBnbhZgI3egG9CKzymwaobBMbbGXD4=; b=owEBbQKS/ZANAwAKAchJV3psRXUyAcsmYgBqukwF9bIy4BO6JVcLAmXkMLMcRuI9zi6WIifgT H8VRKDALuCJAjMEAAEKAB0WIQQqyuwyDnZdb+mxmm/ISVd6bEV1MgUCarpMBQAKCRDISVd6bEV1 Mvw9EACR3sNAqSKZ+04jHdUg41lvFZPH58V2+k622jf6PeIr3VaSphznArENuulSvl0fd25e/gz oVH9SbHWZLSA+rJfTUJDWjCmOHtFtWdD8RHWxvjw+9ZEY+61f6QL7yOSKaCEUqkKkcOqNwZ/cx3 1CQWr8uU/n9k9+AkczVotZLTSQE+ZYAkCjDb2G3XDaPP2e//yNO1H25SSDdwWGTPwKbrNj7Nu3r FTl603BHM5Lor1uacPaYiS1fp3OWaJ7VXmtbSkYws2pNirUbrvcu8J/8pJba1Zf3FKQ9rlO2wyT WfyrdrDJYIlVYqTEg8Laa6sx5cr0JrDGUAOFCPC3AwXC38vnQh+0LOF3zBmcHQjWzBsHHv5hkK3 oZNM1BK3iQskPz9n1+Qhd/98SDD43U+d7C9WW9J6HLxofQfb+r8qEWSkQ48F54rhMMhZEguYv1Z MWrBUlj2mjlXsChL3pSbseuJLwcARzDEgX1Qh0mExz1nATmD34qBpAgp384+kzzfpExVUHXFzrY ZlY5fVAY3dcHHRimsdh4E5skyXimkfblM/cHAIc7WtypTg8dtwQeAQZimOSf4kvurI2q3WPiTs8 pDtGINfFIY6Mx6sLNXnKk182ppJf3u4x/jmAY0u3L+zvuq/lhJFxRWAQJLEv9xjgg+9bcpR1MY8 VDu6Wuvx4dySHng== X-Developer-Key: i=dan.scally@ideasonboard.com; a=openpgp; fpr=EEC699ACA1B7CB5D31330C0BBD501C2A3546CCF6 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" Add the AwbTrigger control, which works when AwbEnable == false and allows the algorithm to settle into the Converged state before updating the manual gains and applying them. Signed-off-by: Daniel Scally --- src/ipa/libipa/awb.cpp | 18 +++++++++++++++++- src/ipa/libipa/awb.h | 1 + 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/ipa/libipa/awb.cpp b/src/ipa/libipa/awb.cpp index 0c6a01bd780ce00d21c1f7fdd8ba2ed468c4f4a1..2001275fc82c91172a86c5bda5925bb624da414d 100644 --- a/src/ipa/libipa/awb.cpp +++ b/src/ipa/libipa/awb.cpp @@ -235,6 +235,7 @@ int AwbAlgorithmBase::init(const ValueNode &tuningData) ControlInfo(kMinColourTemperature, kMaxColourTemperature, kDefaultColourTemperature); controls_[&controls::AwbEnable] = ControlInfo(false, true); + controls_[&controls::AwbTrigger] = ControlInfo(false, true); return parseModeConfigs(tuningData, controls::AwbAuto); } @@ -308,6 +309,13 @@ void AwbAlgorithmBase::queueRequest(awb::ActiveState &state, currentMode_ = &it->second; } + auto trigger = controls.get(controls::AwbTrigger); + if (trigger && *trigger && !state.autoEnabled) { + lockedCount_ = 0; + convergedState_ = controls::AwbStateEnum::AwbStateSearching; + rescanning_ = true; + } + frameContext.autoEnabled = state.autoEnabled; if (frameContext.autoEnabled) @@ -447,13 +455,21 @@ void AwbAlgorithmBase::process(awb::ActiveState &state, RGB newGains = awbResult.gains * speed + state.automatic.gains * (1 - speed); - updateConvergedState(state.automatic.gains, newGains); + if (state.autoEnabled || rescanning_) + updateConvergedState(state.automatic.gains, newGains); state.automatic.colourTemperature = awbResult.colourTemperature; state.automatic.gains = newGains; if (state.autoEnabled) state.manual.gains = newGains; + if (rescanning_ && + convergedState_ == controls::AwbStateEnum::AwbStateConverged) { + state.manual.gains = newGains; + rescanning_ = false; + convergedState_ = controls::AwbStateEnum::AwbStateLocked; + } + /* Populate metadata. */ metadata.set(controls::AwbEnable, frameContext.autoEnabled); metadata.set(controls::ColourGains, { static_cast(frameContext.gains.r()), diff --git a/src/ipa/libipa/awb.h b/src/ipa/libipa/awb.h index 5d80f241ec92280e867af5f9724471c5784683d1..588d8c5a9fb179a0c7a11143659fa400befa60b0 100644 --- a/src/ipa/libipa/awb.h +++ b/src/ipa/libipa/awb.h @@ -112,6 +112,7 @@ private: controls::AwbStateEnum convergedState_; RGB convergedGains_; unsigned int lockedCount_; + bool rescanning_; }; template