From patchwork Fri May 1 19:13:10 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: d3vv3 X-Patchwork-Id: 26593 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 8A1C6C32F6 for ; Fri, 1 May 2026 19:55:29 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 5A11162FD3; Fri, 1 May 2026 21:55:27 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="GMn5CR8a"; dkim-atps=neutral Received: from mail-wm1-x32d.google.com (mail-wm1-x32d.google.com [IPv6:2a00:1450:4864:20::32d]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id F2C2C62FD3 for ; Fri, 1 May 2026 21:14:23 +0200 (CEST) Received: by mail-wm1-x32d.google.com with SMTP id 5b1f17b1804b1-48984d29fe3so32436085e9.0 for ; Fri, 01 May 2026 12:14:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777662863; x=1778267663; darn=lists.libcamera.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=aooNctj7aSc+WRfu+RFfQ+bD9FOMO+I2ZoQ+botdJs0=; b=GMn5CR8aO0FRdiB8vlQRtK6+AlckL9w2i0YK6u/zdm8fx8qj+2jtU196limcUOIzj8 MbpOQYpPUwRrVjswXEeLIwsOZLm8R+vCrWIjvv41xSZ8ckZMwD5EDTX3egWuhJx2I5q8 RmGwsBB7jskVmRlWA0HJ7cklkA7g4ZjZJBQ48yf0XLb3hxhgFhBnJ0MULL4JSp5+tXKr hPDovixLGxxhbowsoUUcZmUOSImgEIJls39XqpW1m7iuwTKbKLfyMbv/q+mZUumIQ/QK z1+cFdEsUrsGBLtN7BRC6SBXdTaqG3JQ7C3Z9H7ZGdaxvmQY+ZRWtqPskeQBaDXqtR+o 2Oxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777662863; x=1778267663; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=aooNctj7aSc+WRfu+RFfQ+bD9FOMO+I2ZoQ+botdJs0=; b=KugcHexns0oCoS7N2UQp4J/RkM2INhMvcWSJPdLPIiWFUyKNlb11VGK+3Lozof+OFf 5a1cq85ZMON65qevIPoO8SZn3GgIn+Jo10Y0V4gLEU//g85w/eZHt7AhJC4cpPkQGdRa 8Pw4MMNCtJwN8mtRn9llSlHi8CoSNg2g2NJ53XLdhIeORXa8s7cZmUQaW8gJEmoTRWTr CVfOJ2V6JOswn8mcemIH+sNnsV5DuFcgJdQ5N5atUgV+UNcuDafhO7BKmefsQpxZqT2R ZpRfQWMYgt17biVvvZAEzJFkTbAVf/j0evlPnLXrF4rV/l7OnIBJbfNvGo+ajHXxW77w 3JwQ== X-Gm-Message-State: AOJu0YxKxIytO3WiYdNjXnFcrD6q+BdE1uEwzduHoHAZOWMMS3b8UKxB 4oWvx1B7m7mNUI+rQWvFAbFa1JZ8ssyfRVZI9lfLjzjcS2AYbDJhv0ehCnCB7w== X-Gm-Gg: AeBDiesc+LpELfgGPvpH5VucLVRwwKUvpd/RsOL2HQIoy0iJm7si1cOXANJuWMsRf7W bL7WcblxQUzsEBLeF17PHJczRHTJ2a3BcaxgGyscysVOmrygJRooV8EazQWtvjlibrQm3L9J5Ef /OggfXOcU51zHuUeZFK0RTp67gPfACdgRX3Rt3HtcHPVawuYTPU4EgZu3P/HCozl6d+CVRxi2gr mKe7q5XqmOk62+gMm7jN86d0dXmqHZxWVKq+Fph+Wj9d02srgcK06b72F476975zxjeil+PVN6K XDUl0n0GisWbF+WT2SObBM1TCILlfpfzCzOltyH0ZvfjX+CYyXXlQfXN/eM198hcgLubD1K0puE rDLhx+SRDaRtoioVsDNRJn5qy+JQw72/z6W2armFg4I+zrGFHPRS/xo3j1BSJwJ9TYHuOfz2O/S OzCjJt1BXpOegfQ3efhGjCN4VBPsvTjcDKCz1IdTITBkFluB0cW9PlEARTn2sHHT3F42Swf8RH/ +RXZAYhLOFRoy+B+ikMSor5p+6BGKOm X-Received: by 2002:a05:600c:444c:b0:488:e7e4:8425 with SMTP id 5b1f17b1804b1-48a9866a6b4mr5539185e9.23.1777662863493; Fri, 01 May 2026 12:14:23 -0700 (PDT) Received: from dexps.speedport.ip (p200300eda74453f7a35e44f7d2f0427a.dip0.t-ipconnect.de. [2003:ed:a744:53f7:a35e:44f7:d2f0:427a]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48a8eb69698sm139146305e9.1.2026.05.01.12.14.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 01 May 2026 12:14:23 -0700 (PDT) From: d3vv3 To: libcamera-devel@lists.libcamera.org Cc: d3vv3 Subject: [PATCH] ipa: simple: adjust: Support gamma, contrast, saturation defaults from YAML Date: Fri, 1 May 2026 21:13:10 +0200 Message-ID: <20260501191400.985920-2-devve.3@gmail.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260501191400.985920-1-devve.3@gmail.com> References: <20260501191400.985920-1-devve.3@gmail.com> MIME-Version: 1.0 X-Mailman-Approved-At: Fri, 01 May 2026 21:55:24 +0200 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" Read default values for gamma, contrast, and saturation from the tuning file so sensors can specify different image processing defaults without code changes. Falls back to prior defaults (gamma 2.2, contrast 1.0, saturation 1.0) when not specified in YAML. Signed-off-by: d3vv3 --- src/ipa/simple/algorithms/adjust.cpp | 26 ++++++++++++++++---------- src/ipa/simple/algorithms/adjust.h | 4 ++++ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/ipa/simple/algorithms/adjust.cpp b/src/ipa/simple/algorithms/adjust.cpp index 8bf39c4c..2f70519c 100644 --- a/src/ipa/simple/algorithms/adjust.cpp +++ b/src/ipa/simple/algorithms/adjust.cpp @@ -14,6 +14,7 @@ #include #include "libcamera/internal/matrix.h" +#include "libcamera/internal/yaml_parser.h" namespace libcamera { @@ -24,24 +25,29 @@ constexpr float kDefaultSaturation = 1.0f; LOG_DEFINE_CATEGORY(IPASoftAdjust) -int Adjust::init(IPAContext &context, [[maybe_unused]] const ValueNode &tuningData) +int Adjust::init(IPAContext &context, const ValueNode &tuningData) { + defaultGamma_ = tuningData["gamma"].get().value_or(kDefaultGamma); + defaultContrast_ = tuningData["contrast"].get().value_or(kDefaultContrast); + defaultSaturation_ = tuningData["saturation"].get().value_or(kDefaultSaturation); + context.ctrlMap[&controls::Gamma] = - ControlInfo(0.1f, 10.0f, kDefaultGamma); + ControlInfo(0.1f, 10.0f, defaultGamma_); context.ctrlMap[&controls::Contrast] = - ControlInfo(0.0f, 2.0f, kDefaultContrast); + ControlInfo(0.0f, 2.0f, defaultContrast_); if (context.ccmEnabled) context.ctrlMap[&controls::Saturation] = - ControlInfo(0.0f, 2.0f, kDefaultSaturation); + ControlInfo(0.0f, 2.0f, defaultSaturation_); + return 0; } int Adjust::configure(IPAContext &context, [[maybe_unused]] const IPAConfigInfo &configInfo) { - context.activeState.knobs.gamma = kDefaultGamma; - context.activeState.knobs.contrast = std::optional(); - context.activeState.knobs.saturation = std::optional(); + context.activeState.knobs.gamma = defaultGamma_; + context.activeState.knobs.contrast = defaultContrast_; + context.activeState.knobs.saturation = defaultSaturation_; return 0; } @@ -107,7 +113,7 @@ void Adjust::prepare(IPAContext &context, } params->gamma = 1.0 / context.activeState.knobs.gamma; - const float contrast = context.activeState.knobs.contrast.value_or(kDefaultContrast); + const float contrast = context.activeState.knobs.contrast.value_or(defaultContrast_); params->contrastExp = tan(std::clamp(contrast * M_PI_4, 0.0, M_PI_2 - 0.00001)); } @@ -121,10 +127,10 @@ void Adjust::process([[maybe_unused]] IPAContext &context, metadata.set(controls::Gamma, gamma); const auto &contrast = frameContext.contrast; - metadata.set(controls::Contrast, contrast.value_or(kDefaultContrast)); + metadata.set(controls::Contrast, contrast.value_or(defaultContrast_)); const auto &saturation = frameContext.saturation; - metadata.set(controls::Saturation, saturation.value_or(kDefaultSaturation)); + metadata.set(controls::Saturation, saturation.value_or(defaultSaturation_)); } REGISTER_IPA_ALGORITHM(Adjust, "Adjust") diff --git a/src/ipa/simple/algorithms/adjust.h b/src/ipa/simple/algorithms/adjust.h index 49c1f26c..a836b51b 100644 --- a/src/ipa/simple/algorithms/adjust.h +++ b/src/ipa/simple/algorithms/adjust.h @@ -43,6 +43,10 @@ public: private: void applySaturation(Matrix &ccm, float saturation); + + float defaultGamma_; + float defaultContrast_; + float defaultSaturation_; }; } /* namespace ipa::soft::algorithms */