[libcamera-devel] [PATCH 6/9] libcamera: v4l2_controls: Add V4L2ControlId

Laurent Pinchart laurent.pinchart at ideasonboard.com
Wed Oct 9 11:05:49 CEST 2019


Hi Jacopo,

On Wed, Oct 09, 2019 at 10:35:20AM +0200, Jacopo Mondi wrote:
> On Tue, Oct 08, 2019 at 01:46:39AM +0300, Laurent Pinchart wrote:
> > Add a V4L2 specialisation of the ControlId class, in order to construct
> > a ControlId from a v4l2_query_ext_ctrl. This is needed in order to use
> > ControlList for V4L2 controls.
> >
> > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > ---
> >  src/libcamera/include/v4l2_controls.h | 12 +++--
> >  src/libcamera/v4l2_controls.cpp       | 67 +++++++++++++++++++++++----
> >  src/libcamera/v4l2_device.cpp         |  4 +-
> >  3 files changed, 68 insertions(+), 15 deletions(-)
> >
> > diff --git a/src/libcamera/include/v4l2_controls.h b/src/libcamera/include/v4l2_controls.h
> > index b39370b2e90e..71ce377fe4c5 100644
> > --- a/src/libcamera/include/v4l2_controls.h
> > +++ b/src/libcamera/include/v4l2_controls.h
> > @@ -20,23 +20,27 @@
> >
> >  namespace libcamera {
> >
> > +class V4L2ControlId : public ControlId
> > +{
> > +public:
> > +	V4L2ControlId(const struct v4l2_query_ext_ctrl &ctrl);
> > +};
> > +
> 
> This only add a constructor without any field. Do we need inheritance
> or can we just add a constructor to ControlId ?

We could, but I think it's best to keep the ControlId constructor
protected, otherwise applications could create new ControlId instances.

> >  class V4L2ControlInfo
> >  {
> >  public:
> >  	V4L2ControlInfo(const struct v4l2_query_ext_ctrl &ctrl);
> >
> > -	unsigned int id() const { return id_; }
> > +	const ControlId &id() const { return id_; }
> >  	unsigned int type() const { return type_; }
> >  	size_t size() const { return size_; }
> > -	const std::string &name() const { return name_; }
> >
> >  	const ControlRange &range() const { return range_; }
> >
> >  private:
> > -	unsigned int id_;
> > +	V4L2ControlId id_;
> >  	unsigned int type_;
> >  	size_t size_;
> > -	std::string name_;
> >
> >  	ControlRange range_;
> >  };
> > diff --git a/src/libcamera/v4l2_controls.cpp b/src/libcamera/v4l2_controls.cpp
> > index 6f5f1578b139..a630a2583d33 100644
> > --- a/src/libcamera/v4l2_controls.cpp
> > +++ b/src/libcamera/v4l2_controls.cpp
> > @@ -7,6 +7,8 @@
> >
> >  #include "v4l2_controls.h"
> >
> > +#include <string.h>
> > +
> >  /**
> >   * \file v4l2_controls.h
> >   * \brief Support for V4L2 Controls using the V4L2 Extended Controls APIs
> > @@ -47,6 +49,60 @@
> >
> >  namespace libcamera {
> >
> > +namespace {
> > +
> > +std::string v4l2_ctrl_name(const struct v4l2_query_ext_ctrl &ctrl)
> > +{
> > +	size_t len = strnlen(ctrl.name, sizeof(ctrl.name));
> > +	return std::string(static_cast<const char *>(ctrl.name), len);
> > +}
> > +
> > +ControlType v4l2_ctrl_type(const struct v4l2_query_ext_ctrl &ctrl)
> > +{
> > +	switch (ctrl.type) {
> > +	case V4L2_CTRL_TYPE_BOOLEAN:
> > +		return ControlTypeBool;
> > +
> > +	case V4L2_CTRL_TYPE_INTEGER:
> > +		return ControlTypeInteger32;
> > +
> > +	case V4L2_CTRL_TYPE_INTEGER64:
> > +		return ControlTypeInteger64;
> > +
> > +	case V4L2_CTRL_TYPE_MENU:
> > +	case V4L2_CTRL_TYPE_BUTTON:
> > +	case V4L2_CTRL_TYPE_BITMASK:
> > +	case V4L2_CTRL_TYPE_INTEGER_MENU:
> > +		/*
> > +		 * More precise types may be needed, for now use a 32-bit
> > +		 * integer type.
> > +		 */
> > +		return ControlTypeInteger32;
> > +
> > +	default:
> > +		return ControlTypeNone;
> > +	}
> > +}
> 
> Probably it's ok to have inheritance as we need this in
> v4l2_controls.cpp
> 
> This considered
> Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
> 
> > +
> > +} /* namespace */
> > +
> > +/**
> > + * \class V4L2ControlId
> > + * \brief V4L2 control static metadata
> > + *
> > + * The V4L2ControlId class is a specialisation of the ControlId for V4L2
> > + * controls.
> > + */
> > +
> > +/**
> > + * \brief Construct a V4L2ControlId from a struct v4l2_query_ext_ctrl
> > + * \param[in] ctrl The struct v4l2_query_ext_ctrl as returned by the kernel
> > + */
> > +V4L2ControlId::V4L2ControlId(const struct v4l2_query_ext_ctrl &ctrl)
> > +	: ControlId(ctrl.id, v4l2_ctrl_name(ctrl), v4l2_ctrl_type(ctrl))
> > +{
> > +}
> > +
> >  /**
> >   * \class V4L2ControlInfo
> >   * \brief Information on a V4L2 control
> > @@ -66,13 +122,12 @@ namespace libcamera {
> >
> >  /**
> >   * \brief Construct a V4L2ControlInfo from a struct v4l2_query_ext_ctrl
> > - * \param ctrl The struct v4l2_query_ext_ctrl as returned by the kernel
> > + * \param[in] ctrl The struct v4l2_query_ext_ctrl as returned by the kernel
> >   */
> >  V4L2ControlInfo::V4L2ControlInfo(const struct v4l2_query_ext_ctrl &ctrl)
> > +	: id_(ctrl)
> >  {
> > -	id_ = ctrl.id;
> >  	type_ = ctrl.type;
> > -	name_ = static_cast<const char *>(ctrl.name);
> >  	size_ = ctrl.elem_size * ctrl.elems;
> >
> >  	if (ctrl.type == V4L2_CTRL_TYPE_INTEGER64)
> > @@ -101,12 +156,6 @@ V4L2ControlInfo::V4L2ControlInfo(const struct v4l2_query_ext_ctrl &ctrl)
> >   * \return The V4L2 control value data size
> >   */
> >
> > -/**
> > - * \fn V4L2ControlInfo::name()
> > - * \brief Retrieve the control user readable name
> > - * \return The V4L2 control user readable name
> > - */
> > -
> >  /**
> >   * \fn V4L2ControlInfo::range()
> >   * \brief Retrieve the control value range
> > diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp
> > index 3bd82ff23212..466c3d41f6e3 100644
> > --- a/src/libcamera/v4l2_device.cpp
> > +++ b/src/libcamera/v4l2_device.cpp
> > @@ -184,7 +184,7 @@ int V4L2Device::getControls(V4L2ControlList *ctrls)
> >
> >  		const V4L2ControlInfo *info = &iter->second;
> >  		controlInfo[i] = info;
> > -		v4l2Ctrls[i].id = info->id();
> > +		v4l2Ctrls[i].id = ctrl->id();
> >  	}
> >
> >  	struct v4l2_ext_controls v4l2ExtCtrls = {};
> > @@ -259,7 +259,7 @@ int V4L2Device::setControls(V4L2ControlList *ctrls)
> >
> >  		const V4L2ControlInfo *info = &iter->second;
> >  		controlInfo[i] = info;
> > -		v4l2Ctrls[i].id = info->id();
> > +		v4l2Ctrls[i].id = ctrl->id();
> >
> >  		/* Set the v4l2_ext_control value for the write operation. */
> >  		switch (info->type()) {

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list