[{"id":4881,"web_url":"https://patchwork.libcamera.org/comment/4881/","msgid":"<1fc1b693-07df-0f3e-165b-44f69b311290@ideasonboard.com>","date":"2020-05-21T12:35:02","subject":"Re: [libcamera-devel] [PATCH v2] libcamera: PixelFormat: Replace\n\thex with fourcc and modifiers","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Kaaira,\n\nOn 04/04/2020 15:31, Kaaira Gupta wrote:\n> Print fourCC characters instead of the hex values in toString() as they\n> are easier to comprehend. Also, print the corresponding modifiers of the\n> DRM formats so that it can be more specific.\n> \n> Write the tests for them as well.\n> \n> Signed-off-by: Kaaira Gupta <kgupta@es.iitr.ac.in>\n> ---\n> \n> Changes since v1:\n>         - Replaced magic numbers with expressive values.\n>         - Re-wrote ARM vendor's modifiers\n>         - Re-wrote the vendors' map with a macro.\n>         - Changed the copyrights in test file.\n>         - Changed the tests.\n> \n>  src/libcamera/pixelformats.cpp | 197 ++++++++++++++++++++++++++++++++-\n>  test/meson.build               |   1 +\n>  test/pixel-format.cpp          |  49 ++++++++\n>  3 files changed, 244 insertions(+), 3 deletions(-)\n>  create mode 100644 test/pixel-format.cpp\n> \n> diff --git a/src/libcamera/pixelformats.cpp b/src/libcamera/pixelformats.cpp\n> index 1330dc5..81159ee 100644\n> --- a/src/libcamera/pixelformats.cpp\n> +++ b/src/libcamera/pixelformats.cpp\n> @@ -6,6 +6,17 @@\n>   */\n>  \n>  #include <libcamera/pixelformats.h>\n> +#include <map>\n> +#include <string.h>\n> +\n> +#define PIXELFORMAT_VENDOR(vendor)\t\t    \\\n> +        { DRM_FORMAT_MOD_VENDOR_## vendor, #vendor }\n> +\n> +#define AFBC_FORMAT_MOD_BLOCK(afbcBlock)\t\t    \\\n> +\t\t{ AFBC_FORMAT_MOD_## afbcBlock, #afbcBlock }\n> +\n> +#define AFBC_FORMAT_MOD(modifier, mod)\t\t\t     \\\n> +\t\t{ modifier & (AFBC_FORMAT_MOD_## mod), #mod }\n\nI'm sorry - as it's likely my fault, but I think we went a little too\ndeep here.\n\nThe only vendor code modifier we are likely to use is the\nDRM_FORMAT_MOD_VENDOR_MIPI, so we probably want to greatly simplify this\nconversion and only handle that vendor code.\n\nWe should still print the other vendor codes if they are given as a\nhint, but theres no need to decode those directly.\n\n\n\n>  \n>  /**\n>   * \\file pixelformats.h\n> @@ -108,9 +119,189 @@ bool PixelFormat::operator<(const PixelFormat &other) const\n>   */\n>  std::string PixelFormat::toString() const\n>  {\n> -\tchar str[11];\n> -\tsnprintf(str, 11, \"0x%08x\", fourcc_);\n> -\treturn str;\n> +\tif (fourcc_ == DRM_FORMAT_INVALID)\n> +\t\treturn \"<INVALID>\";\n> +\n> +\tchar ss[8] = { static_cast<char>(fourcc_ & 0x7f),\n> +\t\t       static_cast<char>((fourcc_ >> 8) & 0x7f),\n> +\t\t       static_cast<char>((fourcc_ >> 16) & 0x7f),\n> +\t\t       static_cast<char>((fourcc_ >> 24) & 0x7f) };\n> +\n> +\tfor (unsigned int i = 0; i < 4; i++) {\n> +\t\tif (!isprint(ss[i]))\n> +\t\t\tss[i] = '.';\n> +\t}\n> +\n> +\tif (fourcc_ & (1 << 31))\n> +\t\tstrcat(ss, \"-BE\");\n> +\n> +\tstd::string modifier;\n> +\n> +\tif (modifier_ == DRM_FORMAT_MOD_INVALID) {\n> +\t\tmodifier = \" - <INVALID> modifier\";\n> +\t\treturn ss + modifier;\n> +\t}\n> +\n> +\t/* Map of all the vendors with their Ids: */\n> +\tstd::map<long int, std::string> vendors = {\n> +\t\tPIXELFORMAT_VENDOR(NONE),\n> +\t\tPIXELFORMAT_VENDOR(INTEL),\n> +\t\tPIXELFORMAT_VENDOR(AMD),\n> +\t\tPIXELFORMAT_VENDOR(NVIDIA),\n> +\t\tPIXELFORMAT_VENDOR(SAMSUNG),\n> +\t\tPIXELFORMAT_VENDOR(QCOM),\n> +\t\tPIXELFORMAT_VENDOR(VIVANTE),\n> +\t\tPIXELFORMAT_VENDOR(BROADCOM),\n> +\t\tPIXELFORMAT_VENDOR(ARM),\n> +\t\tPIXELFORMAT_VENDOR(ALLWINNER),\n> +\t\tPIXELFORMAT_VENDOR(MIPI)\n> +\t};\n> +\n> +\tstd::map<long int, std::string> afbc_format_blocks = {\n> +\t\tAFBC_FORMAT_MOD_BLOCK(BLOCK_SIZE_16x16),\n> +\t\tAFBC_FORMAT_MOD_BLOCK(BLOCK_SIZE_32x8),\n> +\t\tAFBC_FORMAT_MOD_BLOCK(BLOCK_SIZE_64x4),\n> +\t\tAFBC_FORMAT_MOD_BLOCK(BLOCK_SIZE_32x8_64x4),\n> +\n> +\t};\n> +\n> +\tstd::map<long int, std::string> afbc_format_mod = {\n> +\t\tAFBC_FORMAT_MOD(modifier_, YTR),\n> +\t\tAFBC_FORMAT_MOD(modifier_, SPLIT),\n> +\t\tAFBC_FORMAT_MOD(modifier_, SPARSE),\n> +\t\tAFBC_FORMAT_MOD(modifier_, CBR),\n> +\t\tAFBC_FORMAT_MOD(modifier_, TILED),\n> +\t\tAFBC_FORMAT_MOD(modifier_, SC),\n> +\t\tAFBC_FORMAT_MOD(modifier_, DB),\n> +\t\tAFBC_FORMAT_MOD(modifier_, BCH),\n> +\t};\n> +\n> +\t/* Get the vendor name using its Id */\n> +\tlong int vendorCode = (modifier_ >> 56) & 0xff;\n> +\tstd::string vendor = vendors[vendorCode];\n> +\n> +\tuint64_t modifierValue = modifier_ & 0xff;\n> +\tstd::string vendorSpecification;\n> +\n> +\tswitch (vendorCode) {\n> +\tcase DRM_FORMAT_MOD_VENDOR_NONE: {\n> +\t\tif (modifierValue == 0)\n> +\t\t\tvendorSpecification = \"Linear Layout\";\n> +\t\tbreak;\n> +\t}\n\nWe'd keep DRM_FORMAT_MOD_VENDOR_NONE of course ;-)\n\n\n> +\tcase DRM_FORMAT_MOD_VENDOR_INTEL: {\n> +\t\tif (modifierValue == 1)\n> +\t\t\tvendorSpecification = \"X-tiled\";\n> +\t\telse if (modifierValue == 2)\n> +\t\t\tvendorSpecification = \"Y-tiled\";\n> +\t\telse if (modifierValue == 3)\n> +\t\t\tvendorSpecification = \"Yf-tiled\";\n> +\t\telse if (modifierValue == 4)\n> +\t\t\tvendorSpecification = \"Y-tiled CCS\";\n> +\t\telse if (modifierValue == 5)\n> +\t\t\tvendorSpecification = \"Yf-tiled CSS\";\n> +\t\telse if (modifierValue == 8)\n> +\t\t\tvendorSpecification = \"Bayer packed\";\n> +\t\tbreak;\n> +\t}\n> +\tcase DRM_FORMAT_MOD_VENDOR_AMD: {\n> +\t\t// no specifications\n> +\t\tbreak;\n> +\t}\n> +\tcase DRM_FORMAT_MOD_VENDOR_NVIDIA: {\n> +\t\tif (modifierValue == 1)\n> +\t\t\tvendorSpecification = \"Tegra-tiled\";\n> +\t\telse if (modifierValue == 0x10)\n> +\t\t\tvendorSpecification = \"ONE_GOB | v = 0\";\n> +\t\telse if (modifierValue == 0x11)\n> +\t\t\tvendorSpecification = \"TWO_GOB | v = 1\";\n> +\t\telse if (modifierValue == 0x12)\n> +\t\t\tvendorSpecification = \"FOUR_GOB | v = 2\";\n> +\t\telse if (modifierValue == 0x13)\n> +\t\t\tvendorSpecification = \"EIGHT_GOB | v = 3\";\n> +\t\telse if (modifierValue == 0x14)\n> +\t\t\tvendorSpecification = \"SIXTEEN_GOB | v = 4\";\n> +\t\telse if (modifierValue == 0x15)\n> +\t\t\tvendorSpecification = \"THIRTYTWO_GOB | v = 5\";\n> +\t\tbreak;\n> +\t}\n> +\tcase DRM_FORMAT_MOD_VENDOR_SAMSUNG: {\n> +\t\tif (modifierValue == 1)\n> +\t\t\tvendorSpecification = \"Tiled, 64 (pixels) x 32 (lines)\";\n> +\t\telse if (modifierValue == 2)\n> +\t\t\tvendorSpecification = \"Tiled, 16 (pixels) x 16 (lines)\";\n> +\t\tbreak;\n> +\t}\n> +\tcase DRM_FORMAT_MOD_VENDOR_QCOM: {\n> +\t\tif (modifierValue == 1)\n> +\t\t\tvendorSpecification = \"Compressed\";\n> +\t\tbreak;\n> +\t}\n> +\tcase DRM_FORMAT_MOD_VENDOR_VIVANTE: {\n> +\t\tif (modifierValue == 1)\n> +\t\t\tvendorSpecification = \"4 x 4 tiled\";\n> +\t\telse if (modifierValue == 2)\n> +\t\t\tvendorSpecification = \"64 x 64 super-tiled\";\n> +\t\telse if (modifierValue == 3)\n> +\t\t\tvendorSpecification = \"4 x 4 split-tiled\";\n> +\t\telse if (modifierValue == 4)\n> +\t\t\tvendorSpecification = \"64 x 64 split-super-tiled\";\n> +\t\tbreak;\n> +\t}\n> +\tcase DRM_FORMAT_MOD_VENDOR_BROADCOM: {\n> +\t\tif (modifierValue == 1)\n> +\t\t\tvendorSpecification = \"VC4-T-Tiled\";\n> +\t\telse if (modifierValue == 6)\n> +\t\t\tvendorSpecification = \"UIF\";\n> +\t\telse if (modifierValue == 2)\n> +\t\t\tvendorSpecification = \"SAND32\";\n> +\t\telse if (modifierValue == 3)\n> +\t\t\tvendorSpecification = \"SAND64\";\n> +\t\telse if (modifierValue == 4)\n> +\t\t\tvendorSpecification = \"SAND128\";\n> +\t\telse if (modifierValue == 5)\n> +\t\t\tvendorSpecification = \"SAND256\";\n> +\t\tbreak;\n> +\t}\n> +\tcase DRM_FORMAT_MOD_VENDOR_ARM: {\n> +\t\tuint8_t block_size = modifier_ & AFBC_FORMAT_MOD_BLOCK_SIZE_MASK;\n> +\n> +\t\tif (afbc_format_blocks.count(block_size)) {\n> +\t\t\tvendorSpecification = afbc_format_blocks[block_size] + \" | \";\n> +\t\t};\n> +\n> +\t\tstd::map<long int, std::string>::iterator it;\n> +\t\tfor (it = afbc_format_mod.begin(); it != afbc_format_mod.end(); it++) {\n> +\t\t\tif (it->first != 0) {\n> +\t\t\t\tvendorSpecification += it->second + \" | \";\n> +\t\t\t}\n> +\t\t}\n> +\t\tbreak;\n> +\t}\n> +\tcase DRM_FORMAT_MOD_VENDOR_ALLWINNER: {\n> +\t\tif (modifierValue == 1)\n> +\t\t\tvendorSpecification = \"Tiled\";\n> +\t\tbreak;\n> +\t}\n\nSo for all the other vendor, printing just the hex value should be fine,\nas a default catch all (and it would be in the default case statement below)\n\n> +\tcase DRM_FORMAT_MOD_VENDOR_MIPI: {\n> +\t\tif (modifierValue == 1)\n> +\t\t\tvendorSpecification = \"CSI-2 packed\";\n> +\t\tbreak;\n> +\t}\n\nAnd we should keep that one, but using modifierValue == 1 is a 'magic\nvalue', so we should get that directly from the modifier code. We might\nneed to use a bitfield mask.\n\n\n> +\tdefault:\n> +\t\tbreak;\n> +\t}\n> +\n> +\tmodifier = vendor + \" : \" + vendorSpecification;\n> +\tstd::string formatString(ss);\n> +\tformatString = formatString + \" - \" + modifier;\n> +\n> +\t/* Trim last three characters of the string if last char is a space. */\n> +\tif (isspace(formatString.back())) {\n> +\t\tformatString = formatString.substr(0, formatString.size() - 3);\n> +\t}\n\nTry to see if you can prevent adding the characters in the first place,\nso they don't need to be trimmed back.\n\n\n> +\n> +\treturn formatString;\n>  }\n>  \n>  } /* namespace libcamera */\n> diff --git a/test/meson.build b/test/meson.build\n> index 8ab58ac..3f97278 100644\n> --- a/test/meson.build\n> +++ b/test/meson.build\n> @@ -30,6 +30,7 @@ internal_tests = [\n>      ['message',                         'message.cpp'],\n>      ['object',                          'object.cpp'],\n>      ['object-invoke',                   'object-invoke.cpp'],\n> +    ['pixel-format',                    'pixel-format.cpp'],\n>      ['signal-threads',                  'signal-threads.cpp'],\n>      ['threads',                         'threads.cpp'],\n>      ['timer',                           'timer.cpp'],\n> diff --git a/test/pixel-format.cpp b/test/pixel-format.cpp\n> new file mode 100644\n> index 0000000..55cd916\n> --- /dev/null\n> +++ b/test/pixel-format.cpp\n> @@ -0,0 +1,49 @@\n> +/* SPDX-License-Identifier: GPL-2.0-or-later */\n> +/*\n> + * Copyright (C) 2020, Kaaira Gupta\n> + *\n> + * libcamera pixel format handling test\n> + */\n> +\n> +#include <iostream>\n> +#include <vector>\n> +\n> +#include \"libcamera/pixelformats.h\"\n> +\n> +#include \"test.h\"\n> +\n> +using namespace std;\n> +using namespace libcamera;\n> +\n> +class PixelFormatTest : public Test\n> +{\n> +protected:\n> +\tint run()\n> +\t{\n> +\t\tstd::vector<std::pair<PixelFormat, const char *>> formats{\n> +\t\t\t{ PixelFormat(DRM_FORMAT_SRGGB8, DRM_FORMAT_MOD_INVALID), \"RGGB - <INVALID> modifier\" },\n> +\t\t\t{ PixelFormat(DRM_FORMAT_SRGGB8, DRM_FORMAT_MOD_LINEAR), \"RGGB - NONE : Linear Layout\" },\n> +\t\t\t{ PixelFormat(DRM_FORMAT_C8, DRM_FORMAT_MOD_ARM_AFBC(4)), \"C8   - ARM : BLOCK_SIZE_32x8_64x4\" },\n> +\t\t\t{ PixelFormat(DRM_FORMAT_YUV410, DRM_FORMAT_MOD_ARM_AFBC(4|1ULL << 11)), \"YUV9 - ARM : BLOCK_SIZE_32x8_64x4 | BCH\"},\n> +\t\t\t{ PixelFormat(DRM_FORMAT_BIG_ENDIAN, DRM_FORMAT_MOD_ALLWINNER_TILED), \"....-BE - ALLWINNER : Tiled\" }\n> +\t\t};\n> +\t\tfor (const auto &format : formats) {\n> +\t\t\tif ((format.first).toString() != format.second) {\n> +\t\t\t\tcerr << \"Failed to convert PixelFormat \"\n> +\t\t\t\t     << format.first.fourcc() << \" to string\"\n> +\t\t\t\t     << endl;\n> +\t\t\t\treturn TestFail;\n> +\t\t\t}\n> +\t\t}\n> +\n> +\t\tif (PixelFormat().toString() != \"<INVALID>\") {\n> +\t\t\tcerr << \"Failed to convert default PixelFormat to string\"\n> +\t\t\t     << endl;\n> +\t\t\treturn TestFail;\n> +\t\t}\n> +\n> +\t\treturn TestPass;\n> +\t}\n> +};\n> +\n> +TEST_REGISTER(PixelFormatTest)\n>","headers":{"Return-Path":"<kieran.bingham@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 97590603D8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 21 May 2020 14:35:06 +0200 (CEST)","from [192.168.0.20]\n\t(cpc89242-aztw30-2-0-cust488.18-1.cable.virginm.net [86.31.129.233])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 9915D24D;\n\tThu, 21 May 2020 14:35:05 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"UkJ9nUEe\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1590064506;\n\tbh=cFvknpEioqm59XIIfMgXvMlK1hCW6Kj1iKVCaQQHgHY=;\n\th=Reply-To:Subject:To:References:From:Date:In-Reply-To:From;\n\tb=UkJ9nUEeh+CE5WmgYXskItFp88PWgaRx5J+u8UARjrbZwaPPUepdkYexaLw1laMpB\n\tmsvi6HQHMX7OJedgtNL6WG4S52QW4plq9fTt6ukOERp5cEIgO6C0GvXdLbeiTPAwXi\n\tzpicKFAliHcJgnyxzLKCFP8SVXvNBY5mfT+qkrpA=","Reply-To":"kieran.bingham@ideasonboard.com","To":"Kaaira Gupta <kgupta@es.iitr.ac.in>, libcamera-devel@lists.libcamera.org,\n\tHelen Koike <helen.koike@collabora.com>,\n\tVaishali Thakkar <vthakkar@vaishalithakkar.in>","References":"<20200404143123.GA14635@kaaira-HP-Pavilion-Notebook>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Autocrypt":"addr=kieran.bingham@ideasonboard.com; keydata=\n\t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\n\tWZw01QYHU/GUV/zHJSFk","Organization":"Ideas on Board","Message-ID":"<1fc1b693-07df-0f3e-165b-44f69b311290@ideasonboard.com>","Date":"Thu, 21 May 2020 13:35:02 +0100","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101\n\tThunderbird/68.7.0","MIME-Version":"1.0","In-Reply-To":"<20200404143123.GA14635@kaaira-HP-Pavilion-Notebook>","Content-Type":"text/plain; charset=utf-8","Content-Language":"en-GB","Content-Transfer-Encoding":"8bit","Subject":"Re: [libcamera-devel] [PATCH v2] libcamera: PixelFormat: Replace\n\thex with fourcc and modifiers","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":"Thu, 21 May 2020 12:35:06 -0000"}}]