aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorHans Verkuil <hans.verkuil@cisco.com>2015-03-13 05:35:40 -0400
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2015-04-02 20:05:59 -0400
commit628821c84e9047bffab8357668a6b1ef6c0038a5 (patch)
treebaa0500872bd00ec6d8b997bc0cc375e742ec474 /drivers/media
parent68cd4e9f21d9d3b868f78eb3a85165229cb4f024 (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.c40
-rw-r--r--drivers/media/platform/vivid/vivid-vid-common.c35
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 },