[PATCH] libcamera: yaml_parser: Add support for float types
Stefan Klug
stefan.klug at ideasonboard.com
Fri Jun 21 16:52:38 CEST 2024
Hi Laurent,
On Fri, Jun 21, 2024 at 03:03:18PM +0300, Laurent Pinchart wrote:
> The YamlObject::get<T>() function template has a specialization for
> double but not for float. When used in an IPA module, the issue is
> caught at module load time only, when dynamic links are resolved,
> causing errors such as
>
> Failed to open IPA module shared object: /usr/lib/libcamera/ipa_rkisp1.so: undefined symbol: _ZNK9libcamera10YamlObject6GetterIfE3getERK_
>
> Fix it by adding a float specialization. The alternative would be to use
> double only in IPA modules, but the lack of enforcement at compile time
> makes this dangerous.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Reviewed-by: Stefan Klug <stefan.klug at ideasonboard.com>
Cheers,
Stefam
> ---
> Jacopo, I think this may fix the issue you've experienced. Could you
> test the patch ?
> ---
> include/libcamera/internal/yaml_parser.h | 1 +
> src/libcamera/yaml_parser.cpp | 9 +++++++++
> 2 files changed, 10 insertions(+)
>
> diff --git a/include/libcamera/internal/yaml_parser.h b/include/libcamera/internal/yaml_parser.h
> index 06a41146ad01..e38a2df9ae1d 100644
> --- a/include/libcamera/internal/yaml_parser.h
> +++ b/include/libcamera/internal/yaml_parser.h
> @@ -177,6 +177,7 @@ public:
> template<typename T,
> std::enable_if_t<
> std::is_same_v<bool, T> ||
> + std::is_same_v<float, T> ||
> std::is_same_v<double, T> ||
> std::is_same_v<int8_t, T> ||
> std::is_same_v<uint8_t, T> ||
> diff --git a/src/libcamera/yaml_parser.cpp b/src/libcamera/yaml_parser.cpp
> index 56670ba7a584..025006bcdcdd 100644
> --- a/src/libcamera/yaml_parser.cpp
> +++ b/src/libcamera/yaml_parser.cpp
> @@ -278,6 +278,13 @@ YamlObject::Getter<uint32_t>::get(const YamlObject &obj) const
> return value;
> }
>
> +template<>
> +std::optional<float>
> +YamlObject::Getter<float>::get(const YamlObject &obj) const
> +{
> + return obj.get<double>();
> +}
> +
> template<>
> std::optional<double>
> YamlObject::Getter<double>::get(const YamlObject &obj) const
> @@ -349,6 +356,7 @@ YamlObject::Getter<Size>::get(const YamlObject &obj) const
> template<typename T,
> std::enable_if_t<
> std::is_same_v<bool, T> ||
> + std::is_same_v<float, T> ||
> std::is_same_v<double, T> ||
> std::is_same_v<int8_t, T> ||
> std::is_same_v<uint8_t, T> ||
> @@ -377,6 +385,7 @@ std::optional<std::vector<T>> YamlObject::getList() const
> }
>
> template std::optional<std::vector<bool>> YamlObject::getList<bool>() const;
> +template std::optional<std::vector<float>> YamlObject::getList<float>() const;
> template std::optional<std::vector<double>> YamlObject::getList<double>() const;
> template std::optional<std::vector<int8_t>> YamlObject::getList<int8_t>() const;
> template std::optional<std::vector<uint8_t>> YamlObject::getList<uint8_t>() const;
> --
> Regards,
>
> Laurent Pinchart
>
More information about the libcamera-devel
mailing list