[libcamera-devel] [PATCH 2/2] [DNI] test: Test serialization of Rectangle and Size controls

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sun Apr 26 17:30:40 CEST 2020


Hi Jacopo,

On Sun, Apr 26, 2020 at 05:10:03PM +0200, Jacopo Mondi wrote:
> Hi Laurent,
>   I start from here to comment on the API
> 
> On Sat, Apr 25, 2020 at 11:56:39PM +0300, Laurent Pinchart wrote:
> > This patch should be rebased on real controls once available.
> >
> > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > ---
> >  src/libcamera/control_ids.yaml               | 18 ++++++++++++++++++
> >  test/serialization/control_serialization.cpp |  5 +++++
> >  2 files changed, 23 insertions(+)
> >
> > diff --git a/src/libcamera/control_ids.yaml b/src/libcamera/control_ids.yaml
> > index 4befec746a59..b1ae03e5b0ff 100644
> > --- a/src/libcamera/control_ids.yaml
> > +++ b/src/libcamera/control_ids.yaml
> > @@ -50,4 +50,22 @@ controls:
> >        type: int32_t
> >        description: Specify a fixed gain parameter
> >
> > +  - TheRectangle:
> > +      type: Rectangle
> > +      description: A Rectangle property
> > +
> > +  - TheRectangles:
> > +      type: Rectangle
> > +      description: A Rectangle array property
> > +      size: [n]
> > +
> > +  - TheSize:
> > +      type: Size
> > +      description: A Size property
> > +
> > +  - TheSizes:
> > +      type: Size
> > +      description: A Size array property
> > +      size: [n]
> > +
> >  ...
> > diff --git a/test/serialization/control_serialization.cpp b/test/serialization/control_serialization.cpp
> > index 2989b52774fb..789e0d83f4e4 100644
> > --- a/test/serialization/control_serialization.cpp
> > +++ b/test/serialization/control_serialization.cpp
> > @@ -45,6 +45,11 @@ protected:
> >  		list.set(controls::Brightness, 255);
> >  		list.set(controls::Contrast, 128);
> >  		list.set(controls::Saturation, 50);
> > +		list.set(controls::TheRectangle, Rectangle{ 100, 100, 640, 480 });
> > +		list.set(controls::TheRectangles, { Rectangle{ 100, 100, 640, 480 },
> > +						    Rectangle{ 200, 200, 1280, 720 } });
> > +		list.set(controls::TheSize, Size{ 640, 480 });
> > +		list.set(controls::TheSizes, { Size{ 640, 480 }, Size{ 1280, 720 } });
> 
> Is this a good idea ? How easy is that get it wrong assuming
> 
> 		list.set(controls::TheSizes, { 640, 480 }};
> 
> does what one expects ? We'll get a type assertion error, which is not
> nice to debug.. I'm debated, this is useful, but might be really a
> bleeding edge of the API...

Adding

 		list.set(controls::TheSizes, { 640, 480 }};

the compiler tells me

In file included from ../../test/serialization/control_serialization.cpp:10:
In file included from ../../include/libcamera/camera.h:15:
../../include/libcamera/controls.h:393:8: error: no matching member function for call to 'set'
                val->set<T>(Span<const typename std::remove_cv_t<V>>{ value.begin(), value.size() });
                ~~~~~^~~~~~
../../test/serialization/control_serialization.cpp:53:8: note: in instantiation of function template specialization 'libcamera::ControlList::set<libcamera::Span<const libcamera::Size, 18446744073709551615>, int>' requested here
                list.set(controls::TheSizes, { 640, 480 });
                     ^
../../include/libcamera/controls.h:185:7: note: candidate function template not viable: no known conversion from 'Span<const typename std::remove_cv_t<int>, [...]>' to 'const Span<const libcamera::Size, [...]>' for 1st argument
        void set(const T &value)
             ^
../../include/libcamera/controls.h:173:7: note: candidate template ignored: requirement '!details::is_span<libcamera::Span<const libcamera::Size, 18446744073709551615> >::value' was not satisfied [with T = libcamera::Span<const libcamera::Size, 18446744073709551615>]
        void set(const T &value)
             ^
1 error generated.

That's the thing I like about the controls API, it has compile-time type
checking. We don't get this for V4L2 controls though, as they're
specified by integer ID, and I'm really tempted to add Control<>
instances for each of the V4L2 controls we need, but that's not for now.

> >
> >  		/*
> >  		 * Serialize the control list, this should fail as the control

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list