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>
This commit is contained in:
David Plowman 2022-11-11 13:30:24 +00:00 committed by Kieran Bingham
parent 75e7befb16
commit a5fdf63e90
3 changed files with 19 additions and 3 deletions

View file

@ -46,7 +46,7 @@ public:
const DeviceMatch &dm); const DeviceMatch &dm);
bool acquire(); bool acquire();
void release(); void release(Camera *camera);
virtual std::unique_ptr<CameraConfiguration> generateConfiguration(Camera *camera, virtual std::unique_ptr<CameraConfiguration> generateConfiguration(Camera *camera,
const StreamRoles &roles) = 0; const StreamRoles &roles) = 0;
@ -74,6 +74,8 @@ protected:
virtual int queueRequestDevice(Camera *camera, Request *request) = 0; virtual int queueRequestDevice(Camera *camera, Request *request) = 0;
virtual void stopDevice(Camera *camera) = 0; virtual void stopDevice(Camera *camera) = 0;
virtual void releaseDevice(Camera *camera);
CameraManager *manager_; CameraManager *manager_;
private: private:

View file

@ -870,7 +870,7 @@ int Camera::release()
return ret == -EACCES ? -EBUSY : ret; return ret == -EACCES ? -EBUSY : ret;
if (d->isAcquired()) if (d->isAcquired())
d->pipe_->release(); d->pipe_->release(this);
d->setState(Private::CameraAvailable); d->setState(Private::CameraAvailable);

View file

@ -183,6 +183,7 @@ bool PipelineHandler::acquire()
/** /**
* \brief Release exclusive access to the pipeline handler * \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 * This function releases access to the pipeline handler previously acquired by
* a call to acquire(). Every release() call shall match a previous successful * a call to acquire(). Every release() call shall match a previous successful
@ -196,7 +197,7 @@ bool PipelineHandler::acquire()
* *
* \sa acquire() * \sa acquire()
*/ */
void PipelineHandler::release() void PipelineHandler::release(Camera *camera)
{ {
MutexLocker locker(lock_); MutexLocker locker(lock_);
@ -204,9 +205,22 @@ void PipelineHandler::release()
unlockMediaDevices(); unlockMediaDevices();
releaseDevice(camera);
--useCount_; --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() void PipelineHandler::unlockMediaDevices()
{ {
for (std::shared_ptr<MediaDevice> &media : mediaDevices_) for (std::shared_ptr<MediaDevice> &media : mediaDevices_)