[libcamera-devel] [PATCH 1/2] libcamera: Add a PipelineHandler::releaseDevice method

Kieran Bingham kieran.bingham at ideasonboard.com
Fri Nov 11 15:07:52 CET 2022


Hi David,

Quoting David Plowman via libcamera-devel (2022-11-11 13:30:24)
> This notifies pipeline handlers when a camera is released, in case
> they want to free any resources or memory buffers.
> 

Indeed, that does sound like something they might need!

> Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
> ---
>  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<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.

I don't know if it helps/is accurate or correct so only as a mere
possible suggestion to clarify:

'as freeing memory allocated during acquire()' ?

But equally - fine without.

> + */
> +void PipelineHandler::releaseDevice([[maybe_unused]] Camera *camera)
> +{
> +}
> +

This is certainly fine, and looks like it works correctly. I suspect it
could also have been the documentation added here, with just an
empty implementation in the header at something like:

	virtual void releaseDevice(Camera *camera) {};

But I think having the base/empty implementation here - does make it
clearer that the documentation is associated with it directly, and it
only costs 3 easy lines so:

Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>

>  void PipelineHandler::unlockMediaDevices()
>  {
>         for (std::shared_ptr<MediaDevice> &media : mediaDevices_)
> -- 
> 2.30.2
>


More information about the libcamera-devel mailing list