libipa: Centralise Fixed / Floating point convertors

The rkisp1 IPA has some utility functions to convert between fixed
and floating point numbers. Move those to libipa so they're available
for use in other IPA modules too.

Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Daniel Scally 2024-11-15 12:25:30 +00:00
parent e4178d7943
commit 3dd5725a84
9 changed files with 21 additions and 35 deletions

View file

@ -2,18 +2,18 @@
/*
* Copyright (C) 2024, Paul Elder <paul.elder@ideasonboard.com>
*
* Miscellaneous utility functions specific to rkisp1
* Fixed / floating point conversions
*/
#include "utils.h"
#include "fixedpoint.h"
/**
* \file utils.h
* \file fixedpoint.h
*/
namespace libcamera {
namespace ipa::rkisp1::utils {
namespace ipa {
/**
* \fn R floatingToFixedPoint(T number)
@ -37,6 +37,6 @@ namespace ipa::rkisp1::utils {
* \return The converted value
*/
} /* namespace ipa::rkisp1::utils */
} /* namespace ipa */
} /* namespace libcamera */

View file

@ -2,7 +2,7 @@
/*
* Copyright (C) 2024, Paul Elder <paul.elder@ideasonboard.com>
*
* Miscellaneous utility functions specific to rkisp1
* Fixed / floating point conversions
*/
#pragma once
@ -12,7 +12,7 @@
namespace libcamera {
namespace ipa::rkisp1::utils {
namespace ipa {
#ifndef __DOXYGEN__
template<unsigned int I, unsigned int F, typename R, typename T,
@ -60,6 +60,6 @@ constexpr R fixedToFloatingPoint(T number)
return static_cast<R>(t) / static_cast<R>(1 << F);
}
} /* namespace ipa::rkisp1::utils */
} /* namespace ipa */
} /* namespace libcamera */

View file

@ -7,6 +7,7 @@ libipa_headers = files([
'colours.h',
'exposure_mode_helper.h',
'fc_queue.h',
'fixedpoint.h',
'histogram.h',
'interpolator.h',
'lsc_polynomial.h',
@ -22,6 +23,7 @@ libipa_sources = files([
'colours.cpp',
'exposure_mode_helper.cpp',
'fc_queue.cpp',
'fixedpoint.cpp',
'histogram.cpp',
'interpolator.cpp',
'lsc_polynomial.cpp',

View file

@ -18,7 +18,7 @@
#include "libcamera/internal/yaml_parser.h"
#include "../utils.h"
#include "libipa/fixedpoint.h"
#include "libipa/interpolator.h"
/**
@ -72,7 +72,7 @@ void Ccm::setParameters(struct rkisp1_cif_isp_ctk_config &config,
for (unsigned int i = 0; i < 3; i++) {
for (unsigned int j = 0; j < 3; j++)
config.coeff[i][j] =
utils::floatingToFixedPoint<4, 7, uint16_t, double>(matrix[i][j]);
floatingToFixedPoint<4, 7, uint16_t, double>(matrix[i][j]);
}
for (unsigned int i = 0; i < 3; i++)

View file

@ -9,7 +9,6 @@ rkisp1_ipa_sources = files([
'ipa_context.cpp',
'params.cpp',
'rkisp1.cpp',
'utils.cpp',
])
rkisp1_ipa_sources += rkisp1_ipa_algorithms

View file

@ -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)

View file

@ -1,6 +1,7 @@
# SPDX-License-Identifier: CC0-1.0
libipa_test = [
{'name': 'fixedpoint', 'sources': ['fixedpoint.cpp']},
{'name': 'interpolator', 'sources': ['interpolator.cpp']},
{'name': 'vector', 'sources': ['vector.cpp']},
]

View file

@ -1,7 +1,6 @@
# SPDX-License-Identifier: CC0-1.0
subdir('libipa')
subdir('rkisp1')
ipa_test = [
{'name': 'ipa_module_test', 'sources': ['ipa_module_test.cpp']},

View file

@ -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