Message ID | 20191007224642.6597-10-laurent.pinchart@ideasonboard.com |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
Hi Laurent, On Tue, Oct 08, 2019 at 01:46:42AM +0300, Laurent Pinchart wrote: > Add a ControlValidator specialisation that validates controls based on a > V4L2 device. > > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > --- > src/libcamera/include/v4l2_controls.h | 14 ++++++++++++ > src/libcamera/v4l2_controls.cpp | 33 +++++++++++++++++++++++++++ > 2 files changed, 47 insertions(+) > > diff --git a/src/libcamera/include/v4l2_controls.h b/src/libcamera/include/v4l2_controls.h > index 133ab9ec208b..5fd92e3ac4e5 100644 > --- a/src/libcamera/include/v4l2_controls.h > +++ b/src/libcamera/include/v4l2_controls.h > @@ -17,6 +17,8 @@ > > #include <libcamera/controls.h> > > +#include "control_validator.h" > + > namespace libcamera { > > class V4L2ControlId : public ControlId > @@ -57,6 +59,18 @@ private: > const V4L2ControlInfoMap &controls_; > }; > > +class V4L2ControlValidator final : public ControlValidator > +{ > +public: > + V4L2ControlValidator(V4L2Device *device); > + > + const std::string &name() const override; > + bool validate(const ControlId &id) const override; > + > +private: > + V4L2Device *dev_; > +}; > + > } /* namespace libcamera */ > > #endif /* __LIBCAMERA_V4L2_CONTROLS_H__ */ > diff --git a/src/libcamera/v4l2_controls.cpp b/src/libcamera/v4l2_controls.cpp > index d3f94709e821..498567ee0bf0 100644 > --- a/src/libcamera/v4l2_controls.cpp > +++ b/src/libcamera/v4l2_controls.cpp > @@ -239,4 +239,37 @@ void V4L2ControlList::set(unsigned int id, const ControlValue &value) > ControlList::set(ctrl->second.id(), value); > } > > +/** > + * \class V4L2ControlValidator > + * \brief A control validator for V4L2Devoe instances V4L2Device > + * > + * This ControlValidator specialisation validates that controls exist in the > + * V4L2Device associated with the validator. > + */ > + > +/** > + * \brief Construst a V4L2ControlValidator for the V4L2 \a device > + * \param[in] device The V4L2 device > + */ > +V4L2ControlValidator::V4L2ControlValidator(V4L2Device *device) > + : dev_(device) > +{ > +} > + > +const std::string &V4L2ControlValidator::name() const > +{ > + return dev_->deviceNode(); > +} > + > +/** > + * \brief Validate a control > + * \param[in] id The control ID > + * \return True if the control is valid, false otherwise I would expand what "valid" means in this context. All validators 'validates' controls, this one does it against the list of controls supported by the video device. Thanks j > + */ > +bool V4L2ControlValidator::validate(const ControlId &id) const > +{ > + const V4L2ControlInfoMap &controls = dev_->controls(); > + return controls.find(id.id()) != controls.end(); The fact std::map::contains(T key) has only been introduced in C++ is really a shame, we have this find() == end() pattern everywhere :( > +} > + > } /* namespace libcamera */ > -- > Regards, > > Laurent Pinchart > > _______________________________________________ > libcamera-devel mailing list > libcamera-devel@lists.libcamera.org > https://lists.libcamera.org/listinfo/libcamera-devel
Hi Jacopo, On Wed, Oct 09, 2019 at 11:27:39AM +0200, Jacopo Mondi wrote: > On Tue, Oct 08, 2019 at 01:46:42AM +0300, Laurent Pinchart wrote: > > Add a ControlValidator specialisation that validates controls based on a > > V4L2 device. > > > > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > --- > > src/libcamera/include/v4l2_controls.h | 14 ++++++++++++ > > src/libcamera/v4l2_controls.cpp | 33 +++++++++++++++++++++++++++ > > 2 files changed, 47 insertions(+) > > > > diff --git a/src/libcamera/include/v4l2_controls.h b/src/libcamera/include/v4l2_controls.h > > index 133ab9ec208b..5fd92e3ac4e5 100644 > > --- a/src/libcamera/include/v4l2_controls.h > > +++ b/src/libcamera/include/v4l2_controls.h > > @@ -17,6 +17,8 @@ > > > > #include <libcamera/controls.h> > > > > +#include "control_validator.h" > > + > > namespace libcamera { > > > > class V4L2ControlId : public ControlId > > @@ -57,6 +59,18 @@ private: > > const V4L2ControlInfoMap &controls_; > > }; > > > > +class V4L2ControlValidator final : public ControlValidator > > +{ > > +public: > > + V4L2ControlValidator(V4L2Device *device); > > + > > + const std::string &name() const override; > > + bool validate(const ControlId &id) const override; > > + > > +private: > > + V4L2Device *dev_; > > +}; > > + > > } /* namespace libcamera */ > > > > #endif /* __LIBCAMERA_V4L2_CONTROLS_H__ */ > > diff --git a/src/libcamera/v4l2_controls.cpp b/src/libcamera/v4l2_controls.cpp > > index d3f94709e821..498567ee0bf0 100644 > > --- a/src/libcamera/v4l2_controls.cpp > > +++ b/src/libcamera/v4l2_controls.cpp > > @@ -239,4 +239,37 @@ void V4L2ControlList::set(unsigned int id, const ControlValue &value) > > ControlList::set(ctrl->second.id(), value); > > } > > > > +/** > > + * \class V4L2ControlValidator > > + * \brief A control validator for V4L2Devoe instances > > V4L2Device Probably better than introducing a V4L2Devoe class, yes. > > + * > > + * This ControlValidator specialisation validates that controls exist in the > > + * V4L2Device associated with the validator. > > + */ > > + > > +/** > > + * \brief Construst a V4L2ControlValidator for the V4L2 \a device > > + * \param[in] device The V4L2 device > > + */ > > +V4L2ControlValidator::V4L2ControlValidator(V4L2Device *device) > > + : dev_(device) > > +{ > > +} > > + > > +const std::string &V4L2ControlValidator::name() const > > +{ > > + return dev_->deviceNode(); > > +} > > + > > +/** > > + * \brief Validate a control > > + * \param[in] id The control ID > > + * \return True if the control is valid, false otherwise > > I would expand what "valid" means in this context. > All validators 'validates' controls, this one does it against the list > of controls supported by the video device. "A control is considered valid if it is supported by the V4L2Device associated with the validator." ? > > + */ > > +bool V4L2ControlValidator::validate(const ControlId &id) const > > +{ > > + const V4L2ControlInfoMap &controls = dev_->controls(); > > + return controls.find(id.id()) != controls.end(); > > The fact std::map::contains(T key) has only been introduced in C++ is > really a shame, we have this find() == end() pattern everywhere :( I know :-( At some point we could bump our minimal C++ version, but C++20 is definitely too recent. > > +} > > + > > } /* namespace libcamera */
Hi Laurent, On Wed, Oct 09, 2019 at 12:48:36PM +0300, Laurent Pinchart wrote: > Hi Jacopo, > > On Wed, Oct 09, 2019 at 11:27:39AM +0200, Jacopo Mondi wrote: > > On Tue, Oct 08, 2019 at 01:46:42AM +0300, Laurent Pinchart wrote: > > > Add a ControlValidator specialisation that validates controls based on a > > > V4L2 device. > > > > > > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > > --- > > > src/libcamera/include/v4l2_controls.h | 14 ++++++++++++ > > > src/libcamera/v4l2_controls.cpp | 33 +++++++++++++++++++++++++++ > > > 2 files changed, 47 insertions(+) > > > > > > diff --git a/src/libcamera/include/v4l2_controls.h b/src/libcamera/include/v4l2_controls.h > > > index 133ab9ec208b..5fd92e3ac4e5 100644 > > > --- a/src/libcamera/include/v4l2_controls.h > > > +++ b/src/libcamera/include/v4l2_controls.h > > > @@ -17,6 +17,8 @@ > > > > > > #include <libcamera/controls.h> > > > > > > +#include "control_validator.h" > > > + > > > namespace libcamera { > > > > > > class V4L2ControlId : public ControlId > > > @@ -57,6 +59,18 @@ private: > > > const V4L2ControlInfoMap &controls_; > > > }; > > > > > > +class V4L2ControlValidator final : public ControlValidator > > > +{ > > > +public: > > > + V4L2ControlValidator(V4L2Device *device); > > > + > > > + const std::string &name() const override; > > > + bool validate(const ControlId &id) const override; > > > + > > > +private: > > > + V4L2Device *dev_; > > > +}; > > > + > > > } /* namespace libcamera */ > > > > > > #endif /* __LIBCAMERA_V4L2_CONTROLS_H__ */ > > > diff --git a/src/libcamera/v4l2_controls.cpp b/src/libcamera/v4l2_controls.cpp > > > index d3f94709e821..498567ee0bf0 100644 > > > --- a/src/libcamera/v4l2_controls.cpp > > > +++ b/src/libcamera/v4l2_controls.cpp > > > @@ -239,4 +239,37 @@ void V4L2ControlList::set(unsigned int id, const ControlValue &value) > > > ControlList::set(ctrl->second.id(), value); > > > } > > > > > > +/** > > > + * \class V4L2ControlValidator > > > + * \brief A control validator for V4L2Devoe instances > > > > V4L2Device > > Probably better than introducing a V4L2Devoe class, yes. > > > > + * > > > + * This ControlValidator specialisation validates that controls exist in the > > > + * V4L2Device associated with the validator. > > > + */ > > > + > > > +/** > > > + * \brief Construst a V4L2ControlValidator for the V4L2 \a device > > > + * \param[in] device The V4L2 device > > > + */ > > > +V4L2ControlValidator::V4L2ControlValidator(V4L2Device *device) > > > + : dev_(device) > > > +{ > > > +} > > > + > > > +const std::string &V4L2ControlValidator::name() const > > > +{ > > > + return dev_->deviceNode(); > > > +} > > > + > > > +/** > > > + * \brief Validate a control > > > + * \param[in] id The control ID > > > + * \return True if the control is valid, false otherwise > > > > I would expand what "valid" means in this context. > > All validators 'validates' controls, this one does it against the list > > of controls supported by the video device. > > "A control is considered valid if it is supported by the V4L2Device > associated with the validator." ? > Better, thanks! > > > + */ > > > +bool V4L2ControlValidator::validate(const ControlId &id) const > > > +{ > > > + const V4L2ControlInfoMap &controls = dev_->controls(); > > > + return controls.find(id.id()) != controls.end(); > > > > The fact std::map::contains(T key) has only been introduced in C++ is > > really a shame, we have this find() == end() pattern everywhere :( > > I know :-( At some point we could bump our minimal C++ version, but > C++20 is definitely too recent. > Not just too recent, it's in the future!1!1 Thanks j > > > +} > > > + > > > } /* namespace libcamera */ > > -- > Regards, > > Laurent Pinchart
diff --git a/src/libcamera/include/v4l2_controls.h b/src/libcamera/include/v4l2_controls.h index 133ab9ec208b..5fd92e3ac4e5 100644 --- a/src/libcamera/include/v4l2_controls.h +++ b/src/libcamera/include/v4l2_controls.h @@ -17,6 +17,8 @@ #include <libcamera/controls.h> +#include "control_validator.h" + namespace libcamera { class V4L2ControlId : public ControlId @@ -57,6 +59,18 @@ private: const V4L2ControlInfoMap &controls_; }; +class V4L2ControlValidator final : public ControlValidator +{ +public: + V4L2ControlValidator(V4L2Device *device); + + const std::string &name() const override; + bool validate(const ControlId &id) const override; + +private: + V4L2Device *dev_; +}; + } /* namespace libcamera */ #endif /* __LIBCAMERA_V4L2_CONTROLS_H__ */ diff --git a/src/libcamera/v4l2_controls.cpp b/src/libcamera/v4l2_controls.cpp index d3f94709e821..498567ee0bf0 100644 --- a/src/libcamera/v4l2_controls.cpp +++ b/src/libcamera/v4l2_controls.cpp @@ -239,4 +239,37 @@ void V4L2ControlList::set(unsigned int id, const ControlValue &value) ControlList::set(ctrl->second.id(), value); } +/** + * \class V4L2ControlValidator + * \brief A control validator for V4L2Devoe instances + * + * This ControlValidator specialisation validates that controls exist in the + * V4L2Device associated with the validator. + */ + +/** + * \brief Construst a V4L2ControlValidator for the V4L2 \a device + * \param[in] device The V4L2 device + */ +V4L2ControlValidator::V4L2ControlValidator(V4L2Device *device) + : dev_(device) +{ +} + +const std::string &V4L2ControlValidator::name() const +{ + return dev_->deviceNode(); +} + +/** + * \brief Validate a control + * \param[in] id The control ID + * \return True if the control is valid, false otherwise + */ +bool V4L2ControlValidator::validate(const ControlId &id) const +{ + const V4L2ControlInfoMap &controls = dev_->controls(); + return controls.find(id.id()) != controls.end(); +} + } /* namespace libcamera */
Add a ControlValidator specialisation that validates controls based on a V4L2 device. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> --- src/libcamera/include/v4l2_controls.h | 14 ++++++++++++ src/libcamera/v4l2_controls.cpp | 33 +++++++++++++++++++++++++++ 2 files changed, 47 insertions(+)