[libcamera-devel] [PATCH 2/8] libcamera: pipeline: add name, major version, and minor version

Paul Elder paul.elder at ideasonboard.com
Tue May 28 00:35:34 CEST 2019


In order to match an IPA module with a pipeline handler, the pipeline
handler must have a name and a major and minor version. Add these to
PipelineHandler as functions, so that they can be automatically defined
by REGISTER_PIPELINE_HANDLER. Also update documentation accordingly.

Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
---
 src/libcamera/include/pipeline_handler.h | 20 ++++++++++++++++++--
 src/libcamera/pipeline/ipu3/ipu3.cpp     |  6 +++++-
 src/libcamera/pipeline/rkisp1/rkisp1.cpp |  6 +++++-
 src/libcamera/pipeline/uvcvideo.cpp      |  6 +++++-
 src/libcamera/pipeline/vimc.cpp          |  6 +++++-
 src/libcamera/pipeline_handler.cpp       | 20 ++++++++++++++++++++
 6 files changed, 58 insertions(+), 6 deletions(-)

diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h
index 7da6df1..7963e7a 100644
--- a/src/libcamera/include/pipeline_handler.h
+++ b/src/libcamera/include/pipeline_handler.h
@@ -77,6 +77,10 @@ public:
 	bool completeBuffer(Camera *camera, Request *request, Buffer *buffer);
 	void completeRequest(Camera *camera, Request *request);
 
+	virtual const char *name() = 0;
+	virtual int majorVersion() = 0;
+	virtual int minorVersion() = 0;
+
 protected:
 	void registerCamera(std::shared_ptr<Camera> camera,
 			    std::unique_ptr<CameraData> data);
@@ -112,7 +116,7 @@ private:
 	std::string name_;
 };
 
-#define REGISTER_PIPELINE_HANDLER(handler)				\
+#define REGISTER_PIPELINE_HANDLER(handler, majorV, minorV)		\
 class handler##Factory final : public PipelineHandlerFactory		\
 {									\
 public:									\
@@ -122,7 +126,19 @@ public:									\
 		return std::make_shared<handler>(manager);		\
 	}								\
 };									\
-static handler##Factory global_##handler##Factory;
+static handler##Factory global_##handler##Factory;			\
+const char *handler::name()						\
+{									\
+	return #handler;						\
+}									\
+int handler::majorVersion()						\
+{									\
+	return majorV;							\
+}									\
+int handler::minorVersion()						\
+{									\
+	return minorV;							\
+}
 
 } /* namespace libcamera */
 
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 05005c4..a1b06fe 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -212,6 +212,10 @@ public:
 
 	bool match(DeviceEnumerator *enumerator) override;
 
+	const char *name() override;
+	int majorVersion() override;
+	int minorVersion() override;
+
 private:
 	IPU3CameraData *cameraData(const Camera *camera)
 	{
@@ -1452,6 +1456,6 @@ int CIO2Device::mediaBusToFormat(unsigned int code)
 	}
 }
 
-REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3);
+REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3, 0, 1);
 
 } /* namespace libcamera */
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index 9b3eea2..7042e7f 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -92,6 +92,10 @@ public:
 
 	bool match(DeviceEnumerator *enumerator) override;
 
+	const char *name() override;
+	int majorVersion() override;
+	int minorVersion() override;
+
 private:
 	RkISP1CameraData *cameraData(const Camera *camera)
 	{
@@ -499,6 +503,6 @@ void PipelineHandlerRkISP1::bufferReady(Buffer *buffer)
 	completeRequest(activeCamera_, request);
 }
 
-REGISTER_PIPELINE_HANDLER(PipelineHandlerRkISP1);
+REGISTER_PIPELINE_HANDLER(PipelineHandlerRkISP1, 0, 1);
 
 } /* namespace libcamera */
diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp
index 45260f3..27c731e 100644
--- a/src/libcamera/pipeline/uvcvideo.cpp
+++ b/src/libcamera/pipeline/uvcvideo.cpp
@@ -68,6 +68,10 @@ public:
 
 	bool match(DeviceEnumerator *enumerator) override;
 
+	const char *name() override;
+	int majorVersion() override;
+	int minorVersion() override;
+
 private:
 	UVCCameraData *cameraData(const Camera *camera)
 	{
@@ -263,6 +267,6 @@ void UVCCameraData::bufferReady(Buffer *buffer)
 	pipe_->completeRequest(camera_, request);
 }
 
-REGISTER_PIPELINE_HANDLER(PipelineHandlerUVC);
+REGISTER_PIPELINE_HANDLER(PipelineHandlerUVC, 0, 1);
 
 } /* namespace libcamera */
diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp
index 0e4eede..d3ff527 100644
--- a/src/libcamera/pipeline/vimc.cpp
+++ b/src/libcamera/pipeline/vimc.cpp
@@ -71,6 +71,10 @@ public:
 
 	bool match(DeviceEnumerator *enumerator) override;
 
+	const char *name() override;
+	int majorVersion() override;
+	int minorVersion() override;
+
 private:
 	VimcCameraData *cameraData(const Camera *camera)
 	{
@@ -274,6 +278,6 @@ void VimcCameraData::bufferReady(Buffer *buffer)
 	pipe_->completeRequest(camera_, request);
 }
 
-REGISTER_PIPELINE_HANDLER(PipelineHandlerVimc);
+REGISTER_PIPELINE_HANDLER(PipelineHandlerVimc, 0, 1);
 
 } /* namespace libcamera */
diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
index dd56907..8f83307 100644
--- a/src/libcamera/pipeline_handler.cpp
+++ b/src/libcamera/pipeline_handler.cpp
@@ -505,6 +505,24 @@ CameraData *PipelineHandler::cameraData(const Camera *camera)
  * constant for the whole lifetime of the pipeline handler.
  */
 
+/**
+ * \fn PipelineHandler::name()
+ * \brief Retrieve the pipeline handler name
+ * \return The pipeline handler name
+ */
+
+/**
+ * \fn PipelineHandler::majorVersion()
+ * \brief Retrieve the pipeline handler major version
+ * \return The pipeline handler major version
+ */
+
+/**
+ * \fn PipelineHandler::minorVersion()
+ * \brief Retrieve the pipeline handler minor version
+ * \return The pipeline handler minor version
+ */
+
 /**
  * \class PipelineHandlerFactory
  * \brief Registration of PipelineHandler classes and creation of instances
@@ -586,6 +604,8 @@ std::vector<PipelineHandlerFactory *> &PipelineHandlerFactory::factories()
  * \def REGISTER_PIPELINE_HANDLER
  * \brief Register a pipeline handler with the pipeline handler factory
  * \param[in] handler Class name of PipelineHandler derived class to register
+ * \param[in] majorV Major version of the PipelineHandler
+ * \param[in] minorV Minor version of the PipelineHandler
  *
  * Register a PipelineHandler subclass with the factory and make it available to
  * try and match devices.
-- 
2.20.1



More information about the libcamera-devel mailing list