diff options
author | David Plowman <david.plowman@raspberrypi.com> | 2022-11-11 13:30:24 +0000 |
---|---|---|
committer | Kieran Bingham <kieran.bingham@ideasonboard.com> | 2022-11-14 11:03:32 +0000 |
commit | a5fdf63e90d8e9559f53f7bf5b0504f30ce69656 (patch) | |
tree | b39331cad47bbf63bdba9bafdc6b282fea81a41d | |
parent | 75e7befb1667f620410f0f15a10eccb32d7df66d (diff) |
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 <david.plowman@raspberrypi.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Naushir Patuck <naush@raspberrypi.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
-rw-r--r-- | include/libcamera/internal/pipeline_handler.h | 4 | ||||
-rw-r--r-- | src/libcamera/camera.cpp | 2 | ||||
-rw-r--r-- | 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<CameraConfiguration> 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<MediaDevice> &media : mediaDevices_) |