Commit 1f088dc1 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

[media] vivid-tpg: correctly average the two pixels in gen_twopix()

gen_twopix() is always called twice: once for the first and once for
the second pixel. Improve the code to properly average the two if the
format requires horizontal downsampling.

This is necessary for patterns like 1x1 red/blue checkers.
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent 5d7c539e
...@@ -687,28 +687,64 @@ static void gen_twopix(struct tpg_data *tpg, ...@@ -687,28 +687,64 @@ static void gen_twopix(struct tpg_data *tpg,
switch (tpg->fourcc) { switch (tpg->fourcc) {
case V4L2_PIX_FMT_NV16M: case V4L2_PIX_FMT_NV16M:
buf[0][offset] = r_y; buf[0][offset] = r_y;
buf[1][offset] = odd ? b_v : g_u; if (odd) {
buf[1][0] = (buf[1][0] + g_u) / 2;
buf[1][1] = (buf[1][1] + b_v) / 2;
break;
}
buf[1][0] = g_u;
buf[1][1] = b_v;
break; break;
case V4L2_PIX_FMT_NV61M: case V4L2_PIX_FMT_NV61M:
buf[0][offset] = r_y; buf[0][offset] = r_y;
buf[1][offset] = odd ? g_u : b_v; if (odd) {
buf[1][0] = (buf[1][0] + b_v) / 2;
buf[1][1] = (buf[1][1] + g_u) / 2;
break;
}
buf[1][0] = b_v;
buf[1][1] = g_u;
break; break;
case V4L2_PIX_FMT_YUYV: case V4L2_PIX_FMT_YUYV:
buf[0][offset] = r_y; buf[0][offset] = r_y;
buf[0][offset + 1] = odd ? b_v : g_u; if (odd) {
buf[0][1] = (buf[0][1] + g_u) / 2;
buf[0][3] = (buf[0][3] + b_v) / 2;
break;
}
buf[0][1] = g_u;
buf[0][3] = b_v;
break; break;
case V4L2_PIX_FMT_UYVY: case V4L2_PIX_FMT_UYVY:
buf[0][offset] = odd ? b_v : g_u;
buf[0][offset + 1] = r_y; buf[0][offset + 1] = r_y;
if (odd) {
buf[0][0] = (buf[0][0] + g_u) / 2;
buf[0][2] = (buf[0][2] + b_v) / 2;
break;
}
buf[0][0] = g_u;
buf[0][2] = b_v;
break; break;
case V4L2_PIX_FMT_YVYU: case V4L2_PIX_FMT_YVYU:
buf[0][offset] = r_y; buf[0][offset] = r_y;
buf[0][offset + 1] = odd ? g_u : b_v; if (odd) {
buf[0][1] = (buf[0][1] + b_v) / 2;
buf[0][3] = (buf[0][3] + g_u) / 2;
break;
}
buf[0][1] = b_v;
buf[0][3] = g_u;
break; break;
case V4L2_PIX_FMT_VYUY: case V4L2_PIX_FMT_VYUY:
buf[0][offset] = odd ? g_u : b_v;
buf[0][offset + 1] = r_y; buf[0][offset + 1] = r_y;
if (odd) {
buf[0][0] = (buf[0][0] + b_v) / 2;
buf[0][2] = (buf[0][2] + g_u) / 2;
break;
}
buf[0][0] = b_v;
buf[0][2] = g_u;
break; break;
case V4L2_PIX_FMT_RGB565: case V4L2_PIX_FMT_RGB565:
buf[0][offset] = (g_u << 5) | b_v; buf[0][offset] = (g_u << 5) | b_v;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment