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
...@@ -634,23 +634,27 @@ static enum ParseState usbvision_parse_lines_422(struct usb_usbvision *usbvision ...@@ -634,23 +634,27 @@ 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));
*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;
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;
} }
} }
...@@ -666,23 +670,27 @@ static enum ParseState usbvision_parse_lines_422(struct usb_usbvision *usbvision ...@@ -666,23 +670,27 @@ 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));
*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;
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;
} }
} }
...@@ -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;
} }
...@@ -1082,25 +1094,30 @@ static enum ParseState usbvision_parse_lines_420(struct usb_usbvision *usbvision ...@@ -1082,25 +1094,30 @@ static enum ParseState usbvision_parse_lines_420(struct usb_usbvision *usbvision
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_)) |
(0xE0 & (g << 5));
*f_even++ =
(0x07 & (g >> 3)) |
(0xF8 & LIMIT_RGB(b_));
break; break;
case V4L2_PIX_FMT_RGB24: case V4L2_PIX_FMT_RGB24:
*f_even++ = LIMIT_RGB(b_);
*f_even++ = LIMIT_RGB(g_);
*f_even++ = LIMIT_RGB(r_); *f_even++ = LIMIT_RGB(r_);
*f_even++ = LIMIT_RGB(g_);
*f_even++ = LIMIT_RGB(b_);
break; break;
case V4L2_PIX_FMT_RGB32: case V4L2_PIX_FMT_RGB32:
*f_even++ = LIMIT_RGB(b_);
*f_even++ = LIMIT_RGB(g_);
*f_even++ = LIMIT_RGB(r_); *f_even++ = LIMIT_RGB(r_);
*f_even++ = LIMIT_RGB(g_);
*f_even++ = LIMIT_RGB(b_);
f_even++; f_even++;
break; break;
case V4L2_PIX_FMT_RGB555: case V4L2_PIX_FMT_RGB555:
g = LIMIT_RGB(g_); g = LIMIT_RGB(g_);
*f_even++ = (0x1F & (LIMIT_RGB(b_) >> 3)) | (0xE0 & (g << 2)); *f_even++ = (0x1F & LIMIT_RGB(r_)) |
*f_even++ = (0x03 & ( g >> 6)) | (0xE0 & (g << 5));
(0x7C & (LIMIT_RGB(r_) >> 1)); *f_even++ = (0x03 & (g >> 3)) |
(0x7C & (LIMIT_RGB(b_) << 2));
break; break;
} }
} }
...@@ -1121,25 +1138,30 @@ static enum ParseState usbvision_parse_lines_420(struct usb_usbvision *usbvision ...@@ -1121,25 +1138,30 @@ static enum ParseState usbvision_parse_lines_420(struct usb_usbvision *usbvision
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_)) |
(0xE0 & (g << 5));
*f_even++ =
(0x07 & (g >> 3)) |
(0xF8 & LIMIT_RGB(b_));
break; break;
case V4L2_PIX_FMT_RGB24: case V4L2_PIX_FMT_RGB24:
*f_even++ = LIMIT_RGB(b_);
*f_even++ = LIMIT_RGB(g_);
*f_even++ = LIMIT_RGB(r_); *f_even++ = LIMIT_RGB(r_);
*f_even++ = LIMIT_RGB(g_);
*f_even++ = LIMIT_RGB(b_);
break; break;
case V4L2_PIX_FMT_RGB32: case V4L2_PIX_FMT_RGB32:
*f_even++ = LIMIT_RGB(b_);
*f_even++ = LIMIT_RGB(g_);
*f_even++ = LIMIT_RGB(r_); *f_even++ = LIMIT_RGB(r_);
*f_even++ = LIMIT_RGB(g_);
*f_even++ = LIMIT_RGB(b_);
f_even++; f_even++;
break; break;
case V4L2_PIX_FMT_RGB555: case V4L2_PIX_FMT_RGB555:
g = LIMIT_RGB(g_); g = LIMIT_RGB(g_);
*f_even++ = (0x1F & (LIMIT_RGB(b_) >> 3)) | (0xE0 & (g << 2)); *f_even++ = (0x1F & LIMIT_RGB(r_)) |
*f_even++ = (0x03 & ( g >> 6)) | (0xE0 & (g << 5));
(0x7C & (LIMIT_RGB(r_) >> 1)); *f_even++ = (0x03 & (g >> 3)) |
(0x7C & (LIMIT_RGB(b_) << 2));
break; break;
} }
} }
...@@ -1162,25 +1184,30 @@ static enum ParseState usbvision_parse_lines_420(struct usb_usbvision *usbvision ...@@ -1162,25 +1184,30 @@ static enum ParseState usbvision_parse_lines_420(struct usb_usbvision *usbvision
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_)) |
(0xE0 & (g << 5));
*f_odd++ =
(0x07 & (g >> 3)) |
(0xF8 & LIMIT_RGB(b_));
break; break;
case V4L2_PIX_FMT_RGB24: case V4L2_PIX_FMT_RGB24:
*f_odd++ = LIMIT_RGB(b_);
*f_odd++ = LIMIT_RGB(g_);
*f_odd++ = LIMIT_RGB(r_); *f_odd++ = LIMIT_RGB(r_);
*f_odd++ = LIMIT_RGB(g_);
*f_odd++ = LIMIT_RGB(b_);
break; break;
case V4L2_PIX_FMT_RGB32: case V4L2_PIX_FMT_RGB32:
*f_odd++ = LIMIT_RGB(b_);
*f_odd++ = LIMIT_RGB(g_);
*f_odd++ = LIMIT_RGB(r_); *f_odd++ = LIMIT_RGB(r_);
*f_odd++ = LIMIT_RGB(g_);
*f_odd++ = LIMIT_RGB(b_);
f_odd++; f_odd++;
break; break;
case V4L2_PIX_FMT_RGB555: case V4L2_PIX_FMT_RGB555:
g = LIMIT_RGB(g_); g = LIMIT_RGB(g_);
*f_odd++ = (0x1F & (LIMIT_RGB(b_) >> 3)) | (0xE0 & (g << 2)); *f_odd++ = (0x1F & LIMIT_RGB(r_)) |
*f_odd++ = (0x03 & ( g >> 6)) | (0xE0 & (g << 5));
(0x7C & (LIMIT_RGB(r_) >> 1)); *f_odd++ = (0x03 & (g >> 3)) |
(0x7C & (LIMIT_RGB(b_) << 2));
break; break;
} }
} }
...@@ -1201,25 +1228,30 @@ static enum ParseState usbvision_parse_lines_420(struct usb_usbvision *usbvision ...@@ -1201,25 +1228,30 @@ static enum ParseState usbvision_parse_lines_420(struct usb_usbvision *usbvision
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_)) |
(0xE0 & (g << 5));
*f_odd++ =
(0x07 & (g >> 3)) |
(0xF8 & LIMIT_RGB(b_));
break; break;
case V4L2_PIX_FMT_RGB24: case V4L2_PIX_FMT_RGB24:
*f_odd++ = LIMIT_RGB(b_);
*f_odd++ = LIMIT_RGB(g_);
*f_odd++ = LIMIT_RGB(r_); *f_odd++ = LIMIT_RGB(r_);
*f_odd++ = LIMIT_RGB(g_);
*f_odd++ = LIMIT_RGB(b_);
break; break;
case V4L2_PIX_FMT_RGB32: case V4L2_PIX_FMT_RGB32:
*f_odd++ = LIMIT_RGB(b_);
*f_odd++ = LIMIT_RGB(g_);
*f_odd++ = LIMIT_RGB(r_); *f_odd++ = LIMIT_RGB(r_);
*f_odd++ = LIMIT_RGB(g_);
*f_odd++ = LIMIT_RGB(b_);
f_odd++; f_odd++;
break; break;
case V4L2_PIX_FMT_RGB555: case V4L2_PIX_FMT_RGB555:
g = LIMIT_RGB(g_); g = LIMIT_RGB(g_);
*f_odd++ = (0x1F & (LIMIT_RGB(b_) >> 3)) | (0xE0 & (g << 2)); *f_odd++ = (0x1F & LIMIT_RGB(r_)) |
*f_odd++ = (0x03 & ( g >> 6)) | (0xE0 & (g << 5));
(0x7C & (LIMIT_RGB(r_) >> 1)); *f_odd++ = (0x03 & (g >> 3)) |
(0x7C & (LIMIT_RGB(b_) << 2));
break; break;
} }
} }
......
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