From c3ed943c992a09c5fc19e25328dca7aa52691c36 Mon Sep 17 00:00:00 2001 From: David Plowman Date: Wed, 17 Jun 2020 17:44:42 +0100 Subject: libcamera: Add support for planar YUV422 and YUV420 formats These formats can be helpful when downstream applications or libraries support them natively (avoiding a costly conversion). Signed-off-by: David Plowman Signed-off-by: Laurent Pinchart Reviewed-by: David Plowman Tested-by: David Plowman Reviewed-by: Kieran Bingham --- src/libcamera/formats.cpp | 14 ++++++++++++++ src/libcamera/formats.yaml | 5 +++++ src/libcamera/v4l2_pixelformat.cpp | 2 ++ src/v4l2/v4l2_camera_proxy.cpp | 4 +++- 4 files changed, 24 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp index 97e98678..c0b53ce7 100644 --- a/src/libcamera/formats.cpp +++ b/src/libcamera/formats.cpp @@ -270,6 +270,20 @@ const std::map pixelFormatInfo{ .colourEncoding = PixelFormatInfo::ColourEncodingYUV, .packed = false, } }, + { formats::YUV420, { + .format = PixelFormat(formats::YUV420), + .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_YUV420), + .bitsPerPixel = 12, + .colourEncoding = PixelFormatInfo::ColourEncodingYUV, + .packed = false, + } }, + { formats::YUV422, { + .format = PixelFormat(formats::YUV422), + .v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_YUV422P), + .bitsPerPixel = 16, + .colourEncoding = PixelFormatInfo::ColourEncodingYUV, + .packed = false, + } }, /* Greyscale formats. */ { formats::R8, { diff --git a/src/libcamera/formats.yaml b/src/libcamera/formats.yaml index a6841c61..ce06dbc4 100644 --- a/src/libcamera/formats.yaml +++ b/src/libcamera/formats.yaml @@ -53,6 +53,11 @@ formats: - NV42: fourcc: DRM_FORMAT_NV42 + - YUV420: + fourcc: DRM_FORMAT_YUV420 + - YUV422: + fourcc: DRM_FORMAT_YUV422 + - MJPEG: fourcc: DRM_FORMAT_MJPEG diff --git a/src/libcamera/v4l2_pixelformat.cpp b/src/libcamera/v4l2_pixelformat.cpp index 741f6c26..6745d17d 100644 --- a/src/libcamera/v4l2_pixelformat.cpp +++ b/src/libcamera/v4l2_pixelformat.cpp @@ -63,6 +63,8 @@ const std::map vpf2pf{ { V4L2PixelFormat(V4L2_PIX_FMT_NV61), formats::NV61 }, { V4L2PixelFormat(V4L2_PIX_FMT_NV12), formats::NV12 }, { V4L2PixelFormat(V4L2_PIX_FMT_NV21), formats::NV21 }, + { V4L2PixelFormat(V4L2_PIX_FMT_YUV420), formats::YUV420 }, + { V4L2PixelFormat(V4L2_PIX_FMT_YUV422P), formats::YUV422 }, /* Greyscale formats. */ { V4L2PixelFormat(V4L2_PIX_FMT_GREY), formats::R8 }, diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp index bf47aa7e..86b87e37 100644 --- a/src/v4l2/v4l2_camera_proxy.cpp +++ b/src/v4l2/v4l2_camera_proxy.cpp @@ -560,7 +560,7 @@ struct PixelFormatInfo { namespace { -static const std::array pixelFormatInfo = {{ +static const std::array pixelFormatInfo = {{ /* RGB formats. */ { formats::RGB888, V4L2_PIX_FMT_BGR24, 1, {{ { 24, 1, 1 }, { 0, 0, 0 }, { 0, 0, 0 } }} }, { formats::BGR888, V4L2_PIX_FMT_RGB24, 1, {{ { 24, 1, 1 }, { 0, 0, 0 }, { 0, 0, 0 } }} }, @@ -577,6 +577,8 @@ static const std::array pixelFormatInfo = {{ { formats::NV61, V4L2_PIX_FMT_NV61, 2, {{ { 8, 1, 1 }, { 16, 2, 1 }, { 0, 0, 0 } }} }, { formats::NV24, V4L2_PIX_FMT_NV24, 2, {{ { 8, 1, 1 }, { 16, 1, 1 }, { 0, 0, 0 } }} }, { formats::NV42, V4L2_PIX_FMT_NV42, 2, {{ { 8, 1, 1 }, { 16, 1, 1 }, { 0, 0, 0 } }} }, + { formats::YUV420, V4L2_PIX_FMT_YUV420, 3, {{ { 8, 1, 1 }, { 8, 2, 2 }, { 8, 2, 2 } }} }, + { formats::YUV422, V4L2_PIX_FMT_YUV422P, 3, {{ { 8, 1, 1 }, { 8, 2, 1 }, { 8, 2, 1 } }} }, /* Compressed formats. */ /* * \todo Get a better image size estimate for MJPEG, via -- cgit v1.2.1