diff options
author | Kieran Bingham <kieran.bingham@ideasonboard.com> | 2019-06-27 15:33:04 +0100 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2019-07-02 16:59:28 +0300 |
commit | b9bf9514eb7b08220763d7d72c3b1b83bdfe6ab0 (patch) | |
tree | cecfe4629242b616c0ce16e5e3461d122156d247 | |
parent | 20d5640ca49c76c89be5bebcc00981942c7a9c19 (diff) |
libcamera: camera: Provide a list of ControlInfo
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>
-rw-r--r-- | include/libcamera/camera.h | 3 | ||||
-rw-r--r-- | include/libcamera/controls.h | 2 | ||||
-rw-r--r-- | src/libcamera/camera.cpp | 12 | ||||
-rw-r--r-- | src/libcamera/controls.cpp | 5 | ||||
-rw-r--r-- | src/libcamera/include/pipeline_handler.h | 4 | ||||
-rw-r--r-- | src/libcamera/pipeline_handler.cpp | 19 |
6 files changed, 45 insertions, 0 deletions
diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h index fb2f7ba3..6d693d9a 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 22061559..18293c94 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 617ea99c..592dfd39 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -549,6 +549,18 @@ int Camera::release() } /** + * \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 * * Retrieve all of the camera's static stream information. The static diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp index 7fac1169..cd2cf337 100644 --- a/src/libcamera/controls.cpp +++ b/src/libcamera/controls.cpp @@ -326,6 +326,11 @@ bool operator==(const ControlInfo &lhs, const ControlId &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 a4cbc593..f836d5d1 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 c91ef2f7..0283e4e5 100644 --- a/src/libcamera/pipeline_handler.cpp +++ b/src/libcamera/pipeline_handler.cpp @@ -89,6 +89,14 @@ LOG_DEFINE_CATEGORY(Pipeline) */ /** + * \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 * @@ -218,6 +226,17 @@ void PipelineHandler::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 * \param[in] camera The camera to generate a default configuration for |