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

Message ID 20200821144601.67860-4-email@uajain.com
State Accepted
Headers show
Series
  • android: Camera hotplug support
Related show

Commit Message

Umang Jain Aug. 21, 2020, 2:46 p.m. UTC
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@uajain.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
---
 src/android/camera_device.cpp      | 7 +++++++
 src/android/camera_device.h        | 5 ++++-
 src/android/camera_hal_manager.cpp | 4 ++--
 src/android/camera_hal_manager.h   | 2 +-
 4 files changed, 14 insertions(+), 4 deletions(-)

Patch

diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 3419236..550fcfa 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -233,6 +233,13 @@  CameraDevice::~CameraDevice()
 		delete it.second;
 }
 
+std::shared_ptr<CameraDevice> CameraDevice::create(unsigned int id,
+						    const std::shared_ptr<Camera> &cam)
+{
+	CameraDevice *camera = new CameraDevice(id, cam);
+	return std::shared_ptr<CameraDevice>(camera);
+}
+
 /*
  * 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..3e472c7 100644
--- a/src/android/camera_device.h
+++ b/src/android/camera_device.h
@@ -47,7 +47,8 @@  struct CameraStream {
 class CameraDevice : protected libcamera::Loggable
 {
 public:
-	CameraDevice(unsigned int id, const std::shared_ptr<libcamera::Camera> &camera);
+	static std::shared_ptr<CameraDevice> create(unsigned int id,
+						    const std::shared_ptr<libcamera::Camera> &cam);
 	~CameraDevice();
 
 	int initialize();
@@ -72,6 +73,8 @@  protected:
 	std::string logPrefix() const override;
 
 private:
+	CameraDevice(unsigned int id, const std::shared_ptr<libcamera::Camera> &camera);
+
 	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__ */