Skip to content

Commit

Permalink
V4L/DVB (7024): usbvision: YUV to RGB conversion fixes
Browse files Browse the repository at this point in the history
All YUV to RGB conversions in usbvision were reverted
(conversion to BGR but saying RGB to the application)

Signed-off-by: Thierry MERLE <thierry.merle@free.fr>
Acked-by: Dwaine Garden <DwaineGarden@rogers.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
  • Loading branch information
Thierry MERLE authored and Mauro Carvalho Chehab committed Jan 25, 2008
1 parent 1f8d300 commit 6200bba
Showing 1 changed file with 166 additions and 134 deletions.
300 changes: 166 additions & 134 deletions drivers/media/video/usbvision/usbvision-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
switch (frame->v4l2_format.format) {
case V4L2_PIX_FMT_RGB565:
*f++ = (0x1F & (bv >> 3)) | (0xE0 & (gv << 3));
*f++ = (0x07 & (gv >> 5)) | (0xF8 & rv);
break;
case V4L2_PIX_FMT_RGB24:
*f++ = bv;
*f++ = gv;
*f++ = rv;
break;
case V4L2_PIX_FMT_RGB32:
*f++ = bv;
*f++ = gv;
*f++ = rv;
f++;
break;
case V4L2_PIX_FMT_RGB555:
*f++ = (0x1F & (bv >> 3)) | (0xE0 & (gv << 2));
*f++ = (0x03 & (gv >> 6)) | (0x7C & (rv >> 1));
break;
case V4L2_PIX_FMT_RGB565:
*f++ = (0x1F & rv) |
(0xE0 & (gv << 5));
*f++ = (0x07 & (gv >> 3)) |
(0xF8 & bv);
break;
case V4L2_PIX_FMT_RGB24:
*f++ = rv;
*f++ = gv;
*f++ = bv;
break;
case V4L2_PIX_FMT_RGB32:
*f++ = rv;
*f++ = gv;
*f++ = bv;
f++;
break;
case V4L2_PIX_FMT_RGB555:
*f++ = (0x1F & rv) |
(0xE0 & (gv << 5));
*f++ = (0x03 & (gv >> 3)) |
(0x7C & (bv << 2));
break;
}
}
clipmask_index += clipmask_add;
Expand All @@ -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);
switch (frame->v4l2_format.format) {
case V4L2_PIX_FMT_RGB565:
*f++ = (0x1F & (bv >> 3)) | (0xE0 & (gv << 3));
*f++ = (0x07 & (gv >> 5)) | (0xF8 & rv);
break;
case V4L2_PIX_FMT_RGB24:
*f++ = bv;
*f++ = gv;
*f++ = rv;
break;
case V4L2_PIX_FMT_RGB32:
*f++ = bv;
*f++ = gv;
*f++ = rv;
f++;
break;
case V4L2_PIX_FMT_RGB555:
*f++ = (0x1F & (bv >> 3)) | (0xE0 & (gv << 2));
*f++ = (0x03 & (gv >> 6)) | (0x7C & (rv >> 1));
break;
case V4L2_PIX_FMT_RGB565:
*f++ = (0x1F & rv) |
(0xE0 & (gv << 5));
*f++ = (0x07 & (gv >> 3)) |
(0xF8 & bv);
break;
case V4L2_PIX_FMT_RGB24:
*f++ = rv;
*f++ = gv;
*f++ = bv;
break;
case V4L2_PIX_FMT_RGB32:
*f++ = rv;
*f++ = gv;
*f++ = bv;
f++;
break;
case V4L2_PIX_FMT_RGB555:
*f++ = (0x1F & rv) |
(0xE0 & (gv << 5));
*f++ = (0x03 & (gv >> 3)) |
(0x7C & (bv << 2));
break;
}
}
clipmask_index += clipmask_add;
Expand Down Expand Up @@ -951,22 +959,26 @@ static enum ParseState usbvision_parse_compress(struct usb_usbvision *usbvision,
*f++ = Y[Idx];
break;
case V4L2_PIX_FMT_RGB555:
*f++ = (0x1F & (bv >> 3)) | (0xE0 & (gv << 2));
*f++ = (0x03 & (gv >> 6)) | (0x7C & (rv >> 1));
*f++ = (0x1F & rv) |
(0xE0 & (gv << 5));
*f++ = (0x03 & (gv >> 3)) |
(0x7C & (bv << 2));
break;
case V4L2_PIX_FMT_RGB565:
*f++ = (0x1F & (bv >> 3)) | (0xE0 & (gv << 3));
*f++ = (0x07 & (gv >> 5)) | (0xF8 & rv);
*f++ = (0x1F & rv) |
(0xE0 & (gv << 5));
*f++ = (0x07 & (gv >> 3)) |
(0xF8 & bv);
break;
case V4L2_PIX_FMT_RGB24:
*f++ = bv;
*f++ = gv;
*f++ = rv;
*f++ = gv;
*f++ = bv;
break;
case V4L2_PIX_FMT_RGB32:
*f++ = bv;
*f++ = gv;
*f++ = rv;
*f++ = gv;
*f++ = bv;
f++;
break;
}
Expand Down Expand Up @@ -1080,28 +1092,33 @@ static enum ParseState usbvision_parse_lines_420(struct usb_usbvision *usbvision
r_ = (y_ + ur) >> 16;

switch (frame->v4l2_format.format) {
case V4L2_PIX_FMT_RGB565:
g = LIMIT_RGB(g_);
*f_even++ = (0x1F & (LIMIT_RGB(b_) >> 3)) | (0xE0 & (g << 3));
*f_even++ = (0x07 & ( g >> 5)) | (0xF8 & LIMIT_RGB(r_));
break;
case V4L2_PIX_FMT_RGB24:
*f_even++ = LIMIT_RGB(b_);
*f_even++ = LIMIT_RGB(g_);
*f_even++ = LIMIT_RGB(r_);
break;
case V4L2_PIX_FMT_RGB32:
*f_even++ = LIMIT_RGB(b_);
*f_even++ = LIMIT_RGB(g_);
*f_even++ = LIMIT_RGB(r_);
f_even++;
break;
case V4L2_PIX_FMT_RGB555:
g = LIMIT_RGB(g_);
*f_even++ = (0x1F & (LIMIT_RGB(b_) >> 3)) | (0xE0 & (g << 2));
*f_even++ = (0x03 & ( g >> 6)) |
(0x7C & (LIMIT_RGB(r_) >> 1));
break;
case V4L2_PIX_FMT_RGB565:
g = LIMIT_RGB(g_);
*f_even++ =
(0x1F & LIMIT_RGB(r_)) |
(0xE0 & (g << 5));
*f_even++ =
(0x07 & (g >> 3)) |
(0xF8 & LIMIT_RGB(b_));
break;
case V4L2_PIX_FMT_RGB24:
*f_even++ = LIMIT_RGB(r_);
*f_even++ = LIMIT_RGB(g_);
*f_even++ = LIMIT_RGB(b_);
break;
case V4L2_PIX_FMT_RGB32:
*f_even++ = LIMIT_RGB(r_);
*f_even++ = LIMIT_RGB(g_);
*f_even++ = LIMIT_RGB(b_);
f_even++;
break;
case V4L2_PIX_FMT_RGB555:
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;
Expand All @@ -1119,28 +1136,33 @@ static enum ParseState usbvision_parse_lines_420(struct usb_usbvision *usbvision
r_ = (y_ + ur) >> 16;

switch (frame->v4l2_format.format) {
case V4L2_PIX_FMT_RGB565:
g = LIMIT_RGB(g_);
*f_even++ = (0x1F & (LIMIT_RGB(b_) >> 3)) | (0xE0 & (g << 3));
*f_even++ = (0x07 & ( g >> 5)) | (0xF8 & LIMIT_RGB(r_));
break;
case V4L2_PIX_FMT_RGB24:
*f_even++ = LIMIT_RGB(b_);
*f_even++ = LIMIT_RGB(g_);
*f_even++ = LIMIT_RGB(r_);
break;
case V4L2_PIX_FMT_RGB32:
*f_even++ = LIMIT_RGB(b_);
*f_even++ = LIMIT_RGB(g_);
*f_even++ = LIMIT_RGB(r_);
f_even++;
break;
case V4L2_PIX_FMT_RGB555:
g = LIMIT_RGB(g_);
*f_even++ = (0x1F & (LIMIT_RGB(b_) >> 3)) | (0xE0 & (g << 2));
*f_even++ = (0x03 & ( g >> 6)) |
(0x7C & (LIMIT_RGB(r_) >> 1));
break;
case V4L2_PIX_FMT_RGB565:
g = LIMIT_RGB(g_);
*f_even++ =
(0x1F & LIMIT_RGB(r_)) |
(0xE0 & (g << 5));
*f_even++ =
(0x07 & (g >> 3)) |
(0xF8 & LIMIT_RGB(b_));
break;
case V4L2_PIX_FMT_RGB24:
*f_even++ = LIMIT_RGB(r_);
*f_even++ = LIMIT_RGB(g_);
*f_even++ = LIMIT_RGB(b_);
break;
case V4L2_PIX_FMT_RGB32:
*f_even++ = LIMIT_RGB(r_);
*f_even++ = LIMIT_RGB(g_);
*f_even++ = LIMIT_RGB(b_);
f_even++;
break;
case V4L2_PIX_FMT_RGB555:
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;
Expand All @@ -1160,28 +1182,33 @@ static enum ParseState usbvision_parse_lines_420(struct usb_usbvision *usbvision
r_ = (y_ + ur) >> 16;

switch (frame->v4l2_format.format) {
case V4L2_PIX_FMT_RGB565:
g = LIMIT_RGB(g_);
*f_odd++ = (0x1F & (LIMIT_RGB(b_) >> 3)) | (0xE0 & (g << 3));
*f_odd++ = (0x07 & ( g >> 5)) | (0xF8 & LIMIT_RGB(r_));
break;
case V4L2_PIX_FMT_RGB24:
*f_odd++ = LIMIT_RGB(b_);
*f_odd++ = LIMIT_RGB(g_);
*f_odd++ = LIMIT_RGB(r_);
break;
case V4L2_PIX_FMT_RGB32:
*f_odd++ = LIMIT_RGB(b_);
*f_odd++ = LIMIT_RGB(g_);
*f_odd++ = LIMIT_RGB(r_);
f_odd++;
break;
case V4L2_PIX_FMT_RGB555:
g = LIMIT_RGB(g_);
*f_odd++ = (0x1F & (LIMIT_RGB(b_) >> 3)) | (0xE0 & (g << 2));
*f_odd++ = (0x03 & ( g >> 6)) |
(0x7C & (LIMIT_RGB(r_) >> 1));
break;
case V4L2_PIX_FMT_RGB565:
g = LIMIT_RGB(g_);
*f_odd++ =
(0x1F & LIMIT_RGB(r_)) |
(0xE0 & (g << 5));
*f_odd++ =
(0x07 & (g >> 3)) |
(0xF8 & LIMIT_RGB(b_));
break;
case V4L2_PIX_FMT_RGB24:
*f_odd++ = LIMIT_RGB(r_);
*f_odd++ = LIMIT_RGB(g_);
*f_odd++ = LIMIT_RGB(b_);
break;
case V4L2_PIX_FMT_RGB32:
*f_odd++ = LIMIT_RGB(r_);
*f_odd++ = LIMIT_RGB(g_);
*f_odd++ = LIMIT_RGB(b_);
f_odd++;
break;
case V4L2_PIX_FMT_RGB555:
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;
Expand All @@ -1199,28 +1226,33 @@ static enum ParseState usbvision_parse_lines_420(struct usb_usbvision *usbvision
r_ = (y_ + ur) >> 16;

switch (frame->v4l2_format.format) {
case V4L2_PIX_FMT_RGB565:
g = LIMIT_RGB(g_);
*f_odd++ = (0x1F & (LIMIT_RGB(b_) >> 3)) | (0xE0 & (g << 3));
*f_odd++ = (0x07 & ( g >> 5)) | (0xF8 & LIMIT_RGB(r_));
break;
case V4L2_PIX_FMT_RGB24:
*f_odd++ = LIMIT_RGB(b_);
*f_odd++ = LIMIT_RGB(g_);
*f_odd++ = LIMIT_RGB(r_);
break;
case V4L2_PIX_FMT_RGB32:
*f_odd++ = LIMIT_RGB(b_);
*f_odd++ = LIMIT_RGB(g_);
*f_odd++ = LIMIT_RGB(r_);
f_odd++;
break;
case V4L2_PIX_FMT_RGB555:
g = LIMIT_RGB(g_);
*f_odd++ = (0x1F & (LIMIT_RGB(b_) >> 3)) | (0xE0 & (g << 2));
*f_odd++ = (0x03 & ( g >> 6)) |
(0x7C & (LIMIT_RGB(r_) >> 1));
break;
case V4L2_PIX_FMT_RGB565:
g = LIMIT_RGB(g_);
*f_odd++ =
(0x1F & LIMIT_RGB(r_)) |
(0xE0 & (g << 5));
*f_odd++ =
(0x07 & (g >> 3)) |
(0xF8 & LIMIT_RGB(b_));
break;
case V4L2_PIX_FMT_RGB24:
*f_odd++ = LIMIT_RGB(r_);
*f_odd++ = LIMIT_RGB(g_);
*f_odd++ = LIMIT_RGB(b_);
break;
case V4L2_PIX_FMT_RGB32:
*f_odd++ = LIMIT_RGB(r_);
*f_odd++ = LIMIT_RGB(g_);
*f_odd++ = LIMIT_RGB(b_);
f_odd++;
break;
case V4L2_PIX_FMT_RGB555:
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;
Expand Down

0 comments on commit 6200bba

Please sign in to comment.