summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Elder <paul.elder@ideasonboard.com>2020-06-29 22:27:05 +0900
committerPaul Elder <paul.elder@ideasonboard.com>2020-07-10 16:11:02 +0900
commitfad0314bc909cf74444ef97b74b2a933a194e986 (patch)
tree1355bbe5fd30ffbbfadf154c25629acfbd1dad1a
parentf1b449476cd82dd391bd8e078fb93181e2ec881c (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.h1
-rw-r--r--src/libcamera/formats.cpp25
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 */