From patchwork Wed Nov 16 00:17:23 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 17807 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 9E5F1C3285 for ; Wed, 16 Nov 2022 00:17:31 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 6EB786309B; Wed, 16 Nov 2022 01:17:30 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1668557850; bh=9WogkLEpfbW6noMfaI5JtIgQ8SHgfPUEVfe9+Nv+/cs=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=QwgW6wQ/AiF4cU9qUHU4hCW4MQbMLuqdUYiFHJXUXpkjdJuBN68fy3IBcAF3nkaPa N3SRyIDyJHJTMXZTkMePY2dBOmulCARy/4hYqBNjj1E7q3DkzK7gLKBDH4MSn5n/4Q zuTy5PJdnxUknFXpLy5rWaRznO+8IksoVrN043C2IfTI/SGK1obA2UrPAt1kUDXGY3 8XV5lYZBuXrT+7asj3+lp0dVaHS5HDJaPvqtE8UXTyfBrE9JyPVf2mr3MjaySfTO7m PT6oRe0Q0f0DQ7k0y1+t8G0WoNPlWP5Pgswy7KBty2hTzuI2rlPKfYKdXnvRps1FRF 12tZlCOqoWx1A== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 577A563087 for ; Wed, 16 Nov 2022 01:17:29 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Ub88ZsVo"; dkim-atps=neutral Received: from Monstersaurus.local (cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id D5AFFAF4; Wed, 16 Nov 2022 01:17:28 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1668557849; bh=9WogkLEpfbW6noMfaI5JtIgQ8SHgfPUEVfe9+Nv+/cs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Ub88ZsVoU3WqaezXQxalSdbgMuZZvwBAkv+bCUGX6Pl6NArCSKkXN4t4hEin3GgFr 7uPhiaAVUwog687Y3WUkoJdAzm3MdkVgoJJDw4s16q8IsRK0dhE3pYAWboQCr4SVo/ rVlu1KnLoT8qjZNe8w73PLu+msg7w8Hlt9tgpIgc= To: libcamera devel Date: Wed, 16 Nov 2022 00:17:23 +0000 Message-Id: <20221116001724.3938045-2-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221116001724.3938045-1-kieran.bingham@ideasonboard.com> References: <20221116001724.3938045-1-kieran.bingham@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 1/2] libcamera: pipeline: Add an acquireDevice method 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: , X-Patchwork-Original-From: Kieran Bingham via libcamera-devel From: Kieran Bingham Reply-To: Kieran Bingham Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Cameras may need to acquire resources such as video device nodes before they can be configured. Acquisition of these resources can prevent power saving operations from being handled for instance in the event that a camera daemon such as Pipewire keeps unacquired devices held at runtime. Provide a method to allow pipeline handlers to implement resource acquisition operations during the acquire phase of the Camera state machine. Any resources acquired during acquireDevice() must be released as part of the corresponding releaseDevice() implementation. Signed-off-by: Kieran Bingham --- include/libcamera/internal/pipeline_handler.h | 3 ++- src/libcamera/camera.cpp | 2 +- src/libcamera/pipeline_handler.cpp | 23 ++++++++++++++++++- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h index ec4f662d7399..483553b0d027 100644 --- a/include/libcamera/internal/pipeline_handler.h +++ b/include/libcamera/internal/pipeline_handler.h @@ -45,7 +45,7 @@ public: MediaDevice *acquireMediaDevice(DeviceEnumerator *enumerator, const DeviceMatch &dm); - bool acquire(); + bool acquire(Camera *camera); void release(Camera *camera); virtual std::unique_ptr generateConfiguration(Camera *camera, @@ -74,6 +74,7 @@ protected: virtual int queueRequestDevice(Camera *camera, Request *request) = 0; virtual void stopDevice(Camera *camera) = 0; + virtual bool acquireDevice(Camera *camera); virtual void releaseDevice(Camera *camera); CameraManager *manager_; diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index 2d947a442bff..4e0a6584a673 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -835,7 +835,7 @@ int Camera::acquire() if (ret < 0) return ret == -EACCES ? -EBUSY : ret; - if (!d->pipe_->acquire()) { + if (!d->pipe_->acquire(this)) { LOG(Camera, Info) << "Pipeline handler in use by another process"; return -EBUSY; diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index cfade4908118..4303a5893a4d 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -143,6 +143,7 @@ MediaDevice *PipelineHandler::acquireMediaDevice(DeviceEnumerator *enumerator, /** * \brief Acquire exclusive access to the pipeline handler for the process + * \param[in] camera The camera which is being acquired * * This function locks all the media devices used by the pipeline to ensure * that no other process can access them concurrently. @@ -155,13 +156,16 @@ MediaDevice *PipelineHandler::acquireMediaDevice(DeviceEnumerator *enumerator, * Pipeline handlers shall not call this function directly as the Camera class * handles access internally. * + * Any resources acquired during an overridden acquireDevice() must be released + * by a corresponding override of releaseDevice(). + * * \context This function is \threadsafe. * * \return True if the pipeline handler was acquired, false if another process * has already acquired it * \sa release() */ -bool PipelineHandler::acquire() +bool PipelineHandler::acquire(Camera *camera) { MutexLocker locker(lock_); @@ -177,10 +181,27 @@ bool PipelineHandler::acquire() } } + if (!acquireDevice(camera)) { + unlockMediaDevices(); + return false; + } + ++useCount_; return true; } +/** + * \brief Acquire resources associated with this camera + * \param[in] camera The camera for which to acquire resources + * + * Pipeline handlers may override this in order to perform resource acquisition + * operations when a camera is acquired, such as opening device nodes. + */ +bool PipelineHandler::acquireDevice([[maybe_unused]] Camera *camera) +{ + return true; +} + /** * \brief Release exclusive access to the pipeline handler * \param[in] camera The camera for which to release data