From patchwork Fri Jun 26 13:05:50 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Scally X-Patchwork-Id: 27063 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 4E6CFBF415 for ; Fri, 26 Jun 2026 13:06:17 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 03D1565F07; Fri, 26 Jun 2026 15:06:10 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="vnuDMNtq"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 5E814658FA for ; Fri, 26 Jun 2026 15:06:05 +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 7BF5E19EC; Fri, 26 Jun 2026 15:05:24 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1782479124; bh=cPbSJkOCWsDRjI/shTMr9ESWFrPH86HAjyeuXWQiXmU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=vnuDMNtqkCvUrOle/fJ9YzX/hiakUELx2suIaXUxBt73bQwpTUcfT6Q0q1tBAcK54 dIYCB7OSvL3QuxR1Bg8PyGV1YZ3zVs5eooSSDbcKz70L1ZW6zu68Oj0Zi9aRia8om6 HdTrGFPdxPOdONJPpnNq7dC7PA3zgQUdc7PVzF+I= From: Daniel Scally Date: Fri, 26 Jun 2026 14:05:50 +0100 Subject: [PATCH v2 03/12] ipa: ipu3: Convert from separate gains to RGB in AGC MIME-Version: 1.0 Message-Id: <20260626-ipu3-libipa-rework-v2-3-41546e23de3e@ideasonboard.com> References: <20260626-ipu3-libipa-rework-v2-0-41546e23de3e@ideasonboard.com> In-Reply-To: <20260626-ipu3-libipa-rework-v2-0-41546e23de3e@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=2356; i=dan.scally@ideasonboard.com; h=from:subject:message-id; bh=cPbSJkOCWsDRjI/shTMr9ESWFrPH86HAjyeuXWQiXmU=; b=owEBbQKS/ZANAwAKAchJV3psRXUyAcsmYgBqPnk5+jfijVknwt+44YYtRE0Zq6LUf3vDItggJ YZp1gRMuwyJAjMEAAEKAB0WIQQqyuwyDnZdb+mxmm/ISVd6bEV1MgUCaj55OQAKCRDISVd6bEV1 Ms9/D/0dMZ9ZMkVIPNZ6Z0MSwf8po67A0RbVLKjoVFpAKEZhtobajSYRf+FMolFPYb/FeM3+nEr fF3czmusZn9Jq0Sh7A4zpDlyynkkPf6pIMMBsFWJwFswpizi8Bufj91uc9ulrMomXLBUMRmRx03 TEwgLJwT8FoCKPul5EZ3QEnMCuJhk5WzIva5XTM43ZSFOj+nOq4mOod6HhZgP5WPZkFjnQqVfKI 1YUDk2MOmf1P/lTSVyXrx36jXK1UBk1dRMblihLd1GKoncWexn352HBgMe74lENwVSmAOJljxri T+v+iC1FNHcuY1TTHbxhFRBWErSvkWXye5cKiaMcyuEX67rWmGZ4U/Xy7Y5EB5e/0+bol/xC714 iwUs9SDMViPqGc+4/uHwEVE8AJqcj44U43hkqMkMw6jGkJiSWGUmSY7Y/gqycCANmyTxMZWBSfb iXRZBcpApRCKL3h6ueEm4P44Gqc682xQnuHWWYfAqXvr0m/qpQIpcf2UodrlnXFE1SPlzt5JOdO k48tjKWS/RrmfB2ztbIzZKxnk48HiAoAA9daQ5nQQG5oCROmxxNSkH+qnb7ASTSuhTUtMnt2bmI ITppoZwbctAghP3xRG0JO01bmGWUU53m+n63aV209SwopsQ2oxU7oNi+IBWLSbkmhNfvYXBDBh5 0SeBmx8j4awUvww== 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" The AGC algorithm stores red, blue and green gains as type double class members. Switch to using a single member of type RGB instead to simplify the code. Signed-off-by: Daniel Scally --- Changes in v2: - New patch --- src/ipa/ipu3/algorithms/agc.cpp | 9 ++++----- src/ipa/ipu3/algorithms/agc.h | 6 +++--- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp index d6a7036c6504acb106f5c773b529ad80b8349f85..b8b880b357a4770efd6810a3bdf616dd25ce93e4 100644 --- a/src/ipa/ipu3/algorithms/agc.cpp +++ b/src/ipa/ipu3/algorithms/agc.cpp @@ -186,8 +186,7 @@ double Agc::estimateLuminance(double gain) const sum.b() += std::min(std::get<2>(rgbTriples_[i]) * gain, 255.0); } - RGB gains{{ rGain_, gGain_, bGain_ }}; - double ySum = rec601LuminanceFromRGB(sum * gains); + double ySum = rec601LuminanceFromRGB(sum * gains_); return ySum / (bdsGrid_.height * bdsGrid_.width) / 255; } @@ -208,9 +207,9 @@ void Agc::process(IPAContext &context, [[maybe_unused]] const uint32_t frame, ControlList &metadata) { Histogram hist = parseStatistics(stats, context.configuration.grid.bdsGrid); - rGain_ = context.activeState.awb.gains.red; - gGain_ = context.activeState.awb.gains.blue; - bGain_ = context.activeState.awb.gains.green; + gains_ = RGB({ context.activeState.awb.gains.red, + context.activeState.awb.gains.blue, + context.activeState.awb.gains.green }); /* * The Agc algorithm needs to know the effective exposure value that was diff --git a/src/ipa/ipu3/algorithms/agc.h b/src/ipa/ipu3/algorithms/agc.h index d274a2350485f8f9a3870b24ceb29927cb9c2bec..12ddb173ff89b7de68dd544a194292f4d14efdbb 100644 --- a/src/ipa/ipu3/algorithms/agc.h +++ b/src/ipa/ipu3/algorithms/agc.h @@ -13,6 +13,8 @@ #include +#include "libcamera/internal/vector.h" + #include "libipa/agc_mean_luminance.h" #include "libipa/histogram.h" @@ -49,9 +51,7 @@ private: double maxAnalogueGain_; uint32_t stride_; - double rGain_; - double gGain_; - double bGain_; + RGB gains_; ipu3_uapi_grid_config bdsGrid_; std::vector> rgbTriples_; };