Message ID | 20240911162400.1906661-2-paul.elder@ideasonboard.com |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
On Wed, Sep 11, 2024 at 06:23:59PM +0200, Paul Elder wrote: > Add to ControlId information on whether or not it is an array control, > and the size of the control if it is an array control. > > Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> > Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > > --- > Changes in v2: > - fix documentation > --- > include/libcamera/controls.h | 17 ++++++++++++++++- > src/libcamera/controls.cpp | 17 +++++++++++++++-- > 2 files changed, 31 insertions(+), 3 deletions(-) > > diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h > index 8959dfcc2..b539159e1 100644 > --- a/include/libcamera/controls.h > +++ b/include/libcamera/controls.h > @@ -46,50 +46,60 @@ struct control_type { > template<> > struct control_type<void> { > static constexpr ControlType value = ControlTypeNone; > + static constexpr std::size_t size = 0; > }; > > template<> > struct control_type<bool> { > static constexpr ControlType value = ControlTypeBool; > + static constexpr std::size_t size = 0; > }; > > template<> > struct control_type<uint8_t> { > static constexpr ControlType value = ControlTypeByte; > + static constexpr std::size_t size = 0; > }; > > template<> > struct control_type<int32_t> { > static constexpr ControlType value = ControlTypeInteger32; > + static constexpr std::size_t size = 0; > }; > > template<> > struct control_type<int64_t> { > static constexpr ControlType value = ControlTypeInteger64; > + static constexpr std::size_t size = 0; > }; > > template<> > struct control_type<float> { > static constexpr ControlType value = ControlTypeFloat; > + static constexpr std::size_t size = 0; > }; > > template<> > struct control_type<std::string> { > static constexpr ControlType value = ControlTypeString; > + static constexpr std::size_t size = 0; > }; > > template<> > struct control_type<Rectangle> { > static constexpr ControlType value = ControlTypeRectangle; > + static constexpr std::size_t size = 0; > }; > > template<> > struct control_type<Size> { > static constexpr ControlType value = ControlTypeSize; > + static constexpr std::size_t size = 0; > }; > > template<typename T, std::size_t N> > struct control_type<Span<T, N>> : public control_type<std::remove_cv_t<T>> { > + static constexpr std::size_t size = N; > }; > > } /* namespace details */ > @@ -215,11 +225,14 @@ class ControlId > { > public: > ControlId(unsigned int id, const std::string &name, ControlType type, > + std::size_t size = 0, > const std::map<std::string, int32_t> &enumStrMap = {}); > > unsigned int id() const { return id_; } > const std::string &name() const { return name_; } > ControlType type() const { return type_; } > + bool isArray() const { return size_ > 0; } > + std::size_t size() const { return size_; } > const std::map<std::string, int32_t> &enumStrMap() const { return enumStrMap_; } > const std::string enumToString(int32_t value) const; > > @@ -229,6 +242,7 @@ private: > unsigned int id_; > std::string name_; > ControlType type_; > + std::size_t size_; > std::map<std::string, int32_t> enumStrMap_; > std::map<int32_t, std::string> reverseMap_; > }; > @@ -260,7 +274,8 @@ public: > using type = T; > > Control(unsigned int id, const char *name, const std::map<std::string, int32_t> &enumStrMap = {}) > - : ControlId(id, name, details::control_type<std::remove_cv_t<T>>::value, enumStrMap) > + : ControlId(id, name, details::control_type<std::remove_cv_t<T>>::value, > + details::control_type<std::remove_cv_t<T>>::size, enumStrMap) > { > } > > diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp > index 0f83139fb..217769396 100644 > --- a/src/libcamera/controls.cpp > +++ b/src/libcamera/controls.cpp > @@ -391,11 +391,12 @@ void ControlValue::reserve(ControlType type, bool isArray, std::size_t numElemen > * \param[in] id The control numerical ID > * \param[in] name The control name > * \param[in] type The control data type > + * \param[in] size The size of the array control, or 0 if scalar control > * \param[in] enumStrMap The map from enum names to values (optional) > */ > ControlId::ControlId(unsigned int id, const std::string &name, ControlType type, > - const std::map<std::string, int32_t> &enumStrMap) > - : id_(id), name_(name), type_(type), enumStrMap_(enumStrMap) > + std::size_t size, const std::map<std::string, int32_t> &enumStrMap) > + : id_(id), name_(name), type_(type), size_(size), enumStrMap_(enumStrMap) > { > for (const auto &pair : enumStrMap_) > reverseMap_[pair.second] = pair.first; > @@ -419,6 +420,18 @@ ControlId::ControlId(unsigned int id, const std::string &name, ControlType type, > * \return The control data type > */ > > +/** > + * \fn bool ControlId::isArray() const > + * \brief Determine if the control is an array control > + * \return True if the control is an array control, false otherwise > + */ > + > +/** > + * \fn std::size_t ControlId::size() const > + * \brief Retrieve the size of the control if it is an array control > + * \return The size of the array control, size_t::max for dynamic extend, or 0 for non-array Line wrap. Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > + */ > + > /** > * \brief Retrieve the name of an enum value > * \return The name of the enum value
diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h index 8959dfcc2..b539159e1 100644 --- a/include/libcamera/controls.h +++ b/include/libcamera/controls.h @@ -46,50 +46,60 @@ struct control_type { template<> struct control_type<void> { static constexpr ControlType value = ControlTypeNone; + static constexpr std::size_t size = 0; }; template<> struct control_type<bool> { static constexpr ControlType value = ControlTypeBool; + static constexpr std::size_t size = 0; }; template<> struct control_type<uint8_t> { static constexpr ControlType value = ControlTypeByte; + static constexpr std::size_t size = 0; }; template<> struct control_type<int32_t> { static constexpr ControlType value = ControlTypeInteger32; + static constexpr std::size_t size = 0; }; template<> struct control_type<int64_t> { static constexpr ControlType value = ControlTypeInteger64; + static constexpr std::size_t size = 0; }; template<> struct control_type<float> { static constexpr ControlType value = ControlTypeFloat; + static constexpr std::size_t size = 0; }; template<> struct control_type<std::string> { static constexpr ControlType value = ControlTypeString; + static constexpr std::size_t size = 0; }; template<> struct control_type<Rectangle> { static constexpr ControlType value = ControlTypeRectangle; + static constexpr std::size_t size = 0; }; template<> struct control_type<Size> { static constexpr ControlType value = ControlTypeSize; + static constexpr std::size_t size = 0; }; template<typename T, std::size_t N> struct control_type<Span<T, N>> : public control_type<std::remove_cv_t<T>> { + static constexpr std::size_t size = N; }; } /* namespace details */ @@ -215,11 +225,14 @@ class ControlId { public: ControlId(unsigned int id, const std::string &name, ControlType type, + std::size_t size = 0, const std::map<std::string, int32_t> &enumStrMap = {}); unsigned int id() const { return id_; } const std::string &name() const { return name_; } ControlType type() const { return type_; } + bool isArray() const { return size_ > 0; } + std::size_t size() const { return size_; } const std::map<std::string, int32_t> &enumStrMap() const { return enumStrMap_; } const std::string enumToString(int32_t value) const; @@ -229,6 +242,7 @@ private: unsigned int id_; std::string name_; ControlType type_; + std::size_t size_; std::map<std::string, int32_t> enumStrMap_; std::map<int32_t, std::string> reverseMap_; }; @@ -260,7 +274,8 @@ public: using type = T; Control(unsigned int id, const char *name, const std::map<std::string, int32_t> &enumStrMap = {}) - : ControlId(id, name, details::control_type<std::remove_cv_t<T>>::value, enumStrMap) + : ControlId(id, name, details::control_type<std::remove_cv_t<T>>::value, + details::control_type<std::remove_cv_t<T>>::size, enumStrMap) { } diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp index 0f83139fb..217769396 100644 --- a/src/libcamera/controls.cpp +++ b/src/libcamera/controls.cpp @@ -391,11 +391,12 @@ void ControlValue::reserve(ControlType type, bool isArray, std::size_t numElemen * \param[in] id The control numerical ID * \param[in] name The control name * \param[in] type The control data type + * \param[in] size The size of the array control, or 0 if scalar control * \param[in] enumStrMap The map from enum names to values (optional) */ ControlId::ControlId(unsigned int id, const std::string &name, ControlType type, - const std::map<std::string, int32_t> &enumStrMap) - : id_(id), name_(name), type_(type), enumStrMap_(enumStrMap) + std::size_t size, const std::map<std::string, int32_t> &enumStrMap) + : id_(id), name_(name), type_(type), size_(size), enumStrMap_(enumStrMap) { for (const auto &pair : enumStrMap_) reverseMap_[pair.second] = pair.first; @@ -419,6 +420,18 @@ ControlId::ControlId(unsigned int id, const std::string &name, ControlType type, * \return The control data type */ +/** + * \fn bool ControlId::isArray() const + * \brief Determine if the control is an array control + * \return True if the control is an array control, false otherwise + */ + +/** + * \fn std::size_t ControlId::size() const + * \brief Retrieve the size of the control if it is an array control + * \return The size of the array control, size_t::max for dynamic extend, or 0 for non-array + */ + /** * \brief Retrieve the name of an enum value * \return The name of the enum value