[libcamera-devel,v4,04/13] libcamera: camera: Provide a list of ControlInfo

Message ID 20190701201504.28487-5-laurent.pinchart@ideasonboard.com
State Accepted
Headers show
Series
  • libcamera Controls
Related show

Commit Message

Laurent Pinchart July 1, 2019, 8:14 p.m. UTC
From: Kieran Bingham <kieran.bingham@ideasonboard.com>

Extend the Camera class to expose the controls it supports. Each
pipeline should generate a list of controls supported by each camera it
creates. These are represented by a ControlInfoMap, and an associated
ControlList of default values.

Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
---
 include/libcamera/camera.h               |  3 +++
 include/libcamera/controls.h             |  2 ++
 src/libcamera/camera.cpp                 | 12 ++++++++++++
 src/libcamera/controls.cpp               |  5 +++++
 src/libcamera/include/pipeline_handler.h |  4 ++++
 src/libcamera/pipeline_handler.cpp       | 19 +++++++++++++++++++
 6 files changed, 45 insertions(+)

Comments

Niklas Söderlund July 2, 2019, 12:01 a.m. UTC | #1
Hi Kieran,

Thanks for your work.

On 2019-07-01 23:14:55 +0300, Laurent Pinchart wrote:
> From: Kieran Bingham <kieran.bingham@ideasonboard.com>
> 
> Extend the Camera class to expose the controls it supports. Each
> pipeline should generate a list of controls supported by each camera it
> creates. These are represented by a ControlInfoMap, and an associated
> ControlList of default values.
> 
> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>

Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>

> ---
>  include/libcamera/camera.h               |  3 +++
>  include/libcamera/controls.h             |  2 ++
>  src/libcamera/camera.cpp                 | 12 ++++++++++++
>  src/libcamera/controls.cpp               |  5 +++++
>  src/libcamera/include/pipeline_handler.h |  4 ++++
>  src/libcamera/pipeline_handler.cpp       | 19 +++++++++++++++++++
>  6 files changed, 45 insertions(+)
> 
> diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h
> index fb2f7ba3423c..6d693d9a6c7a 100644
> --- a/include/libcamera/camera.h
> +++ b/include/libcamera/camera.h
> @@ -12,6 +12,7 @@
>  #include <set>
>  #include <string>
>  
> +#include <libcamera/controls.h>
>  #include <libcamera/request.h>
>  #include <libcamera/signal.h>
>  #include <libcamera/stream.h>
> @@ -83,6 +84,8 @@ public:
>  	int acquire();
>  	int release();
>  
> +	const ControlInfoMap &controls();
> +
>  	const std::set<Stream *> &streams() const;
>  	std::unique_ptr<CameraConfiguration> generateConfiguration(const StreamRoles &roles);
>  	int configure(CameraConfiguration *config);
> diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
> index 2206155909ca..18293c9462cf 100644
> --- a/include/libcamera/controls.h
> +++ b/include/libcamera/controls.h
> @@ -99,6 +99,8 @@ static inline bool operator!=(const ControlInfo &lhs, const ControlId &rhs)
>  	return !(lhs == rhs);
>  }
>  
> +using ControlInfoMap = std::unordered_map<ControlId, ControlInfo>;
> +
>  class ControlList
>  {
>  private:
> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
> index 617ea99cdf71..592dfd39eacc 100644
> --- a/src/libcamera/camera.cpp
> +++ b/src/libcamera/camera.cpp
> @@ -548,6 +548,18 @@ int Camera::release()
>  	return 0;
>  }
>  
> +/**
> + * \brief Retrieve the list of controls supported by the camera
> + *
> + * Camera controls remain constant through the lifetime of the camera.
> + *
> + * \return A ControlInfoMap listing the controls supported by the camera
> + */
> +const ControlInfoMap &Camera::controls()
> +{
> +	return pipe_->controls(this);
> +}
> +
>  /**
>   * \brief Retrieve all the camera's stream information
>   *
> diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
> index 7fac1169cbfd..cd2cf337b379 100644
> --- a/src/libcamera/controls.cpp
> +++ b/src/libcamera/controls.cpp
> @@ -325,6 +325,11 @@ bool operator==(const ControlInfo &lhs, const ControlId &rhs)
>  	return lhs.id() == rhs;
>  }
>  
> +/**
> + * \typedef ControlInfoMap
> + * \brief A map of ControlId to ControlInfo
> + */
> +
>  /**
>   * \class ControlList
>   * \brief Associate a list of ControlId with their values for a camera
> diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h
> index a4cbc593a179..f836d5d1a600 100644
> --- a/src/libcamera/include/pipeline_handler.h
> +++ b/src/libcamera/include/pipeline_handler.h
> @@ -14,6 +14,7 @@
>  #include <string>
>  #include <vector>
>  
> +#include <libcamera/controls.h>
>  #include <libcamera/stream.h>
>  
>  namespace libcamera {
> @@ -41,6 +42,7 @@ public:
>  	Camera *camera_;
>  	PipelineHandler *pipe_;
>  	std::list<Request *> queuedRequests_;
> +	ControlInfoMap controlInfo_;
>  
>  private:
>  	CameraData(const CameraData &) = delete;
> @@ -60,6 +62,8 @@ public:
>  	bool lock();
>  	void unlock();
>  
> +	const ControlInfoMap &controls(Camera *camera);
> +
>  	virtual CameraConfiguration *generateConfiguration(Camera *camera,
>  		const StreamRoles &roles) = 0;
>  	virtual int configure(Camera *camera, CameraConfiguration *config) = 0;
> diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
> index c91ef2f7d336..0283e4e5ad51 100644
> --- a/src/libcamera/pipeline_handler.cpp
> +++ b/src/libcamera/pipeline_handler.cpp
> @@ -88,6 +88,14 @@ LOG_DEFINE_CATEGORY(Pipeline)
>   * PipelineHandler::completeRequest()
>   */
>  
> +/**
> + * \var CameraData::controlInfo_
> + * \brief The set of controls supported by the camera
> + *
> + * The control information shall be initialised by the pipeline handler when
> + * creating the camera, and shall not be modified afterwards.
> + */
> +
>  /**
>   * \class PipelineHandler
>   * \brief Create and manage cameras based on a set of media devices
> @@ -217,6 +225,17 @@ void PipelineHandler::unlock()
>  		media->unlock();
>  }
>  
> +/**
> + * \brief Retrieve the list of controls for a camera
> + * \param[in] camera The camera
> + * \return A ControlInfoMap listing the controls support by \a camera
> + */
> +const ControlInfoMap &PipelineHandler::controls(Camera *camera)
> +{
> +	CameraData *data = cameraData(camera);
> +	return data->controlInfo_;
> +}
> +
>  /**
>   * \fn PipelineHandler::generateConfiguration()
>   * \brief Generate a camera configuration for a specified camera
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel@lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel

Patch

diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h
index fb2f7ba3423c..6d693d9a6c7a 100644
--- a/include/libcamera/camera.h
+++ b/include/libcamera/camera.h
@@ -12,6 +12,7 @@ 
 #include <set>
 #include <string>
 
+#include <libcamera/controls.h>
 #include <libcamera/request.h>
 #include <libcamera/signal.h>
 #include <libcamera/stream.h>
@@ -83,6 +84,8 @@  public:
 	int acquire();
 	int release();
 
+	const ControlInfoMap &controls();
+
 	const std::set<Stream *> &streams() const;
 	std::unique_ptr<CameraConfiguration> generateConfiguration(const StreamRoles &roles);
 	int configure(CameraConfiguration *config);
diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
index 2206155909ca..18293c9462cf 100644
--- a/include/libcamera/controls.h
+++ b/include/libcamera/controls.h
@@ -99,6 +99,8 @@  static inline bool operator!=(const ControlInfo &lhs, const ControlId &rhs)
 	return !(lhs == rhs);
 }
 
+using ControlInfoMap = std::unordered_map<ControlId, ControlInfo>;
+
 class ControlList
 {
 private:
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
index 617ea99cdf71..592dfd39eacc 100644
--- a/src/libcamera/camera.cpp
+++ b/src/libcamera/camera.cpp
@@ -548,6 +548,18 @@  int Camera::release()
 	return 0;
 }
 
+/**
+ * \brief Retrieve the list of controls supported by the camera
+ *
+ * Camera controls remain constant through the lifetime of the camera.
+ *
+ * \return A ControlInfoMap listing the controls supported by the camera
+ */
+const ControlInfoMap &Camera::controls()
+{
+	return pipe_->controls(this);
+}
+
 /**
  * \brief Retrieve all the camera's stream information
  *
diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
index 7fac1169cbfd..cd2cf337b379 100644
--- a/src/libcamera/controls.cpp
+++ b/src/libcamera/controls.cpp
@@ -325,6 +325,11 @@  bool operator==(const ControlInfo &lhs, const ControlId &rhs)
 	return lhs.id() == rhs;
 }
 
+/**
+ * \typedef ControlInfoMap
+ * \brief A map of ControlId to ControlInfo
+ */
+
 /**
  * \class ControlList
  * \brief Associate a list of ControlId with their values for a camera
diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h
index a4cbc593a179..f836d5d1a600 100644
--- a/src/libcamera/include/pipeline_handler.h
+++ b/src/libcamera/include/pipeline_handler.h
@@ -14,6 +14,7 @@ 
 #include <string>
 #include <vector>
 
+#include <libcamera/controls.h>
 #include <libcamera/stream.h>
 
 namespace libcamera {
@@ -41,6 +42,7 @@  public:
 	Camera *camera_;
 	PipelineHandler *pipe_;
 	std::list<Request *> queuedRequests_;
+	ControlInfoMap controlInfo_;
 
 private:
 	CameraData(const CameraData &) = delete;
@@ -60,6 +62,8 @@  public:
 	bool lock();
 	void unlock();
 
+	const ControlInfoMap &controls(Camera *camera);
+
 	virtual CameraConfiguration *generateConfiguration(Camera *camera,
 		const StreamRoles &roles) = 0;
 	virtual int configure(Camera *camera, CameraConfiguration *config) = 0;
diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
index c91ef2f7d336..0283e4e5ad51 100644
--- a/src/libcamera/pipeline_handler.cpp
+++ b/src/libcamera/pipeline_handler.cpp
@@ -88,6 +88,14 @@  LOG_DEFINE_CATEGORY(Pipeline)
  * PipelineHandler::completeRequest()
  */
 
+/**
+ * \var CameraData::controlInfo_
+ * \brief The set of controls supported by the camera
+ *
+ * The control information shall be initialised by the pipeline handler when
+ * creating the camera, and shall not be modified afterwards.
+ */
+
 /**
  * \class PipelineHandler
  * \brief Create and manage cameras based on a set of media devices
@@ -217,6 +225,17 @@  void PipelineHandler::unlock()
 		media->unlock();
 }
 
+/**
+ * \brief Retrieve the list of controls for a camera
+ * \param[in] camera The camera
+ * \return A ControlInfoMap listing the controls support by \a camera
+ */
+const ControlInfoMap &PipelineHandler::controls(Camera *camera)
+{
+	CameraData *data = cameraData(camera);
+	return data->controlInfo_;
+}
+
 /**
  * \fn PipelineHandler::generateConfiguration()
  * \brief Generate a camera configuration for a specified camera