diff options
author | Mauro Carvalho Chehab <mchehab@redhat.com> | 2008-10-14 15:47:35 +0000 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2008-10-14 15:47:35 +0000 |
commit | df0d94ddb68d94430e1b5489d37eebda90a510fa (patch) | |
tree | 6bce51f9e04681306fdeffb3ea7f448197c7ee78 | |
parent | 365109dcd86d8e5f257bb1c2312255e0dcea0d89 (diff) | |
download | mediapointer-dvb-s2-df0d94ddb68d94430e1b5489d37eebda90a510fa.tar.gz mediapointer-dvb-s2-df0d94ddb68d94430e1b5489d37eebda90a510fa.tar.bz2 |
Add support for rgb565 pixel formats to vivi
From: Magnus Damm <damm@igel.co.jp>
This patch adds RGB565 pixel format support to the vivi driver. Both
little endian and big endian versions are added. The driver follows
the RGB pixel format described in Table 2-2 of the V4L2 API spec,
_not_ the older BGR interpretation described in Table 2-1.
Signed-off-by: Magnus Damm <damm@igel.co.jp>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r-- | linux/drivers/media/video/vivi.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/linux/drivers/media/video/vivi.c b/linux/drivers/media/video/vivi.c index ec6c971d8..c1aa35ddc 100644 --- a/linux/drivers/media/video/vivi.c +++ b/linux/drivers/media/video/vivi.c @@ -142,6 +142,16 @@ static struct vivi_fmt formats[] = { .fourcc = V4L2_PIX_FMT_UYVY, .depth = 16, }, + { + .name = "RGB565 (LE)", + .fourcc = V4L2_PIX_FMT_RGB565, /* gggbbbbb rrrrrggg */ + .depth = 16, + }, + { + .name = "RGB565 (BE)", + .fourcc = V4L2_PIX_FMT_RGB565X, /* rrrrrggg gggbbbbb */ + .depth = 16, + }, }; static struct vivi_fmt *get_format(struct v4l2_format *f) @@ -304,6 +314,30 @@ static void gen_twopix(struct vivi_fh *fh, unsigned char *buf, int colorpos) break; } break; + case V4L2_PIX_FMT_RGB565: + switch (color) { + case 0: + case 2: + *p = (g_u << 5) | b_v; + break; + case 1: + case 3: + *p = (r_y << 3) | (g_u >> 3); + break; + } + break; + case V4L2_PIX_FMT_RGB565X: + switch (color) { + case 0: + case 2: + *p = (r_y << 3) | (g_u >> 3); + break; + case 1: + case 3: + *p = (g_u << 5) | b_v; + break; + } + break; } } } @@ -781,6 +815,12 @@ static int vidioc_s_fmt_vid_cap(struct file *file, void *priv, case V4L2_PIX_FMT_UYVY: is_yuv = 1; break; + case V4L2_PIX_FMT_RGB565: + case V4L2_PIX_FMT_RGB565X: + r >>= 3; + g >>= 2; + b >>= 3; + break; } if (is_yuv) { |