[libcamera-devel] [PATCH v4 01/16] libcamera: controls: Add a function to merge two control lists

Niklas Söderlund niklas.soderlund at ragnatech.se
Sat May 1 08:41:55 CEST 2021


Hi Jacopo,

Thanks for your work.

On 2021-04-30 18:00:11 +0200, Jacopo Mondi wrote:
> From: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> 
> Add a new ControlList::merge() function to merge two control lists by
> copying in the values in the list passed as parameters.
> 
> This can be used by pipeline handlers to merge metadata they populate
> with metadata received from an IPA.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> [reimplement the function by not using std::unordered_map::merge()]
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
>  include/libcamera/controls.h |  2 ++
>  src/libcamera/controls.cpp   | 28 ++++++++++++++++++++++++++++
>  2 files changed, 30 insertions(+)
> 
> diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
> index 1a5690a5ccbe..1c9b37e617bc 100644
> --- a/include/libcamera/controls.h
> +++ b/include/libcamera/controls.h
> @@ -363,7 +363,9 @@ public:
>  
>  	bool empty() const { return controls_.empty(); }
>  	std::size_t size() const { return controls_.size(); }
> +
>  	void clear() { controls_.clear(); }
> +	void merge(const ControlList &source);
>  
>  	bool contains(const ControlId &id) const;
>  	bool contains(unsigned int id) const;
> diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
> index c58ed3946f3b..154ca7bfe7c1 100644
> --- a/src/libcamera/controls.cpp
> +++ b/src/libcamera/controls.cpp
> @@ -874,6 +874,34 @@ ControlList::ControlList(const ControlInfoMap &infoMap, ControlValidator *valida
>   * \brief Removes all controls from the list
>   */
>  
> +/**
> + * \brief Merge the \a source into the ControlList
> + * \param[in] source The ControlList to merge into this object
> + *
> + * Merging two control lists copies elements from the \a source and insert
> + * them in *this. If the \a source contains elements whose key is already
> + * present in *this, then those elements are not overwritten.
> + * identical to std::unordered_map::merge() in that only internal pointers to
> + * nodes are updated, without copying or moving the elements.
> + *
> + * Only control lists created from the same ControlIdMap or ControlInfoMap may
> + * be merged. Attempting to do otherwise results in undefined behaviour.
> + *
> + * \todo Reimplement or implement an overloaded version which internally uses
> + * std::unordered_map::merge() and accepts a non-cost argument.
> + */
> +void ControlList::merge(const ControlList &source)
> +{
> +	ASSERT(idmap_ == source.idmap_);
> +
> +	for (const auto &ctrl : source) {
> +		if (contains(ctrl.first))
> +			continue;

nit1: Should not 'source' have priority over 'this'? If I'm merging 
something to 'this' I would expect the new stuff to overwrite my 
existing state.

nit2: Maybe add a debug log here? It feels like an issue with the 
potential to reduce someone to tears, "I set the control in the IPA but 
my application still sees the old value, why?"

> +
> +		set(ctrl.first, ctrl.second);
> +	}
> +}
> +
>  /**
>   * \brief Check if the list contains a control with the specified \a id
>   * \param[in] id The control ID
> -- 
> 2.31.1
> 
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel

-- 
Regards,
Niklas Söderlund


More information about the libcamera-devel mailing list