From patchwork Fri May 24 13:52:56 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 20099 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 731CDBD87C for ; Fri, 24 May 2024 13:53:08 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 61BBB634B1; Fri, 24 May 2024 15:53:07 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Lcglayvb"; 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 22028634AA for ; Fri, 24 May 2024 15:53:01 +0200 (CEST) Received: from Monstersaurus.local (cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id DA5D1150E; Fri, 24 May 2024 15:52:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1716558767; bh=/3x9cfYUt/GOVWzCJbu4F/Y7UbYEi5cGg8i6XoXpTRE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Lcglayvb8xuw2vphV5rD/7LoNzIBG5SDsHFQSNLfLkCprGYiCV1VC64KpE5FF+9Ni WiP2cVxTtvNYB3XSPGLY4vu7LQoO2tFgBBsJc2XqCvTsB0bN7TaJDWuD122Z2TJUMF rrKypY6si72uhSwWHwIn4LivUos7bDgdoWZcLU5w= From: Kieran Bingham To: libcamera devel Cc: Kieran Bingham Subject: [PATCH v2 2/2] libipa: camera_sensor_helper: Fix rounding of gainCode Date: Fri, 24 May 2024 14:52:56 +0100 Message-Id: <20240524135256.649406-3-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240524135256.649406-1-kieran.bingham@ideasonboard.com> References: <20240524135256.649406-1-kieran.bingham@ideasonboard.com> 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" The implementation of gainCode for both Exponential and Linear gain models does not generate a gainCode that matches the result of the reverse operation. This can be seen by converting sequential gainCodes to a gain and converting that back to the gainCode. The values do not translate back due to only rounding down, rather than to the closest integer. Correct the rounding error and ensure that gainCode translation produces accurate bi-directional conversions from the perspective of the gainCode. This fixes the IMX290, IMX296, IMX327 and IMX335 which use the Exponential gain model helpers, as well as IMX219, IMX258, IMX283, and IMX477 which use the Linear gain model helpers. This updates the corresponding test which was previously marked as expected to fail. Fixes: 8ad9249fb09d ("libipa: camera_sensor_helper: Implement exponential gain model") Signed-off-by: Kieran Bingham --- src/ipa/libipa/camera_sensor_helper.cpp | 6 +++--- test/ipa/meson.build | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/ipa/libipa/camera_sensor_helper.cpp b/src/ipa/libipa/camera_sensor_helper.cpp index 2cd61fccfbb9..4a92ead88b23 100644 --- a/src/ipa/libipa/camera_sensor_helper.cpp +++ b/src/ipa/libipa/camera_sensor_helper.cpp @@ -64,13 +64,13 @@ uint32_t CameraSensorHelper::gainCode(double gain) const case AnalogueGainLinear: ASSERT(k.linear.m0 == 0 || k.linear.m1 == 0); - return (k.linear.c0 - k.linear.c1 * gain) / - (k.linear.m1 * gain - k.linear.m0); + return std::round((k.linear.c0 - k.linear.c1 * gain) / + (k.linear.m1 * gain - k.linear.m0)); case AnalogueGainExponential: ASSERT(k.exp.a != 0 && k.exp.m != 0); - return std::log2(gain / k.exp.a) / k.exp.m; + return std::round(std::log2(gain / k.exp.a) / k.exp.m); default: ASSERT(false); diff --git a/test/ipa/meson.build b/test/ipa/meson.build index abc2456fc341..0b22c7576e56 100644 --- a/test/ipa/meson.build +++ b/test/ipa/meson.build @@ -1,8 +1,7 @@ # SPDX-License-Identifier: CC0-1.0 ipa_test = [ - {'name': 'camera_sensor_helper', 'sources': ['camera_sensor_helper.cpp'], - 'should_fail': true}, + {'name': 'camera_sensor_helper', 'sources': ['camera_sensor_helper.cpp']}, {'name': 'ipa_module_test', 'sources': ['ipa_module_test.cpp']}, {'name': 'ipa_interface_test', 'sources': ['ipa_interface_test.cpp']}, ]