summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2024-06-21 15:00:37 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2024-06-24 22:14:22 +0300
commit3d7e50fd715dee709da9e2a8c9ccd4892f4d5f75 (patch)
tree556c9e364f1fc2205752b1c2f39d79c4cca921b1
parenta8de1f398ddc26a655756e8954fd4d90dff3b3fa (diff)
libcamera: yaml_parser: Add support for float types
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@ideasonboard.com> Tested-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com>
-rw-r--r--include/libcamera/internal/yaml_parser.h1
-rw-r--r--src/libcamera/yaml_parser.cpp9
2 files changed, 10 insertions, 0 deletions
diff --git a/include/libcamera/internal/yaml_parser.h b/include/libcamera/internal/yaml_parser.h
index 06a41146..e38a2df9 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 56670ba7..025006bc 100644
--- a/src/libcamera/yaml_parser.cpp
+++ b/src/libcamera/yaml_parser.cpp
@@ -279,6 +279,13 @@ YamlObject::Getter<uint32_t>::get(const YamlObject &obj) const
}
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;