[libcamera-devel] [RFC 4/6] libcamera: PixelFormat: Add operations to operate on names
Niklas Söderlund
niklas.soderlund at ragnatech.se
Fri Feb 28 04:29:11 CET 2020
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 <niklas.soderlund at ragnatech.se>
---
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<uint32_t> &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<uint32_t> &modifiers() const;
@@ -47,6 +49,7 @@ protected:
private:
const PixelFormatEntry *fromDRM(uint32_t drm_fourcc, const std::set<uint32_t> &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<uint32_t> modifiers;
@@ -42,27 +43,27 @@ struct PixelFormatEntry {
static const std::vector<PixelFormatEntry> 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();
}
--
2.25.1
More information about the libcamera-devel
mailing list