{"id":9226,"url":"https://patchwork.libcamera.org/api/patches/9226/?format=json","web_url":"https://patchwork.libcamera.org/patch/9226/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20200805151437.157155-3-email@uajain.com>","date":"2020-08-05T15:14:44","name":"[libcamera-devel,2/2] android: camera_hal_manager: Support camera hotplug","commit_ref":null,"pull_url":null,"state":"accepted","archived":false,"hash":"456099fd486adc32963399005513525b8a02dff8","submitter":{"id":1,"url":"https://patchwork.libcamera.org/api/people/1/?format=json","name":"Umang Jain","email":"email@uajain.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/9226/mbox/","series":[{"id":1197,"url":"https://patchwork.libcamera.org/api/series/1197/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=1197","date":"2020-08-05T15:14:43","name":"android: Camera hotplug support","version":1,"mbox":"https://patchwork.libcamera.org/series/1197/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/9226/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/9226/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 C89FCBD86F\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  5 Aug 2020 15:14:48 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9310F605AE;\n\tWed,  5 Aug 2020 17:14:48 +0200 (CEST)","from o1.f.az.sendgrid.net (o1.f.az.sendgrid.net [208.117.55.132])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 7403C60392\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  5 Aug 2020 17:14:46 +0200 (CEST)","by filterdrecv-p3las1-559bd7b968-wk85c with SMTP id\n\tfilterdrecv-p3las1-559bd7b968-wk85c-19-5F2ACCE4-7F\n\t2020-08-05 15:14:44.744677232 +0000 UTC m=+593915.478323937","from mail.uajain.com (unknown)\n\tby ismtpd0003p1maa1.sendgrid.net (SG) with ESMTP id\n\tMyAD5_rmSZyzyU9OTWX_2w for <libcamera-devel@lists.libcamera.org>;\n\tWed, 05 Aug 2020 15:14:44.089 +0000 (UTC)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=uajain.com header.i=@uajain.com\n\theader.b=\"IxljR5fS\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=uajain.com;\n\th=from:subject:in-reply-to:references:mime-version:to:cc:\n\tcontent-transfer-encoding:content-type;\n\ts=s1; bh=vsmP+YwBsxogne+hm5MTk+A6/YWvfvAk7Tg9eZacMxg=;\n\tb=IxljR5fSm7sgB/yl9fWLNcYr4+2vlGja1H5rj6N/S76JISA473Dl4JFH/Wir2tn0J4O+\n\tLdETvSNLNAI6awAbBtzCE4Koog7rHCY+i/DQhF0zCG7kMCqpWHeohmVWyO9y8d+nhXjMg8\n\t+j5EOqVz6t8reRv2IK8I819DHxz8qo6Uw=","From":"Umang Jain <email@uajain.com>","Date":"Wed, 05 Aug 2020 15:14:44 +0000 (UTC)","Message-Id":"<20200805151437.157155-3-email@uajain.com>","In-Reply-To":"<20200805151437.157155-1-email@uajain.com>","References":"<20200805151437.157155-1-email@uajain.com>","Mime-Version":"1.0","X-SG-EID":"1Q40EQ7YGir8a9gjSIAdTjhngY657NMk9ckeo4dbHZDiOpywc/L3L9rFqlwE4KPc+mYHlj5pFD2lBxsaGLVsOCDqbDvgI+twqiPnkVPbvDJz4I3xKGOwPVaxLzK3xEsQWyiGUgWI/Vw+4+V3/Im8zNYu+tKuuyiFBgrwFs1U5Ooch9vtROwq/JYq9ZMyva4ThsfEBdHzfN8zVUe2XrG9M+//LPMPZm5bnYxfqMkWCnAjp65uHrfc0kYsD9SkyJVZc2pghy8JDwSSqsxN+520mA==","To":"libcamera-devel@lists.libcamera.org","Subject":"[libcamera-devel] [PATCH 2/2] android: camera_hal_manager: Support\n\tcamera hotplug","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=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"},"content":"Extend the support for camera hotplug from libcamera's CameraManager\nto CameraHalManager. Use camera module callbacks to let the framework\nknow about the hotplug events and change the status of cameras being\nbeing hotplugged or unplugged via camera_device_status_change().\n\nSigned-off-by: Umang Jain <email@uajain.com>\n---\n src/android/camera_device.h        |  1 +\n src/android/camera_hal_manager.cpp | 40 ++++++++++++++++++++++++++++--\n src/android/camera_hal_manager.h   |  3 +++\n 3 files changed, 42 insertions(+), 2 deletions(-)","diff":"diff --git a/src/android/camera_device.h b/src/android/camera_device.h\nindex 4e5fb98..fa9706c 100644\n--- a/src/android/camera_device.h\n+++ b/src/android/camera_device.h\n@@ -47,6 +47,7 @@ public:\n \n \tunsigned int id() const { return id_; }\n \tcamera3_device_t *camera3Device() { return &camera3Device_; }\n+\tconst libcamera::Camera *getCamera() { return camera_.get(); };\n \n \tint facing() const { return facing_; }\n \tint orientation() const { return orientation_; }\ndiff --git a/src/android/camera_hal_manager.cpp b/src/android/camera_hal_manager.cpp\nindex 3ddcab5..b498278 100644\n--- a/src/android/camera_hal_manager.cpp\n+++ b/src/android/camera_hal_manager.cpp\n@@ -59,8 +59,6 @@ int CameraHalManager::init()\n \t/*\n \t * For each Camera registered in the system, a CameraDevice\n \t * gets created here to wraps a libcamera Camera instance.\n-\t *\n-\t * \\todo Support camera hotplug.\n \t */\n \tunsigned int index = 0;\n \tfor (auto &cam : cameraManager_->cameras()) {\n@@ -73,6 +71,10 @@ int CameraHalManager::init()\n \t\t++index;\n \t}\n \n+\t/* Support camera hotplug */\n+\tcameraManager_->cameraAdded.connect(this, &CameraHalManager::cameraAdded);\n+\tcameraManager_->cameraRemoved.connect(this, &CameraHalManager::cameraRemoved);\n+\n \treturn 0;\n }\n \n@@ -93,6 +95,40 @@ CameraDevice *CameraHalManager::open(unsigned int id,\n \treturn camera;\n }\n \n+void CameraHalManager::cameraAdded(std::shared_ptr<Camera> cam)\n+{\n+\tunsigned int id = cameras_.size();\n+\tCameraDevice *camera = new CameraDevice(id, cam);\n+\tint ret = camera->initialize();\n+\tif (ret) {\n+\t\tLOG(HAL, Error) << \"Failed to initialize camera: \" << cam->name();\n+\t\treturn;\n+\t}\n+\n+\tcameras_.emplace_back(camera);\n+\tcallbacks_->camera_device_status_change(callbacks_, id,\n+\t\t\t\t\t\tCAMERA_DEVICE_STATUS_PRESENT);\n+\tLOG(HAL, Debug) << \"Camera \" << cam->name() << \" ID:\" << id\n+\t\t\t<< \" added and initialized successfully.\";\n+}\n+\n+void CameraHalManager::cameraRemoved(std::shared_ptr<Camera> cam)\n+{\n+\tauto iter = std::find_if(cameras_.begin(), cameras_.end(),\n+\t\t\t\t[cam](std::unique_ptr<CameraDevice> &camera) {\n+\t\t\t\t\treturn cam.get() == camera->getCamera();\n+\t\t\t\t});\n+\tif (iter == cameras_.end())\n+\t\treturn;\n+\n+\tunsigned int id = (*iter)->id();\n+\tcallbacks_->camera_device_status_change(callbacks_, id,\n+\t\t\t\t\t\tCAMERA_DEVICE_STATUS_NOT_PRESENT);\n+\tcameras_.erase(iter);\n+\tLOG(HAL, Debug) << \"Camera \" << cam->name() << \" ID:\" << id\n+\t\t\t<< \" removed successfully.\";\n+}\n+\n unsigned int CameraHalManager::numCameras() const\n {\n \treturn cameraManager_->cameras().size();\ndiff --git a/src/android/camera_hal_manager.h b/src/android/camera_hal_manager.h\nindex 4345b1e..52ab9e2 100644\n--- a/src/android/camera_hal_manager.h\n+++ b/src/android/camera_hal_manager.h\n@@ -33,6 +33,9 @@ public:\n \tint setCallbacks(const camera_module_callbacks_t *callbacks);\n \n private:\n+\tvoid cameraAdded(std::shared_ptr<libcamera::Camera> cam);\n+\tvoid cameraRemoved(std::shared_ptr<libcamera::Camera> cam);\n+\n \tlibcamera::CameraManager *cameraManager_;\n \n \tconst camera_module_callbacks_t *callbacks_;\n","prefixes":["libcamera-devel","2/2"]}