[libcamera-devel] [PATCH v3 05/14] libcamera: camera: Provide a list of ControlInfo
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Mon Jul 1 01:38:08 CEST 2019
From: Kieran Bingham <kieran.bingham at 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 at ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
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 ad2d49d522c5..9b37dfb16b89 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 22db2b93eff2..e4c41b97a354 100644
--- a/src/libcamera/controls.cpp
+++ b/src/libcamera/controls.cpp
@@ -315,6 +315,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 Associates a list of ControlIds 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
More information about the libcamera-devel
mailing list