Message ID | 20241016111943.1411372-2-paul.elder@ideasonboard.com |
---|---|
State | Accepted |
Commit | aafa406edd39d04689bfcd4ff5239f918a0885ce |
Headers | show |
Series |
|
Related | show |
Quoting Paul Elder (2024-10-16 12:19:41) > Add vendor/namespace information to ControlId, so that the vendor can be > queried from it. This is expected to be used by applications either > simply to display the vendor or for it to be used for grouping in a > UI. > > Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > --- > Changes in v2: > - reorder code so that vendor comes immediately after name > --- > include/libcamera/controls.h | 11 +++++++---- > src/libcamera/control_ids.cpp.in | 4 ++-- > src/libcamera/control_serializer.cpp | 2 +- > src/libcamera/controls.cpp | 19 +++++++++++++++---- > src/libcamera/v4l2_device.cpp | 2 +- > 5 files changed, 26 insertions(+), 12 deletions(-) > > diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h > index ca60bbacad17..4c28240812bf 100644 > --- a/include/libcamera/controls.h > +++ b/include/libcamera/controls.h > @@ -234,12 +234,13 @@ private: > class ControlId > { > public: > - ControlId(unsigned int id, const std::string &name, ControlType type, > - std::size_t size = 0, > + ControlId(unsigned int id, const std::string &name, const std::string &vendor, > + 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_; } > + const std::string &vendor() const { return vendor_; } > ControlType type() const { return type_; } > bool isArray() const { return size_ > 0; } > std::size_t size() const { return size_; } > @@ -250,6 +251,7 @@ private: > > unsigned int id_; > std::string name_; > + std::string vendor_; > ControlType type_; > std::size_t size_; > std::map<std::string, int32_t> enumStrMap_; > @@ -282,8 +284,9 @@ class Control : public ControlId > 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, > + Control(unsigned int id, const char *name, const char *vendor, > + const std::map<std::string, int32_t> &enumStrMap = {}) > + : ControlId(id, name, vendor, details::control_type<std::remove_cv_t<T>>::value, > details::control_type<std::remove_cv_t<T>>::size, enumStrMap) > { > } > diff --git a/src/libcamera/control_ids.cpp.in b/src/libcamera/control_ids.cpp.in > index 3a20493119bb..afe9e2c96610 100644 > --- a/src/libcamera/control_ids.cpp.in > +++ b/src/libcamera/control_ids.cpp.in > @@ -89,9 +89,9 @@ extern const std::map<std::string, {{ctrl.type}}> {{ctrl.name}}NameValueMap = { > { "{{enum.name}}", {{enum.name}} }, > {%- endfor %} > }; > -extern const Control<{{ctrl.type}}> {{ctrl.name}}({{ctrl.name|snake_case|upper}}, "{{ctrl.name}}", {{ctrl.name}}NameValueMap); > +extern const Control<{{ctrl.type}}> {{ctrl.name}}({{ctrl.name|snake_case|upper}}, "{{ctrl.name}}", "{{vendor}}", {{ctrl.name}}NameValueMap); > {% else -%} > -extern const Control<{{ctrl.type}}> {{ctrl.name}}({{ctrl.name|snake_case|upper}}, "{{ctrl.name}}"); > +extern const Control<{{ctrl.type}}> {{ctrl.name}}({{ctrl.name|snake_case|upper}}, "{{ctrl.name}}", "{{vendor}}"); > {% endif -%} > {%- endfor %} > > diff --git a/src/libcamera/control_serializer.cpp b/src/libcamera/control_serializer.cpp > index 52fd714fb4bd..0a5e8220a0ff 100644 > --- a/src/libcamera/control_serializer.cpp > +++ b/src/libcamera/control_serializer.cpp > @@ -498,7 +498,7 @@ ControlInfoMap ControlSerializer::deserialize<ControlInfoMap>(ByteStreamBuffer & > * debugging purpose. > */ > controlIds_.emplace_back(std::make_unique<ControlId>(entry->id, > - "", type)); > + "", "local", type)); > (*localIdMap)[entry->id] = controlIds_.back().get(); > } > > diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp > index 62185d643ecd..2efecf0fc52b 100644 > --- a/src/libcamera/controls.cpp > +++ b/src/libcamera/controls.cpp > @@ -394,13 +394,17 @@ void ControlValue::reserve(ControlType type, bool isArray, std::size_t numElemen > * \brief Construct a ControlId instance > * \param[in] id The control numerical ID > * \param[in] name The control name > + * \param[in] vendor The vendor 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, > - std::size_t size, const std::map<std::string, int32_t> &enumStrMap) > - : id_(id), name_(name), type_(type), size_(size), enumStrMap_(enumStrMap) > +ControlId::ControlId(unsigned int id, const std::string &name, > + const std::string &vendor, ControlType type, > + std::size_t size, > + const std::map<std::string, int32_t> &enumStrMap) > + : id_(id), name_(name), vendor_(vendor), type_(type), size_(size), > + enumStrMap_(enumStrMap) > { > for (const auto &pair : enumStrMap_) > reverseMap_[pair.second] = pair.first; > @@ -418,6 +422,12 @@ ControlId::ControlId(unsigned int id, const std::string &name, ControlType type, > * \return The control name > */ > > +/** > + * \fn const std::string &ControlId::vendor() const > + * \brief Retrieve the vendor name > + * \return The vendor name, as a string > + */ > + > /** > * \fn ControlType ControlId::type() const > * \brief Retrieve the control data type > @@ -489,10 +499,11 @@ ControlId::ControlId(unsigned int id, const std::string &name, ControlType type, > */ > > /** > - * \fn Control::Control(unsigned int id, const char *name) > + * \fn Control::Control(unsigned int id, const char *name, const char *vendor) > * \brief Construct a Control instance > * \param[in] id The control numerical ID > * \param[in] name The control name > + * \param[in] vendor The vendor name > * \param[in] enumStrMap The map from enum names to values (optional) > * > * The control data type is automatically deduced from the template type T. > diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp > index 68add4f2e642..7d21cf15fec1 100644 > --- a/src/libcamera/v4l2_device.cpp > +++ b/src/libcamera/v4l2_device.cpp > @@ -520,7 +520,7 @@ std::unique_ptr<ControlId> V4L2Device::v4l2ControlId(const v4l2_query_ext_ctrl & > const std::string name(static_cast<const char *>(ctrl.name), len); > const ControlType type = v4l2CtrlType(ctrl.type); > > - return std::make_unique<ControlId>(ctrl.id, name, type); > + return std::make_unique<ControlId>(ctrl.id, name, "v4l2", type); I'm so very tempted to see if we can map 'all v4l2' controls to a real libcamera vendor namespace correctly by some automation ... Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > } > > /** > -- > 2.39.2 >
diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h index ca60bbacad17..4c28240812bf 100644 --- a/include/libcamera/controls.h +++ b/include/libcamera/controls.h @@ -234,12 +234,13 @@ private: class ControlId { public: - ControlId(unsigned int id, const std::string &name, ControlType type, - std::size_t size = 0, + ControlId(unsigned int id, const std::string &name, const std::string &vendor, + 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_; } + const std::string &vendor() const { return vendor_; } ControlType type() const { return type_; } bool isArray() const { return size_ > 0; } std::size_t size() const { return size_; } @@ -250,6 +251,7 @@ private: unsigned int id_; std::string name_; + std::string vendor_; ControlType type_; std::size_t size_; std::map<std::string, int32_t> enumStrMap_; @@ -282,8 +284,9 @@ class Control : public ControlId 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, + Control(unsigned int id, const char *name, const char *vendor, + const std::map<std::string, int32_t> &enumStrMap = {}) + : ControlId(id, name, vendor, details::control_type<std::remove_cv_t<T>>::value, details::control_type<std::remove_cv_t<T>>::size, enumStrMap) { } diff --git a/src/libcamera/control_ids.cpp.in b/src/libcamera/control_ids.cpp.in index 3a20493119bb..afe9e2c96610 100644 --- a/src/libcamera/control_ids.cpp.in +++ b/src/libcamera/control_ids.cpp.in @@ -89,9 +89,9 @@ extern const std::map<std::string, {{ctrl.type}}> {{ctrl.name}}NameValueMap = { { "{{enum.name}}", {{enum.name}} }, {%- endfor %} }; -extern const Control<{{ctrl.type}}> {{ctrl.name}}({{ctrl.name|snake_case|upper}}, "{{ctrl.name}}", {{ctrl.name}}NameValueMap); +extern const Control<{{ctrl.type}}> {{ctrl.name}}({{ctrl.name|snake_case|upper}}, "{{ctrl.name}}", "{{vendor}}", {{ctrl.name}}NameValueMap); {% else -%} -extern const Control<{{ctrl.type}}> {{ctrl.name}}({{ctrl.name|snake_case|upper}}, "{{ctrl.name}}"); +extern const Control<{{ctrl.type}}> {{ctrl.name}}({{ctrl.name|snake_case|upper}}, "{{ctrl.name}}", "{{vendor}}"); {% endif -%} {%- endfor %} diff --git a/src/libcamera/control_serializer.cpp b/src/libcamera/control_serializer.cpp index 52fd714fb4bd..0a5e8220a0ff 100644 --- a/src/libcamera/control_serializer.cpp +++ b/src/libcamera/control_serializer.cpp @@ -498,7 +498,7 @@ ControlInfoMap ControlSerializer::deserialize<ControlInfoMap>(ByteStreamBuffer & * debugging purpose. */ controlIds_.emplace_back(std::make_unique<ControlId>(entry->id, - "", type)); + "", "local", type)); (*localIdMap)[entry->id] = controlIds_.back().get(); } diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp index 62185d643ecd..2efecf0fc52b 100644 --- a/src/libcamera/controls.cpp +++ b/src/libcamera/controls.cpp @@ -394,13 +394,17 @@ void ControlValue::reserve(ControlType type, bool isArray, std::size_t numElemen * \brief Construct a ControlId instance * \param[in] id The control numerical ID * \param[in] name The control name + * \param[in] vendor The vendor 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, - std::size_t size, const std::map<std::string, int32_t> &enumStrMap) - : id_(id), name_(name), type_(type), size_(size), enumStrMap_(enumStrMap) +ControlId::ControlId(unsigned int id, const std::string &name, + const std::string &vendor, ControlType type, + std::size_t size, + const std::map<std::string, int32_t> &enumStrMap) + : id_(id), name_(name), vendor_(vendor), type_(type), size_(size), + enumStrMap_(enumStrMap) { for (const auto &pair : enumStrMap_) reverseMap_[pair.second] = pair.first; @@ -418,6 +422,12 @@ ControlId::ControlId(unsigned int id, const std::string &name, ControlType type, * \return The control name */ +/** + * \fn const std::string &ControlId::vendor() const + * \brief Retrieve the vendor name + * \return The vendor name, as a string + */ + /** * \fn ControlType ControlId::type() const * \brief Retrieve the control data type @@ -489,10 +499,11 @@ ControlId::ControlId(unsigned int id, const std::string &name, ControlType type, */ /** - * \fn Control::Control(unsigned int id, const char *name) + * \fn Control::Control(unsigned int id, const char *name, const char *vendor) * \brief Construct a Control instance * \param[in] id The control numerical ID * \param[in] name The control name + * \param[in] vendor The vendor name * \param[in] enumStrMap The map from enum names to values (optional) * * The control data type is automatically deduced from the template type T. diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp index 68add4f2e642..7d21cf15fec1 100644 --- a/src/libcamera/v4l2_device.cpp +++ b/src/libcamera/v4l2_device.cpp @@ -520,7 +520,7 @@ std::unique_ptr<ControlId> V4L2Device::v4l2ControlId(const v4l2_query_ext_ctrl & const std::string name(static_cast<const char *>(ctrl.name), len); const ControlType type = v4l2CtrlType(ctrl.type); - return std::make_unique<ControlId>(ctrl.id, name, type); + return std::make_unique<ControlId>(ctrl.id, name, "v4l2", type); } /**