From patchwork Mon Aug 10 12:04:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 9274 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id D481FBD87D for ; Mon, 10 Aug 2020 12:04:18 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id A0BD460DCA; Mon, 10 Aug 2020 14:04:18 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=uajain.com header.i=@uajain.com header.b="vrY0woxL"; dkim-atps=neutral Received: from o1.f.az.sendgrid.net (o1.f.az.sendgrid.net [208.117.55.132]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 0657460E89 for ; Mon, 10 Aug 2020 14:04:15 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=uajain.com; h=from:subject:in-reply-to:references:mime-version:to:cc: content-transfer-encoding:content-type; s=s1; bh=hRI3QrkrdUUb2GfoxLz6TSSt2ZtkOZOlo3hKcH4mQIo=; b=vrY0woxLq8rOya3FVh71M+t4LJFEB/c1S23IRDyOuNnQAIgLu09dfzRDjV5PB4YMSL6D uTCoBZWh9GMeXZhKMCxHpeOsx18aK2O8qsLevxricFT9EdwV07MoEiFFj3ftBwtMybGRH+ /4kjo7h6j49g7sjc7yeq29ykSS0AgIkXQ= Received: by filterdrecv-p3mdw1-7ff865655c-8dgl4 with SMTP id filterdrecv-p3mdw1-7ff865655c-8dgl4-17-5F3137BE-AA 2020-08-10 12:04:14.852928121 +0000 UTC m=+1014484.473196805 Received: from mail.uajain.com (unknown) by ismtpd0006p1maa1.sendgrid.net (SG) with ESMTP id dv0XAPOxRNKcg96xkeHjSQ for ; Mon, 10 Aug 2020 12:04:14.467 +0000 (UTC) From: Umang Jain Date: Mon, 10 Aug 2020 12:04:14 +0000 (UTC) Message-Id: <20200810120406.52654-5-email@uajain.com> In-Reply-To: <20200810120406.52654-1-email@uajain.com> References: <20200810120406.52654-1-email@uajain.com> Mime-Version: 1.0 X-SG-EID: 1Q40EQ7YGir8a9gjSIAdTjhngY657NMk9ckeo4dbHZDiOpywc/L3L9rFqlwE4KPcO0wIVNwfic3Culi7Uik3lzUh+gFX7nrLTXMz/5XSKoetSIgIsTB3YntnH97XAgGKc06ApYMZ7L0zlgppraeFgCulJ7sEjSlSD7S3r2YOMpV4kFprWoqsp56uD99TvWz035kuC/3/dIyAS5ASQnyKsZASegiFQN14XlruLT24FFlpD865ejz/e9CE1I3NzTRKoKPc93QVM1gNcRwzia7i5w== To: libcamera-devel@lists.libcamera.org Subject: [libcamera-devel] [PATCH v2 4/4] android: camera_hal_manager: Handle hot-unplug of currently open camera X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Maintain an extra ref for the currently open camera in CameraHalManager. This will ensure we have an graceful handling if the currently open camera is hot-unplugged. Signed-off-by: Umang Jain --- src/android/camera_device.h | 1 + src/android/camera_hal_manager.cpp | 18 +++++++++++++++--- src/android/camera_hal_manager.h | 2 ++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/android/camera_device.h b/src/android/camera_device.h index 7f9e010..2dc0a20 100644 --- a/src/android/camera_device.h +++ b/src/android/camera_device.h @@ -61,6 +61,7 @@ public: int facing() const { return facing_; } int orientation() const { return orientation_; } + bool running() { return running_; } void setCallbacks(const camera3_callback_ops_t *callbacks); const camera_metadata_t *getStaticMetadata(); diff --git a/src/android/camera_hal_manager.cpp b/src/android/camera_hal_manager.cpp index fdde2c0..9db5954 100644 --- a/src/android/camera_hal_manager.cpp +++ b/src/android/camera_hal_manager.cpp @@ -38,6 +38,8 @@ CameraHalManager::~CameraHalManager() cameras_.clear(); camerasMap_.clear(); + cameraInUse_.reset(); + if (cameraManager_) { cameraManager_->stop(); delete cameraManager_; @@ -55,6 +57,7 @@ int CameraHalManager::init() cameraCounter_ = 0; externalCameraCounter_ = 1000; + cameraInUse_ = nullptr; int ret = cameraManager_->start(); if (ret) { @@ -82,14 +85,17 @@ CameraDevice *CameraHalManager::open(unsigned int id, return nullptr; } - CameraDevice *camera = iter->get(); + if (cameraInUse_) + cameraInUse_.reset(); + + cameraInUse_ = std::move(*iter); - if (camera->open(hardwareModule)) + if (cameraInUse_->open(hardwareModule)) return nullptr; LOG(HAL, Info) << "Open camera '" << id << "'"; - return camera; + return cameraInUse_.get(); } void CameraHalManager::cameraAdded(std::shared_ptr cam) @@ -169,6 +175,12 @@ void CameraHalManager::cameraRemoved(std::shared_ptr cam) unsigned int id = (*iter)->id(); callbacks_->camera_device_status_change(callbacks_, id, CAMERA_DEVICE_STATUS_NOT_PRESENT); + + if (*iter == cameraInUse_ && cameraInUse_->running()) { + cameraInUse_->close(); + cameraInUse_.reset(); + } + cameras_.erase(iter); LOG(HAL, Debug) << "Camera ID: " << id << " removed successfully."; diff --git a/src/android/camera_hal_manager.h b/src/android/camera_hal_manager.h index 7c481d4..974d53d 100644 --- a/src/android/camera_hal_manager.h +++ b/src/android/camera_hal_manager.h @@ -48,6 +48,8 @@ private: std::map camerasMap_; Mutex mutex_; + std::shared_ptr cameraInUse_; + unsigned int externalCameraCounter_; unsigned int cameraCounter_; };