Patch Detail
Show a patch.
GET /api/patches/9075/?format=api
{ "id": 9075, "url": "https://patchwork.libcamera.org/api/patches/9075/?format=api", "web_url": "https://patchwork.libcamera.org/patch/9075/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20200729115055.3840110-5-niklas.soderlund@ragnatech.se>", "date": "2020-07-29T11:50:54", "name": "[libcamera-devel,v5,4/5] libcamera: pipeline: uvcvideo: Generate unique camera names", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "923b562e30c6f742cb3760c266bf37417bcc6ae7", "submitter": { "id": 5, "url": "https://patchwork.libcamera.org/api/people/5/?format=api", "name": "Niklas Söderlund", "email": "niklas.soderlund@ragnatech.se" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/9075/mbox/", "series": [ { "id": 1163, "url": "https://patchwork.libcamera.org/api/series/1163/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=1163", "date": "2020-07-29T11:50:50", "name": "libcamera: Generate unique and stable camera names", "version": 5, "mbox": "https://patchwork.libcamera.org/series/1163/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/9075/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/9075/checks/", "tags": {}, "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 1D09BBD86F\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 29 Jul 2020 11:51:09 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id EADFA6185C;\n\tWed, 29 Jul 2020 13:51:08 +0200 (CEST)", "from bin-mail-out-05.binero.net (bin-mail-out-05.binero.net\n\t[195.74.38.228])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 1EF44616FF\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 29 Jul 2020 13:51:05 +0200 (CEST)", "from bismarck.berto.se (p4fca2eca.dip0.t-ipconnect.de\n\t[79.202.46.202]) by bin-vsp-out-02.atm.binero.net (Halon) with ESMTPA\n\tid c7e47ea1-d191-11ea-8fb8-005056917f90;\n\tWed, 29 Jul 2020 13:51:04 +0200 (CEST)" ], "X-Halon-ID": "c7e47ea1-d191-11ea-8fb8-005056917f90", "Authorized-sender": "niklas@soderlund.pp.se", "From": "=?utf-8?q?Niklas_S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>", "To": "libcamera-devel@lists.libcamera.org", "Date": "Wed, 29 Jul 2020 13:50:54 +0200", "Message-Id": "<20200729115055.3840110-5-niklas.soderlund@ragnatech.se>", "X-Mailer": "git-send-email 2.27.0", "In-Reply-To": "<20200729115055.3840110-1-niklas.soderlund@ragnatech.se>", "References": "<20200729115055.3840110-1-niklas.soderlund@ragnatech.se>", "MIME-Version": "1.0", "Subject": "[libcamera-devel] [PATCH v5 4/5] libcamera: pipeline: uvcvideo:\n\tGenerate unique camera names", "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>", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "base64", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "Generate camera names that are unique and persistent between system\nresets. The name is constructed from the USB vendor and product\ninformation that is stored on USB device itself and the USB bus and\ndevice numbers where the hardware is plugged in.\n\nBefore this change example of camera names:\n\nVenus USB2.0 Camera: Venus USB2\nLogitech Webcam C930e\n\nAfter this change the same cameras are:\n\n0ac8:3420:3:10\n046d:0843:3:4\n\nSigned-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n---\n* Changes since v3\n- Switch argument to generateName() to UVCCameraData pointer.\n---\n src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 35 +++++++++++++++++++-\n 1 file changed, 34 insertions(+), 1 deletion(-)", "diff": "diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\nindex 93e3dc17e3a7105e..f51529ea519f5aee 100644\n--- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n+++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n@@ -6,6 +6,7 @@\n */\n \n #include <algorithm>\n+#include <fstream>\n #include <iomanip>\n #include <math.h>\n #include <tuple>\n@@ -81,6 +82,8 @@ public:\n \tbool match(DeviceEnumerator *enumerator) override;\n \n private:\n+\tstd::string generateName(const UVCCameraData *data);\n+\n \tint processControl(ControlList *controls, unsigned int id,\n \t\t\t const ControlValue &value);\n \tint processControls(UVCCameraData *data, Request *request);\n@@ -379,6 +382,30 @@ int PipelineHandlerUVC::queueRequestDevice(Camera *camera, Request *request)\n \treturn 0;\n }\n \n+std::string PipelineHandlerUVC::generateName(const UVCCameraData *data)\n+{\n+\n+\tstatic const std::vector<std::string> files\n+\t\t= { \"idVendor\", \"idProduct\", \"busnum\", \"devnum\" };\n+\tstd::string path = data->video_->devicePath();\n+\tstd::vector<std::string> values;\n+\tstd::string value;\n+\n+\tfor (const std::string &name : files) {\n+\t\tstd::ifstream file(path + \"/../\" + name);\n+\n+\t\tif (!file.is_open())\n+\t\t\treturn \"\";\n+\n+\t\tstd::getline(file, value);\n+\t\tfile.close();\n+\n+\t\tvalues.push_back(value);\n+\t}\n+\n+\treturn utils::join(values, \":\");\n+}\n+\n bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator)\n {\n \tMediaDevice *media;\n@@ -405,8 +432,14 @@ bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator)\n \t\treturn false;\n \n \t/* Create and register the camera. */\n+\tstd::string name = generateName(data.get());\n+\tif (name.empty()) {\n+\t\tLOG(UVC, Error) << \"Failed to generate camera name\";\n+\t\treturn false;\n+\t}\n+\n \tstd::set<Stream *> streams{ &data->stream_ };\n-\tstd::shared_ptr<Camera> camera = Camera::create(this, media->model(), streams);\n+\tstd::shared_ptr<Camera> camera = Camera::create(this, name, streams);\n \tregisterCamera(std::move(camera), std::move(data));\n \n \t/* Enable hot-unplug notifications. */\n", "prefixes": [ "libcamera-devel", "v5", "4/5" ] }