[PATCH 09/11] ipa: libipa: pwl: Specialize YamlObject getter

Paul Elder paul.elder at ideasonboard.com
Thu Jun 13 10:05:02 CEST 2024


On Thu, Jun 13, 2024 at 04:39:42AM +0300, Laurent Pinchart wrote:
> Implement a specialization of the YamlObject::Getter structure to
> support deserializing ipa::Pwl objects from YAML data.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

Reviewed-by: Paul Elder <paul.elder at ideasonboard.com>

> ---
>  src/ipa/libipa/pwl.cpp | 35 +++++++++++++++++++++++++++++++++++
>  1 file changed, 35 insertions(+)
> 
> diff --git a/src/ipa/libipa/pwl.cpp b/src/ipa/libipa/pwl.cpp
> index cf864fbb3889..3c639645fa3d 100644
> --- a/src/ipa/libipa/pwl.cpp
> +++ b/src/ipa/libipa/pwl.cpp
> @@ -459,4 +459,39 @@ std::string Pwl::toString() const
>  
>  } /* namespace ipa */
>  
> +#ifndef __DOXYGEN__
> +/*
> + * The YAML data shall be a list of numerical values with an even number of
> + * elements. They are parsed in pairs into x and y points in the piecewise
> + * linear function, and added in order. x must be monotonically increasing.
> + */
> +template<>
> +std::optional<ipa::Pwl>
> +YamlObject::Getter<ipa::Pwl>::get(const YamlObject &obj) const
> +{
> +	if (!obj.size() || obj.size() % 2)
> +		return std::nullopt;
> +
> +	ipa::Pwl pwl;
> +
> +	const auto &list = obj.asList();
> +
> +	for (auto it = list.begin(); it != list.end(); it++) {
> +		auto x = it->get<double>();
> +		if (!x)
> +			return std::nullopt;
> +		auto y = (++it)->get<double>();
> +		if (!y)
> +			return std::nullopt;
> +
> +		pwl.append(*x, *y);
> +	}
> +
> +	if (pwl.size() != obj.size() / 2)
> +		return std::nullopt;
> +
> +	return pwl;
> +}
> +#endif /* __DOXYGEN__ */
> +
>  } /* namespace libcamera */


More information about the libcamera-devel mailing list