From patchwork Wed Jun 5 06:48:25 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Klug X-Patchwork-Id: 20198 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 135D5BDE6B for ; Wed, 5 Jun 2024 06:48:37 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 13622634D7; Wed, 5 Jun 2024 08:48:36 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="YYpDdsaq"; 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 61BF6633DE for ; Wed, 5 Jun 2024 08:48:34 +0200 (CEST) Received: from ideasonboard.com (unknown [IPv6:2a00:6020:448c:6c00:dcc4:f2dc:93ce:ff8f]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id F1D4815C5; Wed, 5 Jun 2024 08:48:25 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1717570106; bh=VpzImRUiU8T9OpuEM7viBPRcl5lsPuIQHI25ZLjLX/0=; h=From:To:Cc:Subject:Date:From; b=YYpDdsaqMwUiU2jow1I8CSkJUk7jmW/CrbmRJR3J66lLMHa+zLafauoo4Vq0S2yri cyrAgjPReXOLhW3TbQYoYsdce7ugtLyrSFYQcROWVif7UUEV2s8Ow1GwM2oRhm2eYi ids7aQTxrLEXRWVr08fgmlmWx4KDQ7m0oPM7PmzI= From: Stefan Klug To: libcamera-devel@lists.libcamera.org Cc: Stefan Klug Subject: [PATCH] pipeline: rkisp1: cproc: Fix default value handling Date: Wed, 5 Jun 2024 08:48:25 +0200 Message-ID: <20240605064829.81288-1-stefan.klug@ideasonboard.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 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" Default control values where not applied to activeState. This had no negative side effects in first place, as the hardware defaults where used. The issue became visible, when only one of the controls was set at runtime. In that case the params for the other values where overwritten with 0 (reset value of activeState) resulting in a black image. While at it, only add the controls to the controls map if the algorithm is contained in the tuning file. Signed-off-by: Stefan Klug Reviewed-by: Jacopo Mondi Reviewed-by: Kieran Bingham Signed-off-by: Stefan Klug Reviewed-by: Jacopo Mondi Reviewed-by: Kieran Bingham --- This patch depends on https://patchwork.libcamera.org/patch/20194/ which needs to be merged first. src/ipa/rkisp1/algorithms/cproc.cpp | 59 +++++++++++++++++++++++++++-- src/ipa/rkisp1/algorithms/cproc.h | 3 ++ src/ipa/rkisp1/rkisp1.cpp | 3 -- 3 files changed, 59 insertions(+), 6 deletions(-) diff --git a/src/ipa/rkisp1/algorithms/cproc.cpp b/src/ipa/rkisp1/algorithms/cproc.cpp index 68bb8180..0f122504 100644 --- a/src/ipa/rkisp1/algorithms/cproc.cpp +++ b/src/ipa/rkisp1/algorithms/cproc.cpp @@ -33,6 +33,56 @@ namespace ipa::rkisp1::algorithms { LOG_DEFINE_CATEGORY(RkISP1CProc) +static int convertBrightness(const float v) +{ + return std::clamp(std::lround(v * 128), -128, 127); +} + +static int convertContrast(const float v) +{ + return std::clamp(std::lround(v * 128), 0, 255); +} + +static int convertSaturation(const float v) +{ + return std::clamp(std::lround(v * 128), 0, 255); +} + +/** + * \copydoc libcamera::ipa::Algorithm::init + */ +int ColorProcessing::init([[maybe_unused]] IPAContext &context, + [[maybe_unused]] const YamlObject &tuningData) +{ + context.ctrlMap[&controls::Brightness] = ControlInfo(-1.0f, 0.993f, 0.0f); + context.ctrlMap[&controls::Contrast] = ControlInfo(0.0f, 1.993f, 1.0f); + context.ctrlMap[&controls::Saturation] = ControlInfo(0.0f, 1.993f, 1.0f); + + return 0; +} + +/** + * \brief Configure the Gamma given a configInfo + * \param[in] context The shared IPA context + * \param[in] configInfo The IPA configuration data + * + * \return 0 + */ +int ColorProcessing::configure([[maybe_unused]] IPAContext &context, + [[maybe_unused]] const IPACameraSensorInfo &configInfo) +{ + auto &cproc = context.activeState.cproc; + + cproc.brightness = convertBrightness( + context.ctrlMap[&controls::Brightness].def().get()); + cproc.contrast = convertContrast( + context.ctrlMap[&controls::Contrast].def().get()); + cproc.saturation = convertSaturation( + context.ctrlMap[&controls::Saturation].def().get()); + + return 0; +} + /** * \copydoc libcamera::ipa::Algorithm::queueRequest */ @@ -44,9 +94,12 @@ void ColorProcessing::queueRequest(IPAContext &context, auto &cproc = context.activeState.cproc; bool update = false; + if (frame == 0) + update = true; + const auto &brightness = controls.get(controls::Brightness); if (brightness) { - int value = std::clamp(std::lround(*brightness * 128), -128, 127); + int value = convertBrightness(*brightness); if (cproc.brightness != value) { cproc.brightness = value; update = true; @@ -57,7 +110,7 @@ void ColorProcessing::queueRequest(IPAContext &context, const auto &contrast = controls.get(controls::Contrast); if (contrast) { - int value = std::clamp(std::lround(*contrast * 128), 0, 255); + int value = convertContrast(*contrast); if (cproc.contrast != value) { cproc.contrast = value; update = true; @@ -68,7 +121,7 @@ void ColorProcessing::queueRequest(IPAContext &context, const auto saturation = controls.get(controls::Saturation); if (saturation) { - int value = std::clamp(std::lround(*saturation * 128), 0, 255); + int value = convertSaturation(*saturation); if (cproc.saturation != value) { cproc.saturation = value; update = true; diff --git a/src/ipa/rkisp1/algorithms/cproc.h b/src/ipa/rkisp1/algorithms/cproc.h index bafba5cc..e50e7200 100644 --- a/src/ipa/rkisp1/algorithms/cproc.h +++ b/src/ipa/rkisp1/algorithms/cproc.h @@ -21,6 +21,9 @@ public: ColorProcessing() = default; ~ColorProcessing() = default; + int init(IPAContext &context, const YamlObject &tuningData) override; + int configure(IPAContext &context, + const IPACameraSensorInfo &configInfo) override; void queueRequest(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, const ControlList &controls) override; diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp index 17474408..62d56a3a 100644 --- a/src/ipa/rkisp1/rkisp1.cpp +++ b/src/ipa/rkisp1/rkisp1.cpp @@ -109,9 +109,6 @@ const ControlInfoMap::Map rkisp1Controls{ { &controls::AeEnable, ControlInfo(false, true) }, { &controls::AwbEnable, ControlInfo(false, true) }, { &controls::ColourGains, ControlInfo(0.0f, 3.996f, 1.0f) }, - { &controls::Brightness, ControlInfo(-1.0f, 0.993f, 0.0f) }, - { &controls::Contrast, ControlInfo(0.0f, 1.993f, 1.0f) }, - { &controls::Saturation, ControlInfo(0.0f, 1.993f, 1.0f) }, { &controls::Sharpness, ControlInfo(0.0f, 10.0f, 1.0f) }, { &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) }, };