summaryrefslogtreecommitdiff
path: root/test/ipa
diff options
context:
space:
mode:
Diffstat (limited to 'test/ipa')
-rw-r--r--test/ipa/libipa/fixedpoint.cpp (renamed from test/ipa/rkisp1/rkisp1-utils.cpp)16
-rw-r--r--test/ipa/libipa/histogram.cpp66
-rw-r--r--test/ipa/libipa/interpolator.cpp54
-rw-r--r--test/ipa/libipa/meson.build19
-rw-r--r--test/ipa/meson.build2
-rw-r--r--test/ipa/rkisp1/meson.build15
6 files changed, 148 insertions, 24 deletions
diff --git a/test/ipa/rkisp1/rkisp1-utils.cpp b/test/ipa/libipa/fixedpoint.cpp
index b1863894..99eb662d 100644
--- a/test/ipa/rkisp1/rkisp1-utils.cpp
+++ b/test/ipa/libipa/fixedpoint.cpp
@@ -2,7 +2,7 @@
/*
* Copyright (C) 2024, Paul Elder <paul.elder@ideasonboard.com>
*
- * Miscellaneous utility tests
+ * Fixed / Floating point utility tests
*/
#include <cmath>
@@ -10,22 +10,22 @@
#include <map>
#include <stdint.h>
-#include "../src/ipa/rkisp1/utils.h"
+#include "../src/ipa/libipa/fixedpoint.h"
#include "test.h"
using namespace std;
using namespace libcamera;
-using namespace ipa::rkisp1;
+using namespace ipa;
-class RkISP1UtilsTest : public Test
+class FixedPointUtilsTest : public Test
{
protected:
/* R for real, I for integer */
template<unsigned int IntPrec, unsigned int FracPrec, typename I, typename R>
int testFixedToFloat(I input, R expected)
{
- R out = utils::fixedToFloatingPoint<IntPrec, FracPrec, R>(input);
+ R out = fixedToFloatingPoint<IntPrec, FracPrec, R>(input);
R prec = 1.0 / (1 << FracPrec);
if (std::abs(out - expected) > prec) {
cerr << "Reverse conversion expected " << input
@@ -40,7 +40,7 @@ protected:
template<unsigned int IntPrec, unsigned int FracPrec, typename T>
int testSingleFixedPoint(double input, T expected)
{
- T ret = utils::floatingToFixedPoint<IntPrec, FracPrec, T>(input);
+ T ret = floatingToFixedPoint<IntPrec, FracPrec, T>(input);
if (ret != expected) {
cerr << "Expected " << input << " to convert to "
<< expected << ", got " << ret << std::endl;
@@ -51,7 +51,7 @@ protected:
* The precision check is fairly arbitrary but is based on what
* the rkisp1 is capable of in the crosstalk module.
*/
- double f = utils::fixedToFloatingPoint<IntPrec, FracPrec, double>(ret);
+ double f = fixedToFloatingPoint<IntPrec, FracPrec, double>(ret);
if (std::abs(f - input) > 0.005) {
cerr << "Reverse conversion expected " << ret
<< " to convert to " << input
@@ -105,4 +105,4 @@ protected:
}
};
-TEST_REGISTER(RkISP1UtilsTest)
+TEST_REGISTER(FixedPointUtilsTest)
diff --git a/test/ipa/libipa/histogram.cpp b/test/ipa/libipa/histogram.cpp
new file mode 100644
index 00000000..77ff31a6
--- /dev/null
+++ b/test/ipa/libipa/histogram.cpp
@@ -0,0 +1,66 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2024, Ideas on Board Oy
+ *
+ * Histogram tests
+ */
+
+#include "../src/ipa/libipa/histogram.h"
+
+#include <cmath>
+#include <iostream>
+#include <map>
+#include <stdint.h>
+
+#include "test.h"
+
+using namespace std;
+using namespace libcamera;
+using namespace ipa;
+
+#define ASSERT_EQ(a, b) \
+ if (!((a) == (b))) { \
+ std::cout << #a " != " #b << std::endl; \
+ return TestFail; \
+ }
+
+class HistogramTest : public Test
+{
+protected:
+ int run()
+ {
+ auto hist = Histogram({ { 50, 50 } });
+
+ ASSERT_EQ(hist.bins(), 2);
+ ASSERT_EQ(hist.total(), 100);
+
+ ASSERT_EQ(hist.cumulativeFrequency(1.0), 50);
+ ASSERT_EQ(hist.cumulativeFrequency(1.5), 75);
+ ASSERT_EQ(hist.cumulativeFrequency(2.0), 100);
+
+ ASSERT_EQ(hist.quantile(0.0), 0.0);
+ ASSERT_EQ(hist.quantile(1.0), 2.0);
+ ASSERT_EQ(hist.quantile(0.5), 1.0);
+
+ /* Test quantile in the middle of a bin. */
+ ASSERT_EQ(hist.quantile(0.75), 1.5);
+
+ /* Test quantile smaller than the smallest histogram step. */
+ ASSERT_EQ(hist.quantile(0.001), 0.002);
+
+ ASSERT_EQ(hist.interQuantileMean(0.0, 1.0), 1.0);
+ ASSERT_EQ(hist.interQuantileMean(0.0, 0.5), 0.5);
+ ASSERT_EQ(hist.interQuantileMean(0.5, 1.0), 1.5);
+
+ /* Test interquantile mean that starts and ends in the middle of a bin. */
+ ASSERT_EQ(hist.interQuantileMean(0.25, 0.75), 1.0);
+
+ /* Test small ranges at the borders of the histogram. */
+ ASSERT_EQ(hist.interQuantileMean(0.0, 0.1), 0.1);
+ ASSERT_EQ(hist.interQuantileMean(0.9, 1.0), 1.9);
+
+ return TestPass;
+ }
+};
+
+TEST_REGISTER(HistogramTest)
diff --git a/test/ipa/libipa/interpolator.cpp b/test/ipa/libipa/interpolator.cpp
new file mode 100644
index 00000000..6abb7760
--- /dev/null
+++ b/test/ipa/libipa/interpolator.cpp
@@ -0,0 +1,54 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2024, Ideas on Board Oy
+ *
+ * Interpolator tests
+ */
+
+#include "../src/ipa/libipa/interpolator.h"
+
+#include <cmath>
+#include <iostream>
+#include <map>
+#include <stdint.h>
+#include <stdio.h>
+
+#include "test.h"
+
+using namespace std;
+using namespace libcamera;
+using namespace ipa;
+
+#define ASSERT_EQ(a, b) \
+ if ((a) != (b)) { \
+ printf(#a " != " #b "\n"); \
+ return TestFail; \
+ }
+
+class InterpolatorTest : public Test
+{
+protected:
+ int run()
+ {
+ Interpolator<int> interpolator;
+ interpolator.setData({ { 10, 100 }, { 20, 200 }, { 30, 300 } });
+
+ ASSERT_EQ(interpolator.getInterpolated(0), 100);
+ ASSERT_EQ(interpolator.getInterpolated(10), 100);
+ ASSERT_EQ(interpolator.getInterpolated(20), 200);
+ ASSERT_EQ(interpolator.getInterpolated(25), 250);
+ ASSERT_EQ(interpolator.getInterpolated(30), 300);
+ ASSERT_EQ(interpolator.getInterpolated(40), 300);
+
+ interpolator.setQuantization(10);
+ unsigned int q = 0;
+ ASSERT_EQ(interpolator.getInterpolated(25, &q), 300);
+ ASSERT_EQ(q, 30);
+ ASSERT_EQ(interpolator.getInterpolated(24, &q), 200);
+ ASSERT_EQ(q, 20);
+
+ return TestPass;
+ }
+};
+
+TEST_REGISTER(InterpolatorTest)
diff --git a/test/ipa/libipa/meson.build b/test/ipa/libipa/meson.build
new file mode 100644
index 00000000..8c63ebd8
--- /dev/null
+++ b/test/ipa/libipa/meson.build
@@ -0,0 +1,19 @@
+# SPDX-License-Identifier: CC0-1.0
+
+libipa_test = [
+ {'name': 'fixedpoint', 'sources': ['fixedpoint.cpp']},
+ {'name': 'histogram', 'sources': ['histogram.cpp']},
+ {'name': 'interpolator', 'sources': ['interpolator.cpp']},
+]
+
+foreach test : libipa_test
+ exe = executable(test['name'], test['sources'],
+ dependencies : [libcamera_private, libipa_dep],
+ implicit_include_directories : false,
+ link_with : [test_libraries],
+ include_directories : [test_includes_internal,
+ '../../../src/ipa/libipa/'])
+
+ test(test['name'], exe, suite : 'ipa',
+ should_fail : test.get('should_fail', false))
+endforeach
diff --git a/test/ipa/meson.build b/test/ipa/meson.build
index e9871aba..ceed15ba 100644
--- a/test/ipa/meson.build
+++ b/test/ipa/meson.build
@@ -1,6 +1,6 @@
# SPDX-License-Identifier: CC0-1.0
-subdir('rkisp1')
+subdir('libipa')
ipa_test = [
{'name': 'ipa_module_test', 'sources': ['ipa_module_test.cpp']},
diff --git a/test/ipa/rkisp1/meson.build b/test/ipa/rkisp1/meson.build
deleted file mode 100644
index 894523da..00000000
--- a/test/ipa/rkisp1/meson.build
+++ /dev/null
@@ -1,15 +0,0 @@
-# SPDX-License-Identifier: CC0-1.0
-
-rkisp1_ipa_test = [
- {'name': 'rkisp1-utils', 'sources': ['rkisp1-utils.cpp']},
-]
-
-foreach test : rkisp1_ipa_test
- exe = executable(test['name'], test['sources'],
- dependencies : [libcamera_private, libipa_dep],
- link_with : [test_libraries],
- include_directories : [test_includes_internal,
- '../../../src/ipa/rkisp1/'])
-
- test(test['name'], exe, suite : 'ipa')
-endforeach