[PATCH v2 2/2] libipa: camera_sensor_helper: Fix rounding of gainCode

Kieran Bingham kieran.bingham at ideasonboard.com
Fri May 24 15:52:56 CEST 2024


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 <kieran.bingham at ideasonboard.com>
---
 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']},
 ]
-- 
2.34.1



More information about the libcamera-devel mailing list