From patchwork Fri Jun 19 19:06:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kaaira Gupta X-Patchwork-Id: 4103 Return-Path: Received: from mail-pg1-x535.google.com (mail-pg1-x535.google.com [IPv6:2607:f8b0:4864:20::535]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 08C77600FE for ; Fri, 19 Jun 2020 21:06:39 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=es-iitr-ac-in.20150623.gappssmtp.com header.i=@es-iitr-ac-in.20150623.gappssmtp.com header.b="GVsGQhHk"; dkim-atps=neutral Received: by mail-pg1-x535.google.com with SMTP id s10so4899037pgm.0 for ; Fri, 19 Jun 2020 12:06:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=es-iitr-ac-in.20150623.gappssmtp.com; s=20150623; h=date:from:to:subject:message-id:mime-version:content-disposition :user-agent; bh=xXWxUHRlwLR0ExHZPIY7IGmpEErELaLAeLli60Fznw8=; b=GVsGQhHka7MJJOpgnlWcFsK9Tuy6FcV2W1YRSYdk4LvmGyk3gMpLSaCGgGO86NxnL7 ZJgq1UTqeJC2oQ1IFhSgPkE9h+rwvRMy7LlZd9Yd61MCF3W++hkbSLtaw6UorW3r/anS kJxecYVBvMhNMN4sL6kQXptWRjfke7mftOWBldIja8OX+3DxmE40Q8Prx4N1II27QScA tT5h6yh9NFkbxuYGLmmu8Y8CyO0d41Ts/4kUCzTHHZxVO6prLK8yWpTSFpEeya+mZBwE tRQz4h0D7H2xCfbI/ck2RcZnPdMnC3gme8KY7c7LxqJX0cfeezOz82NNknzp0UnYYEgZ J6Pg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:subject:message-id:mime-version :content-disposition:user-agent; bh=xXWxUHRlwLR0ExHZPIY7IGmpEErELaLAeLli60Fznw8=; b=ijrcBRW8nTFF5TZENRmYGiAS/MeVugUaHpIEWI3VWXUN3IzAZYjgdFsEsbwUxmpTV+ TWLeSysdyJlHWUsmkJj628vv6lFck/+He/lrK1w+Mrhx3yiTWEjo+SQN8578Fbjqv+es IN62ZSMmqI4hKCrCklSYe11GszLk7rK8JSCQHSg10yY4tQqupsZ+3uxxTd88bs8gkdER p1z1vthG+yEw5iXmc/oZDHfnxQnTOclgoxpHdRe5dumDvaIPi0zNN2s8kUJUqnk/u36q WoIAZ8eK8gIspk8T/lr89wG56v6VpVqxH9+uEyEaaUvveplzJf4sGP057YP1peTHjGFV Rozw== X-Gm-Message-State: AOAM53095ZhqqnqTSir31UzvRhBpiq4M7/NoRceukUAfIAP4OanRHo9B SIA2AcCJJerSon0XQHzsTT9iHjDCUv/p7g== X-Google-Smtp-Source: ABdhPJxGOJDYnxa+FrnDPQTbD2aSOA4i4KQ3OouOjnTnkD8qIGbwP20MFbE7KIaAQyKSgvSbrkek3g== X-Received: by 2002:a63:5d19:: with SMTP id r25mr4144062pgb.360.1592593597555; Fri, 19 Jun 2020 12:06:37 -0700 (PDT) Received: from kaaira-HP-Pavilion-Notebook ([103.113.213.178]) by smtp.gmail.com with ESMTPSA id x126sm6657750pfc.36.2020.06.19.12.06.35 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Fri, 19 Jun 2020 12:06:37 -0700 (PDT) Date: Sat, 20 Jun 2020 00:36:31 +0530 From: Kaaira Gupta To: libcamera-devel@lists.libcamera.org, Kieran Bingham , Laurent Pinchart Message-ID: <20200619190631.GA13950@kaaira-HP-Pavilion-Notebook> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.9.4 (2018-02-28) Subject: [libcamera-devel] [PATCH v5] libcamera:PixelFormat: Replace hex with format names X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 19 Jun 2020 19:06:41 -0000 Print format names defined in formats namespace instead of the hex values in toString() as they are easier to comprehend. For this add a property of 'name' in PixelFormatInfo so as to map the formats with their names. Print fourcc for formats which are not used in libcamera. Signed-off-by: Kaaira Gupta Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- Changes since v4: -Print libcamera defined names instead of fourcc. Changes since v3: -shortened the texts. -Removed default case as well. -changed commit message and tests to reflect the changes. Changes since v2: - Remove description for all vendors except for MIPI - Change commit message to reflect this change. - Change tests accordingly. Changes since v1: - Replaced magic numbers with expressive values. - Re-wrote ARM vendor's modifiers - Re-wrote the vendors' map with a macro. - Changed the copyrights in test file. - Changed the tests. include/libcamera/internal/formats.h | 1 + src/libcamera/formats.cpp | 40 +++++++++++++++++++++-- src/libcamera/pixel_format.cpp | 27 +++++++++++++-- test/meson.build | 1 + test/pixel-format.cpp | 49 ++++++++++++++++++++++++++++ 5 files changed, 113 insertions(+), 5 deletions(-) create mode 100644 test/pixel-format.cpp diff --git a/include/libcamera/internal/formats.h b/include/libcamera/internal/formats.h index 4b172ef..8012721 100644 --- a/include/libcamera/internal/formats.h +++ b/include/libcamera/internal/formats.h @@ -46,6 +46,7 @@ public: static const PixelFormatInfo &info(const PixelFormat &format); /* \todo Add support for non-contiguous memory planes */ + std::string name; PixelFormat format; V4L2PixelFormat v4l2Format; unsigned int bitsPerPixel; diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp index 97e9867..2908409 100644 --- a/src/libcamera/formats.cpp +++ b/src/libcamera/formats.cpp @@ -169,6 +169,7 @@ namespace { const std::map pixelFormatInfo{ /* RGB formats. */ { formats::BGR888, { + .name = "BGR888", .format = formats::BGR888, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_RGB24), .bitsPerPixel = 24, @@ -176,6 +177,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::RGB888, { + .name = "RGB888", .format = formats::RGB888, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_BGR24), .bitsPerPixel = 24, @@ -183,6 +185,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::ABGR8888, { + .name = "ABGR8888", .format = formats::ABGR8888, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_RGBA32), .bitsPerPixel = 32, @@ -190,6 +193,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::ARGB8888, { + .name = "ARGB8888", .format = formats::ARGB8888, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_ABGR32), .bitsPerPixel = 32, @@ -197,6 +201,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::BGRA8888, { + .name = "BGRA8888", .format = formats::BGRA8888, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_ARGB32), .bitsPerPixel = 32, @@ -204,6 +209,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::RGBA8888, { + .name = "RGBA8888", .format = formats::RGBA8888, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_BGRA32), .bitsPerPixel = 32, @@ -213,6 +219,7 @@ const std::map pixelFormatInfo{ /* YUV packed formats. */ { formats::YUYV, { + .name = "YUYV", .format = formats::YUYV, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_YUYV), .bitsPerPixel = 16, @@ -220,6 +227,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::YVYU, { + .name = "YVYU", .format = formats::YVYU, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_YVYU), .bitsPerPixel = 16, @@ -227,6 +235,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::UYVY, { + .name = "UYVY", .format = formats::UYVY, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_UYVY), .bitsPerPixel = 16, @@ -234,6 +243,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::VYUY, { + .name = "VYUY", .format = formats::VYUY, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_VYUY), .bitsPerPixel = 16, @@ -243,6 +253,7 @@ const std::map pixelFormatInfo{ /* YUV planar formats. */ { formats::NV16, { + .name = "NV16", .format = formats::NV16, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_NV16), .bitsPerPixel = 16, @@ -250,6 +261,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::NV61, { + .name = "NV61", .format = formats::NV61, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_NV61), .bitsPerPixel = 16, @@ -257,6 +269,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::NV12, { + .name = "NV12", .format = formats::NV12, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_NV12), .bitsPerPixel = 12, @@ -264,6 +277,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::NV21, { + .name = "NV21", .format = formats::NV21, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_NV21), .bitsPerPixel = 12, @@ -273,6 +287,7 @@ const std::map pixelFormatInfo{ /* Greyscale formats. */ { formats::R8, { + .name = "R8", .format = formats::R8, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_GREY), .bitsPerPixel = 8, @@ -282,6 +297,7 @@ const std::map pixelFormatInfo{ /* Bayer formats. */ { formats::SBGGR8, { + .name = "SBGGR8", .format = formats::SBGGR8, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR8), .bitsPerPixel = 8, @@ -289,6 +305,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::SGBRG8, { + .name = "SGBRG8", .format = formats::SGBRG8, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SGBRG8), .bitsPerPixel = 8, @@ -296,6 +313,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::SGRBG8, { + .name = "SGRBG8", .format = formats::SGRBG8, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG8), .bitsPerPixel = 8, @@ -303,6 +321,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::SRGGB8, { + .name = "SRGGB8", .format = formats::SRGGB8, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SRGGB8), .bitsPerPixel = 8, @@ -310,6 +329,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::SBGGR10, { + .name = "SBGGR10", .format = formats::SBGGR10, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR10), .bitsPerPixel = 10, @@ -317,6 +337,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::SGBRG10, { + .name = "SGBRG10", .format = formats::SGBRG10, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SGBRG10), .bitsPerPixel = 10, @@ -324,6 +345,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::SGRBG10, { + .name = "SGRBG10", .format = formats::SGRBG10, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG10), .bitsPerPixel = 10, @@ -331,6 +353,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::SRGGB10, { + .name = "SRGGB10", .format = formats::SRGGB10, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SRGGB10), .bitsPerPixel = 10, @@ -338,6 +361,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::SBGGR10_CSI2P, { + .name = "SBGGR10_CSI2P", .format = formats::SBGGR10_CSI2P, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR10P), .bitsPerPixel = 10, @@ -345,6 +369,7 @@ const std::map pixelFormatInfo{ .packed = true, } }, { formats::SGBRG10_CSI2P, { + .name = "SGBRG10_CSI2P", .format = formats::SGBRG10_CSI2P, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SGBRG10P), .bitsPerPixel = 10, @@ -352,6 +377,7 @@ const std::map pixelFormatInfo{ .packed = true, } }, { formats::SGRBG10_CSI2P, { + .name = "SGRBG10_CSI2P", .format = formats::SGRBG10_CSI2P, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG10P), .bitsPerPixel = 10, @@ -359,6 +385,7 @@ const std::map pixelFormatInfo{ .packed = true, } }, { formats::SRGGB10_CSI2P, { + .name = "SRGGB10_CSI2P", .format = formats::SRGGB10_CSI2P, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SRGGB10P), .bitsPerPixel = 10, @@ -366,6 +393,7 @@ const std::map pixelFormatInfo{ .packed = true, } }, { formats::SBGGR12, { + .name = "SBGGR12", .format = formats::SBGGR12, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR12), .bitsPerPixel = 12, @@ -373,6 +401,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::SGBRG12, { + .name = "SGBRG12", .format = formats::SGBRG12, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SGBRG12), .bitsPerPixel = 12, @@ -380,6 +409,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::SGRBG12, { + .name = "SGRBG12", .format = formats::SGRBG12, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG12), .bitsPerPixel = 12, @@ -387,6 +417,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::SRGGB12, { + .name = "SRGGB12", .format = formats::SRGGB12, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SRGGB12), .bitsPerPixel = 12, @@ -394,6 +425,7 @@ const std::map pixelFormatInfo{ .packed = false, } }, { formats::SBGGR12_CSI2P, { + .name = "SBGGR12_CSI2P", .format = formats::SBGGR12_CSI2P, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR12P), .bitsPerPixel = 12, @@ -401,6 +433,7 @@ const std::map pixelFormatInfo{ .packed = true, } }, { formats::SGBRG12_CSI2P, { + .name = "SGBRG12_CSI2P", .format = formats::SGBRG12_CSI2P, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SGBRG12P), .bitsPerPixel = 12, @@ -408,6 +441,7 @@ const std::map pixelFormatInfo{ .packed = true, } }, { formats::SGRBG12_CSI2P, { + .name = "SGRBG12_CSI2P", .format = formats::SGRBG12_CSI2P, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG12P), .bitsPerPixel = 12, @@ -415,6 +449,7 @@ const std::map pixelFormatInfo{ .packed = true, } }, { formats::SRGGB12_CSI2P, { + .name = "SRGGB12_CSI2P", .format = formats::SRGGB12_CSI2P, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SRGGB12P), .bitsPerPixel = 12, @@ -424,6 +459,7 @@ const std::map pixelFormatInfo{ /* Compressed formats. */ { formats::MJPEG, { + .name = "MJPEG", .format = formats::MJPEG, .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_MJPEG), .bitsPerPixel = 0, @@ -453,8 +489,8 @@ const PixelFormatInfo &PixelFormatInfo::info(const PixelFormat &format) const auto iter = pixelFormatInfo.find(format); if (iter == pixelFormatInfo.end()) { LOG(Formats, Warning) - << "Unsupported pixel format " - << format.toString(); + << "Unsupported pixel format 0x" + << std::hex << format.fourcc(); return invalid; } diff --git a/src/libcamera/pixel_format.cpp b/src/libcamera/pixel_format.cpp index f191851..07e7af0 100644 --- a/src/libcamera/pixel_format.cpp +++ b/src/libcamera/pixel_format.cpp @@ -6,6 +6,7 @@ */ #include +#include "libcamera/internal/formats.h" #include /** @@ -104,9 +105,29 @@ bool PixelFormat::operator<(const PixelFormat &other) const */ std::string PixelFormat::toString() const { - char str[11]; - snprintf(str, 11, "0x%08x", fourcc_); - return str; + PixelFormat format = PixelFormat(fourcc_, modifier_); + const PixelFormatInfo &info = PixelFormatInfo::info(format); + + if (!info.isValid()) { + if (format == PixelFormat()) + return ""; + + char fourcc[7] = { '<', + static_cast(fourcc_ & 0x7f), + static_cast((fourcc_ >> 8) & 0x7f), + static_cast((fourcc_ >> 16) & 0x7f), + static_cast((fourcc_ >> 24) & 0x7f), + '>' }; + + for (unsigned int i = 1; i < 5; i++) { + if (!isprint(fourcc[i])) + fourcc[i] = '.'; + } + + return fourcc; + } + + return info.name; } } /* namespace libcamera */ diff --git a/test/meson.build b/test/meson.build index a868813..7808a26 100644 --- a/test/meson.build +++ b/test/meson.build @@ -34,6 +34,7 @@ internal_tests = [ ['message', 'message.cpp'], ['object', 'object.cpp'], ['object-invoke', 'object-invoke.cpp'], + ['pixel-format', 'pixel-format.cpp'], ['signal-threads', 'signal-threads.cpp'], ['threads', 'threads.cpp'], ['timer', 'timer.cpp'], diff --git a/test/pixel-format.cpp b/test/pixel-format.cpp new file mode 100644 index 0000000..5b9cdc9 --- /dev/null +++ b/test/pixel-format.cpp @@ -0,0 +1,49 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2020, Kaaira Gupta + * libcamera pixel format handling test + */ + +#include +#include + +#include +#include + +#include "test.h" + +using namespace std; +using namespace libcamera; + +class PixelFormatTest : public Test +{ +protected: + int run() + { + std::vector> formatsMap{ + { formats::R8, "R8" }, + { formats::SRGGB10_CSI2P, "SRGGB10_CSI2P" }, + { PixelFormat(0, 0), "" }, + { PixelFormat(0x20203843), "" } + }; + + for (const auto &format : formatsMap) { + if ((format.first).toString() != format.second) { + cerr << "Failed to convert PixelFormat " + << format.first.fourcc() << " to string" + << endl; + return TestFail; + } + } + + if (PixelFormat().toString() != "") { + cerr << "Failed to convert default PixelFormat to string" + << endl; + return TestFail; + } + + return TestPass; + } +}; + +TEST_REGISTER(PixelFormatTest)