[libcamera-devel] [PATCH v2 11/24] libcamera: v4l2_controls: Fix control range construction for bool

Laurent Pinchart laurent.pinchart at ideasonboard.com
Tue Nov 19 23:38:31 CET 2019


Hi Kieran,

On Tue, Nov 19, 2019 at 04:26:04PM +0000, Kieran Bingham wrote:
> On 08/11/2019 20:53, Laurent Pinchart wrote:
> > V4L2 controls of type V4L2_CTRL_TYPE_BOOLEAN are incorrectly described
> > with a ControlRange of int32_t values. Fix it.
> > 
> > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > ---
> >  src/libcamera/v4l2_controls.cpp | 14 ++++++++++++--
> >  1 file changed, 12 insertions(+), 2 deletions(-)
> > 
> > diff --git a/src/libcamera/v4l2_controls.cpp b/src/libcamera/v4l2_controls.cpp
> > index 2462c3e2c264..b6547a7c627c 100644
> > --- a/src/libcamera/v4l2_controls.cpp
> > +++ b/src/libcamera/v4l2_controls.cpp
> > @@ -118,12 +118,22 @@ V4L2ControlId::V4L2ControlId(const struct v4l2_query_ext_ctrl &ctrl)
> >   */
> >  V4L2ControlRange::V4L2ControlRange(const struct v4l2_query_ext_ctrl &ctrl)
> >  {
> > -	if (ctrl.type == V4L2_CTRL_TYPE_INTEGER64)
> > +	switch (ctrl.type) {
> > +	case V4L2_CTRL_TYPE_BOOLEAN:
> > +		ControlRange::operator=(ControlRange(static_cast<bool>(ctrl.minimum),
> > +						     static_cast<bool>(ctrl.maximum)));
> 
> Hrm shouldn't the minimum and maximum of a bool control be fairly const?
> 
> If so would this be better written as:
> 
>  ControlRange::operator=(ControlRange(false, true));

A V4L2 device could decide to expose a control but only support a single
value. The main use case would be read-only controls that report a
device configuration, but it could also be useful to show that a feature
is only partly implemented/supported.

> Otherwise,
> 
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> 
> > +		break;
> > +
> > +	case V4L2_CTRL_TYPE_INTEGER64:
> >  		ControlRange::operator=(ControlRange(static_cast<int64_t>(ctrl.minimum),
> >  						     static_cast<int64_t>(ctrl.maximum)));
> > -	else
> > +		break;
> > +
> > +	default:
> >  		ControlRange::operator=(ControlRange(static_cast<int32_t>(ctrl.minimum),
> >  						     static_cast<int32_t>(ctrl.maximum)));
> > +		break;
> > +	}
> >  }
> >  
> >  } /* namespace libcamera */
> > 

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list