Patch Detail
Show a patch.
GET /api/patches/3943/?format=api
{ "id": 3943, "url": "https://patchwork.libcamera.org/api/patches/3943/?format=api", "web_url": "https://patchwork.libcamera.org/patch/3943/", "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": "<20200605120306.25529-1-paul.elder@ideasonboard.com>", "date": "2020-06-05T12:03:06", "name": "[libcamera-devel] libcamera: CameraManager, PipelineHandler: Allow multiple devnums per camera", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "03eb44529242171e4b07a65591dc5b76486ca248", "submitter": { "id": 17, "url": "https://patchwork.libcamera.org/api/people/17/?format=api", "name": "Paul Elder", "email": "paul.elder@ideasonboard.com" }, "delegate": { "id": 17, "url": "https://patchwork.libcamera.org/api/users/17/?format=api", "username": "epaul", "first_name": "Paul", "last_name": "Elder", "email": "paul.elder@ideasonboard.com" }, "mbox": "https://patchwork.libcamera.org/patch/3943/mbox/", "series": [ { "id": 957, "url": "https://patchwork.libcamera.org/api/series/957/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=957", "date": "2020-06-05T12:03:06", "name": "[libcamera-devel] libcamera: CameraManager, PipelineHandler: Allow multiple devnums per camera", "version": 1, "mbox": "https://patchwork.libcamera.org/series/957/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/3943/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/3943/checks/", "tags": {}, "headers": { "Return-Path": "<paul.elder@ideasonboard.com>", "Received": [ "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 3A69F603C7\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 5 Jun 2020 14:03:17 +0200 (CEST)", "from emerald.amanokami.net (fs76eef344.knge213.ap.nuro.jp\n\t[118.238.243.68])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id CD4AE27C;\n\tFri, 5 Jun 2020 14:03:15 +0200 (CEST)" ], "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"W0x342Av\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1591358596;\n\tbh=lobqqmc9Jtl07BVnUpIMg5OT3j5WNsAfiVZJL6m/DEA=;\n\th=From:To:Cc:Subject:Date:From;\n\tb=W0x342AvdbmSS443GJg11akMCtzfmkU3/Bmwu80nBPyit+hxoC657/FLHeUHBcCLC\n\tHLQ1pAHOcSEdRg4QMon5d8AbOnrt+CsvFDnOPV5lXSsWbx2MhdytvrtUc9xv36sNhM\n\t+B9YWGBb56kkAGQLQ6EGBS4sx27Ho8LczC27g8lQ=", "From": "Paul Elder <paul.elder@ideasonboard.com>", "To": "libcamera-devel@lists.libcamera.org", "Date": "Fri, 5 Jun 2020 21:03:06 +0900", "Message-Id": "<20200605120306.25529-1-paul.elder@ideasonboard.com>", "X-Mailer": "git-send-email 2.20.1", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [PATCH] libcamera: CameraManager,\n\tPipelineHandler: Allow multiple devnums per camera", "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>", "X-List-Received-Date": "Fri, 05 Jun 2020 12:03:17 -0000" }, "content": "The V4L2 compatibility layer uses devnum to match video device nodes to\nlibcamera Cameras. Some pipeline handlers don't report a devnum for\ntheir camera, which prevents the V4L2 compatibility layer from matching\nvideo device nodes to these cameras. To fix this, we first allow the\ncamera manager to map multiple devnums to a camera. Next, if the pipeline\nhandler doesn't report a devnum for a camera, then walk the media device\nand entity list and tell the camera manager to map every one of these\ndevnums to the camera.\n\nWe considered walking the media entity list and taking the devnum from\njust the one with the default flag set, but we found that some drivers\n(eg. vimc) don't set this flag for any entity.\n\nSigned-off-by: Paul Elder <paul.elder@ideasonboard.com>\n---\n include/libcamera/camera_manager.h | 3 ++-\n src/libcamera/camera_manager.cpp | 14 ++++++++------\n src/libcamera/pipeline_handler.cpp | 12 +++++++++++-\n 3 files changed, 21 insertions(+), 8 deletions(-)", "diff": "diff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h\nindex 079f848a..6095b799 100644\n--- a/include/libcamera/camera_manager.h\n+++ b/include/libcamera/camera_manager.h\n@@ -34,7 +34,8 @@ public:\n \tstd::shared_ptr<Camera> get(const std::string &name);\n \tstd::shared_ptr<Camera> get(dev_t devnum);\n \n-\tvoid addCamera(std::shared_ptr<Camera> camera, dev_t devnum);\n+\tvoid addCamera(std::shared_ptr<Camera> camera,\n+\t\t std::vector<dev_t> devnums);\n \tvoid removeCamera(Camera *camera);\n \n \tstatic const std::string &version() { return version_; }\ndiff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp\nindex da806fa7..fa0bd6a0 100644\n--- a/src/libcamera/camera_manager.cpp\n+++ b/src/libcamera/camera_manager.cpp\n@@ -36,7 +36,8 @@ public:\n \tPrivate(CameraManager *cm);\n \n \tint start();\n-\tvoid addCamera(std::shared_ptr<Camera> &camera, dev_t devnum);\n+\tvoid addCamera(std::shared_ptr<Camera> &camera,\n+\t\t std::vector<dev_t> devnums);\n \tvoid removeCamera(Camera *camera);\n \n \t/*\n@@ -168,7 +169,7 @@ void CameraManager::Private::cleanup()\n }\n \n void CameraManager::Private::addCamera(std::shared_ptr<Camera> &camera,\n-\t\t\t\t dev_t devnum)\n+\t\t\t\t std::vector<dev_t> devnums)\n {\n \tMutexLocker locker(mutex_);\n \n@@ -183,7 +184,7 @@ void CameraManager::Private::addCamera(std::shared_ptr<Camera> &camera,\n \n \tcameras_.push_back(std::move(camera));\n \n-\tif (devnum) {\n+\tfor (dev_t devnum : devnums) {\n \t\tunsigned int index = cameras_.size() - 1;\n \t\tcamerasByDevnum_[devnum] = cameras_[index];\n \t}\n@@ -374,7 +375,7 @@ std::shared_ptr<Camera> CameraManager::get(dev_t devnum)\n /**\n * \\brief Add a camera to the camera manager\n * \\param[in] camera The camera to be added\n- * \\param[in] devnum The device number to associate with \\a camera\n+ * \\param[in] devnums The device numbers to associate with \\a camera\n *\n * This function is called by pipeline handlers to register the cameras they\n * handle with the camera manager. Registered cameras are immediately made\n@@ -385,11 +386,12 @@ std::shared_ptr<Camera> CameraManager::get(dev_t devnum)\n *\n * \\context This function shall be called from the CameraManager thread.\n */\n-void CameraManager::addCamera(std::shared_ptr<Camera> camera, dev_t devnum)\n+void CameraManager::addCamera(std::shared_ptr<Camera> camera,\n+\t\t\t std::vector<dev_t> devnums)\n {\n \tASSERT(Thread::current() == p_.get());\n \n-\tp_->addCamera(camera, devnum);\n+\tp_->addCamera(camera, devnums);\n }\n \n /**\ndiff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp\nindex 53aeebdc..b3824a5f 100644\n--- a/src/libcamera/pipeline_handler.cpp\n+++ b/src/libcamera/pipeline_handler.cpp\n@@ -502,7 +502,17 @@ void PipelineHandler::registerCamera(std::shared_ptr<Camera> camera,\n \tdata->camera_ = camera.get();\n \tcameraData_[camera.get()] = std::move(data);\n \tcameras_.push_back(camera);\n-\tmanager_->addCamera(std::move(camera), devnum);\n+\n+\tstd::vector<dev_t> devnums;\n+\tif (devnum != 0)\n+\t\tdevnums.push_back(devnum);\n+\telse\n+\t\tfor (const std::shared_ptr<MediaDevice> media : mediaDevices_)\n+\t\t\tfor (const MediaEntity *entity : media->entities())\n+\t\t\t\tdevnums.push_back(makedev(entity->deviceMajor(),\n+\t\t\t\t\t\t\t entity->deviceMinor()));\n+\n+\tmanager_->addCamera(std::move(camera), devnums);\n }\n \n /**\n", "prefixes": [ "libcamera-devel" ] }