Commit 6200bbaa authored by Thierry MERLE's avatar Thierry MERLE Committed by Mauro Carvalho Chehab

V4L/DVB (7024): usbvision: YUV to RGB conversion fixes

All YUV to RGB conversions in usbvision were reverted
(conversion to BGR but saying RGB to the application)
Signed-off-by: default avatarThierry MERLE <thierry.merle@free.fr>
Acked-by: default avatarDwaine Garden <DwaineGarden@rogers.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 1f8d3008
...@@ -633,25 +633,29 @@ static enum ParseState usbvision_parse_lines_422(struct usb_usbvision *usbvision ...@@ -633,25 +633,29 @@ static enum ParseState usbvision_parse_lines_422(struct usb_usbvision *usbvision
YUV_TO_RGB_BY_THE_BOOK(yuyv[0], yuyv[1], yuyv[3], rv, gv, bv); YUV_TO_RGB_BY_THE_BOOK(yuyv[0], yuyv[1], yuyv[3], rv, gv, bv);
switch (frame->v4l2_format.format) { switch (frame->v4l2_format.format) {
case V4L2_PIX_FMT_RGB565: case V4L2_PIX_FMT_RGB565:
*f++ = (0x1F & (bv >> 3)) | (0xE0 & (gv << 3)); *f++ = (0x1F & rv) |
*f++ = (0x07 & (gv >> 5)) | (0xF8 & rv); (0xE0 & (gv << 5));
break; *f++ = (0x07 & (gv >> 3)) |
case V4L2_PIX_FMT_RGB24: (0xF8 & bv);
*f++ = bv; break;
*f++ = gv; case V4L2_PIX_FMT_RGB24:
*f++ = rv; *f++ = rv;
break; *f++ = gv;
case V4L2_PIX_FMT_RGB32: *f++ = bv;
*f++ = bv; break;
*f++ = gv; case V4L2_PIX_FMT_RGB32:
*f++ = rv; *f++ = rv;
f++; *f++ = gv;
break; *f++ = bv;
case V4L2_PIX_FMT_RGB555: f++;
*f++ = (0x1F & (bv >> 3)) | (0xE0 & (gv << 2)); break;
*f++ = (0x03 & (gv >> 6)) | (0x7C & (rv >> 1)); case V4L2_PIX_FMT_RGB555:
break; *f++ = (0x1F & rv) |
(0xE0 & (gv << 5));
*f++ = (0x03 & (gv >> 3)) |
(0x7C & (bv << 2));
break;
} }
} }
clipmask_index += clipmask_add; clipmask_index += clipmask_add;
...@@ -665,25 +669,29 @@ static enum ParseState usbvision_parse_lines_422(struct usb_usbvision *usbvision ...@@ -665,25 +669,29 @@ static enum ParseState usbvision_parse_lines_422(struct usb_usbvision *usbvision
YUV_TO_RGB_BY_THE_BOOK(yuyv[2], yuyv[1], yuyv[3], rv, gv, bv); YUV_TO_RGB_BY_THE_BOOK(yuyv[2], yuyv[1], yuyv[3], rv, gv, bv);
switch (frame->v4l2_format.format) { switch (frame->v4l2_format.format) {
case V4L2_PIX_FMT_RGB565: case V4L2_PIX_FMT_RGB565:
*f++ = (0x1F & (bv >> 3)) | (0xE0 & (gv << 3)); *f++ = (0x1F & rv) |
*f++ = (0x07 & (gv >> 5)) | (0xF8 & rv); (0xE0 & (gv << 5));
break; *f++ = (0x07 & (gv >> 3)) |
case V4L2_PIX_FMT_RGB24: (0xF8 & bv);
*f++ = bv; break;
*f++ = gv; case V4L2_PIX_FMT_RGB24:
*f++ = rv; *f++ = rv;
break; *f++ = gv;
case V4L2_PIX_FMT_RGB32: *f++ = bv;
*f++ = bv; break;
*f++ = gv; case V4L2_PIX_FMT_RGB32:
*f++ = rv; *f++ = rv;
f++; *f++ = gv;
break; *f++ = bv;
case V4L2_PIX_FMT_RGB555: f++;
*f++ = (0x1F & (bv >> 3)) | (0xE0 & (gv << 2)); break;
*f++ = (0x03 & (gv >> 6)) | (0x7C & (rv >> 1)); case V4L2_PIX_FMT_RGB555:
break; *f++ = (0x1F & rv) |
(0xE0 & (gv << 5));
*f++ = (0x03 & (gv >> 3)) |
(0x7C & (bv << 2));
break;
} }
} }
clipmask_index += clipmask_add; clipmask_index += clipmask_add;
...@@ -951,22 +959,26 @@ static enum ParseState usbvision_parse_compress(struct usb_usbvision *usbvision, ...@@ -951,22 +959,26 @@ static enum ParseState usbvision_parse_compress(struct usb_usbvision *usbvision,
*f++ = Y[Idx]; *f++ = Y[Idx];
break; break;
case V4L2_PIX_FMT_RGB555: case V4L2_PIX_FMT_RGB555:
*f++ = (0x1F & (bv >> 3)) | (0xE0 & (gv << 2)); *f++ = (0x1F & rv) |
*f++ = (0x03 & (gv >> 6)) | (0x7C & (rv >> 1)); (0xE0 & (gv << 5));
*f++ = (0x03 & (gv >> 3)) |
(0x7C & (bv << 2));
break; break;
case V4L2_PIX_FMT_RGB565: case V4L2_PIX_FMT_RGB565:
*f++ = (0x1F & (bv >> 3)) | (0xE0 & (gv << 3)); *f++ = (0x1F & rv) |
*f++ = (0x07 & (gv >> 5)) | (0xF8 & rv); (0xE0 & (gv << 5));
*f++ = (0x07 & (gv >> 3)) |
(0xF8 & bv);
break; break;
case V4L2_PIX_FMT_RGB24: case V4L2_PIX_FMT_RGB24:
*f++ = bv;
*f++ = gv;
*f++ = rv; *f++ = rv;
*f++ = gv;
*f++ = bv;
break; break;
case V4L2_PIX_FMT_RGB32: case V4L2_PIX_FMT_RGB32:
*f++ = bv;
*f++ = gv;
*f++ = rv; *f++ = rv;
*f++ = gv;
*f++ = bv;
f++; f++;
break; break;
} }
...@@ -1080,28 +1092,33 @@ static enum ParseState usbvision_parse_lines_420(struct usb_usbvision *usbvision ...@@ -1080,28 +1092,33 @@ static enum ParseState usbvision_parse_lines_420(struct usb_usbvision *usbvision
r_ = (y_ + ur) >> 16; r_ = (y_ + ur) >> 16;
switch (frame->v4l2_format.format) { switch (frame->v4l2_format.format) {
case V4L2_PIX_FMT_RGB565: case V4L2_PIX_FMT_RGB565:
g = LIMIT_RGB(g_); g = LIMIT_RGB(g_);
*f_even++ = (0x1F & (LIMIT_RGB(b_) >> 3)) | (0xE0 & (g << 3)); *f_even++ =
*f_even++ = (0x07 & ( g >> 5)) | (0xF8 & LIMIT_RGB(r_)); (0x1F & LIMIT_RGB(r_)) |
break; (0xE0 & (g << 5));
case V4L2_PIX_FMT_RGB24: *f_even++ =
*f_even++ = LIMIT_RGB(b_); (0x07 & (g >> 3)) |
*f_even++ = LIMIT_RGB(g_); (0xF8 & LIMIT_RGB(b_));
*f_even++ = LIMIT_RGB(r_); break;
break; case V4L2_PIX_FMT_RGB24:
case V4L2_PIX_FMT_RGB32: *f_even++ = LIMIT_RGB(r_);
*f_even++ = LIMIT_RGB(b_); *f_even++ = LIMIT_RGB(g_);
*f_even++ = LIMIT_RGB(g_); *f_even++ = LIMIT_RGB(b_);
*f_even++ = LIMIT_RGB(r_); break;
f_even++; case V4L2_PIX_FMT_RGB32:
break; *f_even++ = LIMIT_RGB(r_);
case V4L2_PIX_FMT_RGB555: *f_even++ = LIMIT_RGB(g_);
g = LIMIT_RGB(g_); *f_even++ = LIMIT_RGB(b_);
*f_even++ = (0x1F & (LIMIT_RGB(b_) >> 3)) | (0xE0 & (g << 2)); f_even++;
*f_even++ = (0x03 & ( g >> 6)) | break;
(0x7C & (LIMIT_RGB(r_) >> 1)); case V4L2_PIX_FMT_RGB555:
break; g = LIMIT_RGB(g_);
*f_even++ = (0x1F & LIMIT_RGB(r_)) |
(0xE0 & (g << 5));
*f_even++ = (0x03 & (g >> 3)) |
(0x7C & (LIMIT_RGB(b_) << 2));
break;
} }
} }
clipmask_even_index += clipmask_add; clipmask_even_index += clipmask_add;
...@@ -1119,28 +1136,33 @@ static enum ParseState usbvision_parse_lines_420(struct usb_usbvision *usbvision ...@@ -1119,28 +1136,33 @@ static enum ParseState usbvision_parse_lines_420(struct usb_usbvision *usbvision
r_ = (y_ + ur) >> 16; r_ = (y_ + ur) >> 16;
switch (frame->v4l2_format.format) { switch (frame->v4l2_format.format) {
case V4L2_PIX_FMT_RGB565: case V4L2_PIX_FMT_RGB565:
g = LIMIT_RGB(g_); g = LIMIT_RGB(g_);
*f_even++ = (0x1F & (LIMIT_RGB(b_) >> 3)) | (0xE0 & (g << 3)); *f_even++ =
*f_even++ = (0x07 & ( g >> 5)) | (0xF8 & LIMIT_RGB(r_)); (0x1F & LIMIT_RGB(r_)) |
break; (0xE0 & (g << 5));
case V4L2_PIX_FMT_RGB24: *f_even++ =
*f_even++ = LIMIT_RGB(b_); (0x07 & (g >> 3)) |
*f_even++ = LIMIT_RGB(g_); (0xF8 & LIMIT_RGB(b_));
*f_even++ = LIMIT_RGB(r_); break;
break; case V4L2_PIX_FMT_RGB24:
case V4L2_PIX_FMT_RGB32: *f_even++ = LIMIT_RGB(r_);
*f_even++ = LIMIT_RGB(b_); *f_even++ = LIMIT_RGB(g_);
*f_even++ = LIMIT_RGB(g_); *f_even++ = LIMIT_RGB(b_);
*f_even++ = LIMIT_RGB(r_); break;
f_even++; case V4L2_PIX_FMT_RGB32:
break; *f_even++ = LIMIT_RGB(r_);
case V4L2_PIX_FMT_RGB555: *f_even++ = LIMIT_RGB(g_);
g = LIMIT_RGB(g_); *f_even++ = LIMIT_RGB(b_);
*f_even++ = (0x1F & (LIMIT_RGB(b_) >> 3)) | (0xE0 & (g << 2)); f_even++;
*f_even++ = (0x03 & ( g >> 6)) | break;
(0x7C & (LIMIT_RGB(r_) >> 1)); case V4L2_PIX_FMT_RGB555:
break; g = LIMIT_RGB(g_);
*f_even++ = (0x1F & LIMIT_RGB(r_)) |
(0xE0 & (g << 5));
*f_even++ = (0x03 & (g >> 3)) |
(0x7C & (LIMIT_RGB(b_) << 2));
break;
} }
} }
clipmask_even_index += clipmask_add; clipmask_even_index += clipmask_add;
...@@ -1160,28 +1182,33 @@ static enum ParseState usbvision_parse_lines_420(struct usb_usbvision *usbvision ...@@ -1160,28 +1182,33 @@ static enum ParseState usbvision_parse_lines_420(struct usb_usbvision *usbvision
r_ = (y_ + ur) >> 16; r_ = (y_ + ur) >> 16;
switch (frame->v4l2_format.format) { switch (frame->v4l2_format.format) {
case V4L2_PIX_FMT_RGB565: case V4L2_PIX_FMT_RGB565:
g = LIMIT_RGB(g_); g = LIMIT_RGB(g_);
*f_odd++ = (0x1F & (LIMIT_RGB(b_) >> 3)) | (0xE0 & (g << 3)); *f_odd++ =
*f_odd++ = (0x07 & ( g >> 5)) | (0xF8 & LIMIT_RGB(r_)); (0x1F & LIMIT_RGB(r_)) |
break; (0xE0 & (g << 5));
case V4L2_PIX_FMT_RGB24: *f_odd++ =
*f_odd++ = LIMIT_RGB(b_); (0x07 & (g >> 3)) |
*f_odd++ = LIMIT_RGB(g_); (0xF8 & LIMIT_RGB(b_));
*f_odd++ = LIMIT_RGB(r_); break;
break; case V4L2_PIX_FMT_RGB24:
case V4L2_PIX_FMT_RGB32: *f_odd++ = LIMIT_RGB(r_);
*f_odd++ = LIMIT_RGB(b_); *f_odd++ = LIMIT_RGB(g_);
*f_odd++ = LIMIT_RGB(g_); *f_odd++ = LIMIT_RGB(b_);
*f_odd++ = LIMIT_RGB(r_); break;
f_odd++; case V4L2_PIX_FMT_RGB32:
break; *f_odd++ = LIMIT_RGB(r_);
case V4L2_PIX_FMT_RGB555: *f_odd++ = LIMIT_RGB(g_);
g = LIMIT_RGB(g_); *f_odd++ = LIMIT_RGB(b_);
*f_odd++ = (0x1F & (LIMIT_RGB(b_) >> 3)) | (0xE0 & (g << 2)); f_odd++;
*f_odd++ = (0x03 & ( g >> 6)) | break;
(0x7C & (LIMIT_RGB(r_) >> 1)); case V4L2_PIX_FMT_RGB555:
break; g = LIMIT_RGB(g_);
*f_odd++ = (0x1F & LIMIT_RGB(r_)) |
(0xE0 & (g << 5));
*f_odd++ = (0x03 & (g >> 3)) |
(0x7C & (LIMIT_RGB(b_) << 2));
break;
} }
} }
clipmask_odd_index += clipmask_add; clipmask_odd_index += clipmask_add;
...@@ -1199,28 +1226,33 @@ static enum ParseState usbvision_parse_lines_420(struct usb_usbvision *usbvision ...@@ -1199,28 +1226,33 @@ static enum ParseState usbvision_parse_lines_420(struct usb_usbvision *usbvision
r_ = (y_ + ur) >> 16; r_ = (y_ + ur) >> 16;
switch (frame->v4l2_format.format) { switch (frame->v4l2_format.format) {
case V4L2_PIX_FMT_RGB565: case V4L2_PIX_FMT_RGB565:
g = LIMIT_RGB(g_); g = LIMIT_RGB(g_);
*f_odd++ = (0x1F & (LIMIT_RGB(b_) >> 3)) | (0xE0 & (g << 3)); *f_odd++ =
*f_odd++ = (0x07 & ( g >> 5)) | (0xF8 & LIMIT_RGB(r_)); (0x1F & LIMIT_RGB(r_)) |
break; (0xE0 & (g << 5));
case V4L2_PIX_FMT_RGB24: *f_odd++ =
*f_odd++ = LIMIT_RGB(b_); (0x07 & (g >> 3)) |
*f_odd++ = LIMIT_RGB(g_); (0xF8 & LIMIT_RGB(b_));
*f_odd++ = LIMIT_RGB(r_); break;
break; case V4L2_PIX_FMT_RGB24:
case V4L2_PIX_FMT_RGB32: *f_odd++ = LIMIT_RGB(r_);
*f_odd++ = LIMIT_RGB(b_); *f_odd++ = LIMIT_RGB(g_);
*f_odd++ = LIMIT_RGB(g_); *f_odd++ = LIMIT_RGB(b_);
*f_odd++ = LIMIT_RGB(r_); break;
f_odd++; case V4L2_PIX_FMT_RGB32:
break; *f_odd++ = LIMIT_RGB(r_);
case V4L2_PIX_FMT_RGB555: *f_odd++ = LIMIT_RGB(g_);
g = LIMIT_RGB(g_); *f_odd++ = LIMIT_RGB(b_);
*f_odd++ = (0x1F & (LIMIT_RGB(b_) >> 3)) | (0xE0 & (g << 2)); f_odd++;
*f_odd++ = (0x03 & ( g >> 6)) | break;
(0x7C & (LIMIT_RGB(r_) >> 1)); case V4L2_PIX_FMT_RGB555:
break; g = LIMIT_RGB(g_);
*f_odd++ = (0x1F & LIMIT_RGB(r_)) |
(0xE0 & (g << 5));
*f_odd++ = (0x03 & (g >> 3)) |
(0x7C & (LIMIT_RGB(b_) << 2));
break;
} }
} }
clipmask_odd_index += clipmask_add; clipmask_odd_index += clipmask_add;
......
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