diff options
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.cpp | 66 | ||||
-rw-r--r-- | test/ipa/libipa/interpolator.cpp | 54 | ||||
-rw-r--r-- | test/ipa/libipa/meson.build | 19 | ||||
-rw-r--r-- | test/ipa/meson.build | 2 | ||||
-rw-r--r-- | test/ipa/rkisp1/meson.build | 15 |
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 |