[libcamera-devel] [PATCH v3 3/5] android: camera_device: Make CameraDevice a shared object

Laurent Pinchart laurent.pinchart at ideasonboard.com
Wed Aug 19 16:40:38 CEST 2020


Hi Umang,

Thank you for the patch.

On Mon, Aug 17, 2020 at 08:26:39PM +0000, Umang Jain wrote:
> CameraDevice needs to be wrapper into the std::shared_ptr instead
> of std::unique_ptr to enable refcounting. The refcounting will help
> us to support hotplug and hot-unplug CameraHalManager operations
> in the subsequent commit.
> 
> Signed-off-by: Umang Jain <email at uajain.com>
> ---
>  src/android/camera_device.cpp      | 15 +++++++++++++++
>  src/android/camera_device.h        |  7 +++++--
>  src/android/camera_hal_manager.cpp |  4 ++--
>  src/android/camera_hal_manager.h   |  2 +-
>  4 files changed, 23 insertions(+), 5 deletions(-)
> 
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index d918350..a79bb69 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -233,6 +233,21 @@ CameraDevice::~CameraDevice()
>  		delete it.second;
>  }
>  
> +std::shared_ptr<CameraDevice> CameraDevice::create(unsigned int id,
> +						    const std::shared_ptr<Camera> &cam)
> +{
> +	struct Deleter : std::default_delete<CameraDevice> {
> +		void operator()(CameraDevice *camera)
> +		{
> +			delete camera;
> +		}
> +	};

The reason we have a custom deleter for the Camera class is to allow
making the destructor private. The private destructor can't be accessed
from the default deleter, so we create a custom version inside this
member function of CameraDevice, which gives it access to the
destructor.

As this is internal to the HAL, making the destructor private is a bit
overkill in my opinion. You could simplify this function to

	CameraDevice *camera = new CameraDevice(id, cam);
	return std::shared_ptr<CameraDevice>(camera);

if you made the destructor public. The constructor can stay private.

With this changed,

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

> +
> +	CameraDevice *camera = new CameraDevice(id, cam);
> +
> +	return std::shared_ptr<CameraDevice>(camera, Deleter());
> +}
> +
>  /*
>   * Initialize the camera static information.
>   * This method is called before the camera device is opened.
> diff --git a/src/android/camera_device.h b/src/android/camera_device.h
> index 7be9e11..b149043 100644
> --- a/src/android/camera_device.h
> +++ b/src/android/camera_device.h
> @@ -47,8 +47,8 @@ struct CameraStream {
>  class CameraDevice : protected libcamera::Loggable
>  {
>  public:
> -	CameraDevice(unsigned int id, const std::shared_ptr<libcamera::Camera> &camera);
> -	~CameraDevice();
> +	static std::shared_ptr<CameraDevice> create(unsigned int id,
> +						    const std::shared_ptr<libcamera::Camera> &cam);
>  
>  	int initialize();
>  
> @@ -72,6 +72,9 @@ protected:
>  	std::string logPrefix() const override;
>  
>  private:
> +	CameraDevice(unsigned int id, const std::shared_ptr<libcamera::Camera> &camera);
> +	~CameraDevice();
> +
>  	struct Camera3RequestDescriptor {
>  		Camera3RequestDescriptor(unsigned int frameNumber,
>  					 unsigned int numBuffers);
> diff --git a/src/android/camera_hal_manager.cpp b/src/android/camera_hal_manager.cpp
> index 3d6d2b4..3a744af 100644
> --- a/src/android/camera_hal_manager.cpp
> +++ b/src/android/camera_hal_manager.cpp
> @@ -64,12 +64,12 @@ int CameraHalManager::init()
>  	 */
>  	unsigned int index = 0;
>  	for (auto &cam : cameraManager_->cameras()) {
> -		CameraDevice *camera = new CameraDevice(index, cam);
> +		std::shared_ptr<CameraDevice> camera = CameraDevice::create(index, cam);
>  		ret = camera->initialize();
>  		if (ret)
>  			continue;
>  
> -		cameras_.emplace_back(camera);
> +		cameras_.emplace_back(std::move(camera));
>  		++index;
>  	}
>  
> diff --git a/src/android/camera_hal_manager.h b/src/android/camera_hal_manager.h
> index a582f04..3e34d63 100644
> --- a/src/android/camera_hal_manager.h
> +++ b/src/android/camera_hal_manager.h
> @@ -36,7 +36,7 @@ private:
>  	libcamera::CameraManager *cameraManager_;
>  
>  	const camera_module_callbacks_t *callbacks_;
> -	std::vector<std::unique_ptr<CameraDevice>> cameras_;
> +	std::vector<std::shared_ptr<CameraDevice>> cameras_;
>  };
>  
>  #endif /* __ANDROID_CAMERA_MANAGER_H__ */

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list