diff options
-rw-r--r-- | include/libcamera/controls.h | 2 | ||||
-rw-r--r-- | src/libcamera/controls.cpp | 54 |
2 files changed, 56 insertions, 0 deletions
diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h index 18293c94..fbb3a622 100644 --- a/include/libcamera/controls.h +++ b/include/libcamera/controls.h @@ -117,11 +117,13 @@ public: const_iterator begin() const { return controls_.begin(); } const_iterator end() const { return controls_.end(); } + bool contains(ControlId id) const; bool contains(const ControlInfo *info) const; bool empty() const { return controls_.empty(); } std::size_t size() const { return controls_.size(); } void clear() { controls_.clear(); } + ControlValue &operator[](ControlId id); ControlValue &operator[](const ControlInfo *info) { return controls_[info]; } void update(const ControlList &list); diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp index cd2cf337..42a2f899 100644 --- a/src/libcamera/controls.cpp +++ b/src/libcamera/controls.cpp @@ -10,6 +10,8 @@ #include <sstream> #include <string> +#include <libcamera/camera.h> + #include "log.h" #include "utils.h" @@ -388,6 +390,30 @@ ControlList::ControlList(Camera *camera) */ /** + * \brief Check if the list contains a control with the specified \a id + * \param[in] id The control ID + * + * The behaviour is undefined if the control \a id is not supported by the + * camera that the ControlList refers to. + * + * \return True if the list contains a matching control, false otherwise + */ +bool ControlList::contains(ControlId id) const +{ + const ControlInfoMap &controls = camera_->controls(); + const auto iter = controls.find(id); + if (iter == controls.end()) { + LOG(Controls, Error) + << "Camera " << camera_->name() + << " does not support control " << id; + + return false; + } + + return controls_.find(&iter->second) != controls_.end(); +} + +/** * \brief Check if the list contains a control with the specified \a info * \param[in] info The control info * \return True if the list contains a matching control, false otherwise @@ -415,6 +441,34 @@ bool ControlList::contains(const ControlInfo *info) const */ /** + * \brief Access or insert the control specified by \a id + * \param[in] id The control ID + * + * This method returns a reference to the control identified by \a id, inserting + * it in the list if the ID is not already present. + * + * The behaviour is undefined if the control \a id is not supported by the + * camera that the ControlList refers to. + * + * \return A reference to the value of the control identified by \a id + */ +ControlValue &ControlList::operator[](ControlId id) +{ + const ControlInfoMap &controls = camera_->controls(); + const auto iter = controls.find(id); + if (iter == controls.end()) { + LOG(Controls, Error) + << "Camera " << camera_->name() + << " does not support control " << id; + + static ControlValue empty; + return empty; + } + + return controls_[&iter->second]; +} + +/** * \fn ControlList::operator[](const ControlInfo *info) * \brief Access or insert the control specified by \a info * \param[in] info The control info |