diff options
author | Paul Elder <paul.elder@ideasonboard.com> | 2020-06-29 22:27:05 +0900 |
---|---|---|
committer | Paul Elder <paul.elder@ideasonboard.com> | 2020-07-10 16:11:02 +0900 |
commit | fad0314bc909cf74444ef97b74b2a933a194e986 (patch) | |
tree | 1355bbe5fd30ffbbfadf154c25629acfbd1dad1a | |
parent | f1b449476cd82dd391bd8e078fb93181e2ec881c (diff) |
libcamera: formats: PixelFormatInfo: Add v4l2 lookup function
Add a lookup function for PixelFormatInfo that takes a V4L2PixelFormat.
Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r-- | include/libcamera/internal/formats.h | 1 | ||||
-rw-r--r-- | src/libcamera/formats.cpp | 25 |
2 files changed, 23 insertions, 3 deletions
diff --git a/include/libcamera/internal/formats.h b/include/libcamera/internal/formats.h index 4e90e5ac..211da4a3 100644 --- a/include/libcamera/internal/formats.h +++ b/include/libcamera/internal/formats.h @@ -51,6 +51,7 @@ public: bool isValid() const { return format.isValid(); } static const PixelFormatInfo &info(const PixelFormat &format); + static const PixelFormatInfo &info(const V4L2PixelFormat &format); /* \todo Add support for non-contiguous memory planes */ const char *name; diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp index 4a03a7e3..48aa2454 100644 --- a/src/libcamera/formats.cpp +++ b/src/libcamera/formats.cpp @@ -7,6 +7,7 @@ #include "libcamera/internal/formats.h" +#include <algorithm> #include <errno.h> #include <libcamera/formats.h> @@ -228,6 +229,8 @@ const std::map<unsigned int, std::vector<SizeRange>> &ImageFormats::data() const namespace { +const PixelFormatInfo pixelFormatInfoInvalid{}; + const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{ /* RGB formats. */ { formats::BGR888, { @@ -699,17 +702,33 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{ */ const PixelFormatInfo &PixelFormatInfo::info(const PixelFormat &format) { - static const PixelFormatInfo invalid{}; - const auto iter = pixelFormatInfo.find(format); if (iter == pixelFormatInfo.end()) { LOG(Formats, Warning) << "Unsupported pixel format 0x" << utils::hex(format.fourcc()); - return invalid; + return pixelFormatInfoInvalid; } return iter->second; } +/** + * \brief Retrieve information about a pixel format + * \param[in] format The V4L2 pixel format + * \return The PixelFormatInfo describing the V4L2 \a format if known, or an + * invalid PixelFormatInfo otherwise + */ +const PixelFormatInfo &PixelFormatInfo::info(const V4L2PixelFormat &format) +{ + const auto &info = std::find_if(pixelFormatInfo.begin(), pixelFormatInfo.end(), + [format](auto pair) { + return pair.second.v4l2Format == format; + }); + if (info == pixelFormatInfo.end()) + return pixelFormatInfoInvalid; + + return info->second; +} + } /* namespace libcamera */ |