From patchwork Fri Feb 28 03:29:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 2914 Return-Path: Received: from bin-mail-out-06.binero.net (bin-mail-out-06.binero.net [195.74.38.229]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 0CD826271F for ; Fri, 28 Feb 2020 04:29:40 +0100 (CET) X-Halon-ID: 8cd1328a-59da-11ea-9f85-005056917a89 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (p4fca2392.dip0.t-ipconnect.de [79.202.35.146]) by bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA id 8cd1328a-59da-11ea-9f85-005056917a89; Fri, 28 Feb 2020 04:29:39 +0100 (CET) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Fri, 28 Feb 2020 04:29:11 +0100 Message-Id: <20200228032913.497826-5-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200228032913.497826-1-niklas.soderlund@ragnatech.se> References: <20200228032913.497826-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC 4/6] libcamera: PixelFormat: Add operations to operate on 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, 28 Feb 2020 03:29:40 -0000 Add a name to each pixel format and extend PixelFormat to be constructed from a name and to retrieve the name for printing. Make use of the new functionality to demonstrate it. - Update the cam utility to read and print the pixel format name instead of the fourcc integer number. - Update log messages to print the name instead of the fourcc integer number. Signed-off-by: Niklas Söderlund --- include/libcamera/pixelformats.h | 3 ++ src/cam/main.cpp | 9 ++--- src/libcamera/pipeline/uvcvideo.cpp | 4 +- src/libcamera/pixelformats.cpp | 58 ++++++++++++++++++++--------- src/libcamera/stream.cpp | 2 +- 5 files changed, 51 insertions(+), 25 deletions(-) diff --git a/include/libcamera/pixelformats.h b/include/libcamera/pixelformats.h index f0951e983192d5e8..8cea3a90ef2cc7ae 100644 --- a/include/libcamera/pixelformats.h +++ b/include/libcamera/pixelformats.h @@ -24,6 +24,7 @@ public: PixelFormat(); PixelFormat(const PixelFormat &other); explicit PixelFormat(uint32_t drm_fourcc, const std::set &drm_modifiers); + explicit PixelFormat(const std::string &name); PixelFormat &operator=(const PixelFormat &other); @@ -31,6 +32,7 @@ public: bool operator!=(const PixelFormat &other) const; bool operator<(const PixelFormat &other) const; + const std::string &name() const; uint32_t v4l2() const; uint32_t fourcc() const; const std::set &modifiers() const; @@ -47,6 +49,7 @@ protected: private: const PixelFormatEntry *fromDRM(uint32_t drm_fourcc, const std::set &drm_modifiers) const; const PixelFormatEntry *fromV4L2(uint32_t v4l2_fourcc) const; + const PixelFormatEntry *fromName(const std::string &name) const; const PixelFormatEntry *format_; }; diff --git a/src/cam/main.cpp b/src/cam/main.cpp index c8ef79daea37d8b6..0a08e362294fc9ee 100644 --- a/src/cam/main.cpp +++ b/src/cam/main.cpp @@ -159,7 +159,7 @@ int CamApp::parseOptions(int argc, char *argv[]) ArgumentRequired); streamKeyValue.addOption("height", OptionInteger, "Height in pixels", ArgumentRequired); - streamKeyValue.addOption("pixelformat", OptionInteger, "Pixel format", + streamKeyValue.addOption("pixelformat", OptionString, "Pixel format", ArgumentRequired); OptionsParser parser; @@ -247,9 +247,9 @@ int CamApp::prepareConfig() if (opt.isSet("height")) cfg.size.height = opt["height"]; - /* TODO: Translate 4CC string to ID. */ if (opt.isSet("pixelformat")) - cfg.pixelFormat = PixelFormat(opt["pixelformat"], {}); + cfg.pixelFormat = + PixelFormat(opt["pixelformat"].toString()); } } @@ -282,8 +282,7 @@ int CamApp::infoConfiguration() const StreamFormats &formats = cfg.formats(); for (PixelFormat pixelformat : formats.pixelformats()) { - std::cout << " * Pixelformat: 0x" << std::hex - << std::setw(8) << pixelformat.fourcc() << " " + std::cout << " * Pixelformat: " << pixelformat.name() << " " << formats.range(pixelformat).toString() << std::endl; diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp index 5f3e52f691aaeae4..75fbfe1eb9145424 100644 --- a/src/libcamera/pipeline/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo.cpp @@ -115,8 +115,8 @@ CameraConfiguration::Status UVCCameraConfiguration::validate() if (iter == pixelFormats.end()) { cfg.pixelFormat = pixelFormats.front(); LOG(UVC, Debug) - << "Adjusting pixel format from " << pixelFormat.fourcc() - << " to " << cfg.pixelFormat.fourcc(); + << "Adjusting pixel format from " << pixelFormat.name() + << " to " << cfg.pixelFormat.name(); status = Adjusted; } diff --git a/src/libcamera/pixelformats.cpp b/src/libcamera/pixelformats.cpp index b2aacbc39b9ca16a..70f41d86a23baceb 100644 --- a/src/libcamera/pixelformats.cpp +++ b/src/libcamera/pixelformats.cpp @@ -35,6 +35,7 @@ LOG_DEFINE_CATEGORY(PixelFormats) */ struct PixelFormatEntry { + std::string name; uint32_t v4l2; uint32_t drm; std::set modifiers; @@ -42,27 +43,27 @@ struct PixelFormatEntry { static const std::vector pixelFormats = { /* Invalid format, important to be first in list. */ - { .v4l2 = 0, .drm = DRM_FORMAT_INVALID, .modifiers = {} }, + { .name = "INVALID", .v4l2 = 0, .drm = DRM_FORMAT_INVALID, .modifiers = {} }, /* RGB formats. */ - { .v4l2 = V4L2_PIX_FMT_RGB24, .drm = DRM_FORMAT_BGR888, .modifiers = {} }, - { .v4l2 = V4L2_PIX_FMT_BGR24, .drm = DRM_FORMAT_RGB888, .modifiers = {} }, - { .v4l2 = V4L2_PIX_FMT_ARGB32, .drm = DRM_FORMAT_BGRA8888, .modifiers = {} }, + { .name = "RGR888", .v4l2 = V4L2_PIX_FMT_RGB24, .drm = DRM_FORMAT_BGR888, .modifiers = {} }, + { .name = "RGB888", .v4l2 = V4L2_PIX_FMT_BGR24, .drm = DRM_FORMAT_RGB888, .modifiers = {} }, + { .name = "BGRA8888", .v4l2 = V4L2_PIX_FMT_ARGB32, .drm = DRM_FORMAT_BGRA8888, .modifiers = {} }, /* YUV packed formats. */ - { .v4l2 = V4L2_PIX_FMT_YUYV, .drm = DRM_FORMAT_YUYV, .modifiers = {} }, - { .v4l2 = V4L2_PIX_FMT_YVYU, .drm = DRM_FORMAT_YVYU, .modifiers = {} }, - { .v4l2 = V4L2_PIX_FMT_UYVY, .drm = DRM_FORMAT_UYVY, .modifiers = {} }, - { .v4l2 = V4L2_PIX_FMT_VYUY, .drm = DRM_FORMAT_VYUY, .modifiers = {} }, + { .name = "YUYV", .v4l2 = V4L2_PIX_FMT_YUYV, .drm = DRM_FORMAT_YUYV, .modifiers = {} }, + { .name = "YVYU", .v4l2 = V4L2_PIX_FMT_YVYU, .drm = DRM_FORMAT_YVYU, .modifiers = {} }, + { .name = "UYVY", .v4l2 = V4L2_PIX_FMT_UYVY, .drm = DRM_FORMAT_UYVY, .modifiers = {} }, + { .name = "VYUY", .v4l2 = V4L2_PIX_FMT_VYUY, .drm = DRM_FORMAT_VYUY, .modifiers = {} }, /* YUY planar formats. */ - { .v4l2 = V4L2_PIX_FMT_NV16, .drm = DRM_FORMAT_NV16, .modifiers = {} }, - { .v4l2 = V4L2_PIX_FMT_NV16M, .drm = DRM_FORMAT_NV16, .modifiers = {} }, - { .v4l2 = V4L2_PIX_FMT_NV61, .drm = DRM_FORMAT_NV61, .modifiers = {} }, - { .v4l2 = V4L2_PIX_FMT_NV61M, .drm = DRM_FORMAT_NV61, .modifiers = {} }, - { .v4l2 = V4L2_PIX_FMT_NV12, .drm = DRM_FORMAT_NV12, .modifiers = {} }, - { .v4l2 = V4L2_PIX_FMT_NV12M, .drm = DRM_FORMAT_NV12, .modifiers = {} }, - { .v4l2 = V4L2_PIX_FMT_NV21, .drm = DRM_FORMAT_NV21, .modifiers = {} }, - { .v4l2 = V4L2_PIX_FMT_NV21M, .drm = DRM_FORMAT_NV21, .modifiers = {} }, + { .name = "NV16", .v4l2 = V4L2_PIX_FMT_NV16, .drm = DRM_FORMAT_NV16, .modifiers = {} }, + { .name = "NV16M", .v4l2 = V4L2_PIX_FMT_NV16M, .drm = DRM_FORMAT_NV16, .modifiers = {} }, + { .name = "NV61", .v4l2 = V4L2_PIX_FMT_NV61, .drm = DRM_FORMAT_NV61, .modifiers = {} }, + { .name = "NV61M", .v4l2 = V4L2_PIX_FMT_NV61M, .drm = DRM_FORMAT_NV61, .modifiers = {} }, + { .name = "NV12", .v4l2 = V4L2_PIX_FMT_NV12, .drm = DRM_FORMAT_NV12, .modifiers = {} }, + { .name = "NV12M", .v4l2 = V4L2_PIX_FMT_NV12M, .drm = DRM_FORMAT_NV12, .modifiers = {} }, + { .name = "NV21", .v4l2 = V4L2_PIX_FMT_NV21, .drm = DRM_FORMAT_NV21, .modifiers = {} }, + { .name = "NV21M", .v4l2 = V4L2_PIX_FMT_NV21M, .drm = DRM_FORMAT_NV21, .modifiers = {} }, /* Compressed formats. */ - { .v4l2 = V4L2_PIX_FMT_MJPEG, .drm = DRM_FORMAT_MJPEG, .modifiers = {} }, + { .name = "MJPEG", .v4l2 = V4L2_PIX_FMT_MJPEG, .drm = DRM_FORMAT_MJPEG, .modifiers = {} }, }; PixelFormat::PixelFormat() @@ -85,6 +86,11 @@ PixelFormat::PixelFormat(uint32_t v4l2_fourcc) { } +PixelFormat::PixelFormat(const std::string &name) + : format_(fromName(name)) +{ +} + PixelFormat &PixelFormat::operator=(const PixelFormat &other) { format_ = other.format_; @@ -107,6 +113,11 @@ bool PixelFormat::operator<(const PixelFormat &other) const return format_ > other.format_; } +const std::string &PixelFormat::name() const +{ + return format_->name; +} + uint32_t PixelFormat::v4l2() const { return format_->v4l2; @@ -149,4 +160,17 @@ const PixelFormatEntry *PixelFormat::fromV4L2(uint32_t v4l2_fourcc) const return &pixelFormats[0]; } +const PixelFormatEntry *PixelFormat::fromName(const std::string &name) const +{ + for (const PixelFormatEntry &entry : pixelFormats) + if (entry.name == name) + return &entry; + + LOG(PixelFormats, Error) + << "Unsupported name for pixel format " + << name; + + return &pixelFormats[0]; +} + } /* namespace libcamera */ diff --git a/src/libcamera/stream.cpp b/src/libcamera/stream.cpp index dbce550ca8d0b7b1..e82ffd8f3b211925 100644 --- a/src/libcamera/stream.cpp +++ b/src/libcamera/stream.cpp @@ -348,7 +348,7 @@ StreamConfiguration::StreamConfiguration(const StreamFormats &formats) std::string StreamConfiguration::toString() const { std::stringstream ss; - ss << size.toString() << "-" << utils::hex(pixelFormat.fourcc()); + ss << size.toString() << "-" << pixelFormat.name(); return ss.str(); }