[libcamera-devel] [PATCH v2 2/7] libcamera: Controls: Add ControlTypeMenu

Hirokazu Honda hiroh at chromium.org
Tue Apr 27 05:46:30 CEST 2021


Hi Laurent,

On Tue, Apr 27, 2021 at 12:31 PM Laurent Pinchart
<laurent.pinchart at ideasonboard.com> wrote:
>
> Hi Hiro,
>
> Thank you for the patch.
>
> On Wed, Apr 21, 2021 at 01:23:41PM +0900, Hirokazu Honda wrote:
> > This adds control type for v4l2 menu.
> >
> > Signed-off-by: Hirokazu Honda <hiroh at chromium.org>
> > ---
> >  include/libcamera/controls.h | 28 ++++++++++++++++++++++++++++
> >  src/libcamera/controls.cpp   |  7 +++++++
> >  2 files changed, 35 insertions(+)
> >
> > diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
> > index 1a5690a5..357819e7 100644
> > --- a/include/libcamera/controls.h
> > +++ b/include/libcamera/controls.h
> > @@ -9,6 +9,7 @@
> >  #define __LIBCAMERA_CONTROLS_H__
> >
> >  #include <assert.h>
> > +#include <sstream>
> >  #include <stdint.h>
> >  #include <string>
> >  #include <unordered_map>
> > @@ -32,6 +33,28 @@ enum ControlType {
> >       ControlTypeString,
> >       ControlTypeRectangle,
> >       ControlTypeSize,
> > +     ControlTypeMenu,
> > +};
> > +
> > +struct ControlMenu {
> > +     uint32_t index;
> > +     bool isName = false;
> > +
> > +     union {
> > +             char name[28];
> > +             int64_t value;
> > +     };
> > +
> > +     std::string toString() const
> > +     {
> > +             std::stringstream ss;
> > +             ss << "index: " << index;
> > +             if (isName)
> > +                     ss << "name: " << name;
> > +             else
> > +                     ss << "value: " << value;
> > +             return ss.str();
> > +     }
> >  };
>
> As this is used for V4L2 controls only, I'm really not keen on adding
> support for named menu entries :-( Especially given that 28 is a
> completely arbitrary limit. I'd like to instead store the value as an
> integer, and, if we really need support for named menu entries, to add
> them to the ControlInfo class instead ? The mapping between numerical
> values and names should be constant, it shouldn't be a property of the
> ControlValue.
>

I see. Actually the named menu is necessary for test pattern mode.
We need a class for string. The problem is ControlValue uses memcpy
for copy, but it doesn't obviously work for std::string.
Could you tell me your prefered solution?
My idea is only to replace memcpy by copy assignment operator.

-Hiro
> >
> >  namespace details {
> > @@ -85,6 +108,11 @@ struct control_type<Size> {
> >       static constexpr ControlType value = ControlTypeSize;
> >  };
> >
> > +template<>
> > +struct control_type<ControlMenu> {
> > +     static constexpr ControlType value = ControlTypeMenu;
> > +};
> > +
> >  template<typename T, std::size_t N>
> >  struct control_type<Span<T, N>> : public control_type<std::remove_cv_t<T>> {
> >  };
> > diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
> > index c58ed394..8ab5ac92 100644
> > --- a/src/libcamera/controls.cpp
> > +++ b/src/libcamera/controls.cpp
> > @@ -60,6 +60,7 @@ static constexpr size_t ControlValueSize[] = {
> >       [ControlTypeString]             = sizeof(char),
> >       [ControlTypeRectangle]          = sizeof(Rectangle),
> >       [ControlTypeSize]               = sizeof(Size),
> > +     [ControlTypeMenu]               = sizeof(ControlMenu),
> >  };
> >
> >  } /* namespace */
> > @@ -254,6 +255,12 @@ std::string ControlValue::toString() const
> >                       str += value->toString();
> >                       break;
> >               }
> > +             case ControlTypeMenu: {
> > +                     const ControlMenu *value =
> > +                             reinterpret_cast<const ControlMenu *>(data);
> > +                     str += value->toString();
> > +                     break;
> > +             }
> >               case ControlTypeNone:
> >               case ControlTypeString:
> >                       break;
>
> --
> Regards,
>
> Laurent Pinchart


More information about the libcamera-devel mailing list