[{"id":31812,"web_url":"https://patchwork.libcamera.org/comment/31812/","msgid":"<172937556162.2485972.1384411873929412992@ping.linuxembedded.co.uk>","date":"2024-10-19T22:06:01","subject":"Re: [PATCH v2 1/3] libcamera: controls: Add vendor information to\n\tControlId","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Paul Elder (2024-10-16 12:19:41)\n> Add vendor/namespace information to ControlId, so that the vendor can be\n> queried from it. This is expected to be used by applications either\n> simply to display the vendor or for it to be used for grouping in a\n> UI.\n> \n> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> \n> ---\n> Changes in v2:\n> - reorder code so that vendor comes immediately after name\n> ---\n>  include/libcamera/controls.h         | 11 +++++++----\n>  src/libcamera/control_ids.cpp.in     |  4 ++--\n>  src/libcamera/control_serializer.cpp |  2 +-\n>  src/libcamera/controls.cpp           | 19 +++++++++++++++----\n>  src/libcamera/v4l2_device.cpp        |  2 +-\n>  5 files changed, 26 insertions(+), 12 deletions(-)\n> \n> diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h\n> index ca60bbacad17..4c28240812bf 100644\n> --- a/include/libcamera/controls.h\n> +++ b/include/libcamera/controls.h\n> @@ -234,12 +234,13 @@ private:\n>  class ControlId\n>  {\n>  public:\n> -       ControlId(unsigned int id, const std::string &name, ControlType type,\n> -                 std::size_t size = 0,\n> +       ControlId(unsigned int id, const std::string &name, const std::string &vendor,\n> +                 ControlType type, std::size_t size = 0,\n>                   const std::map<std::string, int32_t> &enumStrMap = {});\n>  \n>         unsigned int id() const { return id_; }\n>         const std::string &name() const { return name_; }\n> +       const std::string &vendor() const { return vendor_; }\n>         ControlType type() const { return type_; }\n>         bool isArray() const { return size_ > 0; }\n>         std::size_t size() const { return size_; }\n> @@ -250,6 +251,7 @@ private:\n>  \n>         unsigned int id_;\n>         std::string name_;\n> +       std::string vendor_;\n>         ControlType type_;\n>         std::size_t size_;\n>         std::map<std::string, int32_t> enumStrMap_;\n> @@ -282,8 +284,9 @@ class Control : public ControlId\n>  public:\n>         using type = T;\n>  \n> -       Control(unsigned int id, const char *name, const std::map<std::string, int32_t> &enumStrMap = {})\n> -               : ControlId(id, name, details::control_type<std::remove_cv_t<T>>::value,\n> +       Control(unsigned int id, const char *name, const char *vendor,\n> +               const std::map<std::string, int32_t> &enumStrMap = {})\n> +               : ControlId(id, name, vendor, details::control_type<std::remove_cv_t<T>>::value,\n>                             details::control_type<std::remove_cv_t<T>>::size, enumStrMap)\n>         {\n>         }\n> diff --git a/src/libcamera/control_ids.cpp.in b/src/libcamera/control_ids.cpp.in\n> index 3a20493119bb..afe9e2c96610 100644\n> --- a/src/libcamera/control_ids.cpp.in\n> +++ b/src/libcamera/control_ids.cpp.in\n> @@ -89,9 +89,9 @@ extern const std::map<std::string, {{ctrl.type}}> {{ctrl.name}}NameValueMap = {\n>         { \"{{enum.name}}\", {{enum.name}} },\n>  {%- endfor %}\n>  };\n> -extern const Control<{{ctrl.type}}> {{ctrl.name}}({{ctrl.name|snake_case|upper}}, \"{{ctrl.name}}\", {{ctrl.name}}NameValueMap);\n> +extern const Control<{{ctrl.type}}> {{ctrl.name}}({{ctrl.name|snake_case|upper}}, \"{{ctrl.name}}\", \"{{vendor}}\", {{ctrl.name}}NameValueMap);\n>  {% else -%}\n> -extern const Control<{{ctrl.type}}> {{ctrl.name}}({{ctrl.name|snake_case|upper}}, \"{{ctrl.name}}\");\n> +extern const Control<{{ctrl.type}}> {{ctrl.name}}({{ctrl.name|snake_case|upper}}, \"{{ctrl.name}}\", \"{{vendor}}\");\n>  {% endif -%}\n>  {%- endfor %}\n>  \n> diff --git a/src/libcamera/control_serializer.cpp b/src/libcamera/control_serializer.cpp\n> index 52fd714fb4bd..0a5e8220a0ff 100644\n> --- a/src/libcamera/control_serializer.cpp\n> +++ b/src/libcamera/control_serializer.cpp\n> @@ -498,7 +498,7 @@ ControlInfoMap ControlSerializer::deserialize<ControlInfoMap>(ByteStreamBuffer &\n>                          * debugging purpose.\n>                          */\n>                         controlIds_.emplace_back(std::make_unique<ControlId>(entry->id,\n> -                                                                            \"\", type));\n> +                                                                            \"\", \"local\", type));\n>                         (*localIdMap)[entry->id] = controlIds_.back().get();\n>                 }\n>  \n> diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp\n> index 62185d643ecd..2efecf0fc52b 100644\n> --- a/src/libcamera/controls.cpp\n> +++ b/src/libcamera/controls.cpp\n> @@ -394,13 +394,17 @@ void ControlValue::reserve(ControlType type, bool isArray, std::size_t numElemen\n>   * \\brief Construct a ControlId instance\n>   * \\param[in] id The control numerical ID\n>   * \\param[in] name The control name\n> + * \\param[in] vendor The vendor name\n>   * \\param[in] type The control data type\n>   * \\param[in] size The size of the array control, or 0 if scalar control\n>   * \\param[in] enumStrMap The map from enum names to values (optional)\n>   */\n> -ControlId::ControlId(unsigned int id, const std::string &name, ControlType type,\n> -                    std::size_t size, const std::map<std::string, int32_t> &enumStrMap)\n> -       : id_(id), name_(name), type_(type), size_(size), enumStrMap_(enumStrMap)\n> +ControlId::ControlId(unsigned int id, const std::string &name,\n> +                    const std::string &vendor, ControlType type,\n> +                    std::size_t size,\n> +                    const std::map<std::string, int32_t> &enumStrMap)\n> +       : id_(id), name_(name), vendor_(vendor), type_(type), size_(size),\n> +         enumStrMap_(enumStrMap)\n>  {\n>         for (const auto &pair : enumStrMap_)\n>                 reverseMap_[pair.second] = pair.first;\n> @@ -418,6 +422,12 @@ ControlId::ControlId(unsigned int id, const std::string &name, ControlType type,\n>   * \\return The control name\n>   */\n>  \n> +/**\n> + * \\fn const std::string &ControlId::vendor() const\n> + * \\brief Retrieve the vendor name\n> + * \\return The vendor name, as a string\n> + */\n> +\n>  /**\n>   * \\fn ControlType ControlId::type() const\n>   * \\brief Retrieve the control data type\n> @@ -489,10 +499,11 @@ ControlId::ControlId(unsigned int id, const std::string &name, ControlType type,\n>   */\n>  \n>  /**\n> - * \\fn Control::Control(unsigned int id, const char *name)\n> + * \\fn Control::Control(unsigned int id, const char *name, const char *vendor)\n>   * \\brief Construct a Control instance\n>   * \\param[in] id The control numerical ID\n>   * \\param[in] name The control name\n> + * \\param[in] vendor The vendor name\n>   * \\param[in] enumStrMap The map from enum names to values (optional)\n>   *\n>   * The control data type is automatically deduced from the template type T.\n> diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp\n> index 68add4f2e642..7d21cf15fec1 100644\n> --- a/src/libcamera/v4l2_device.cpp\n> +++ b/src/libcamera/v4l2_device.cpp\n> @@ -520,7 +520,7 @@ std::unique_ptr<ControlId> V4L2Device::v4l2ControlId(const v4l2_query_ext_ctrl &\n>         const std::string name(static_cast<const char *>(ctrl.name), len);\n>         const ControlType type = v4l2CtrlType(ctrl.type);\n>  \n> -       return std::make_unique<ControlId>(ctrl.id, name, type);\n> +       return std::make_unique<ControlId>(ctrl.id, name, \"v4l2\", type);\n\nI'm so very tempted to see if we can map 'all v4l2' controls to a real\nlibcamera vendor namespace correctly by some automation ...\n\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n\n\n>  }\n>  \n>  /**\n> -- \n> 2.39.2\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 202D5BD1F1\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSat, 19 Oct 2024 22:06:09 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9FFEE6538C;\n\tSun, 20 Oct 2024 00:06:07 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 90583633C6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 20 Oct 2024 00:06:04 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B01ED526;\n\tSun, 20 Oct 2024 00:04:19 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"FvyuEKzc\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1729375459;\n\tbh=sl5qjqxz9GnSyvinL4XwO+pdv+xBy53wmRgEwncHEsw=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=FvyuEKzc6rInbB1H2Y24nmdzBJg4eabnxMricKD3pYVRM2BT8pG8o+jlVcm1fagrX\n\tzSVAqSMFbWNaXL7BPKmkc6dugQnPRhXWvaF+hQ+4GihTL3w8RQmPDdZxA9wSvZUbOH\n\tyavtNJ5FLyRBTQYSEvffkAa8WgrkJsrU+i4AoMuE=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20241016111943.1411372-2-paul.elder@ideasonboard.com>","References":"<20241016111943.1411372-1-paul.elder@ideasonboard.com>\n\t<20241016111943.1411372-2-paul.elder@ideasonboard.com>","Subject":"Re: [PATCH v2 1/3] libcamera: controls: Add vendor information to\n\tControlId","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"Paul Elder <paul.elder@ideasonboard.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Paul Elder <paul.elder@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Sat, 19 Oct 2024 23:06:01 +0100","Message-ID":"<172937556162.2485972.1384411873929412992@ping.linuxembedded.co.uk>","User-Agent":"alot/0.10","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]