[PATCH v2 1/3] libcamera: controls: Add vendor information to ControlId

Kieran Bingham kieran.bingham at ideasonboard.com
Sun Oct 20 00:06:01 CEST 2024


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 at ideasonboard.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at 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 at ideasonboard.com>



>  }
>  
>  /**
> -- 
> 2.39.2
>


More information about the libcamera-devel mailing list