Message ID | 20200622043812.16989-1-laurent.pinchart@ideasonboard.com |
---|---|
State | Accepted |
Commit | c3ed943c992a09c5fc19e25328dca7aa52691c36 |
Headers | show |
Series |
|
Related | show |
Hi Laurent Thanks for all this - I've compiled and run it too on my libcamera-based application. All working fine for me! Reviewed-by: David Plowman <david.plowman@raspberrypi.com> Tested-by: David Plowman <david.plowman@raspberrypi.com> Best regards David On Mon, 22 Jun 2020 at 05:38, Laurent Pinchart <laurent.pinchart@ideasonboard.com> wrote: > > From: David Plowman <david.plowman@raspberrypi.com> > > These formats can be helpful when downstream applications or libraries > support them natively (avoiding a costly conversion). > > Signed-off-by: David Plowman <david.plowman@raspberrypi.com> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > --- > Changes since v1: > > - Rebase on top of formats rework > - Fix number of planes in formats descriptions > --- > 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(-) > > David, could you please test this and provide a Tested-by tag (and > Reviewed-by too if possible) ? > > diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp > index 97e986786cc8..c0b53ce7cc97 100644 > --- a/src/libcamera/formats.cpp > +++ b/src/libcamera/formats.cpp > @@ -270,6 +270,20 @@ const std::map<PixelFormat, PixelFormatInfo> 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 a6841c618f93..ce06dbc41aa1 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 741f6c2646bc..6745d17d4926 100644 > --- a/src/libcamera/v4l2_pixelformat.cpp > +++ b/src/libcamera/v4l2_pixelformat.cpp > @@ -63,6 +63,8 @@ const std::map<V4L2PixelFormat, PixelFormat> 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 bf47aa7ee633..86b87e379b98 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, 14> pixelFormatInfo = {{ > +static const std::array<PixelFormatInfo, 16> 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, 14> 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 > -- > Regards, > > Laurent Pinchart >
Hi David, Laurent, On 22/06/2020 05:38, Laurent Pinchart wrote: > From: David Plowman <david.plowman@raspberrypi.com> > > These formats can be helpful when downstream applications or libraries > support them natively (avoiding a costly conversion). > > Signed-off-by: David Plowman <david.plowman@raspberrypi.com> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > --- > Changes since v1: > > - Rebase on top of formats rework > - Fix number of planes in formats descriptions > --- > 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(-) > > David, could you please test this and provide a Tested-by tag (and > Reviewed-by too if possible) ? > > diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp > index 97e986786cc8..c0b53ce7cc97 100644 > --- a/src/libcamera/formats.cpp > +++ b/src/libcamera/formats.cpp > @@ -270,6 +270,20 @@ const std::map<PixelFormat, PixelFormatInfo> 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 a6841c618f93..ce06dbc41aa1 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 741f6c2646bc..6745d17d4926 100644 > --- a/src/libcamera/v4l2_pixelformat.cpp > +++ b/src/libcamera/v4l2_pixelformat.cpp > @@ -63,6 +63,8 @@ const std::map<V4L2PixelFormat, PixelFormat> 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 bf47aa7ee633..86b87e379b98 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, 14> pixelFormatInfo = {{ > +static const std::array<PixelFormatInfo, 16> 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, 14> 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 } }} }, Wow, what fun. One v4l2 format gets marked with a P and one doesn't. I love the consistency ;-) But - I've dug into the include/uapi/linux/videodev2.h and include/uapi/drm/drm_fourcc.h headers, and as best I can see these are correct. -- Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > /* Compressed formats. */ > /* > * \todo Get a better image size estimate for MJPEG, via >
diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp index 97e986786cc8..c0b53ce7cc97 100644 --- a/src/libcamera/formats.cpp +++ b/src/libcamera/formats.cpp @@ -270,6 +270,20 @@ const std::map<PixelFormat, PixelFormatInfo> 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 a6841c618f93..ce06dbc41aa1 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 741f6c2646bc..6745d17d4926 100644 --- a/src/libcamera/v4l2_pixelformat.cpp +++ b/src/libcamera/v4l2_pixelformat.cpp @@ -63,6 +63,8 @@ const std::map<V4L2PixelFormat, PixelFormat> 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 bf47aa7ee633..86b87e379b98 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, 14> pixelFormatInfo = {{ +static const std::array<PixelFormatInfo, 16> 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, 14> 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