[{"id":17292,"web_url":"https://patchwork.libcamera.org/comment/17292/","msgid":"<20210526205934.ge3ow7et7ecchxyj@uno.localdomain>","date":"2021-05-26T20:59:34","subject":"Re: [libcamera-devel] [PATCH v5 2/6] libcamera: V4L2Device: Support\n\tv4l2 menu control","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Hiro,\n\nOn Wed, May 19, 2021 at 04:59:37PM +0900, Hirokazu Honda wrote:\n> This adds a support of v4l2 menu. The control info for v4l2 menu\n> contains indices without names and 64bit values of querymenu.\n>\n> Signed-off-by: Hirokazu Honda <hiroh@chromium.org>\n> ---\n>  include/libcamera/internal/v4l2_device.h |  3 ++\n>  src/libcamera/v4l2_device.cpp            | 64 ++++++++++++++++++++++--\n>  2 files changed, 63 insertions(+), 4 deletions(-)\n>\n> diff --git a/include/libcamera/internal/v4l2_device.h b/include/libcamera/internal/v4l2_device.h\n> index 5ba9b23b..34080b07 100644\n> --- a/include/libcamera/internal/v4l2_device.h\n> +++ b/include/libcamera/internal/v4l2_device.h\n> @@ -56,6 +56,9 @@ protected:\n>  \tint fd() const { return fd_; }\n>\n>  private:\n> +\tbool createControlInfoForMenu(const v4l2_query_ext_ctrl &ctrl,\n> +\t\t\t\t      ControlInfo &ctrlInfo);\n> +\n\nWe create ControlInfo from a v4l2_query_ext_ctrl with\nV4L2Device::v4l2ControlInfo()\n\nI would name this V4L2Device::v4l2MenuControlInfo() or maybe just\nexpand V4L2Device::v4l2ControlInfo() with support for menu controls\n\n>  \tvoid listControls();\n>  \tvoid updateControls(ControlList *ctrls,\n>  \t\t\t    Span<const v4l2_ext_control> v4l2Ctrls);\n> diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp\n> index 515cbdfe..9f7873f1 100644\n> --- a/src/libcamera/v4l2_device.cpp\n> +++ b/src/libcamera/v4l2_device.cpp\n> @@ -464,6 +464,49 @@ int V4L2Device::ioctl(unsigned long request, void *argp)\n>   * \\return The V4L2 device file descriptor, -1 if the device node is not open\n>   */\n>\n> +/**\n> + * \\brief Create ControlInfo for v4l2 menu ctrl.\n\nNo '.' at the end of briefs\n\n> + * \\param[in] ctrl The v4l2_query_ext_ctrl that represents a menu\n> + * \\param[out] ctrlInfo The created controlInfo\n> + *\n> + * The created ControlInfo contains not only values and also extra values, which\n> + * are indices and name/value acquired by VIDIOC_QUERYMENU, respectively. The\n> + * extra values contains std::string if the type of \\a ctrl is\n> + * V4L2_CTRL_TYPE_MENU or int64_t otherwise.\n\nI don't think this applies in full anymore\n\n> + *\n> + * \\return True on success or false otherwise\n> + */\n> +bool V4L2Device::createControlInfoForMenu(const v4l2_query_ext_ctrl &ctrl,\n> +\t\t\t\t\t  ControlInfo &ctrlInfo)\n\nctrlInfo is an output parameter, a * is better suited\n\n> +{\n> +\tASSERT(ctrl.type == V4L2_CTRL_TYPE_MENU ||\n> +\t       ctrl.type == V4L2_CTRL_TYPE_INTEGER_MENU);\n\nThis is internal code, the assertion makes only sure this patch does\nwhat you intend, does it bring any value ?\n\n> +\n> +\tstd::vector<ControlValue> indices;\n> +\tv4l2_querymenu menu;\n> +\tmemset(&menu, 0, sizeof(menu));\n\nI don't recall if we already had a discussion about using menu{};\n\n> +\tmenu.id = ctrl.id;\n> +\n> +\tfor (menu.index = ctrl.minimum;\n> +\t     static_cast<int>(menu.index) <= ctrl.maximum; menu.index++) {\n\nDo you need the cast ? Here it compiles fine without (clang 11.1.0)\n\n\n> +\t\tif (ioctl(VIDIOC_QUERYMENU, &menu) != 0)\n> +\t\t\tcontinue;\n> +\n> +\t\tindices.emplace_back(static_cast<int32_t>(menu.index));\n> +\t}\n> +\n> +\tif (indices.empty()) {\n\nCan this happen ?\nMore in general, can this function fail at all ?\n\nI don't like we have\n        ctrlInfo = v4l2ControlInfo(ctrl)\nand a few lines below\n        if (!createControlInfoForMenu(ctrl, ctrlInfo);\n\nwhich are basically doing the same thing (create a ControlInfo from a\nv4l2_query_ext_ctrl)\n\nI would suggest either\n        ctrlInfo = v4l2ControlInfo(ctrl)\n        ....\n        ctrlInfo = v4l2MenuControlInfo(ctrl)\n\nor just support menu in v4l2ControlInfo()\n\n\n> +\t\tLOG(V4L2, Error)\n> +\t\t\t<< \"No applicable value: \" << utils::hex(ctrl.id);\n> +\n> +\t\treturn false;\n> +\t}\n> +\n> +\tctrlInfo = ControlInfo(indices);\n> +\n> +\treturn true;\n> +}\n> +\n>  /*\n>   * \\brief List and store information about all controls supported by the\n>   * V4L2 device\n> @@ -473,7 +516,6 @@ void V4L2Device::listControls()\n>  \tControlInfoMap::Map ctrls;\n>  \tstruct v4l2_query_ext_ctrl ctrl = {};\n>\n> -\t/* \\todo Add support for menu controls. */\n>  \twhile (1) {\n>  \t\tctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL |\n>  \t\t\t   V4L2_CTRL_FLAG_NEXT_COMPOUND;\n> @@ -484,15 +526,22 @@ void V4L2Device::listControls()\n>  \t\t    ctrl.flags & V4L2_CTRL_FLAG_DISABLED)\n>  \t\t\tcontinue;\n>\n> +\t\tControlInfo ctrlInfo;\n>  \t\tswitch (ctrl.type) {\n>  \t\tcase V4L2_CTRL_TYPE_INTEGER:\n>  \t\tcase V4L2_CTRL_TYPE_BOOLEAN:\n> -\t\tcase V4L2_CTRL_TYPE_MENU:\n>  \t\tcase V4L2_CTRL_TYPE_BUTTON:\n>  \t\tcase V4L2_CTRL_TYPE_INTEGER64:\n>  \t\tcase V4L2_CTRL_TYPE_BITMASK:\n> -\t\tcase V4L2_CTRL_TYPE_INTEGER_MENU:\n>  \t\tcase V4L2_CTRL_TYPE_U8:\n> +\t\t\tctrlInfo = V4L2ControlInfo(ctrl);\n> +\t\t\tbreak;\n> +\n> +\t\tcase V4L2_CTRL_TYPE_INTEGER_MENU:\n> +\t\tcase V4L2_CTRL_TYPE_MENU:\n> +\t\t\tif (!createControlInfoForMenu(ctrl, ctrlInfo))\n> +\t\t\t\tcontinue;\n> +\n>  \t\t\tbreak;\n>  \t\t/* \\todo Support other control types. */\n>  \t\tdefault:\n> @@ -502,10 +551,13 @@ void V4L2Device::listControls()\n>  \t\t\tcontinue;\n>  \t\t}\n>\n> +\t\tLOG(V4L2, Debug) << \"Control: \" << ctrl.name\n> +\t\t\t\t << \" (\" << utils::hex(ctrl.id) << \")\";\n> +\n>  \t\tcontrolIds_.emplace_back(std::make_unique<V4L2ControlId>(ctrl));\n>  \t\tcontrolInfo_.emplace(ctrl.id, ctrl);\n>\n> -\t\tctrls.emplace(controlIds_.back().get(), V4L2ControlInfo(ctrl));\n> +\t\tctrls.emplace(controlIds_.back().get(), ctrlInfo);\n>  \t}\n>\n>  \tcontrols_ = std::move(ctrls);\n> @@ -572,6 +624,10 @@ void V4L2Device::updateControls(ControlList *ctrls,\n>  \t\t\tvalue.set<int64_t>(v4l2Ctrl->value64);\n>  \t\t\tbreak;\n>\n> +\t\tcase ControlTypeInteger32:\n> +\t\t\tvalue.set<int32_t>(v4l2Ctrl->value);\n> +\t\t\tbreak;\n> +\n>  \t\tcase ControlTypeByte:\n>  \t\t\t/*\n>  \t\t\t * No action required, the VIDIOC_[GS]_EXT_CTRLS ioctl\n> --\n> 2.31.1.751.gd2f1c929bd-goog\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 4A886C3203\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 26 May 2021 20:58:52 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 75A7F68923;\n\tWed, 26 May 2021 22:58:51 +0200 (CEST)","from relay8-d.mail.gandi.net (relay8-d.mail.gandi.net\n\t[217.70.183.201])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C0B23602B1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 26 May 2021 22:58:49 +0200 (CEST)","(Authenticated sender: jacopo@jmondi.org)\n\tby relay8-d.mail.gandi.net (Postfix) with ESMTPSA id D2A561BF205;\n\tWed, 26 May 2021 20:58:48 +0000 (UTC)"],"Date":"Wed, 26 May 2021 22:59:34 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Hirokazu Honda <hiroh@chromium.org>","Message-ID":"<20210526205934.ge3ow7et7ecchxyj@uno.localdomain>","References":"<20210519075941.1337388-1-hiroh@chromium.org>\n\t<20210519075941.1337388-2-hiroh@chromium.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20210519075941.1337388-2-hiroh@chromium.org>","Subject":"Re: [libcamera-devel] [PATCH v5 2/6] libcamera: V4L2Device: Support\n\tv4l2 menu control","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":17306,"web_url":"https://patchwork.libcamera.org/comment/17306/","msgid":"<CAO5uPHOg-jzPBzdKkzAQYcz_H+KWJoM6=b9UujO50kfGRpC45Q@mail.gmail.com>","date":"2021-05-27T05:50:58","subject":"Re: [libcamera-devel] [PATCH v5 2/6] libcamera: V4L2Device: Support\n\tv4l2 menu control","submitter":{"id":63,"url":"https://patchwork.libcamera.org/api/people/63/","name":"Hirokazu Honda","email":"hiroh@chromium.org"},"content":"Hi Jacopo, thank you for reviewing.\n\nOn Thu, May 27, 2021 at 5:58 AM Jacopo Mondi <jacopo@jmondi.org> wrote:\n\n> Hi Hiro,\n>\n> On Wed, May 19, 2021 at 04:59:37PM +0900, Hirokazu Honda wrote:\n> > This adds a support of v4l2 menu. The control info for v4l2 menu\n> > contains indices without names and 64bit values of querymenu.\n> >\n> > Signed-off-by: Hirokazu Honda <hiroh@chromium.org>\n> > ---\n> >  include/libcamera/internal/v4l2_device.h |  3 ++\n> >  src/libcamera/v4l2_device.cpp            | 64 ++++++++++++++++++++++--\n> >  2 files changed, 63 insertions(+), 4 deletions(-)\n> >\n> > diff --git a/include/libcamera/internal/v4l2_device.h\n> b/include/libcamera/internal/v4l2_device.h\n> > index 5ba9b23b..34080b07 100644\n> > --- a/include/libcamera/internal/v4l2_device.h\n> > +++ b/include/libcamera/internal/v4l2_device.h\n> > @@ -56,6 +56,9 @@ protected:\n> >       int fd() const { return fd_; }\n> >\n> >  private:\n> > +     bool createControlInfoForMenu(const v4l2_query_ext_ctrl &ctrl,\n> > +                                   ControlInfo &ctrlInfo);\n> > +\n>\n> We create ControlInfo from a v4l2_query_ext_ctrl with\n> V4L2Device::v4l2ControlInfo()\n>\n> I would name this V4L2Device::v4l2MenuControlInfo() or maybe just\n> expand V4L2Device::v4l2ControlInfo() with support for menu controls\n>\n> >       void listControls();\n> >       void updateControls(ControlList *ctrls,\n> >                           Span<const v4l2_ext_control> v4l2Ctrls);\n> > diff --git a/src/libcamera/v4l2_device.cpp\n> b/src/libcamera/v4l2_device.cpp\n> > index 515cbdfe..9f7873f1 100644\n> > --- a/src/libcamera/v4l2_device.cpp\n> > +++ b/src/libcamera/v4l2_device.cpp\n> > @@ -464,6 +464,49 @@ int V4L2Device::ioctl(unsigned long request, void\n> *argp)\n> >   * \\return The V4L2 device file descriptor, -1 if the device node is\n> not open\n> >   */\n> >\n> > +/**\n> > + * \\brief Create ControlInfo for v4l2 menu ctrl.\n>\n> No '.' at the end of briefs\n>\n> > + * \\param[in] ctrl The v4l2_query_ext_ctrl that represents a menu\n> > + * \\param[out] ctrlInfo The created controlInfo\n> > + *\n> > + * The created ControlInfo contains not only values and also extra\n> values, which\n> > + * are indices and name/value acquired by VIDIOC_QUERYMENU,\n> respectively. The\n> > + * extra values contains std::string if the type of \\a ctrl is\n> > + * V4L2_CTRL_TYPE_MENU or int64_t otherwise.\n>\n> I don't think this applies in full anymore\n>\n> > + *\n> > + * \\return True on success or false otherwise\n> > + */\n> > +bool V4L2Device::createControlInfoForMenu(const v4l2_query_ext_ctrl\n> &ctrl,\n> > +                                       ControlInfo &ctrlInfo)\n>\n> ctrlInfo is an output parameter, a * is better suited\n>\n> > +{\n> > +     ASSERT(ctrl.type == V4L2_CTRL_TYPE_MENU ||\n> > +            ctrl.type == V4L2_CTRL_TYPE_INTEGER_MENU);\n>\n> This is internal code, the assertion makes only sure this patch does\n> what you intend, does it bring any value ?\n>\n> > +\n> > +     std::vector<ControlValue> indices;\n> > +     v4l2_querymenu menu;\n> > +     memset(&menu, 0, sizeof(menu));\n>\n> I don't recall if we already had a discussion about using menu{};\n>\n>\nI use memset for C structure.\n\n-Hiro\n\n\n> > +     menu.id = ctrl.id;\n> > +\n> > +     for (menu.index = ctrl.minimum;\n> > +          static_cast<int>(menu.index) <= ctrl.maximum; menu.index++) {\n>\n> Do you need the cast ? Here it compiles fine without (clang 11.1.0)\n>\n>\n> > +             if (ioctl(VIDIOC_QUERYMENU, &menu) != 0)\n> > +                     continue;\n> > +\n> > +             indices.emplace_back(static_cast<int32_t>(menu.index));\n> > +     }\n> > +\n> > +     if (indices.empty()) {\n>\n> Can this happen ?\n> More in general, can this function fail at all ?\n>\n> I don't like we have\n>         ctrlInfo = v4l2ControlInfo(ctrl)\n> and a few lines below\n>         if (!createControlInfoForMenu(ctrl, ctrlInfo);\n>\n> which are basically doing the same thing (create a ControlInfo from a\n> v4l2_query_ext_ctrl)\n>\n> I would suggest either\n>         ctrlInfo = v4l2ControlInfo(ctrl)\n>         ....\n>         ctrlInfo = v4l2MenuControlInfo(ctrl)\n>\n> or just support menu in v4l2ControlInfo()\n>\n>\n> > +             LOG(V4L2, Error)\n> > +                     << \"No applicable value: \" << utils::hex(ctrl.id);\n> > +\n> > +             return false;\n> > +     }\n> > +\n> > +     ctrlInfo = ControlInfo(indices);\n> > +\n> > +     return true;\n> > +}\n> > +\n> >  /*\n> >   * \\brief List and store information about all controls supported by the\n> >   * V4L2 device\n> > @@ -473,7 +516,6 @@ void V4L2Device::listControls()\n> >       ControlInfoMap::Map ctrls;\n> >       struct v4l2_query_ext_ctrl ctrl = {};\n> >\n> > -     /* \\todo Add support for menu controls. */\n> >       while (1) {\n> >               ctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL |\n> >                          V4L2_CTRL_FLAG_NEXT_COMPOUND;\n> > @@ -484,15 +526,22 @@ void V4L2Device::listControls()\n> >                   ctrl.flags & V4L2_CTRL_FLAG_DISABLED)\n> >                       continue;\n> >\n> > +             ControlInfo ctrlInfo;\n> >               switch (ctrl.type) {\n> >               case V4L2_CTRL_TYPE_INTEGER:\n> >               case V4L2_CTRL_TYPE_BOOLEAN:\n> > -             case V4L2_CTRL_TYPE_MENU:\n> >               case V4L2_CTRL_TYPE_BUTTON:\n> >               case V4L2_CTRL_TYPE_INTEGER64:\n> >               case V4L2_CTRL_TYPE_BITMASK:\n> > -             case V4L2_CTRL_TYPE_INTEGER_MENU:\n> >               case V4L2_CTRL_TYPE_U8:\n> > +                     ctrlInfo = V4L2ControlInfo(ctrl);\n> > +                     break;\n> > +\n> > +             case V4L2_CTRL_TYPE_INTEGER_MENU:\n> > +             case V4L2_CTRL_TYPE_MENU:\n> > +                     if (!createControlInfoForMenu(ctrl, ctrlInfo))\n> > +                             continue;\n> > +\n> >                       break;\n> >               /* \\todo Support other control types. */\n> >               default:\n> > @@ -502,10 +551,13 @@ void V4L2Device::listControls()\n> >                       continue;\n> >               }\n> >\n> > +             LOG(V4L2, Debug) << \"Control: \" << ctrl.name\n> > +                              << \" (\" << utils::hex(ctrl.id) << \")\";\n> > +\n> >\n>  controlIds_.emplace_back(std::make_unique<V4L2ControlId>(ctrl));\n> >               controlInfo_.emplace(ctrl.id, ctrl);\n> >\n> > -             ctrls.emplace(controlIds_.back().get(),\n> V4L2ControlInfo(ctrl));\n> > +             ctrls.emplace(controlIds_.back().get(), ctrlInfo);\n> >       }\n> >\n> >       controls_ = std::move(ctrls);\n> > @@ -572,6 +624,10 @@ void V4L2Device::updateControls(ControlList *ctrls,\n> >                       value.set<int64_t>(v4l2Ctrl->value64);\n> >                       break;\n> >\n> > +             case ControlTypeInteger32:\n> > +                     value.set<int32_t>(v4l2Ctrl->value);\n> > +                     break;\n> > +\n> >               case ControlTypeByte:\n> >                       /*\n> >                        * No action required, the VIDIOC_[GS]_EXT_CTRLS\n> ioctl\n> > --\n> > 2.31.1.751.gd2f1c929bd-goog\n> >\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 06318C3203\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 27 May 2021 05:51:11 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 3B12968926;\n\tThu, 27 May 2021 07:51:10 +0200 (CEST)","from mail-ej1-x62d.google.com (mail-ej1-x62d.google.com\n\t[IPv6:2a00:1450:4864:20::62d])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id ACD7E6891F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 27 May 2021 07:51:08 +0200 (CEST)","by mail-ej1-x62d.google.com with SMTP id gb17so6086438ejc.8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 26 May 2021 22:51:08 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=chromium.org header.i=@chromium.org\n\theader.b=\"g3QU17wf\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org;\n\ts=google; \n\th=mime-version:references:in-reply-to:from:date:message-id:subject:to\n\t:cc; bh=iWNydKNyM/j3SYr6+1rqDuYn4uC/cdpnVMMMkX6+T54=;\n\tb=g3QU17wfG0d6tyoktQRhx7iDRta/0Z5RiWHStrCNR55cyj3ceZaH5tvY5RcWVfcaWv\n\t95rKgthnizidk4w1t30YhU3cyFhGIkkQH6gcHSyPPXLaEVoEIs6xQfQH0pr9Gyz79NUC\n\tbxQ0HcBj6UTD0Dy2DB3qzBQxlybvib8iwzaRc=","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=iWNydKNyM/j3SYr6+1rqDuYn4uC/cdpnVMMMkX6+T54=;\n\tb=gAMelyU5VwFJyhD+dMOxW6+PrRm1H1wm3jvTA/Bk/8jPaVV5yHZy1yTb0ea+4EabzC\n\tX7Vrqk7/qdXxHRyArVXluhe8y9vSd5IuCs/Pu41oe8W4CBLbLzYJLeTBAjXwPFKgj4cY\n\th84Lisa56Doyf8hRwP6RNnnTPVI06M1aJewUN6NxTmC7OF1ikkoIP2Ja1rpmROGsGSDy\n\t9eatLSbmVQklDD6PbSHZAEe14a7Qxm3or+N0qdW00Soz48jUXzA8lyhEhtP8V8iw0s/R\n\twTzFB0TJKeD4kgX7hW/SxaDYAW17Hru3xyoD7aV3KW3zZldRizlDJWGbYCG6O/eaBZBq\n\t1HFQ==","X-Gm-Message-State":"AOAM531G2e5vM+AxbKgVu3FGyY7o23op/ngMbW0ve+8JmxMBnTGqElTW\n\tQb4ob57N7AgG73cmDIjS/dzBra7JowTru92WreSfzA==","X-Google-Smtp-Source":"ABdhPJyibX5sjmHHnfYz1OOA9lOcLTwSun2Le4DEgujoYsG5eOs8fxec3dYgCy12GY+Oc4OZGgsQZ2xdi3tLYDUnRhA=","X-Received":"by 2002:a17:907:1b06:: with SMTP id\n\tmp6mr2059368ejc.292.1622094668218; \n\tWed, 26 May 2021 22:51:08 -0700 (PDT)","MIME-Version":"1.0","References":"<20210519075941.1337388-1-hiroh@chromium.org>\n\t<20210519075941.1337388-2-hiroh@chromium.org>\n\t<20210526205934.ge3ow7et7ecchxyj@uno.localdomain>","In-Reply-To":"<20210526205934.ge3ow7et7ecchxyj@uno.localdomain>","From":"Hirokazu Honda <hiroh@chromium.org>","Date":"Thu, 27 May 2021 14:50:58 +0900","Message-ID":"<CAO5uPHOg-jzPBzdKkzAQYcz_H+KWJoM6=b9UujO50kfGRpC45Q@mail.gmail.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Content-Type":"multipart/alternative; boundary=\"0000000000007dd86a05c3495852\"","Subject":"Re: [libcamera-devel] [PATCH v5 2/6] libcamera: V4L2Device: Support\n\tv4l2 menu control","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]