Patch Detail
Show a patch.
GET /api/patches/3363/?format=api
{ "id": 3363, "url": "https://patchwork.libcamera.org/api/patches/3363/?format=api", "web_url": "https://patchwork.libcamera.org/patch/3363/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20200331210525.GA4378@kaaira-HP-Pavilion-Notebook>", "date": "2020-03-31T21:05:25", "name": "[libcamera-devel] libcamera: PixelFormat: Replace hex with fourcc and modifiers", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "4d13c65b47f369161b3a428ef5e3e1c33440ee6c", "submitter": { "id": 39, "url": "https://patchwork.libcamera.org/api/people/39/?format=api", "name": "Kaaira Gupta", "email": "kgupta@es.iitr.ac.in" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/3363/mbox/", "series": [ { "id": 790, "url": "https://patchwork.libcamera.org/api/series/790/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=790", "date": "2020-03-31T21:05:25", "name": "[libcamera-devel] libcamera: PixelFormat: Replace hex with fourcc and modifiers", "version": 1, "mbox": "https://patchwork.libcamera.org/series/790/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/3363/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/3363/checks/", "tags": {}, "headers": { "Return-Path": "<kgupta@es.iitr.ac.in>", "Received": [ "from mail-pf1-x444.google.com (mail-pf1-x444.google.com\n\t[IPv6:2607:f8b0:4864:20::444])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A742C6040B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 31 Mar 2020 23:05:34 +0200 (CEST)", "by mail-pf1-x444.google.com with SMTP id i13so10967695pfe.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 31 Mar 2020 14:05:34 -0700 (PDT)", "from kaaira-HP-Pavilion-Notebook ([103.113.213.154])\n\tby smtp.gmail.com with ESMTPSA id\n\tq19sm12382393pgn.93.2020.03.31.14.05.30\n\t(version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256);\n\tTue, 31 Mar 2020 14:05:32 -0700 (PDT)" ], "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected)\n\theader.d=es-iitr-ac-in.20150623.gappssmtp.com\n\theader.i=@es-iitr-ac-in.20150623.gappssmtp.com header.b=\"wN/8lz3W\"; \n\tdkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=es-iitr-ac-in.20150623.gappssmtp.com; s=20150623;\n\th=date:from:to:cc:subject:message-id:mime-version:content-disposition\n\t:user-agent; bh=72OodayrexomeTKqPJI/QpUisRU/qxfloIjQNgGTjxc=;\n\tb=wN/8lz3We5ywi1uNqvbCJYsg+M0XYv/Cup/9yfZhxSrYupV4M1nhm0GB0oR+0AeurL\n\tAD3wp7I+KeXEQmDxk4+vOJ6d9olHMZxInQgAXM1ceD9mD8oTmyocErCtYpi6Qnh09RxC\n\tOsXJDnrg7jg/8vJRv5PbSad5n7nBlLZxCmZJ06Kw8zS5UV8PuKKzShuQ0BszV+GkvnK2\n\tdYweCfbgIQYzbhG8ItovCZyM7MnBMTcBSvyaDg4E9gnfe/uDNgr+Rd/AE46iyFAAF1u3\n\tGUpRb3m+AZDtgscwY4zJvHzjLSbqReWaWiIuJgpVIk1SUeZDM7IXRsTDJG/BROSyZ8gS\n\tZI4w==", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:mime-version\n\t:content-disposition:user-agent;\n\tbh=72OodayrexomeTKqPJI/QpUisRU/qxfloIjQNgGTjxc=;\n\tb=aRTRJM7waPCnhPqgqzXLEgKMCv9EBx7Z0ia+oxtyNbvitFWZGnA6TWyo+185xBWUWv\n\tVdnZKQcifoTaL0qtON5whMFykiSOFjMfqg/x4WBRs4lZwH4hjqUjlFsHtOZ68AyXVthp\n\teXx3wgV8ES/JRKSkzEI1Tudv4gk8uCuKz/tWirQ68kh9Y3P5sJLjTuKaEfStUudFmrwm\n\tHMY3mrhbDIG4Cdo15tUigQQk3pFqXmTIoCtwH0gzNW9FtyOC+hTyJy8WXRXAr2xADnbp\n\tC8Yx0kkRFf2/KEa9iR7w63IqUiAKsfIg4CQeI1C/snLuekCrdm4YX9piVMaAorapFHPA\n\t4bxQ==", "X-Gm-Message-State": "ANhLgQ0TQ+8hngmIvHGFkyQRVSBxDZ/d71O+XDT6kqm30A6z4iL2IskT\n\tDx4/QCTUToiz7qUcZrsgvfh5g7GTM88Yfg==", "X-Google-Smtp-Source": "ADFU+vtD8Jj3Fqgru7aBNCtE/gDlqAf8bRZhNByb/XyI/zoStqCqPDdbn0OTcFlhgwBI+Fmq1PUkBQ==", "X-Received": "by 2002:a63:4282:: with SMTP id\n\tp124mr20325959pga.59.1585688732731; \n\tTue, 31 Mar 2020 14:05:32 -0700 (PDT)", "Date": "Wed, 1 Apr 2020 02:35:25 +0530", "From": "Kaaira Gupta <kgupta@es.iitr.ac.in>", "To": "libcamera-devel@lists.libcamera.org,\n\tKieran Bingham <kieran.bingham@ideasonboard.com>,\n\tHelen Koike <helen.koike@collabora.com>,\n\tVaishali Thakkar <vthakkar@vaishalithakkar.in>", "Cc": "kgupta@es.iitr.ac.in", "Message-ID": "<20200331210525.GA4378@kaaira-HP-Pavilion-Notebook>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=us-ascii", "Content-Disposition": "inline", "User-Agent": "Mutt/1.9.4 (2018-02-28)", "Subject": "[libcamera-devel] [PATCH] libcamera: PixelFormat: Replace hex with\n\tfourcc 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": "Tue, 31 Mar 2020 21:05:37 -0000" }, "content": "Print fourCC characters instead of the hex values in toString() as they\nare easier to comprehend. Also, print the corresponding modifiers of the\nDRM formats so that it can be more specific.\n\nWrite the tests for them as well.\n\nSigned-off-by: Kaaira Gupta <kgupta@es.iitr.ac.in>\n---\n src/libcamera/pixelformats.cpp | 192 ++++++++++++++++++++++++++++++++-\n test/meson.build | 1 +\n test/pixel-format.cpp | 55 ++++++++++\n 3 files changed, 245 insertions(+), 3 deletions(-)\n create mode 100644 test/pixel-format.cpp", "diff": "diff --git a/src/libcamera/pixelformats.cpp b/src/libcamera/pixelformats.cpp\nindex 87557d9..398dbb2 100644\n--- a/src/libcamera/pixelformats.cpp\n+++ b/src/libcamera/pixelformats.cpp\n@@ -6,6 +6,8 @@\n */\n \n #include <libcamera/pixelformats.h>\n+#include <map>\n+#include <string.h>\n \n /**\n * \\file pixelformats.h\n@@ -108,9 +110,193 @@ 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_ == 0)\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 (*modifiers_.begin() == 72057594037927935) {\n+\t\tmodifier = \" <INVALID> modifier\";\n+\t\treturn ss + modifier;\n+\t}\n+\n+\tif (*modifiers_.begin() == 0xf) {\n+\t\tmodifier = \" AFBC_FORMAT_MOD_BLOCK_SIZE_MASK\";\n+\t\treturn ss + modifier;\n+\t} else if (*modifiers_.begin() == 1ULL) {\n+\t\tmodifier = \"AFBC_FORMAT_MOD_BLOCK_SIZE_16x16\";\n+\t\treturn ss + modifier;\n+\t} else if (*modifiers_.begin() == 2ULL) {\n+\t\tmodifier = \" AFBC_FORMAT_MOD_BLOCK_SIZE_32x8\";\n+\t\treturn ss + modifier;\n+\t} else if (*modifiers_.begin() == 3ULL) {\n+\t\tmodifier = \" AFBC_FORMAT_MOD_BLOCK_SIZE_64x4\";\n+\t\treturn ss + modifier;\n+\t} else if (*modifiers_.begin() == 4ULL) {\n+\t\tmodifier = \" AFBC_FORMAT_MOD_BLOCK_SIZE_32x8_64x4\";\n+\t\treturn ss + modifier;\n+\t} else if (*modifiers_.begin() == (1ULL << 4)) {\n+\t\tmodifier = \" AFBC_FORMAT_MOD_YTR\";\n+\t\treturn ss + modifier;\n+\t} else if (*modifiers_.begin() == (1ULL << 5)) {\n+\t\tmodifier = \" AFBC_FORMAT_MOD_SPLIT\";\n+\t\treturn ss + modifier;\n+\t} else if (*modifiers_.begin() == (1ULL << 6)) {\n+\t\tmodifier = \" AFBC_FORMAT_MOD_SPARS\";\n+\t\treturn ss + modifier;\n+\t} else if (*modifiers_.begin() == (1ULL << 7)) {\n+\t\tmodifier = \" AFBC_FORMAT_MOD_CBR\";\n+\t\treturn ss + modifier;\n+\t} else if (*modifiers_.begin() == (1ULL << 8)) {\n+\t\tmodifier = \" AFBC_FORMAT_MOD_TILED\";\n+\t\treturn ss + modifier;\n+\t} else if (*modifiers_.begin() == (1ULL << 9)) {\n+\t\tmodifier = \" AFBC_FORMAT_MOD_SC\";\n+\t\treturn ss + modifier;\n+\t} else if (*modifiers_.begin() == (1ULL << 10)) {\n+\t\tmodifier = \" AFBC_FORMAT_MOD_DB\";\n+\t\treturn ss + modifier;\n+\t} else if (*modifiers_.begin() == (1ULL << 11)) {\n+\t\tmodifier = \" AFBC_FORMAT_MOD_BCH\";\n+\t\treturn ss + modifier;\n+\t}\n+\n+\tstd::map<long int, std::string> vendors = {\n+\t\t{ 0, \"NONE\" },\n+\t\t{ 0x01, \"INTEL\" },\n+\t\t{ 0x02, \"AMD\" },\n+\t\t{ 0x03, \"NVIDIA\" },\n+\t\t{ 0x04, \"SAMSUNG\" },\n+\t\t{ 0x05, \"QCOM\" },\n+\t\t{ 0x06, \"VIVANTE\" },\n+\t\t{ 0x07, \"BROADCOM\" },\n+\t\t{ 0x08, \"ARM\" },\n+\t\t{ 0x09, \"ALLWINNER\" },\n+\t\t{ 0x0a, \"MIPI\" }\n+\t};\n+\n+\tlong int vendorCode = (*modifiers_.begin() >> 56) & 0xff;\n+\n+\tstd::string vendor = vendors[vendorCode];\n+\n+\tint modifierValue = *modifiers_.begin() & 0xff;\n+\tstd::string vendorSpecification;\n+\n+\tswitch (vendorCode) {\n+\tcase 0: {\n+\t\tif (modifierValue == 0)\n+\t\t\tvendorSpecification = \"Linear Layout\";\n+\t\tbreak;\n+\t}\n+\tcase 0x01: {\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 0x02: {\n+\t\t// no specifications\n+\t\tbreak;\n+\t}\n+\tcase 0x03: {\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 0x04: {\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 0x05: {\n+\t\tif (modifierValue == 1)\n+\t\t\tvendorSpecification = \"Compressed\";\n+\t\tbreak;\n+\t}\n+\tcase 0x06: {\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 0x07: {\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 0x08: {\n+\t\tvendorSpecification = \"DRM_FORMAT_MOD_ARM_AFBC(\" + modifierValue;\n+\t\tbreak;\n+\t}\n+\tcase 0x09: {\n+\t\tif (modifierValue == 1)\n+\t\t\tvendorSpecification = \"Tiled\";\n+\t\tbreak;\n+\t}\n+\tcase 0x0a: {\n+\t\tif (modifierValue == 1)\n+\t\t\tvendorSpecification = \"CSI-2 packed\";\n+\t\tbreak;\n+\t}\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\tmodifier = vendor + ' ' + vendorSpecification;\n+\tstd::string formatString(ss);\n+\n+\treturn formatString + ' ' + modifier;\n }\n \n } /* namespace libcamera */\ndiff --git a/test/meson.build b/test/meson.build\nindex 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'],\ndiff --git a/test/pixel-format.cpp b/test/pixel-format.cpp\nnew file mode 100644\nindex 0000000..9676f27\n--- /dev/null\n+++ b/test/pixel-format.cpp\n@@ -0,0 +1,55 @@\n+/* SPDX-License-Identifier: GPL-2.0-or-later */\n+/*\n+ * Copyright (C) 2019, Google Inc.\n+ *\n+ * libcamera pixel format handling test\n+ */\n+\n+#include <iostream>\n+#include <vector>\n+\n+#include \"libcamera/pixelformats.h\"\n+#include \"utils.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(0, { DRM_FORMAT_MOD_INVALID }), \"<INVALID>\" },\n+\t\t\t{ PixelFormat(DRM_FORMAT_SRGGB8, { DRM_FORMAT_MOD_LINEAR }),\n+\t\t\t \"RGGB NONE Linear Layout\" },\n+\t\t\t{ PixelFormat(DRM_FORMAT_C8,\n+\t\t\t{ DRM_FORMAT_MOD_BROADCOM_SAND32_COL_HEIGHT(0) }),\n+\t\t\t \"C8 BROADCOM SAND32\" },\n+\t\t\t{ PixelFormat(DRM_FORMAT_YUV410, { AFBC_FORMAT_MOD_SPLIT }),\n+\t\t\t \"YUV9 AFBC_FORMAT_MOD_SPLIT\" },\n+\t\t\t{ PixelFormat(DRM_FORMAT_BIG_ENDIAN, { DRM_FORMAT_MOD_INVALID }),\n+\t\t\t \"....-BE <INVALID> modifier\" }\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", "prefixes": [ "libcamera-devel" ] }