diff options
author | Hans Verkuil <hans.verkuil@cisco.com> | 2015-03-13 05:35:40 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2015-04-02 20:05:59 -0400 |
commit | 628821c84e9047bffab8357668a6b1ef6c0038a5 (patch) | |
tree | baa0500872bd00ec6d8b997bc0cc375e742ec474 /drivers/media | |
parent | 68cd4e9f21d9d3b868f78eb3a85165229cb4f024 (diff) |
[media] vivid: add support for packed YUV formats
Add support for the packed YUV formats YUV444, YUV555, YUV565 and YUV32.
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/platform/vivid/vivid-tpg.c | 40 | ||||
-rw-r--r-- | drivers/media/platform/vivid/vivid-vid-common.c | 35 |
2 files changed, 72 insertions, 3 deletions
diff --git a/drivers/media/platform/vivid/vivid-tpg.c b/drivers/media/platform/vivid/vivid-tpg.c index 0e2b8d4b8864..7079460deb61 100644 --- a/drivers/media/platform/vivid/vivid-tpg.c +++ b/drivers/media/platform/vivid/vivid-tpg.c | |||
@@ -212,6 +212,12 @@ bool tpg_s_fourcc(struct tpg_data *tpg, u32 fourcc) | |||
212 | case V4L2_PIX_FMT_GREY: | 212 | case V4L2_PIX_FMT_GREY: |
213 | tpg->is_yuv = false; | 213 | tpg->is_yuv = false; |
214 | break; | 214 | break; |
215 | case V4L2_PIX_FMT_YUV444: | ||
216 | case V4L2_PIX_FMT_YUV555: | ||
217 | case V4L2_PIX_FMT_YUV565: | ||
218 | case V4L2_PIX_FMT_YUV32: | ||
219 | tpg->is_yuv = true; | ||
220 | break; | ||
215 | case V4L2_PIX_FMT_YUV420M: | 221 | case V4L2_PIX_FMT_YUV420M: |
216 | case V4L2_PIX_FMT_YVU420M: | 222 | case V4L2_PIX_FMT_YVU420M: |
217 | tpg->buffers = 3; | 223 | tpg->buffers = 3; |
@@ -294,6 +300,9 @@ bool tpg_s_fourcc(struct tpg_data *tpg, u32 fourcc) | |||
294 | case V4L2_PIX_FMT_UYVY: | 300 | case V4L2_PIX_FMT_UYVY: |
295 | case V4L2_PIX_FMT_YVYU: | 301 | case V4L2_PIX_FMT_YVYU: |
296 | case V4L2_PIX_FMT_VYUY: | 302 | case V4L2_PIX_FMT_VYUY: |
303 | case V4L2_PIX_FMT_YUV444: | ||
304 | case V4L2_PIX_FMT_YUV555: | ||
305 | case V4L2_PIX_FMT_YUV565: | ||
297 | tpg->twopixelsize[0] = 2 * 2; | 306 | tpg->twopixelsize[0] = 2 * 2; |
298 | break; | 307 | break; |
299 | case V4L2_PIX_FMT_RGB24: | 308 | case V4L2_PIX_FMT_RGB24: |
@@ -307,6 +316,7 @@ bool tpg_s_fourcc(struct tpg_data *tpg, u32 fourcc) | |||
307 | case V4L2_PIX_FMT_XBGR32: | 316 | case V4L2_PIX_FMT_XBGR32: |
308 | case V4L2_PIX_FMT_ARGB32: | 317 | case V4L2_PIX_FMT_ARGB32: |
309 | case V4L2_PIX_FMT_ABGR32: | 318 | case V4L2_PIX_FMT_ABGR32: |
319 | case V4L2_PIX_FMT_YUV32: | ||
310 | tpg->twopixelsize[0] = 2 * 4; | 320 | tpg->twopixelsize[0] = 2 * 4; |
311 | break; | 321 | break; |
312 | case V4L2_PIX_FMT_GREY: | 322 | case V4L2_PIX_FMT_GREY: |
@@ -713,9 +723,29 @@ static void precalculate_color(struct tpg_data *tpg, int k) | |||
713 | cb = clamp(cb, 16 << 4, 240 << 4); | 723 | cb = clamp(cb, 16 << 4, 240 << 4); |
714 | cr = clamp(cr, 16 << 4, 240 << 4); | 724 | cr = clamp(cr, 16 << 4, 240 << 4); |
715 | } | 725 | } |
716 | tpg->colors[k][0] = clamp(y >> 4, 1, 254); | 726 | y = clamp(y >> 4, 1, 254); |
717 | tpg->colors[k][1] = clamp(cb >> 4, 1, 254); | 727 | cb = clamp(cb >> 4, 1, 254); |
718 | tpg->colors[k][2] = clamp(cr >> 4, 1, 254); | 728 | cr = clamp(cr >> 4, 1, 254); |
729 | switch (tpg->fourcc) { | ||
730 | case V4L2_PIX_FMT_YUV444: | ||
731 | y >>= 4; | ||
732 | cb >>= 4; | ||
733 | cr >>= 4; | ||
734 | break; | ||
735 | case V4L2_PIX_FMT_YUV555: | ||
736 | y >>= 3; | ||
737 | cb >>= 3; | ||
738 | cr >>= 3; | ||
739 | break; | ||
740 | case V4L2_PIX_FMT_YUV565: | ||
741 | y >>= 3; | ||
742 | cb >>= 2; | ||
743 | cr >>= 3; | ||
744 | break; | ||
745 | } | ||
746 | tpg->colors[k][0] = y; | ||
747 | tpg->colors[k][1] = cb; | ||
748 | tpg->colors[k][2] = cr; | ||
719 | } else { | 749 | } else { |
720 | if (tpg->real_quantization == V4L2_QUANTIZATION_LIM_RANGE) { | 750 | if (tpg->real_quantization == V4L2_QUANTIZATION_LIM_RANGE) { |
721 | r = (r * 219) / 255 + (16 << 4); | 751 | r = (r * 219) / 255 + (16 << 4); |
@@ -909,6 +939,7 @@ static void gen_twopix(struct tpg_data *tpg, | |||
909 | case V4L2_PIX_FMT_RGB332: | 939 | case V4L2_PIX_FMT_RGB332: |
910 | buf[0][offset] = (r_y << 5) | (g_u << 2) | b_v; | 940 | buf[0][offset] = (r_y << 5) | (g_u << 2) | b_v; |
911 | break; | 941 | break; |
942 | case V4L2_PIX_FMT_YUV565: | ||
912 | case V4L2_PIX_FMT_RGB565: | 943 | case V4L2_PIX_FMT_RGB565: |
913 | buf[0][offset] = (g_u << 5) | b_v; | 944 | buf[0][offset] = (g_u << 5) | b_v; |
914 | buf[0][offset + 1] = (r_y << 3) | (g_u >> 3); | 945 | buf[0][offset + 1] = (r_y << 3) | (g_u >> 3); |
@@ -921,6 +952,7 @@ static void gen_twopix(struct tpg_data *tpg, | |||
921 | case V4L2_PIX_FMT_XRGB444: | 952 | case V4L2_PIX_FMT_XRGB444: |
922 | alpha = 0; | 953 | alpha = 0; |
923 | /* fall through */ | 954 | /* fall through */ |
955 | case V4L2_PIX_FMT_YUV444: | ||
924 | case V4L2_PIX_FMT_ARGB444: | 956 | case V4L2_PIX_FMT_ARGB444: |
925 | buf[0][offset] = (g_u << 4) | b_v; | 957 | buf[0][offset] = (g_u << 4) | b_v; |
926 | buf[0][offset + 1] = (alpha & 0xf0) | r_y; | 958 | buf[0][offset + 1] = (alpha & 0xf0) | r_y; |
@@ -929,6 +961,7 @@ static void gen_twopix(struct tpg_data *tpg, | |||
929 | case V4L2_PIX_FMT_XRGB555: | 961 | case V4L2_PIX_FMT_XRGB555: |
930 | alpha = 0; | 962 | alpha = 0; |
931 | /* fall through */ | 963 | /* fall through */ |
964 | case V4L2_PIX_FMT_YUV555: | ||
932 | case V4L2_PIX_FMT_ARGB555: | 965 | case V4L2_PIX_FMT_ARGB555: |
933 | buf[0][offset] = (g_u << 5) | b_v; | 966 | buf[0][offset] = (g_u << 5) | b_v; |
934 | buf[0][offset + 1] = (alpha & 0x80) | (r_y << 2) | (g_u >> 3); | 967 | buf[0][offset + 1] = (alpha & 0x80) | (r_y << 2) | (g_u >> 3); |
@@ -961,6 +994,7 @@ static void gen_twopix(struct tpg_data *tpg, | |||
961 | case V4L2_PIX_FMT_XRGB32: | 994 | case V4L2_PIX_FMT_XRGB32: |
962 | alpha = 0; | 995 | alpha = 0; |
963 | /* fall through */ | 996 | /* fall through */ |
997 | case V4L2_PIX_FMT_YUV32: | ||
964 | case V4L2_PIX_FMT_ARGB32: | 998 | case V4L2_PIX_FMT_ARGB32: |
965 | buf[0][offset] = alpha; | 999 | buf[0][offset] = alpha; |
966 | buf[0][offset + 1] = r_y; | 1000 | buf[0][offset + 1] = r_y; |
diff --git a/drivers/media/platform/vivid/vivid-vid-common.c b/drivers/media/platform/vivid/vivid-vid-common.c index 58b42d267342..8f0910da2bc4 100644 --- a/drivers/media/platform/vivid/vivid-vid-common.c +++ b/drivers/media/platform/vivid/vivid-vid-common.c | |||
@@ -162,6 +162,41 @@ struct vivid_fmt vivid_formats[] = { | |||
162 | .buffers = 1, | 162 | .buffers = 1, |
163 | }, | 163 | }, |
164 | { | 164 | { |
165 | .name = "YUV555 (LE)", | ||
166 | .fourcc = V4L2_PIX_FMT_YUV555, /* uuuvvvvv ayyyyyuu */ | ||
167 | .vdownsampling = { 1 }, | ||
168 | .bit_depth = { 16 }, | ||
169 | .planes = 1, | ||
170 | .buffers = 1, | ||
171 | .alpha_mask = 0x8000, | ||
172 | }, | ||
173 | { | ||
174 | .name = "YUV565 (LE)", | ||
175 | .fourcc = V4L2_PIX_FMT_YUV565, /* uuuvvvvv yyyyyuuu */ | ||
176 | .vdownsampling = { 1 }, | ||
177 | .bit_depth = { 16 }, | ||
178 | .planes = 1, | ||
179 | .buffers = 1, | ||
180 | }, | ||
181 | { | ||
182 | .name = "YUV444", | ||
183 | .fourcc = V4L2_PIX_FMT_YUV444, /* uuuuvvvv aaaayyyy */ | ||
184 | .vdownsampling = { 1 }, | ||
185 | .bit_depth = { 16 }, | ||
186 | .planes = 1, | ||
187 | .buffers = 1, | ||
188 | .alpha_mask = 0xf000, | ||
189 | }, | ||
190 | { | ||
191 | .name = "YUV32 (LE)", | ||
192 | .fourcc = V4L2_PIX_FMT_YUV32, /* ayuv */ | ||
193 | .vdownsampling = { 1 }, | ||
194 | .bit_depth = { 32 }, | ||
195 | .planes = 1, | ||
196 | .buffers = 1, | ||
197 | .alpha_mask = 0x000000ff, | ||
198 | }, | ||
199 | { | ||
165 | .name = "Monochrome", | 200 | .name = "Monochrome", |
166 | .fourcc = V4L2_PIX_FMT_GREY, | 201 | .fourcc = V4L2_PIX_FMT_GREY, |
167 | .vdownsampling = { 1 }, | 202 | .vdownsampling = { 1 }, |