Message ID | 20190701201504.28487-5-laurent.pinchart@ideasonboard.com |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
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
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