[PATCH] libcamera: yaml_parser: Add support for float types

Kieran Bingham kieran.bingham at ideasonboard.com
Mon Jun 24 23:55:11 CEST 2024


Quoting Laurent Pinchart (2024-06-21 13:03:18)
> 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>
> ---
> 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>();

I guess there's not a lot of distinction in parsing a value from Yaml as
either a float or a double... and the return/template type will
determine what the call site requires.

Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>

> +}
> +
>  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