[media] vivid: add support for NV24 and NV42
authorHans Verkuil <hans.verkuil@cisco.com>
Fri, 13 Mar 2015 08:51:21 +0000 (05:51 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Fri, 3 Apr 2015 00:04:24 +0000 (21:04 -0300)
Add support for the YUV 4:4:4 formats NV24 and NV42.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/platform/vivid/vivid-tpg.c
drivers/media/platform/vivid/vivid-vid-common.c

index a906cc5a0331b218b71f872d94d2001a6f4d770b..0d31532f7f42faebfedf9e9eebcc76c5e656fa58 100644 (file)
@@ -123,7 +123,7 @@ int tpg_alloc(struct tpg_data *tpg, unsigned max_w)
        tpg->max_line_width = max_w;
        for (pat = 0; pat < TPG_MAX_PAT_LINES; pat++) {
                for (plane = 0; plane < TPG_MAX_PLANES; plane++) {
-                       unsigned pixelsz = plane ? 1 : 4;
+                       unsigned pixelsz = plane ? 2 : 4;
 
                        tpg->lines[pat][plane] = vzalloc(max_w * 2 * pixelsz);
                        if (!tpg->lines[pat][plane])
@@ -136,7 +136,7 @@ int tpg_alloc(struct tpg_data *tpg, unsigned max_w)
                }
        }
        for (plane = 0; plane < TPG_MAX_PLANES; plane++) {
-               unsigned pixelsz = plane ? 1 : 4;
+               unsigned pixelsz = plane ? 2 : 4;
 
                tpg->contrast_line[plane] = vzalloc(max_w * pixelsz);
                if (!tpg->contrast_line[plane])
@@ -255,6 +255,13 @@ bool tpg_s_fourcc(struct tpg_data *tpg, u32 fourcc)
                tpg->planes = 2;
                tpg->is_yuv = true;
                break;
+       case V4L2_PIX_FMT_NV24:
+       case V4L2_PIX_FMT_NV42:
+               tpg->vdownsampling[1] = 1;
+               tpg->hdownsampling[1] = 1;
+               tpg->planes = 2;
+               tpg->is_yuv = true;
+               break;
        case V4L2_PIX_FMT_YUYV:
        case V4L2_PIX_FMT_UYVY:
        case V4L2_PIX_FMT_YVYU:
@@ -322,6 +329,11 @@ bool tpg_s_fourcc(struct tpg_data *tpg, u32 fourcc)
                tpg->twopixelsize[1] = 2;
                tpg->twopixelsize[2] = 2;
                break;
+       case V4L2_PIX_FMT_NV24:
+       case V4L2_PIX_FMT_NV42:
+               tpg->twopixelsize[0] = 2;
+               tpg->twopixelsize[1] = 4;
+               break;
        }
        return true;
 }
@@ -826,6 +838,18 @@ static void gen_twopix(struct tpg_data *tpg,
                buf[1][1] = g_u;
                break;
 
+       case V4L2_PIX_FMT_NV24:
+               buf[0][offset] = r_y;
+               buf[1][2 * offset] = g_u;
+               buf[1][2 * offset + 1] = b_v;
+               break;
+
+       case V4L2_PIX_FMT_NV42:
+               buf[0][offset] = r_y;
+               buf[1][2 * offset] = b_v;
+               buf[1][2 * offset + 1] = g_u;
+               break;
+
        case V4L2_PIX_FMT_YUYV:
                buf[0][offset] = r_y;
                if (odd) {
index 81e6c827357ef595922781509ecc79185ac38a95..aa898505440535bac3a2af61582f65966f3b17f2 100644 (file)
@@ -143,6 +143,24 @@ struct vivid_fmt vivid_formats[] = {
                .planes   = 2,
                .buffers = 1,
        },
+       {
+               .name     = "YUV 4:4:4 biplanar",
+               .fourcc   = V4L2_PIX_FMT_NV24,
+               .vdownsampling = { 1, 1 },
+               .bit_depth = { 8, 16 },
+               .is_yuv   = true,
+               .planes   = 2,
+               .buffers = 1,
+       },
+       {
+               .name     = "YVU 4:4:4 biplanar",
+               .fourcc   = V4L2_PIX_FMT_NV42,
+               .vdownsampling = { 1, 1 },
+               .bit_depth = { 8, 16 },
+               .is_yuv   = true,
+               .planes   = 2,
+               .buffers = 1,
+       },
        {
                .name     = "Monochrome",
                .fourcc   = V4L2_PIX_FMT_GREY,