[{"id":27273,"web_url":"https://patchwork.libcamera.org/comment/27273/","msgid":"<168c-647f1f00-9-2235d640@253258094>","date":"2023-06-06T11:55:56","subject":"Re: [libcamera-devel] =?utf-8?q?=5BPATCH_v3_3/5=5D_libcamera=3A_?=\n\t=?utf-8?q?camera=5Fmanager=3A_Move_=7Badd=2Cremove=7DCamera_to_int?=\n\t=?utf-8?q?ernal?=","submitter":{"id":165,"url":"https://patchwork.libcamera.org/api/people/165/","name":"Ashok Sidipotu","email":"ashok.sidipotu@collabora.com"},"content":"Tested-by: Ashok Sidipotu <ashok.sidipotu@collabora.com>\n\nOn Monday, May 15, 2023 18:15 IST, Kieran Bingham <kieran.bingham@ideasonboard.com> wrote:\n The CameraManager exposes addCamera and removeCamera as public API\ncalls, while they should never be called from an application. These\ncalls are only expected to be used by PipelineHandlers to update the\nCameraManager that a new Camera has been created and allow the Camera\nManager to expose it to applications.\n\nRemove the public calls and update the private implementations such that\nthey can be used directly by the PipelineHandler through the internal\nCameraManager::Private provided by the Extensible class.\n\nSigned-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\nReviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n---\ninclude/libcamera/camera_manager.h | 4 -\ninclude/libcamera/internal/camera_manager.h | 2 +-\nsrc/libcamera/camera_manager.cpp | 87 +++++++++------------\nsrc/libcamera/pipeline_handler.cpp | 6 +-\n4 files changed, 43 insertions(+), 56 deletions(-)\n\ndiff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h\nindex 4b1fb7568e83..9767acc42c89 100644\n--- a/include/libcamera/camera_manager.h\n+++ b/include/libcamera/camera_manager.h\n@@ -34,10 +34,6 @@ public:\nstd::shared_ptr<Camera> get(const std::string &id);\nstd::shared_ptr<Camera> get(dev_t devnum);\n\n- void addCamera(std::shared_ptr<Camera> camera,\n- const std::vector<dev_t> &devnums);\n- void removeCamera(std::shared_ptr<Camera> camera);\n-\nstatic const std::string &version() { return version_; }\n\nSignal<std::shared_ptr<Camera>> cameraAdded;\ndiff --git a/include/libcamera/internal/camera_manager.h b/include/libcamera/internal/camera_manager.h\nindex 05a1e4df8add..885bb2825687 100644\n--- a/include/libcamera/internal/camera_manager.h\n+++ b/include/libcamera/internal/camera_manager.h\n@@ -31,7 +31,7 @@ public:\nint start();\nvoid addCamera(std::shared_ptr<Camera> camera,\nconst std::vector<dev_t> &devnums) LIBCAMERA_TSA_EXCLUDES(mutex_);\n- void removeCamera(Camera *camera) LIBCAMERA_TSA_EXCLUDES(mutex_);\n+ void removeCamera(std::shared_ptr<Camera> camera) LIBCAMERA_TSA_EXCLUDES(mutex_);\n\n/*\n* This mutex protects\ndiff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp\nindex d3c297b888d8..70eb4e455e54 100644\n--- a/src/libcamera/camera_manager.cpp\n+++ b/src/libcamera/camera_manager.cpp\n@@ -147,9 +147,25 @@ void CameraManager::Private::cleanup()\nenumerator_.reset(nullptr);\n}\n\n+/**\n+ * \\brief Add a camera to the camera manager\n+ * \\param[in] camera The camera to be added\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+ * available to the system.\n+ *\n+ * \\a devnums are used by the V4L2 compatibility layer to map V4L2 device nodes\n+ * to Camera instances.\n+ *\n+ * \\context This function shall be called from the CameraManager thread.\n+ */\nvoid CameraManager::Private::addCamera(std::shared_ptr<Camera> camera,\nconst std::vector<dev_t> &devnums)\n{\n+ ASSERT(Thread::current() == this);\n+\nMutexLocker locker(mutex_);\n\nfor (const std::shared_ptr<Camera> &c : cameras_) {\n@@ -166,15 +182,31 @@ void CameraManager::Private::addCamera(std::shared_ptr<Camera> camera,\nunsigned int index = cameras_.size() - 1;\nfor (dev_t devnum : devnums)\ncamerasByDevnum_[devnum] = cameras_[index];\n+\n+ /* Report the addition to the public signal */\n+ CameraManager *const o = LIBCAMERA_O_PTR();\n+ o->cameraAdded.emit(cameras_[index]);\n}\n\n-void CameraManager::Private::removeCamera(Camera *camera)\n+/**\n+ * \\brief Remove a camera from the camera manager\n+ * \\param[in] camera The camera to be removed\n+ *\n+ * This function is called by pipeline handlers to unregister cameras from the\n+ * camera manager. Unregistered cameras won't be reported anymore by the\n+ * cameras() and get() calls, but references may still exist in applications.\n+ *\n+ * \\context This function shall be called from the CameraManager thread.\n+ */\n+void CameraManager::Private::removeCamera(std::shared_ptr<Camera> camera)\n{\n+ ASSERT(Thread::current() == this);\n+\nMutexLocker locker(mutex_);\n\nauto iter = std::find_if(cameras_.begin(), cameras_.end(),\n[camera](std::shared_ptr<Camera> &c) {\n- return c.get() == camera;\n+ return c.get() == camera.get();\n});\nif (iter == cameras_.end())\nreturn;\n@@ -184,12 +216,16 @@ void CameraManager::Private::removeCamera(Camera *camera)\n\nauto iter_d = std::find_if(camerasByDevnum_.begin(), camerasByDevnum_.end(),\n[camera](const std::pair<dev_t, std::weak_ptr<Camera>> &p) {\n- return p.second.lock().get() == camera;\n+ return p.second.lock().get() == camera.get();\n});\nif (iter_d != camerasByDevnum_.end())\ncamerasByDevnum_.erase(iter_d);\n\ncameras_.erase(iter);\n+\n+ /* Report the removal to the public signal */\n+ CameraManager *const o = LIBCAMERA_O_PTR();\n+ o->cameraRemoved.emit(camera);\n}\n\n/**\n@@ -382,51 +418,6 @@ std::shared_ptr<Camera> CameraManager::get(dev_t devnum)\n* perform any blocking operation.\n*/\n\n-/**\n- * \\brief Add a camera to the camera manager\n- * \\param[in] camera The camera to be added\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- * available to the system.\n- *\n- * \\a devnums are used by the V4L2 compatibility layer to map V4L2 device nodes\n- * to Camera instances.\n- *\n- * \\context This function shall be called from the CameraManager thread.\n- */\n-void CameraManager::addCamera(std::shared_ptr<Camera> camera,\n- const std::vector<dev_t> &devnums)\n-{\n- Private *const d = _d();\n-\n- ASSERT(Thread::current() == d);\n-\n- d->addCamera(camera, devnums);\n- cameraAdded.emit(camera);\n-}\n-\n-/**\n- * \\brief Remove a camera from the camera manager\n- * \\param[in] camera The camera to be removed\n- *\n- * This function is called by pipeline handlers to unregister cameras from the\n- * camera manager. Unregistered cameras won't be reported anymore by the\n- * cameras() and get() calls, but references may still exist in applications.\n- *\n- * \\context This function shall be called from the CameraManager thread.\n- */\n-void CameraManager::removeCamera(std::shared_ptr<Camera> camera)\n-{\n- Private *const d = _d();\n-\n- ASSERT(Thread::current() == d);\n-\n- d->removeCamera(camera.get());\n- cameraRemoved.emit(camera);\n-}\n-\n/**\n* \\fn const std::string &CameraManager::version()\n* \\brief Retrieve the libcamera version string\ndiff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp\nindex f72613b8e515..49092ea88a58 100644\n--- a/src/libcamera/pipeline_handler.cpp\n+++ b/src/libcamera/pipeline_handler.cpp\n@@ -16,10 +16,10 @@\n#include <libcamera/base/utils.h>\n\n#include <libcamera/camera.h>\n-#include <libcamera/camera_manager.h>\n#include <libcamera/framebuffer.h>\n\n#include \"libcamera/internal/camera.h\"\n+#include \"libcamera/internal/camera_manager.h\"\n#include \"libcamera/internal/device_enumerator.h\"\n#include \"libcamera/internal/framebuffer.h\"\n#include \"libcamera/internal/media_device.h\"\n@@ -624,7 +624,7 @@ void PipelineHandler::registerCamera(std::shared_ptr<Camera> camera)\n}\n}\n\n- manager_->addCamera(std::move(camera), devnums);\n+ manager_->_d()->addCamera(std::move(camera), devnums);\n}\n\n/**\n@@ -691,7 +691,7 @@ void PipelineHandler::disconnect()\ncontinue;\n\ncamera->disconnect();\n- manager_->removeCamera(camera);\n+ manager_->_d()->removeCamera(camera);\n}\n}\n\n--\n2.34.1","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 845BEC328F\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  6 Jun 2023 12:03:31 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id DB5886287E;\n\tTue,  6 Jun 2023 14:03:29 +0200 (CEST)","from madras.collabora.co.uk (madras.collabora.co.uk\n\t[IPv6:2a00:1098:0:82:1000:25:2eeb:e5ab])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6A6F16287E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  6 Jun 2023 13:55:57 +0200 (CEST)","from hamburger.collabora.co.uk (hamburger.collabora.co.uk\n\t[IPv6:2a01:4f8:1c1c:f269::1])\n\tby madras.collabora.co.uk (Postfix) with ESMTP id 100526606ECC;\n\tTue,  6 Jun 2023 12:55:56 +0100 (BST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1686053009;\n\tbh=n7nZTbkDg0W876xQTsKBjdc/92kfW1GJdeN0ufc1YHM=;\n\th=In-Reply-To:Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:\n\tList-Post:List-Help:List-Subscribe:From:Reply-To:Cc:From;\n\tb=Nr3ieG57yny88OK+9vhOGdgi9zuyyeACxr0WnF+45ZS09iHhTTN51vsEbznlIbu8J\n\tTRxkRr1+vxUZy1Kufkqm+sNizpJOBjTuFmEA+ZeC1IAJajiD+DAmBrgRUprZz1LTUe\n\tXiPqh2wU6+JxJp0p4azAYcwWtDY+l1MmrNw4TdD+rmOIK4URAO+IF3VBnf439UfJBN\n\tB5xM7np2mtCZDFtqjykLYz8nZjN/5W/x2ykngyl0hsQE50ewyS+HsB/nl7/3wjrHPp\n\tsLeFe7P1CqZnTUTdgtoDpkdhC09t56hPTlQTFL5BQ5K680XUTd5A7gXotKf0rlNz76\n\tgKHIMn/PoJpng==","In-Reply-To":"<20230515124550.3601128-4-kieran.bingham@ideasonboard.com>","Content-Type":"multipart/alternative;\n\tboundary=\"----=_=-_OpenGroupware_org_NGMime-5772-1686052556.805536-2------\"","X-Forward":"127.0.0.1","Date":"Tue, 06 Jun 2023 12:55:56 +0100","To":"\"Kieran Bingham\" <kieran.bingham@ideasonboard.com>","MIME-Version":"1.0","Message-ID":"<168c-647f1f00-9-2235d640@253258094>","User-Agent":"SOGoMail 5.8.0","X-Mailman-Approved-At":"Tue, 06 Jun 2023 14:03:27 +0200","Subject":"Re: [libcamera-devel] =?utf-8?q?=5BPATCH_v3_3/5=5D_libcamera=3A_?=\n\t=?utf-8?q?camera=5Fmanager=3A_Move_=7Badd=2Cremove=7DCamera_to_int?=\n\t=?utf-8?q?ernal?=","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>","From":"Ashok Sidipotu via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Ashok Sidipotu <ashok.sidipotu@collabora.com>","Cc":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>,\n\tlibcamera devel <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":27289,"web_url":"https://patchwork.libcamera.org/comment/27289/","msgid":"<20230606161039.GE25679@pendragon.ideasonboard.com>","date":"2023-06-06T16:10:39","subject":"Re: [libcamera-devel] [PATCH v3 3/5] libcamera: camera_manager:\n\tMove {add, remove}Camera to internal","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Kieran,\n\nThank you for the patch.\n\nOn Mon, May 15, 2023 at 01:45:48PM +0100, Kieran Bingham via libcamera-devel wrote:\n> The CameraManager exposes addCamera and removeCamera as public API\n> calls, while they should never be called from an application. These\n> calls are only expected to be used by PipelineHandlers to update the\n> CameraManager that a new Camera has been created and allow the Camera\n> Manager to expose it to applications.\n> \n> Remove the public calls and update the private implementations such that\n> they can be used directly by the PipelineHandler through the internal\n> CameraManager::Private provided by the Extensible class.\n> \n> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> ---\n>  include/libcamera/camera_manager.h          |  4 -\n>  include/libcamera/internal/camera_manager.h |  2 +-\n>  src/libcamera/camera_manager.cpp            | 87 +++++++++------------\n>  src/libcamera/pipeline_handler.cpp          |  6 +-\n>  4 files changed, 43 insertions(+), 56 deletions(-)\n> \n> diff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h\n> index 4b1fb7568e83..9767acc42c89 100644\n> --- a/include/libcamera/camera_manager.h\n> +++ b/include/libcamera/camera_manager.h\n> @@ -34,10 +34,6 @@ public:\n>  \tstd::shared_ptr<Camera> get(const std::string &id);\n>  \tstd::shared_ptr<Camera> get(dev_t devnum);\n>  \n> -\tvoid addCamera(std::shared_ptr<Camera> camera,\n> -\t\t       const std::vector<dev_t> &devnums);\n> -\tvoid removeCamera(std::shared_ptr<Camera> camera);\n> -\n>  \tstatic const std::string &version() { return version_; }\n>  \n>  \tSignal<std::shared_ptr<Camera>> cameraAdded;\n> diff --git a/include/libcamera/internal/camera_manager.h b/include/libcamera/internal/camera_manager.h\n> index 05a1e4df8add..885bb2825687 100644\n> --- a/include/libcamera/internal/camera_manager.h\n> +++ b/include/libcamera/internal/camera_manager.h\n> @@ -31,7 +31,7 @@ public:\n>  \tint start();\n>  \tvoid addCamera(std::shared_ptr<Camera> camera,\n>  \t\t       const std::vector<dev_t> &devnums) LIBCAMERA_TSA_EXCLUDES(mutex_);\n> -\tvoid removeCamera(Camera *camera) LIBCAMERA_TSA_EXCLUDES(mutex_);\n> +\tvoid removeCamera(std::shared_ptr<Camera> camera) LIBCAMERA_TSA_EXCLUDES(mutex_);\n>  \n>  \t/*\n>  \t * This mutex protects\n> diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp\n> index d3c297b888d8..70eb4e455e54 100644\n> --- a/src/libcamera/camera_manager.cpp\n> +++ b/src/libcamera/camera_manager.cpp\n> @@ -147,9 +147,25 @@ void CameraManager::Private::cleanup()\n>  \tenumerator_.reset(nullptr);\n>  }\n>  \n> +/**\n> + * \\brief Add a camera to the camera manager\n> + * \\param[in] camera The camera to be added\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> + * available to the system.\n> + *\n> + * \\a devnums are used by the V4L2 compatibility layer to map V4L2 device nodes\n> + * to Camera instances.\n> + *\n> + * \\context This function shall be called from the CameraManager thread.\n> + */\n>  void CameraManager::Private::addCamera(std::shared_ptr<Camera> camera,\n>  \t\t\t\t       const std::vector<dev_t> &devnums)\n>  {\n> +\tASSERT(Thread::current() == this);\n> +\n>  \tMutexLocker locker(mutex_);\n>  \n>  \tfor (const std::shared_ptr<Camera> &c : cameras_) {\n> @@ -166,15 +182,31 @@ void CameraManager::Private::addCamera(std::shared_ptr<Camera> camera,\n>  \tunsigned int index = cameras_.size() - 1;\n>  \tfor (dev_t devnum : devnums)\n>  \t\tcamerasByDevnum_[devnum] = cameras_[index];\n> +\n> +\t/* Report the addition to the public signal */\n> +\tCameraManager *const o = LIBCAMERA_O_PTR();\n> +\to->cameraAdded.emit(cameras_[index]);\n>  }\n>  \n> -void CameraManager::Private::removeCamera(Camera *camera)\n> +/**\n> + * \\brief Remove a camera from the camera manager\n> + * \\param[in] camera The camera to be removed\n> + *\n> + * This function is called by pipeline handlers to unregister cameras from the\n> + * camera manager. Unregistered cameras won't be reported anymore by the\n> + * cameras() and get() calls, but references may still exist in applications.\n> + *\n> + * \\context This function shall be called from the CameraManager thread.\n> + */\n> +void CameraManager::Private::removeCamera(std::shared_ptr<Camera> camera)\n>  {\n> +\tASSERT(Thread::current() == this);\n> +\n>  \tMutexLocker locker(mutex_);\n>  \n>  \tauto iter = std::find_if(cameras_.begin(), cameras_.end(),\n>  \t\t\t\t [camera](std::shared_ptr<Camera> &c) {\n> -\t\t\t\t\t return c.get() == camera;\n> +\t\t\t\t\t return c.get() == camera.get();\n>  \t\t\t\t });\n>  \tif (iter == cameras_.end())\n>  \t\treturn;\n> @@ -184,12 +216,16 @@ void CameraManager::Private::removeCamera(Camera *camera)\n>  \n>  \tauto iter_d = std::find_if(camerasByDevnum_.begin(), camerasByDevnum_.end(),\n>  \t\t\t\t   [camera](const std::pair<dev_t, std::weak_ptr<Camera>> &p) {\n> -\t\t\t\t\t   return p.second.lock().get() == camera;\n> +\t\t\t\t\t   return p.second.lock().get() == camera.get();\n>  \t\t\t\t   });\n>  \tif (iter_d != camerasByDevnum_.end())\n>  \t\tcamerasByDevnum_.erase(iter_d);\n>  \n>  \tcameras_.erase(iter);\n> +\n> +\t/* Report the removal to the public signal */\n> +\tCameraManager *const o = LIBCAMERA_O_PTR();\n> +\to->cameraRemoved.emit(camera);\n>  }\n>  \n>  /**\n> @@ -382,51 +418,6 @@ std::shared_ptr<Camera> CameraManager::get(dev_t devnum)\n>   * perform any blocking operation.\n>   */\n>  \n> -/**\n> - * \\brief Add a camera to the camera manager\n> - * \\param[in] camera The camera to be added\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> - * available to the system.\n> - *\n> - * \\a devnums are used by the V4L2 compatibility layer to map V4L2 device nodes\n> - * to Camera instances.\n> - *\n> - * \\context This function shall be called from the CameraManager thread.\n> - */\n> -void CameraManager::addCamera(std::shared_ptr<Camera> camera,\n> -\t\t\t      const std::vector<dev_t> &devnums)\n> -{\n> -\tPrivate *const d = _d();\n> -\n> -\tASSERT(Thread::current() == d);\n> -\n> -\td->addCamera(camera, devnums);\n> -\tcameraAdded.emit(camera);\n> -}\n> -\n> -/**\n> - * \\brief Remove a camera from the camera manager\n> - * \\param[in] camera The camera to be removed\n> - *\n> - * This function is called by pipeline handlers to unregister cameras from the\n> - * camera manager. Unregistered cameras won't be reported anymore by the\n> - * cameras() and get() calls, but references may still exist in applications.\n> - *\n> - * \\context This function shall be called from the CameraManager thread.\n> - */\n> -void CameraManager::removeCamera(std::shared_ptr<Camera> camera)\n> -{\n> -\tPrivate *const d = _d();\n> -\n> -\tASSERT(Thread::current() == d);\n> -\n> -\td->removeCamera(camera.get());\n> -\tcameraRemoved.emit(camera);\n> -}\n> -\n>  /**\n>   * \\fn const std::string &CameraManager::version()\n>   * \\brief Retrieve the libcamera version string\n> diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp\n> index f72613b8e515..49092ea88a58 100644\n> --- a/src/libcamera/pipeline_handler.cpp\n> +++ b/src/libcamera/pipeline_handler.cpp\n> @@ -16,10 +16,10 @@\n>  #include <libcamera/base/utils.h>\n>  \n>  #include <libcamera/camera.h>\n> -#include <libcamera/camera_manager.h>\n>  #include <libcamera/framebuffer.h>\n>  \n>  #include \"libcamera/internal/camera.h\"\n> +#include \"libcamera/internal/camera_manager.h\"\n>  #include \"libcamera/internal/device_enumerator.h\"\n>  #include \"libcamera/internal/framebuffer.h\"\n>  #include \"libcamera/internal/media_device.h\"\n> @@ -624,7 +624,7 @@ void PipelineHandler::registerCamera(std::shared_ptr<Camera> camera)\n>  \t\t}\n>  \t}\n>  \n> -\tmanager_->addCamera(std::move(camera), devnums);\n> +\tmanager_->_d()->addCamera(std::move(camera), devnums);\n>  }\n>  \n>  /**\n> @@ -691,7 +691,7 @@ void PipelineHandler::disconnect()\n>  \t\t\tcontinue;\n>  \n>  \t\tcamera->disconnect();\n> -\t\tmanager_->removeCamera(camera);\n> +\t\tmanager_->_d()->removeCamera(camera);\n>  \t}\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 E2A78C3200\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  6 Jun 2023 16:10:44 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 76FD762709;\n\tTue,  6 Jun 2023 18:10:44 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9D25562709\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  6 Jun 2023 18:10:42 +0200 (CEST)","from pendragon.ideasonboard.com (om126253223039.31.openmobile.ne.jp\n\t[126.253.223.39])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id E7D1B283;\n\tTue,  6 Jun 2023 18:10:15 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1686067844;\n\tbh=euuy6ZqqTZgFq7U8yGMc9rLkueaxEwYGjHvpk30U54g=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=fJAqjWgeXn1DOK1QxDjMAkz4AXAlp2i6lqwANbxUjqzB6WdBMln7GnW1I74ngZuRR\n\t1UJYZ3Pfae5hXPVEkVHxgesa1iGMtenFJMdRcHGH/MnNgwuFbjK3ziSfA/7gF5BlcX\n\thbpbnCI9HjnvtSQ+SIV9xv9cUBoIHtZePzmyqY6kLVT55BKHA6Qkekba8KD1K3uc3k\n\tziolMdIahYpBh9JF1C7rubNoRvaNkbpCSNYZXczk1++kuTw7NotRJY9QHd/nkoKpLN\n\tcSherisgfO06TQSXRQNVCPzptJb4Urwgesh4ZC+as8JTtj2fq5K0Z6TXGk5XykvnCI\n\tL3WR/XIhiI47g==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1686067817;\n\tbh=euuy6ZqqTZgFq7U8yGMc9rLkueaxEwYGjHvpk30U54g=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=ehewIhP+U5Em0eWlE5NNO4cKYeS+gGHxH8rM6CkSsPtEdXSCRY1ZXkV/kfzDSU09K\n\t8IH5zTvsauOMKa7OoZmuhb7VHCbXOCLM5ihSAPnLzUGOqDS4S+sRXHyoc5GfKUjk0f\n\tBeDhIvzXA0WNbsb5JU7ob8kKHfcpOq8Q28U/hLpY="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"ehewIhP+\"; dkim-atps=neutral","Date":"Tue, 6 Jun 2023 19:10:39 +0300","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Message-ID":"<20230606161039.GE25679@pendragon.ideasonboard.com>","References":"<20230515124550.3601128-1-kieran.bingham@ideasonboard.com>\n\t<20230515124550.3601128-4-kieran.bingham@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20230515124550.3601128-4-kieran.bingham@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v3 3/5] libcamera: camera_manager:\n\tMove {add, remove}Camera to internal","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>","From":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>,\n\tlibcamera devel <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]