diff options
author | Daniel Scally <dan.scally@ideasonboard.com> | 2024-11-15 12:25:30 +0000 |
---|---|---|
committer | Daniel Scally <dan.scally@ideasonboard.com> | 2024-12-17 22:35:58 +0000 |
commit | 3dd5725a84f5ac71c384431ffc4929962aeaf6b2 (patch) | |
tree | 562c6e6f3338091e5e588cd24fa38161d03e04e2 /src/ipa/rkisp1 | |
parent | e4178d7943e16ffb18074a24e6c4fe0143f6c730 (diff) |
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>
Diffstat (limited to 'src/ipa/rkisp1')
-rw-r--r-- | src/ipa/rkisp1/algorithms/ccm.cpp | 4 | ||||
-rw-r--r-- | src/ipa/rkisp1/meson.build | 1 | ||||
-rw-r--r-- | src/ipa/rkisp1/utils.cpp | 42 | ||||
-rw-r--r-- | src/ipa/rkisp1/utils.h | 65 |
4 files changed, 2 insertions, 110 deletions
diff --git a/src/ipa/rkisp1/algorithms/ccm.cpp b/src/ipa/rkisp1/algorithms/ccm.cpp index 6b7d2e2c..e2b5cf4d 100644 --- a/src/ipa/rkisp1/algorithms/ccm.cpp +++ b/src/ipa/rkisp1/algorithms/ccm.cpp @@ -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++) diff --git a/src/ipa/rkisp1/meson.build b/src/ipa/rkisp1/meson.build index 34844f14..26a9fa40 100644 --- a/src/ipa/rkisp1/meson.build +++ b/src/ipa/rkisp1/meson.build @@ -9,7 +9,6 @@ rkisp1_ipa_sources = files([ 'ipa_context.cpp', 'params.cpp', 'rkisp1.cpp', - 'utils.cpp', ]) rkisp1_ipa_sources += rkisp1_ipa_algorithms diff --git a/src/ipa/rkisp1/utils.cpp b/src/ipa/rkisp1/utils.cpp deleted file mode 100644 index 960ec64e..00000000 --- a/src/ipa/rkisp1/utils.cpp +++ /dev/null @@ -1,42 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1-or-later */ -/* - * Copyright (C) 2024, Paul Elder <paul.elder@ideasonboard.com> - * - * Miscellaneous utility functions specific to rkisp1 - */ - -#include "utils.h" - -/** - * \file utils.h - */ - -namespace libcamera { - -namespace ipa::rkisp1::utils { - -/** - * \fn R floatingToFixedPoint(T number) - * \brief Convert a floating point number to a fixed-point representation - * \tparam I Bit width of the integer part of the fixed-point - * \tparam F Bit width of the fractional part of the fixed-point - * \tparam R Return type of the fixed-point representation - * \tparam T Input type of the floating point representation - * \param number The floating point number to convert to fixed point - * \return The converted value - */ - -/** - * \fn R fixedToFloatingPoint(T number) - * \brief Convert a fixed-point number to a floating point representation - * \tparam I Bit width of the integer part of the fixed-point - * \tparam F Bit width of the fractional part of the fixed-point - * \tparam R Return type of the floating point representation - * \tparam T Input type of the fixed-point representation - * \param number The fixed point number to convert to floating point - * \return The converted value - */ - -} /* namespace ipa::rkisp1::utils */ - -} /* namespace libcamera */ diff --git a/src/ipa/rkisp1/utils.h b/src/ipa/rkisp1/utils.h deleted file mode 100644 index 5f38b50b..00000000 --- a/src/ipa/rkisp1/utils.h +++ /dev/null @@ -1,65 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1-or-later */ -/* - * Copyright (C) 2024, Paul Elder <paul.elder@ideasonboard.com> - * - * Miscellaneous utility functions specific to rkisp1 - */ - -#pragma once - -#include <cmath> -#include <type_traits> - -namespace libcamera { - -namespace ipa::rkisp1::utils { - -#ifndef __DOXYGEN__ -template<unsigned int I, unsigned int F, typename R, typename T, - std::enable_if_t<std::is_integral_v<R> && - std::is_floating_point_v<T>> * = nullptr> -#else -template<unsigned int I, unsigned int F, typename R, typename T> -#endif -constexpr R floatingToFixedPoint(T number) -{ - static_assert(sizeof(int) >= sizeof(R)); - static_assert(I + F <= sizeof(R) * 8); - - /* - * The intermediate cast to int is needed on arm platforms to properly - * cast negative values. See - * https://embeddeduse.com/2013/08/25/casting-a-negative-float-to-an-unsigned-int/ - */ - R mask = (1 << (F + I)) - 1; - R frac = static_cast<R>(static_cast<int>(std::round(number * (1 << F)))) & mask; - - return frac; -} - -#ifndef __DOXYGEN__ -template<unsigned int I, unsigned int F, typename R, typename T, - std::enable_if_t<std::is_floating_point_v<R> && - std::is_integral_v<T>> * = nullptr> -#else -template<unsigned int I, unsigned int F, typename R, typename T> -#endif -constexpr R fixedToFloatingPoint(T number) -{ - static_assert(sizeof(int) >= sizeof(T)); - static_assert(I + F <= sizeof(T) * 8); - - /* - * Recreate the upper bits in case of a negative number by shifting the sign - * bit from the fixed point to the first bit of the unsigned and then right shifting - * by the same amount which keeps the sign bit in place. - * This can be optimized by the compiler quite well. - */ - int remaining_bits = sizeof(int) * 8 - (I + F); - int t = static_cast<int>(static_cast<unsigned>(number) << remaining_bits) >> remaining_bits; - return static_cast<R>(t) / static_cast<R>(1 << F); -} - -} /* namespace ipa::rkisp1::utils */ - -} /* namespace libcamera */ |