[{"id":4160,"web_url":"https://patchwork.libcamera.org/comment/4160/","msgid":"<20200320233243.GW5193@pendragon.ideasonboard.com>","date":"2020-03-20T23:32:43","subject":"Re: [libcamera-devel] [PATCH 11/11] test: v4l2_videodevice: Test U8\n\tarray controls","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jacopo,\n\nThank you for the patch.\n\nOn Mon, Mar 09, 2020 at 05:24:14PM +0100, Jacopo Mondi wrote:\n> Test V4L2 array control using vivid control VIVID_CID_U8_4D_ARRAY.\n> \n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> ---\n>  test/v4l2_videodevice/controls.cpp | 31 +++++++++++++++++++++++++++++-\n>  1 file changed, 30 insertions(+), 1 deletion(-)\n> \n> diff --git a/test/v4l2_videodevice/controls.cpp b/test/v4l2_videodevice/controls.cpp\n> index 478de3707a3c..e2601b7594bb 100644\n> --- a/test/v4l2_videodevice/controls.cpp\n> +++ b/test/v4l2_videodevice/controls.cpp\n> @@ -5,6 +5,7 @@\n>   * controls.cpp - V4L2 device controls handling test\n>   */\n>  \n> +#include <array>\n>  #include <iostream>\n>  #include <limits.h>\n>  \n> @@ -12,6 +13,13 @@\n>  \n>  #include \"v4l2_videodevice_test.h\"\n>  \n> +/* These come from the vivid driver */\n\ns/driver/driver./\n\n> +#define VIVID_CID_CUSTOM_BASE\t\t(V4L2_CID_USER_BASE | 0xf000)\n> +#define VIVID_CID_U8_4D_ARRAY\t\t(VIVID_CID_CUSTOM_BASE + 10)\n> +\n> +/* Helper for VIVID_CID_U8_4D_ARRAY control array size: not from kernel. */\n> +#define VIVID_CID_U8_ARRAY_SIZE\t\t(2 * 3 * 4 * 5)\n> +\n>  using namespace std;\n>  using namespace libcamera;\n>  \n> @@ -36,7 +44,8 @@ protected:\n>  \n>  \t\tif (infoMap.find(V4L2_CID_BRIGHTNESS) == infoMap.end() ||\n>  \t\t    infoMap.find(V4L2_CID_CONTRAST) == infoMap.end() ||\n> -\t\t    infoMap.find(V4L2_CID_SATURATION) == infoMap.end()) {\n> +\t\t    infoMap.find(V4L2_CID_SATURATION) == infoMap.end() ||\n> +\t\t    infoMap.find(VIVID_CID_U8_4D_ARRAY) == infoMap.end()) {\n>  \t\t\tcerr << \"Missing controls\" << endl;\n>  \t\t\treturn TestFail;\n>  \t\t}\n> @@ -44,6 +53,7 @@ protected:\n>  \t\tconst ControlInfo &brightness = infoMap.find(V4L2_CID_BRIGHTNESS)->second;\n>  \t\tconst ControlInfo &contrast = infoMap.find(V4L2_CID_CONTRAST)->second;\n>  \t\tconst ControlInfo &saturation = infoMap.find(V4L2_CID_SATURATION)->second;\n> +\t\tconst ControlInfo &u8 = infoMap.find(VIVID_CID_U8_4D_ARRAY)->second;\n>  \n>  \t\t/* Test getting controls. */\n>  \t\tControlList ctrls(infoMap);\n> @@ -51,6 +61,10 @@ protected:\n>  \t\tctrls.set(V4L2_CID_CONTRAST, -1);\n>  \t\tctrls.set(V4L2_CID_SATURATION, -1);\n>  \n> +\t\tstd::array<uint8_t, VIVID_CID_U8_ARRAY_SIZE> u8Values;\n> +\t\tSpan<const uint8_t> u8Span(u8Values);\n> +\t\tctrls.set(VIVID_CID_U8_4D_ARRAY, u8Span);\n\nThis potentially writes random values. The std::array constructor\ndocumentation (https://en.cppreference.com/w/cpp/container/array)\nmentions\n\n\"initializes the array following the rules of aggregate initialization\n(note that default initialization may result in indeterminate values for\nnon-class T)\"\n\nYou don't actually need to set VIVID_CID_U8_4D_ARRAY with an array here.\nWhat matters for the getControls() call is that the ControlList has an\nentry with the desired control ID. You can just set its value to 0, it\nwill be overwritten by getControls().\n\n> +\n>  \t\tint ret = capture_->getControls(&ctrls);\n>  \t\tif (ret) {\n>  \t\t\tcerr << \"Failed to get controls\" << endl;\n> @@ -64,11 +78,26 @@ protected:\n>  \t\t\treturn TestFail;\n>  \t\t}\n>  \n> +\t\tu8Span = ctrls.get(VIVID_CID_U8_4D_ARRAY).get<Span<const uint8_t>>();\n> +\t\tfor (unsigned int i = 0; i < VIVID_CID_U8_ARRAY_SIZE; ++i) {\n> +\t\t\tif (u8Span[i] != 0)\n\nHow about checking for >= min and <= max to make this more generic ?\n\n> +\t\t\t\tcontinue;\n> +\n> +\t\t\tcerr << \"Incorrect value for retrieved array control\"\n> +\t\t\t     << endl;\n> +\t\t\treturn TestFail;\n> +\t\t}\n\n\t\tuint8_t u8Min = u8.min().get<uint8_t>();\n\t\tuint8_t u8Max = u8.max().get<uint8_t>();\n\n\t\tSpan<const uint8_t> u8Span = ctrls.get(VIVID_CID_U8_4D_ARRAY).get<Span<const uint8_t>>();\n\t\tbool valid = std::all_of(u8Span.begin(), u8Span.end(),\n\t\t\t\t\t [&](uint8_t v) { return v >= u8Min && v <= u8Max; });\n\t\tif (!valid) {\n\t\t\tcerr << \"Incorrect value for retrieved array control\"\n\t\t\t     << endl;\n\t\t\treturn TestFail;\n\t\t}\n\n> +\n>  \t\t/* Test setting controls. */\n>  \t\tctrls.set(V4L2_CID_BRIGHTNESS, brightness.min());\n>  \t\tctrls.set(V4L2_CID_CONTRAST, contrast.max());\n>  \t\tctrls.set(V4L2_CID_SATURATION, saturation.min());\n>  \n> +\t\tfor (unsigned int i = 0; i < VIVID_CID_U8_ARRAY_SIZE; ++i)\n> +\t\t\tu8Values[i] = u8.min().get<uint8_t>();\n\n\t\tstd::array<uint8_t, VIVID_CID_U8_ARRAY_SIZE> u8Values;\n\t\tstd::fill(u8Values.begin(), u8Values.end(), u8Min);\n\n(Don't forget to #include <algorithm>)\n\n> +\t\tu8Span = u8Values;\n> +\t\tctrls.set(VIVID_CID_U8_4D_ARRAY, u8Span);\n\n\t\tctrls.set(VIVID_CID_U8_4D_ARRAY, Span<const uint8_t>(u8Values));\n\n> +\n>  \t\tret = capture_->setControls(&ctrls);\n>  \t\tif (ret) {\n>  \t\t\tcerr << \"Failed to set controls\" << endl;","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 76CA660417\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 21 Mar 2020 00:32:50 +0100 (CET)","from pendragon.ideasonboard.com (81-175-216-236.bb.dnainternet.fi\n\t[81.175.216.236])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id D8531A54;\n\tSat, 21 Mar 2020 00:32:49 +0100 (CET)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1584747170;\n\tbh=fl9PYWaEB4AK37yK0Zpwh6ycOA/PkRBGC7CLpZ2dR/s=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=KEYCbs9tBrWZav8Hn26lZ7C80jv6Rc8Bdpw7HEa6pG89MGsehVY4jIh7kQRE7OIdC\n\t60Cq+u/bwWLiCn1ijy6+ZpIfEGr2mi6APf4q0jsfRiynDjwmpSOc4aeJXhSGUShq4/\n\tZq5mqmd8KniGBaF4o8kXOeaJMt9jjSV1ayvz+f54=","Date":"Sat, 21 Mar 2020 01:32:43 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20200320233243.GW5193@pendragon.ideasonboard.com>","References":"<20200309162414.720306-1-jacopo@jmondi.org>\n\t<20200309162414.720306-12-jacopo@jmondi.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20200309162414.720306-12-jacopo@jmondi.org>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH 11/11] test: v4l2_videodevice: Test U8\n\tarray controls","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>","X-List-Received-Date":"Fri, 20 Mar 2020 23:32:50 -0000"}}]