[libcamera-devel,07/10] libcamera: pipeline_handler: Add Camera properties

Message ID 20191204132106.21582-8-jacopo@jmondi.org
State Superseded
Headers show
Series
  • Introduce camera properties
Related show

Commit Message

Jacopo Mondi Dec. 4, 2019, 1:21 p.m. UTC
Associate to each Camera a ControlList which contains the Camera
properties as created by pipeline handlers in the pipeline handler's
CameraData and provide an operation to retrieve them.

Collect properties from the camera sensor in all pipeline handlers that
support one (IPU3, RKISP1 and VIMC).

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 src/libcamera/include/pipeline_handler.h |  2 ++
 src/libcamera/pipeline/ipu3/ipu3.cpp     |  3 +++
 src/libcamera/pipeline/rkisp1/rkisp1.cpp |  3 +++
 src/libcamera/pipeline/vimc.cpp          |  4 ++++
 src/libcamera/pipeline_handler.cpp       | 19 +++++++++++++++++++
 5 files changed, 31 insertions(+)

Comments

Laurent Pinchart Dec. 4, 2019, 4:14 p.m. UTC | #1
Hi Jacopo,

Thank you for the patch.

On Wed, Dec 04, 2019 at 02:21:03PM +0100, Jacopo Mondi wrote:
> Associate to each Camera a ControlList which contains the Camera
> properties as created by pipeline handlers in the pipeline handler's
> CameraData and provide an operation to retrieve them.
> 
> Collect properties from the camera sensor in all pipeline handlers that
> support one (IPU3, RKISP1 and VIMC).
> 
> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> ---
>  src/libcamera/include/pipeline_handler.h |  2 ++
>  src/libcamera/pipeline/ipu3/ipu3.cpp     |  3 +++
>  src/libcamera/pipeline/rkisp1/rkisp1.cpp |  3 +++
>  src/libcamera/pipeline/vimc.cpp          |  4 ++++
>  src/libcamera/pipeline_handler.cpp       | 19 +++++++++++++++++++
>  5 files changed, 31 insertions(+)
> 
> diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h
> index a02e6e77dc9c..68761cc473c4 100644
> --- a/src/libcamera/include/pipeline_handler.h
> +++ b/src/libcamera/include/pipeline_handler.h
> @@ -43,6 +43,7 @@ public:
>  	PipelineHandler *pipe_;
>  	std::list<Request *> queuedRequests_;
>  	ControlInfoMap controlInfo_;
> +	ControlList properties_;
>  	std::unique_ptr<IPAInterface> ipa_;
>  
>  private:
> @@ -64,6 +65,7 @@ public:
>  	void unlock();
>  
>  	const ControlInfoMap &controls(Camera *camera);
> +	const ControlList &properties(Camera *camera);
>  
>  	virtual CameraConfiguration *generateConfiguration(Camera *camera,
>  		const StreamRoles &roles) = 0;
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index 1c5fccf69428..536a63a30018 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -867,6 +867,9 @@ int PipelineHandlerIPU3::registerCameras()
>  		if (ret)
>  			continue;
>  
> +		/* Initialize the camera properties. */
> +		data->properties_ = cio2->sensor_->properties();
> +
>  		/**
>  		 * \todo Dynamically assign ImgU and output devices to each
>  		 * stream and camera; as of now, limit support to two cameras
> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> index 4a583a7a1d7e..e9a70755f4c5 100644
> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> @@ -888,6 +888,9 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor)
>  	if (ret)
>  		return ret;
>  
> +	/* Initialize the camera properties. */
> +	data->properties_ = data->sensor_->properties();
> +
>  	ret = data->loadIPA();
>  	if (ret)
>  		return ret;
> diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp
> index 06664fed42e7..f043cf55889e 100644
> --- a/src/libcamera/pipeline/vimc.cpp
> +++ b/src/libcamera/pipeline/vimc.cpp
> @@ -454,6 +454,10 @@ int VimcCameraData::init(MediaDevice *media)
>  	}
>  
>  	controlInfo_ = std::move(ctrls);
> +
> +	/* Initialize the camera properties. */
> +	properties_ = sensor_->properties();
> +

It would be nice if we could generalize this a little bit across
pipeline handlers, but that's out of scope for this patch series.

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

>  	return 0;
>  }
>  
> diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
> index 4349ca8957e4..a023fa1001f5 100644
> --- a/src/libcamera/pipeline_handler.cpp
> +++ b/src/libcamera/pipeline_handler.cpp
> @@ -96,6 +96,14 @@ LOG_DEFINE_CATEGORY(Pipeline)
>   * creating the camera, and shall not be modified afterwards.
>   */
>  
> +/**
> + * \var CameraData::properties_
> + * \brief The list of properties supported by the camera
> + *
> + * The list of camera properties shall be initialised by the pipeline handler
> + * when creating the camera, and shall not be modified afterwards.
> + */
> +
>  /**
>   * \var CameraData::ipa_
>   * \brief The IPA module used by the camera
> @@ -244,6 +252,17 @@ const ControlInfoMap &PipelineHandler::controls(Camera *camera)
>  	return data->controlInfo_;
>  }
>  
> +/**
> + * \brief Retrieve the list of properties for a camera
> + * \param[in] camera The camera
> + * \return A ControlList of properties supported by \a camera
> + */
> +const ControlList &PipelineHandler::properties(Camera *camera)
> +{
> +	CameraData *data = cameraData(camera);
> +	return data->properties_;
> +}
> +
>  /**
>   * \fn PipelineHandler::generateConfiguration()
>   * \brief Generate a camera configuration for a specified camera

Patch

diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h
index a02e6e77dc9c..68761cc473c4 100644
--- a/src/libcamera/include/pipeline_handler.h
+++ b/src/libcamera/include/pipeline_handler.h
@@ -43,6 +43,7 @@  public:
 	PipelineHandler *pipe_;
 	std::list<Request *> queuedRequests_;
 	ControlInfoMap controlInfo_;
+	ControlList properties_;
 	std::unique_ptr<IPAInterface> ipa_;
 
 private:
@@ -64,6 +65,7 @@  public:
 	void unlock();
 
 	const ControlInfoMap &controls(Camera *camera);
+	const ControlList &properties(Camera *camera);
 
 	virtual CameraConfiguration *generateConfiguration(Camera *camera,
 		const StreamRoles &roles) = 0;
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 1c5fccf69428..536a63a30018 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -867,6 +867,9 @@  int PipelineHandlerIPU3::registerCameras()
 		if (ret)
 			continue;
 
+		/* Initialize the camera properties. */
+		data->properties_ = cio2->sensor_->properties();
+
 		/**
 		 * \todo Dynamically assign ImgU and output devices to each
 		 * stream and camera; as of now, limit support to two cameras
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index 4a583a7a1d7e..e9a70755f4c5 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -888,6 +888,9 @@  int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor)
 	if (ret)
 		return ret;
 
+	/* Initialize the camera properties. */
+	data->properties_ = data->sensor_->properties();
+
 	ret = data->loadIPA();
 	if (ret)
 		return ret;
diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp
index 06664fed42e7..f043cf55889e 100644
--- a/src/libcamera/pipeline/vimc.cpp
+++ b/src/libcamera/pipeline/vimc.cpp
@@ -454,6 +454,10 @@  int VimcCameraData::init(MediaDevice *media)
 	}
 
 	controlInfo_ = std::move(ctrls);
+
+	/* Initialize the camera properties. */
+	properties_ = sensor_->properties();
+
 	return 0;
 }
 
diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
index 4349ca8957e4..a023fa1001f5 100644
--- a/src/libcamera/pipeline_handler.cpp
+++ b/src/libcamera/pipeline_handler.cpp
@@ -96,6 +96,14 @@  LOG_DEFINE_CATEGORY(Pipeline)
  * creating the camera, and shall not be modified afterwards.
  */
 
+/**
+ * \var CameraData::properties_
+ * \brief The list of properties supported by the camera
+ *
+ * The list of camera properties shall be initialised by the pipeline handler
+ * when creating the camera, and shall not be modified afterwards.
+ */
+
 /**
  * \var CameraData::ipa_
  * \brief The IPA module used by the camera
@@ -244,6 +252,17 @@  const ControlInfoMap &PipelineHandler::controls(Camera *camera)
 	return data->controlInfo_;
 }
 
+/**
+ * \brief Retrieve the list of properties for a camera
+ * \param[in] camera The camera
+ * \return A ControlList of properties supported by \a camera
+ */
+const ControlList &PipelineHandler::properties(Camera *camera)
+{
+	CameraData *data = cameraData(camera);
+	return data->properties_;
+}
+
 /**
  * \fn PipelineHandler::generateConfiguration()
  * \brief Generate a camera configuration for a specified camera