aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab+huawei@kernel.org>2021-10-31 16:32:28 +0000
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>2021-10-31 22:36:01 +0000
commit365915aa694d9c1a66b59bb718456fdd6fefa67c (patch)
tree4bdf65956eb8cde2ec8b016f510094bcf385f084
parenta76053007b95c8942cfd39d437e6ecdcbc902c08 (diff)
downloadv4l-utils-365915aa694d9c1a66b59bb718456fdd6fefa67c.tar.gz
v4l2grab: add support for YUV 420 planar and semi-planar formats
Now that planes support is in place, add support for YUV and YVU 4:2:0 planar and semi-planar formats. Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
-rw-r--r--contrib/test/v4l2grab.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/contrib/test/v4l2grab.c b/contrib/test/v4l2grab.c
index 5dab5bb0..af2a5bc0 100644
--- a/contrib/test/v4l2grab.c
+++ b/contrib/test/v4l2grab.c
@@ -282,6 +282,34 @@ static void copy_two_pixels(struct v4l2_format *fmt,
convert_yuv(enc, plane0[y_off + (i << 1)], u, v, dst);
break;
+ case V4L2_PIX_FMT_NV12:
+ case V4L2_PIX_FMT_NV21:
+ if (fourcc == V4L2_PIX_FMT_NV12) {
+ u = plane1[0];
+ v = plane1[1];
+ } else {
+ u = plane1[1];
+ v = plane1[0];
+ }
+
+ for (i = 0; i < 2; i++)
+ convert_yuv(enc, plane0[i], u, v, dst);
+
+ break;
+ case V4L2_PIX_FMT_YUV420:
+ case V4L2_PIX_FMT_YVU420:
+ if (fourcc == V4L2_PIX_FMT_YUV420) {
+ u = plane1[0];
+ v = plane2[0];
+ } else {
+ u = plane2[0];
+ v = plane1[0];
+ }
+
+ for (i = 0; i < 2; i++)
+ convert_yuv(enc, plane0[i], u, v, dst);
+
+ break;
default:
case V4L2_PIX_FMT_BGR24:
for (i = 0; i < 2; i++) {
@@ -325,6 +353,19 @@ static unsigned int convert_to_rgb24(struct v4l2_format *fmt,
case V4L2_PIX_FMT_BGR24:
depth = 24;
break;
+ case V4L2_PIX_FMT_NV12:
+ case V4L2_PIX_FMT_NV21:
+ num_planes = 2;
+ depth = 8; /* Depth of plane 0 */
+ h_dec = 1;
+ break;
+ case V4L2_PIX_FMT_YUV420:
+ case V4L2_PIX_FMT_YVU420:
+ num_planes = 3;
+ depth = 8; /* Depth of plane 0 */
+ h_dec = 1;
+ w_dec = 1;
+ break;
case V4L2_PIX_FMT_RGB565:
case V4L2_PIX_FMT_RGB565X:
case V4L2_PIX_FMT_YUYV:
@@ -1010,6 +1051,10 @@ int main(int argc, char **argv)
case V4L2_PIX_FMT_UYVY:
case V4L2_PIX_FMT_YVYU:
case V4L2_PIX_FMT_VYUY:
+ case V4L2_PIX_FMT_NV12:
+ case V4L2_PIX_FMT_NV21:
+ case V4L2_PIX_FMT_YUV420:
+ case V4L2_PIX_FMT_YVU420:
out_buf = malloc(3 * x_res * y_res);
if (!out_buf) {
perror("Cannot allocate memory");