summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libcamera/formats.cpp147
-rw-r--r--src/libcamera/include/formats.h9
2 files changed, 156 insertions, 0 deletions
diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp
index f6f8bc12..b3af0f7f 100644
--- a/src/libcamera/formats.cpp
+++ b/src/libcamera/formats.cpp
@@ -121,6 +121,45 @@ const std::map<unsigned int, std::vector<SizeRange>> &ImageFormats::data() const
*
* \var PixelFormatInfo::v4l2Format
* \brief The V4L2 pixel format corresponding to the PixelFormat
+ *
+ * \var PixelFormatInfo::bitsPerPixel
+ * \brief The average number of bits per pixel
+ *
+ * The number per pixel averages the total number of bits for all colour
+ * components over the whole image, excluding any padding bits or padding
+ * pixels.
+ *
+ * For formats that store pixels with bit padding within words, only the
+ * effective bits are taken into account. For instance, 12-bit Bayer data
+ * stored in two bytes per pixel report 12, not 16, in this field.
+ *
+ * Formats that don't have a fixed number of bits per pixel, such as compressed
+ * formats, report 0 in this field.
+ *
+ * \var PixelFormatInfo::colourEncoding
+ * \brief The colour encoding type
+ *
+ * \var PixelFormatInfo::packed
+ * \brief Tell if multiple pixels are packed in the same bytes
+ *
+ * Packed formats are defined as storing data from multiple pixels in the same
+ * bytes. For instance, 12-bit Bayer data with two pixels stored in three bytes
+ * is packed, while the same data stored with 4 bits of padding in two bytes
+ * per pixel is not packed.
+ */
+
+/**
+ * \enum PixelFormatInfo::ColourEncoding
+ * \brief The colour encoding type
+ *
+ * \var PixelFormatInfo::ColourEncodingRGB
+ * \brief RGB colour encoding
+ *
+ * \var PixelFormatInfo::ColourEncodingYUV
+ * \brief YUV colour encoding
+ *
+ * \var PixelFormatInfo::ColourEncodingRAW
+ * \brief RAW colour encoding
*/
namespace {
@@ -130,156 +169,264 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
{ PixelFormat(DRM_FORMAT_BGR888), {
.format = PixelFormat(DRM_FORMAT_BGR888),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_RGB24),
+ .bitsPerPixel = 24,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRGB,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_RGB888), {
.format = PixelFormat(DRM_FORMAT_RGB888),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_BGR24),
+ .bitsPerPixel = 24,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRGB,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_ABGR8888), {
.format = PixelFormat(DRM_FORMAT_ABGR8888),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_RGBA32),
+ .bitsPerPixel = 32,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRGB,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_ARGB8888), {
.format = PixelFormat(DRM_FORMAT_ARGB8888),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_ABGR32),
+ .bitsPerPixel = 32,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRGB,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_BGRA8888), {
.format = PixelFormat(DRM_FORMAT_BGRA8888),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_ARGB32),
+ .bitsPerPixel = 32,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRGB,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_RGBA8888), {
.format = PixelFormat(DRM_FORMAT_RGBA8888),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_BGRA32),
+ .bitsPerPixel = 32,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRGB,
+ .packed = false,
} },
/* YUV packed formats. */
{ PixelFormat(DRM_FORMAT_YUYV), {
.format = PixelFormat(DRM_FORMAT_YUYV),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_YUYV),
+ .bitsPerPixel = 16,
+ .colourEncoding = PixelFormatInfo::ColourEncodingYUV,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_YVYU), {
.format = PixelFormat(DRM_FORMAT_YVYU),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_YVYU),
+ .bitsPerPixel = 16,
+ .colourEncoding = PixelFormatInfo::ColourEncodingYUV,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_UYVY), {
.format = PixelFormat(DRM_FORMAT_UYVY),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_UYVY),
+ .bitsPerPixel = 16,
+ .colourEncoding = PixelFormatInfo::ColourEncodingYUV,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_VYUY), {
.format = PixelFormat(DRM_FORMAT_VYUY),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_VYUY),
+ .bitsPerPixel = 16,
+ .colourEncoding = PixelFormatInfo::ColourEncodingYUV,
+ .packed = false,
} },
/* YUV planar formats. */
{ PixelFormat(DRM_FORMAT_NV16), {
.format = PixelFormat(DRM_FORMAT_NV16),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_NV16),
+ .bitsPerPixel = 16,
+ .colourEncoding = PixelFormatInfo::ColourEncodingYUV,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_NV61), {
.format = PixelFormat(DRM_FORMAT_NV61),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_NV61),
+ .bitsPerPixel = 16,
+ .colourEncoding = PixelFormatInfo::ColourEncodingYUV,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_NV12), {
.format = PixelFormat(DRM_FORMAT_NV12),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_NV12),
+ .bitsPerPixel = 12,
+ .colourEncoding = PixelFormatInfo::ColourEncodingYUV,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_NV21), {
.format = PixelFormat(DRM_FORMAT_NV21),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_NV21),
+ .bitsPerPixel = 12,
+ .colourEncoding = PixelFormatInfo::ColourEncodingYUV,
+ .packed = false,
} },
/* Greyscale formats. */
{ PixelFormat(DRM_FORMAT_R8), {
.format = PixelFormat(DRM_FORMAT_R8),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_GREY),
+ .bitsPerPixel = 8,
+ .colourEncoding = PixelFormatInfo::ColourEncodingYUV,
+ .packed = false,
} },
/* Bayer formats. */
{ PixelFormat(DRM_FORMAT_SBGGR8), {
.format = PixelFormat(DRM_FORMAT_SBGGR8),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR8),
+ .bitsPerPixel = 8,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_SGBRG8), {
.format = PixelFormat(DRM_FORMAT_SGBRG8),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SGBRG8),
+ .bitsPerPixel = 8,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_SGRBG8), {
.format = PixelFormat(DRM_FORMAT_SGRBG8),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG8),
+ .bitsPerPixel = 8,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_SRGGB8), {
.format = PixelFormat(DRM_FORMAT_SRGGB8),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SRGGB8),
+ .bitsPerPixel = 8,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_SBGGR10), {
.format = PixelFormat(DRM_FORMAT_SBGGR10),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR10),
+ .bitsPerPixel = 10,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_SGBRG10), {
.format = PixelFormat(DRM_FORMAT_SGBRG10),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SGBRG10),
+ .bitsPerPixel = 10,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_SGRBG10), {
.format = PixelFormat(DRM_FORMAT_SGRBG10),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG10),
+ .bitsPerPixel = 10,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_SRGGB10), {
.format = PixelFormat(DRM_FORMAT_SRGGB10),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SRGGB10),
+ .bitsPerPixel = 10,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_SBGGR10, MIPI_FORMAT_MOD_CSI2_PACKED), {
.format = PixelFormat(DRM_FORMAT_SBGGR10, MIPI_FORMAT_MOD_CSI2_PACKED),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR10P),
+ .bitsPerPixel = 10,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+ .packed = true,
} },
{ PixelFormat(DRM_FORMAT_SGBRG10, MIPI_FORMAT_MOD_CSI2_PACKED), {
.format = PixelFormat(DRM_FORMAT_SGBRG10, MIPI_FORMAT_MOD_CSI2_PACKED),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SGBRG10P),
+ .bitsPerPixel = 10,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+ .packed = true,
} },
{ PixelFormat(DRM_FORMAT_SGRBG10, MIPI_FORMAT_MOD_CSI2_PACKED), {
.format = PixelFormat(DRM_FORMAT_SGRBG10, MIPI_FORMAT_MOD_CSI2_PACKED),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG10P),
+ .bitsPerPixel = 10,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+ .packed = true,
} },
{ PixelFormat(DRM_FORMAT_SRGGB10, MIPI_FORMAT_MOD_CSI2_PACKED), {
.format = PixelFormat(DRM_FORMAT_SRGGB10, MIPI_FORMAT_MOD_CSI2_PACKED),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SRGGB10P),
+ .bitsPerPixel = 10,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+ .packed = true,
} },
{ PixelFormat(DRM_FORMAT_SBGGR12), {
.format = PixelFormat(DRM_FORMAT_SBGGR12),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR12),
+ .bitsPerPixel = 12,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_SGBRG12), {
.format = PixelFormat(DRM_FORMAT_SGBRG12),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SGBRG12),
+ .bitsPerPixel = 12,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_SGRBG12), {
.format = PixelFormat(DRM_FORMAT_SGRBG12),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG12),
+ .bitsPerPixel = 12,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_SRGGB12), {
.format = PixelFormat(DRM_FORMAT_SRGGB12),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SRGGB12),
+ .bitsPerPixel = 12,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+ .packed = false,
} },
{ PixelFormat(DRM_FORMAT_SBGGR12, MIPI_FORMAT_MOD_CSI2_PACKED), {
.format = PixelFormat(DRM_FORMAT_SBGGR12, MIPI_FORMAT_MOD_CSI2_PACKED),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR12P),
+ .bitsPerPixel = 12,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+ .packed = true,
} },
{ PixelFormat(DRM_FORMAT_SGBRG12, MIPI_FORMAT_MOD_CSI2_PACKED), {
.format = PixelFormat(DRM_FORMAT_SGBRG12, MIPI_FORMAT_MOD_CSI2_PACKED),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SGBRG12P),
+ .bitsPerPixel = 12,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+ .packed = true,
} },
{ PixelFormat(DRM_FORMAT_SGRBG12, MIPI_FORMAT_MOD_CSI2_PACKED), {
.format = PixelFormat(DRM_FORMAT_SGRBG12, MIPI_FORMAT_MOD_CSI2_PACKED),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG12P),
+ .bitsPerPixel = 12,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+ .packed = true,
} },
{ PixelFormat(DRM_FORMAT_SRGGB12, MIPI_FORMAT_MOD_CSI2_PACKED), {
.format = PixelFormat(DRM_FORMAT_SRGGB12, MIPI_FORMAT_MOD_CSI2_PACKED),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_SRGGB12P),
+ .bitsPerPixel = 12,
+ .colourEncoding = PixelFormatInfo::ColourEncodingRAW,
+ .packed = true,
} },
/* Compressed formats. */
{ PixelFormat(DRM_FORMAT_MJPEG), {
.format = PixelFormat(DRM_FORMAT_MJPEG),
.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_MJPEG),
+ .bitsPerPixel = 0,
+ .colourEncoding = PixelFormatInfo::ColourEncodingYUV,
+ .packed = false,
} },
};
diff --git a/src/libcamera/include/formats.h b/src/libcamera/include/formats.h
index 560df07c..291a1108 100644
--- a/src/libcamera/include/formats.h
+++ b/src/libcamera/include/formats.h
@@ -35,6 +35,12 @@ private:
class PixelFormatInfo
{
public:
+ enum ColourEncoding {
+ ColourEncodingRGB,
+ ColourEncodingYUV,
+ ColourEncodingRAW,
+ };
+
bool isValid() const { return format.isValid(); }
static const PixelFormatInfo &info(const PixelFormat &format);
@@ -42,6 +48,9 @@ public:
/* \todo Add support for non-contiguous memory planes */
PixelFormat format;
V4L2PixelFormat v4l2Format;
+ unsigned int bitsPerPixel;
+ enum ColourEncoding colourEncoding;
+ bool packed;
};
} /* namespace libcamera */