From a5fdf63e90d8e9559f53f7bf5b0504f30ce69656 Mon Sep 17 00:00:00 2001 From: David Plowman Date: Fri, 11 Nov 2022 13:30:24 +0000 Subject: libcamera: Add a PipelineHandler::releaseDevice method This notifies pipeline handlers when a camera is released, in case they want to free any resources or memory buffers. Signed-off-by: David Plowman Reviewed-by: Kieran Bingham Reviewed-by: Naushir Patuck Signed-off-by: Kieran Bingham --- include/libcamera/internal/pipeline_handler.h | 4 +++- src/libcamera/camera.cpp | 2 +- src/libcamera/pipeline_handler.cpp | 16 +++++++++++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h index 96aab9d6..ec4f662d 100644 --- a/include/libcamera/internal/pipeline_handler.h +++ b/include/libcamera/internal/pipeline_handler.h @@ -46,7 +46,7 @@ public: const DeviceMatch &dm); bool acquire(); - void release(); + void release(Camera *camera); virtual std::unique_ptr generateConfiguration(Camera *camera, const StreamRoles &roles) = 0; @@ -74,6 +74,8 @@ protected: virtual int queueRequestDevice(Camera *camera, Request *request) = 0; virtual void stopDevice(Camera *camera) = 0; + virtual void releaseDevice(Camera *camera); + CameraManager *manager_; private: diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index c4f65c1a..2d947a44 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -870,7 +870,7 @@ int Camera::release() return ret == -EACCES ? -EBUSY : ret; if (d->isAcquired()) - d->pipe_->release(); + d->pipe_->release(this); d->setState(Private::CameraAvailable); diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp index 825aff5a..cfade490 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -183,6 +183,7 @@ bool PipelineHandler::acquire() /** * \brief Release exclusive access to the pipeline handler + * \param[in] camera The camera for which to release data * * This function releases access to the pipeline handler previously acquired by * a call to acquire(). Every release() call shall match a previous successful @@ -196,7 +197,7 @@ bool PipelineHandler::acquire() * * \sa acquire() */ -void PipelineHandler::release() +void PipelineHandler::release(Camera *camera) { MutexLocker locker(lock_); @@ -204,9 +205,22 @@ void PipelineHandler::release() unlockMediaDevices(); + releaseDevice(camera); + --useCount_; } +/** + * \brief Release resources associated with this camera + * \param[in] camera The camera for which to release resources + * + * Pipeline handlers may override this in order to perform cleanup operations + * when a camera is released, such as freeing memory. + */ +void PipelineHandler::releaseDevice([[maybe_unused]] Camera *camera) +{ +} + void PipelineHandler::unlockMediaDevices() { for (std::shared_ptr &media : mediaDevices_) -- cgit v1.2.1