libcamera: controls: Add a function to merge two control lists

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.

Reviewed-by: Hirokazu Honda <hiroh@chromium.org>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
[reimplement the function by not using std::unordered_map::merge()]
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
Laurent Pinchart 2021-02-22 15:21:21 +02:00 committed by Jacopo Mondi
parent 332870ea2b
commit a5c881645a
2 changed files with 32 additions and 0 deletions

View file

@ -363,7 +363,9 @@ public:
bool empty() const { return controls_.empty(); } bool empty() const { return controls_.empty(); }
std::size_t size() const { return controls_.size(); } std::size_t size() const { return controls_.size(); }
void clear() { controls_.clear(); } void clear() { controls_.clear(); }
void merge(const ControlList &source);
bool contains(const ControlId &id) const; bool contains(const ControlId &id) const;
bool contains(unsigned int id) const; bool contains(unsigned int id) const;

View file

@ -874,6 +874,36 @@ ControlList::ControlList(const ControlInfoMap &infoMap, ControlValidator *valida
* \brief Removes all controls from the list * \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 inserts
* them in *this. If the \a source contains elements whose key is already
* present in *this, then those elements are not overwritten.
*
* 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-const argument.
*/
void ControlList::merge(const ControlList &source)
{
ASSERT(idmap_ == source.idmap_);
for (const auto &ctrl : source) {
if (contains(ctrl.first)) {
const ControlId *id = idmap_->at(ctrl.first);
LOG(Controls, Warning)
<< "Control " << id->name() << " not overwritten";
continue;
}
set(ctrl.first, ctrl.second);
}
}
/** /**
* \brief Check if the list contains a control with the specified \a id * \brief Check if the list contains a control with the specified \a id
* \param[in] id The control ID * \param[in] id The control ID