[libcamera-devel] [PATCH 1/2] libcamera: controls: Return ControlValue reference from ControlList::set()

Jacopo Mondi jacopo at jmondi.org
Mon Apr 27 14:08:25 CEST 2020


Hi Laurent,

On Sun, Apr 26, 2020 at 08:30:52PM +0300, Laurent Pinchart wrote:
> Hi Jacopo,
>
> On Sun, Apr 26, 2020 at 04:24:54PM +0200, Jacopo Mondi wrote:
> > On Sun, Apr 26, 2020 at 02:16:22AM +0300, Laurent Pinchart wrote:
> > > It is useful for the caller of ControlList::set() to get a reference to
> > > the ControlValue that stores the control in the control list, in order
> > > to then modify that value directly. This allows creating an entry in
> > > the ControlList and then reserving memory for the control when getting
> > > V4L2 controls from a device. This is already possible by calling the
> > > get() function right after set(), but results in two lookups. Extend the
> > > id-based set() function to return the reference to the inserted
> > > ControlValue to avoid the second lookup.
> > >
> > > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > > ---
> > >  include/libcamera/controls.h | 2 +-
> > >  src/libcamera/controls.cpp   | 7 +++++--
> > >  2 files changed, 6 insertions(+), 3 deletions(-)
> > >
> > > diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
> > > index 80944efc133a..5a5cfc3e52ca 100644
> > > --- a/include/libcamera/controls.h
> > > +++ b/include/libcamera/controls.h
> > > @@ -394,7 +394,7 @@ public:
> > >  	}
> > >
> > >  	const ControlValue &get(unsigned int id) const;
> > > -	void set(unsigned int id, const ControlValue &value);
> > > +	ControlValue &set(unsigned int id, const ControlValue &value);
> > >
> > >  	const ControlInfoMap *infoMap() const { return infoMap_; }
> > >
> > > diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
> > > index 08df7f29e938..12822e87a4d7 100644
> > > --- a/src/libcamera/controls.cpp
> > > +++ b/src/libcamera/controls.cpp
> > > @@ -930,14 +930,17 @@ const ControlValue &ControlList::get(unsigned int id) const
> > >   *
> > >   * The behaviour is undefined if the control \a id is not supported by the
> > >   * object that the list refers to.
> > > + *
> > > + * \return A reference to the ControlValue stored in the control list
> > >   */
> > > -void ControlList::set(unsigned int id, const ControlValue &value)
> > > +ControlValue &ControlList::set(unsigned int id, const ControlValue &value)
> > >  {
> > >  	ControlValue *val = find(id);
> > >  	if (!val)
> > > -		return;
> > > +		return *val;
> >
> > Wouldn't you dereference a nullptr ? Should we create a
>
> I agree. I actually dreamt about libcamera last night and figured out
> this issue in my sleep. I wonder how bad that is :-)
>
> >         static ControlValue empty{};
> >
> > at function begin and return that one ?
>
> The set() function is documented as having an undefined behaviour if the
> control isn't supported, so this is within the range of possible
> undefined behaviours (so would rm -rf /*). It's not very nice though.
> Returning a reference to a local static variable isn't nice either, as
> the caller won't know that an error occurred. I'm leaning towards
> returning a pointer, until we refactor this API (getting and setting
> controls by numerical ID isn't nice in general). I'll see what I can do.

Please be aware the same happens already in
        const ControlValue &ControlList::get(unsigned int id) const

>
> > Overall, I think I'm still missing the use case for this tbh, but
>
> It's to avoid a second lookup in patch 2/2.
>
> > we're not losing anything, as the previous return type was void, so
> > Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
> >
> > >
> > >  	*val = value;
> > > +	return *val;
> > >  }
> > >
> > >  /**
>
> --
> Regards,
>
> Laurent Pinchart


More information about the libcamera-devel mailing list