[{"id":31708,"web_url":"https://patchwork.libcamera.org/comment/31708/","msgid":"<20241010204304.GK32107@pendragon.ideasonboard.com>","date":"2024-10-10T20:43:04","subject":"Re: [PATCH 1/3] libcamera: controls: Add vendor information to\n\tControlId","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Paul,\n\nThank you for the patch.\n\nOn Thu, Oct 10, 2024 at 05:47:17PM +0900, Paul Elder wrote:\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> ---\n>  include/libcamera/controls.h         |  8 ++++++--\n>  src/libcamera/control_ids.cpp.in     |  4 ++--\n>  src/libcamera/control_serializer.cpp |  2 +-\n>  src/libcamera/controls.cpp           | 16 +++++++++++++---\n>  src/libcamera/v4l2_device.cpp        |  2 +-\n>  5 files changed, 23 insertions(+), 9 deletions(-)\n> \n> diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h\n> index ca60bbacad17..07750b76dfb8 100644\n> --- a/include/libcamera/controls.h\n> +++ b/include/libcamera/controls.h\n> @@ -235,12 +235,14 @@ class ControlId\n>  {\n>  public:\n>  \tControlId(unsigned int id, const std::string &name, ControlType type,\n> +\t\t  const std::string &vendor,\n>  \t\t  std::size_t size = 0,\n>  \t\t  const std::map<std::string, int32_t> &enumStrMap = {});\n>  \n>  \tunsigned int id() const { return id_; }\n>  \tconst std::string &name() const { return name_; }\n>  \tControlType type() const { return type_; }\n> +\tconst std::string &vendor() const { return vendor_; }\n\nNitpicking, I'd group the function along with name() (same for vendor_\nand name_, and the .cpp file).\n\n>  \tbool isArray() const { return size_ > 0; }\n>  \tstd::size_t size() const { return size_; }\n>  \tconst std::map<int32_t, std::string> &enumerators() const { return reverseMap_; }\n> @@ -251,6 +253,7 @@ private:\n>  \tunsigned int id_;\n>  \tstd::string name_;\n>  \tControlType type_;\n> +\tstd::string vendor_;\n>  \tstd::size_t size_;\n>  \tstd::map<std::string, int32_t> enumStrMap_;\n>  \tstd::map<int32_t, std::string> reverseMap_;\n> @@ -282,9 +285,10 @@ class Control : public ControlId\n>  public:\n>  \tusing type = T;\n>  \n> -\tControl(unsigned int id, const char *name, const std::map<std::string, int32_t> &enumStrMap = {})\n> +\tControl(unsigned int id, const char *name, const char *vendor,\n> +\t\tconst std::map<std::string, int32_t> &enumStrMap = {})\n>  \t\t: ControlId(id, name, details::control_type<std::remove_cv_t<T>>::value,\n> -\t\t\t    details::control_type<std::remove_cv_t<T>>::size, enumStrMap)\n> +\t\t\t    vendor, details::control_type<std::remove_cv_t<T>>::size, enumStrMap)\n>  \t{\n>  \t}\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>  \t{ \"{{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..0da65fdc0fad 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>  \t\t\t * debugging purpose.\n>  \t\t\t */\n>  \t\t\tcontrolIds_.emplace_back(std::make_unique<ControlId>(entry->id,\n> -\t\t\t\t\t\t\t\t\t     \"\", type));\n> +\t\t\t\t\t\t\t\t\t     \"\", type, \"local\"));\n\nThe local ID map is used for V4L2 controls only, should we use \"v4l2\" as\nthe vendor name, like we do in V4L2Device::v4l2ControlId() ? Or could\nthe ID map be used for something else later ? We don't have a control\nname here, so I suppose it's no big deal if the vendor name is\nmeaningless. I'm fine keeping it as-is.\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n>  \t\t\t(*localIdMap)[entry->id] = controlIds_.back().get();\n>  \t\t}\n>  \n> diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp\n> index 62185d643ecd..7b55fecbc032 100644\n> --- a/src/libcamera/controls.cpp\n> +++ b/src/libcamera/controls.cpp\n> @@ -396,11 +396,14 @@ void ControlValue::reserve(ControlType type, bool isArray, std::size_t numElemen\n>   * \\param[in] name The control 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] vendor The vendor name\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> -\t\t     std::size_t size, const std::map<std::string, int32_t> &enumStrMap)\n> -\t: id_(id), name_(name), type_(type), size_(size), enumStrMap_(enumStrMap)\n> +\t\t     const std::string &vendor, std::size_t size,\n> +\t\t     const std::map<std::string, int32_t> &enumStrMap)\n> +\t: id_(id), name_(name), type_(type), vendor_(vendor), size_(size),\n> +\t  enumStrMap_(enumStrMap)\n>  {\n>  \tfor (const auto &pair : enumStrMap_)\n>  \t\treverseMap_[pair.second] = pair.first;\n> @@ -430,6 +433,12 @@ ControlId::ControlId(unsigned int id, const std::string &name, ControlType type,\n>   * \\return True if the control is an array control, false otherwise\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 std::size_t ControlId::size() const\n>   * \\brief Retrieve the size of the control if it is an array control\n> @@ -489,10 +498,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..7aa2b92ab8e7 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>  \tconst std::string name(static_cast<const char *>(ctrl.name), len);\n>  \tconst ControlType type = v4l2CtrlType(ctrl.type);\n>  \n> -\treturn std::make_unique<ControlId>(ctrl.id, name, type);\n> +\treturn std::make_unique<ControlId>(ctrl.id, name, type, \"v4l2\");\n>  }\n>  \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 D1839C3260\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 10 Oct 2024 20:43:11 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id BC7E06536B;\n\tThu, 10 Oct 2024 22:43:10 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 97B966353A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 10 Oct 2024 22:43:09 +0200 (CEST)","from pendragon.ideasonboard.com (unknown [132.205.230.15])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id D91ED4D4;\n\tThu, 10 Oct 2024 22:41:30 +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=\"NFKHouxR\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1728592891;\n\tbh=ai/PcHuAq4xLPkJzVkM/8tpdnfW38EHhlAbkETBssZE=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=NFKHouxR8xnadJlC4v80H8BtQS3rTt1VsIz0sVzfmFw0GcS187xx2XJzhHrGgeijd\n\tmk3lI5EeUrGt87X5FdCBpp5QM4GlX5J5rVTu4w7NygdiXxdFUSSHbVcnZ+4IrLRjIy\n\tI8e2KITBHjtuqKGd2BXXRpv18qLCyzLY8iuAUkKk=","Date":"Thu, 10 Oct 2024 23:43:04 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH 1/3] libcamera: controls: Add vendor information to\n\tControlId","Message-ID":"<20241010204304.GK32107@pendragon.ideasonboard.com>","References":"<20241010084719.712485-1-paul.elder@ideasonboard.com>\n\t<20241010084719.712485-2-paul.elder@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20241010084719.712485-2-paul.elder@ideasonboard.com>","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>"}},{"id":31757,"web_url":"https://patchwork.libcamera.org/comment/31757/","msgid":"<Zw-hvY7wQrssiv7e@pyrite.rasen.tech>","date":"2024-10-16T11:21:33","subject":"Re: [PATCH 1/3] libcamera: controls: Add vendor information to\n\tControlId","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"On Thu, Oct 10, 2024 at 11:43:04PM +0300, Laurent Pinchart wrote:\n> Hi Paul,\n> \n> Thank you for the patch.\n> \n> On Thu, Oct 10, 2024 at 05:47:17PM +0900, Paul Elder wrote:\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> > ---\n> >  include/libcamera/controls.h         |  8 ++++++--\n> >  src/libcamera/control_ids.cpp.in     |  4 ++--\n> >  src/libcamera/control_serializer.cpp |  2 +-\n> >  src/libcamera/controls.cpp           | 16 +++++++++++++---\n> >  src/libcamera/v4l2_device.cpp        |  2 +-\n> >  5 files changed, 23 insertions(+), 9 deletions(-)\n> > \n> > diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h\n> > index ca60bbacad17..07750b76dfb8 100644\n> > --- a/include/libcamera/controls.h\n> > +++ b/include/libcamera/controls.h\n> > @@ -235,12 +235,14 @@ class ControlId\n> >  {\n> >  public:\n> >  \tControlId(unsigned int id, const std::string &name, ControlType type,\n> > +\t\t  const std::string &vendor,\n> >  \t\t  std::size_t size = 0,\n> >  \t\t  const std::map<std::string, int32_t> &enumStrMap = {});\n> >  \n> >  \tunsigned int id() const { return id_; }\n> >  \tconst std::string &name() const { return name_; }\n> >  \tControlType type() const { return type_; }\n> > +\tconst std::string &vendor() const { return vendor_; }\n> \n> Nitpicking, I'd group the function along with name() (same for vendor_\n> and name_, and the .cpp file).\n> \n> >  \tbool isArray() const { return size_ > 0; }\n> >  \tstd::size_t size() const { return size_; }\n> >  \tconst std::map<int32_t, std::string> &enumerators() const { return reverseMap_; }\n> > @@ -251,6 +253,7 @@ private:\n> >  \tunsigned int id_;\n> >  \tstd::string name_;\n> >  \tControlType type_;\n> > +\tstd::string vendor_;\n> >  \tstd::size_t size_;\n> >  \tstd::map<std::string, int32_t> enumStrMap_;\n> >  \tstd::map<int32_t, std::string> reverseMap_;\n> > @@ -282,9 +285,10 @@ class Control : public ControlId\n> >  public:\n> >  \tusing type = T;\n> >  \n> > -\tControl(unsigned int id, const char *name, const std::map<std::string, int32_t> &enumStrMap = {})\n> > +\tControl(unsigned int id, const char *name, const char *vendor,\n> > +\t\tconst std::map<std::string, int32_t> &enumStrMap = {})\n> >  \t\t: ControlId(id, name, details::control_type<std::remove_cv_t<T>>::value,\n> > -\t\t\t    details::control_type<std::remove_cv_t<T>>::size, enumStrMap)\n> > +\t\t\t    vendor, details::control_type<std::remove_cv_t<T>>::size, enumStrMap)\n> >  \t{\n> >  \t}\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> >  \t{ \"{{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..0da65fdc0fad 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> >  \t\t\t * debugging purpose.\n> >  \t\t\t */\n> >  \t\t\tcontrolIds_.emplace_back(std::make_unique<ControlId>(entry->id,\n> > -\t\t\t\t\t\t\t\t\t     \"\", type));\n> > +\t\t\t\t\t\t\t\t\t     \"\", type, \"local\"));\n> \n> The local ID map is used for V4L2 controls only, should we use \"v4l2\" as\n> the vendor name, like we do in V4L2Device::v4l2ControlId() ? Or could\n> the ID map be used for something else later ? We don't have a control\n> name here, so I suppose it's no big deal if the vendor name is\n> meaningless. I'm fine keeping it as-is.\n\nOh, I thought that in theory technically you could have a completely\nseparate control space (not that you could in practice).\n\n\nPaul\n\n> \n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> \n> >  \t\t\t(*localIdMap)[entry->id] = controlIds_.back().get();\n> >  \t\t}\n> >  \n> > diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp\n> > index 62185d643ecd..7b55fecbc032 100644\n> > --- a/src/libcamera/controls.cpp\n> > +++ b/src/libcamera/controls.cpp\n> > @@ -396,11 +396,14 @@ void ControlValue::reserve(ControlType type, bool isArray, std::size_t numElemen\n> >   * \\param[in] name The control 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] vendor The vendor name\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> > -\t\t     std::size_t size, const std::map<std::string, int32_t> &enumStrMap)\n> > -\t: id_(id), name_(name), type_(type), size_(size), enumStrMap_(enumStrMap)\n> > +\t\t     const std::string &vendor, std::size_t size,\n> > +\t\t     const std::map<std::string, int32_t> &enumStrMap)\n> > +\t: id_(id), name_(name), type_(type), vendor_(vendor), size_(size),\n> > +\t  enumStrMap_(enumStrMap)\n> >  {\n> >  \tfor (const auto &pair : enumStrMap_)\n> >  \t\treverseMap_[pair.second] = pair.first;\n> > @@ -430,6 +433,12 @@ ControlId::ControlId(unsigned int id, const std::string &name, ControlType type,\n> >   * \\return True if the control is an array control, false otherwise\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 std::size_t ControlId::size() const\n> >   * \\brief Retrieve the size of the control if it is an array control\n> > @@ -489,10 +498,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..7aa2b92ab8e7 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> >  \tconst std::string name(static_cast<const char *>(ctrl.name), len);\n> >  \tconst ControlType type = v4l2CtrlType(ctrl.type);\n> >  \n> > -\treturn std::make_unique<ControlId>(ctrl.id, name, type);\n> > +\treturn std::make_unique<ControlId>(ctrl.id, name, type, \"v4l2\");\n> >  }\n> >  \n> >  /**\n> \n> -- \n> Regards,\n> \n> Laurent Pinchart","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 3FE34C326C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 16 Oct 2024 11:21:42 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D513865384;\n\tWed, 16 Oct 2024 13:21:41 +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 972CA6537E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 16 Oct 2024 13:21:40 +0200 (CEST)","from pyrite.rasen.tech (unknown\n\t[IPv6:2404:7a81:160:2100:b5b2:fcb4:385e:af78])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 6F8C9A2F;\n\tWed, 16 Oct 2024 13:19:57 +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=\"boopMS+h\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1729077598;\n\tbh=YcM2RZpyYKB9Tz+/14h8AZ6srdrXIMlS7+SVIXK/hwg=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=boopMS+hbnp/879dYuKx3mDmAVCU8ZAHy9ecyxoq5A62AklVHOrWdlyzk9bhxrngf\n\t4TKxMiq3/KxbGA/8VsMoA/2Wy+YvCXQGRsgm02iOpjMYOiHLU2CJo4LMLqTu2y+W9b\n\tcHHRsPlGnylCLmw5Hl8p8jLdsNpC7+L2yGjJZRT8=","Date":"Wed, 16 Oct 2024 20:21:33 +0900","From":"Paul Elder <paul.elder@ideasonboard.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH 1/3] libcamera: controls: Add vendor information to\n\tControlId","Message-ID":"<Zw-hvY7wQrssiv7e@pyrite.rasen.tech>","References":"<20241010084719.712485-1-paul.elder@ideasonboard.com>\n\t<20241010084719.712485-2-paul.elder@ideasonboard.com>\n\t<20241010204304.GK32107@pendragon.ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","In-Reply-To":"<20241010204304.GK32107@pendragon.ideasonboard.com>","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>"}}]