[libcamera-devel] [PATCH 1/3] libcamera: camera: create a association with the responsible pipeline handler

Niklas Söderlund niklas.soderlund at ragnatech.se
Wed Jan 23 00:29:53 CET 2019


The PipelineHandler which creates a Camera is responsible for serving
any operation requested by the user. In order to do so the Camera needs
to store a reference to its creator.

Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
---
 include/libcamera/camera.h           |  8 ++++++--
 src/libcamera/camera.cpp             | 15 +++++++++------
 src/libcamera/pipeline/ipu3/ipu3.cpp |  3 ++-
 src/libcamera/pipeline/uvcvideo.cpp  |  2 +-
 src/libcamera/pipeline/vimc.cpp      | 10 ++--------
 5 files changed, 20 insertions(+), 18 deletions(-)

diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h
index 2ea1a6883311cf9f..d3bae4cbee1e0cea 100644
--- a/include/libcamera/camera.h
+++ b/include/libcamera/camera.h
@@ -12,10 +12,13 @@
 
 namespace libcamera {
 
+class PipelineHandler;
+
 class Camera final
 {
 public:
-	static std::shared_ptr<Camera> create(const std::string &name);
+	static std::shared_ptr<Camera> create(const std::string &name,
+					      class PipelineHandler *pipe);
 
 	Camera(const Camera &) = delete;
 	void operator=(const Camera &) = delete;
@@ -23,10 +26,11 @@ public:
 	const std::string &name() const;
 
 private:
-	explicit Camera(const std::string &name);
+	explicit Camera(const std::string &name, class PipelineHandler *pipe);
 	~Camera();
 
 	std::string name_;
+	class PipelineHandler *pipe_;
 };
 
 } /* namespace libcamera */
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
index acf912bee95cbec4..f198eb4978b12239 100644
--- a/src/libcamera/camera.cpp
+++ b/src/libcamera/camera.cpp
@@ -52,17 +52,20 @@ namespace libcamera {
 /**
  * \brief Create a camera instance
  * \param[in] name The name of the camera device
+ * \param[in] pipe The pipeline handler responsible for the camera device
  *
  * The caller is responsible for guaranteeing unicity of the camera name.
  *
  * \return A shared pointer to the newly created camera object
  */
-std::shared_ptr<Camera> Camera::create(const std::string &name)
+std::shared_ptr<Camera> Camera::create(const std::string &name,
+				       class PipelineHandler *pipe)
 {
 	struct Allocator : std::allocator<Camera> {
-		void construct(void *p, const std::string &name)
+		void construct(void *p, const std::string &name,
+			       class PipelineHandler *pipe)
 		{
-			::new(p) Camera(name);
+			::new(p) Camera(name, pipe);
 		}
 		void destroy(Camera *p)
 		{
@@ -70,7 +73,7 @@ std::shared_ptr<Camera> Camera::create(const std::string &name)
 		}
 	};
 
-	return std::allocate_shared<Camera>(Allocator(), name);
+	return std::allocate_shared<Camera>(Allocator(), name, pipe);
 }
 
 /**
@@ -83,8 +86,8 @@ const std::string &Camera::name() const
 	return name_;
 }
 
-Camera::Camera(const std::string &name)
-	: name_(name)
+Camera::Camera(const std::string &name, class PipelineHandler *pipe)
+	: name_(name), pipe_(pipe)
 {
 }
 
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 8cbc10acfbb571fd..48d028f7e6cd9b4d 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -171,7 +171,8 @@ void PipelineHandlerIPU3::registerCameras(CameraManager *manager)
 			continue;
 
 		std::string cameraName = sensor->name() + " " + std::to_string(id);
-		std::shared_ptr<Camera> camera = Camera::create(cameraName);
+		std::shared_ptr<Camera> camera = Camera::create(cameraName,
+								this);
 		manager->addCamera(std::move(camera));
 
 		LOG(IPU3, Info)
diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp
index 3ba69da8b77586e3..3651250b683e7810 100644
--- a/src/libcamera/pipeline/uvcvideo.cpp
+++ b/src/libcamera/pipeline/uvcvideo.cpp
@@ -48,7 +48,7 @@ bool PipelineHandlerUVC::match(CameraManager *manager, DeviceEnumerator *enumera
 
 	dev_->acquire();
 
-	std::shared_ptr<Camera> camera = Camera::create(dev_->model());
+	std::shared_ptr<Camera> camera = Camera::create(dev_->model(), this);
 	manager->addCamera(std::move(camera));
 
 	return true;
diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp
index 82b9237a3d7d93e5..81d8319eb88e06d2 100644
--- a/src/libcamera/pipeline/vimc.cpp
+++ b/src/libcamera/pipeline/vimc.cpp
@@ -57,14 +57,8 @@ bool PipeHandlerVimc::match(CameraManager *manager, DeviceEnumerator *enumerator
 
 	dev_->acquire();
 
-	/*
-	 * NOTE: A more complete Camera implementation could
-	 * be passed the MediaDevice(s) it controls here or
-	 * a reference to the PipelineHandler. Which method
-	 * will be chosen depends on how the Camera
-	 * object is modeled.
-	 */
-	std::shared_ptr<Camera> camera = Camera::create("Dummy VIMC Camera");
+	std::shared_ptr<Camera> camera = Camera::create("Dummy VIMC Camera",
+							this);
 	manager->addCamera(std::move(camera));
 
 	return true;
-- 
2.20.1



More information about the libcamera-devel mailing list