[libcamera-devel] [PATCH v3 02/14] libcamera: v4l2_controls: Add min and max to V4L2ControlInfo

Laurent Pinchart laurent.pinchart at ideasonboard.com
Mon Jul 1 17:50:50 CEST 2019


Hi Jacopo,

On Mon, Jul 01, 2019 at 04:56:26PM +0200, Jacopo Mondi wrote:
> Hi Laurent,
> 
> On Mon, Jul 01, 2019 at 02:38:05AM +0300, Laurent Pinchart wrote:
> > Add min() and max() methods to V4L2ControlInfo to report the control's
> > minimum and maximum value respectively.
> >
> > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > ---
> >  src/libcamera/include/v4l2_controls.h |  6 ++++++
> >  src/libcamera/v4l2_controls.cpp       | 14 ++++++++++++++
> >  2 files changed, 20 insertions(+)
> >
> > diff --git a/src/libcamera/include/v4l2_controls.h b/src/libcamera/include/v4l2_controls.h
> > index 2c8cb9003f25..0047efab11fa 100644
> > --- a/src/libcamera/include/v4l2_controls.h
> > +++ b/src/libcamera/include/v4l2_controls.h
> > @@ -28,11 +28,17 @@ public:
> >  	size_t size() const { return size_; }
> >  	const std::string &name() const { return name_; }
> >
> > +	int64_t min() const { return min_; }
> > +	int64_t max() const { return max_; }
> > +
> >  private:
> >  	unsigned int id_;
> >  	unsigned int type_;
> >  	size_t size_;
> >  	std::string name_;
> > +
> > +	int64_t min_;
> > +	int64_t max_;
> >  };
> >
> >  class V4L2Control
> > diff --git a/src/libcamera/v4l2_controls.cpp b/src/libcamera/v4l2_controls.cpp
> > index 78888de29642..af017bce48ba 100644
> > --- a/src/libcamera/v4l2_controls.cpp
> > +++ b/src/libcamera/v4l2_controls.cpp
> > @@ -74,6 +74,8 @@ V4L2ControlInfo::V4L2ControlInfo(const struct v4l2_query_ext_ctrl &ctrl)
> >  	type_ = ctrl.type;
> >  	name_ = static_cast<const char *>(ctrl.name);
> >  	size_ = ctrl.elem_size * ctrl.elems;
> > +	min_ = ctrl.minimum;
> > +	max_ = ctrl.maximum;
> 
> Please note that ctrl.minimum and ctrl.maximum are meaningful only for
> some of the types the v4l2_device supports at enumeration time
> 
> 		V4L2ControlInfo info(ctrl);
> 		switch (info.type()) {
> 		case V4L2_CTRL_TYPE_INTEGER:
> 		case V4L2_CTRL_TYPE_BOOLEAN:
> 		case V4L2_CTRL_TYPE_MENU:
> 		case V4L2_CTRL_TYPE_BUTTON:
> 		case V4L2_CTRL_TYPE_INTEGER64:
> 		case V4L2_CTRL_TYPE_BITMASK:
> 		case V4L2_CTRL_TYPE_INTEGER_MENU:
> 			break;
> 		/* \todo Support compound controls. */
> 		default:
> 			LOG(V4L2, Debug) << "Control type '" << info.type()
> 					 << "' not supported";
> 			continue;
> 		}
> 
> 		controls_.emplace(ctrl.id, info);
> 
> https://www.kernel.org/doc/html/v5.0/media/uapi/v4l/vidioc-queryctrl.html#c.v4l2_ctrl_type
> 
> The most problematic one seems to be the BITMASK type, but also for
> others, the driver might report nothing.

The V4L2 control framework should report 0 in those cases, so we should
be fine. We will have to handle default values and step later, and these
will be type-dependent as well, so we may end up reworking this code,
but for now I don't think it's a problem.

> That said, if that' fine in your opinion, please have my
> Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
> 
> >  }
> >
> >  /**
> > @@ -100,6 +102,18 @@ V4L2ControlInfo::V4L2ControlInfo(const struct v4l2_query_ext_ctrl &ctrl)
> >   * \return The V4L2 control user readable name
> >   */
> >
> > +/**
> > + * \fn V4L2ControlInfo::min()
> > + * \brief Retrieve the control minimum value
> > + * \return The V4L2 control minimum value
> > + */
> > +
> > +/**
> > + * \fn V4L2ControlInfo::max()
> > + * \brief Retrieve the control maximum value
> > + * \return The V4L2 control maximum value
> > + */
> > +
> >  /**
> >   * \class V4L2Control
> >   * \brief A V4L2 control value

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list