From patchwork Tue Mar 23 10:09:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 11655 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 4054AC32E4 for ; Tue, 23 Mar 2021 10:09:32 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 7A91E68D65; Tue, 23 Mar 2021 11:09:31 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="XwSSYPbE"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id DA316602E3 for ; Tue, 23 Mar 2021 11:09:29 +0100 (CET) Received: from pyrite.rasen.tech (unknown [IPv6:2400:4051:61:600:2c71:1b79:d06d:5032]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 2D98C885; Tue, 23 Mar 2021 11:09:26 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1616494169; bh=C+ls2pPkWW6SmNXUQHTbqFIbXi+oqBycH7+XGa5KJ0U=; h=From:To:Cc:Subject:Date:From; b=XwSSYPbEc7uPrCi/7t/zVAFd6tZs+MSmYEYw/+Mdu6KlJcATsaBN/OjjQORyPbSnG MlOS47rb3Lb7f0MRRt0XwB0AyW5nF0L9cNz8STKn1AtIcYD7a+RAovNVlL1Ues94lm xJhejZpQo2vqvRlNm4ahyzzPeMTveMdr8dEG2V2s= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Tue, 23 Mar 2021 19:09:06 +0900 Message-Id: <20210323100906.17488-1-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3] android: Return -EUSERS when failed to open a Camera that's in use 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: , Cc: hiroh@google.com Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The correct return value for the HAL for hal_dev_open() when trying to open a camera that's already opened is EUSERS. Make hal_dev_open() return -EUSERS, and plumb the logic for this through CameraHalManager::open(). This allows the following CTS tests to pass: - android.hardware.camera2.cts.CameraManagerTest#testCameraManagerOpenAllCameras - android.hardware.camera2.cts.MultiViewTest#testDualCameraPreview Signed-off-by: Paul Elder Reviewed-by: Laurent Pinchart Reviewed-by: Hirokazu Honda Reviewed-by: Jacopo Mondi --- Changes in v3: - simplify the error handling in hal_dev_open() Changes in v2: - use structured binding when opening the camera in hal_dev_open() - expand the error message --- src/android/camera3_hal.cpp | 4 ++-- src/android/camera_hal_manager.cpp | 15 ++++++++------- src/android/camera_hal_manager.h | 4 +++- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/android/camera3_hal.cpp b/src/android/camera3_hal.cpp index d6e04af2..08773d33 100644 --- a/src/android/camera3_hal.cpp +++ b/src/android/camera3_hal.cpp @@ -77,11 +77,11 @@ static int hal_dev_open(const hw_module_t *module, const char *name, LOG(HAL, Debug) << "Open camera " << name; int id = atoi(name); - CameraDevice *camera = cameraManager.open(id, module); + auto [camera, ret] = cameraManager.open(id, module); if (!camera) { LOG(HAL, Error) << "Failed to open camera module '" << id << "'"; - return -ENODEV; + return ret == -EBUSY ? -EUSERS : ret; } *device = &camera->camera3Device()->common; diff --git a/src/android/camera_hal_manager.cpp b/src/android/camera_hal_manager.cpp index 189eda2b..aeff14bd 100644 --- a/src/android/camera_hal_manager.cpp +++ b/src/android/camera_hal_manager.cpp @@ -65,28 +65,29 @@ int CameraHalManager::init() return 0; } -CameraDevice *CameraHalManager::open(unsigned int id, - const hw_module_t *hardwareModule) +std::tuple +CameraHalManager::open(unsigned int id, const hw_module_t *hardwareModule) { MutexLocker locker(mutex_); if (!callbacks_) { LOG(HAL, Error) << "Can't open camera before callbacks are set"; - return nullptr; + return { nullptr, -ENODEV }; } CameraDevice *camera = cameraDeviceFromHalId(id); if (!camera) { LOG(HAL, Error) << "Invalid camera id '" << id << "'"; - return nullptr; + return { nullptr, -ENODEV }; } - if (camera->open(hardwareModule)) - return nullptr; + int ret = camera->open(hardwareModule); + if (ret) + return { nullptr, ret }; LOG(HAL, Info) << "Open camera '" << id << "'"; - return camera; + return { camera, 0 }; } void CameraHalManager::cameraAdded(std::shared_ptr cam) diff --git a/src/android/camera_hal_manager.h b/src/android/camera_hal_manager.h index a91decc7..24bf716c 100644 --- a/src/android/camera_hal_manager.h +++ b/src/android/camera_hal_manager.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -28,7 +29,8 @@ public: int init(); - CameraDevice *open(unsigned int id, const hw_module_t *module); + std::tuple + open(unsigned int id, const hw_module_t *module); unsigned int numCameras() const; int getCameraInfo(unsigned int id, struct camera_info *info);