25 #include <fvutils/color/colorspaces.h>
26 #include <fvutils/color/rgb.h>
27 #include <fvutils/color/rgbyuv.h>
28 #include <fvutils/color/yuv.h>
32 namespace firevision {
35 rgb_to_yuy2(
const unsigned char *RGB,
unsigned char *YUV,
unsigned int width,
unsigned int height)
38 int y0, y1, u0, u1, v0, v1;
41 for (i = 0, j = 0; i < 3 * width * height; i += 6, j += 4) {
45 RGB2YUV(r, g, b, y0, u0, v0);
49 RGB2YUV(r, g, b, y1, u1, v1);
51 YUV[j + 1] = (u0 + u1) / 2;
53 YUV[j + 3] = (v0 + v1) / 2;
74 rgb_to_yuv411packed_plainc(
const unsigned char *RGB,
79 unsigned int i = 0, j = 0;
80 int y[4] = {0, 0, 0, 0}, u, v;
85 while (i < (width * height)) {
87 for (
unsigned int k = 0; j <= 4; ++j) {
88 RGB2YUV(r->R, r->G, r->B, y[k], u, v);
114 convert_line_rgb_to_yuv422planar(
const unsigned char *RGB,
118 unsigned int rgb_line,
119 unsigned int yuv_line)
122 int y1, y2, u1, u2, v1, v2;
124 unsigned char *yp, *up, *vp;
126 yp = YUV + (width * yuv_line);
127 up = YUV422_PLANAR_U_PLANE(YUV, width, height) + (width * yuv_line / 2);
128 vp = YUV422_PLANAR_V_PLANE(YUV, width, height) + (width * yuv_line / 2);
130 RGB += 3 * width * rgb_line;
138 RGB2YUV(r1->R, r1->G, r1->B, y1, u1, v1);
139 RGB2YUV(r2->R, r2->G, r2->B, y2, u2, v2);
143 *up++ = (u1 + u2) / 2;
144 *vp++ = (v1 + v2) / 2;
160 rgb_to_yuv422planar_plainc(
const unsigned char *RGB,
166 int y1, y2, u1, u2, v1, v2;
168 unsigned char *yp, *up, *vp;
171 up = YUV422_PLANAR_U_PLANE(YUV, width, height);
172 vp = YUV422_PLANAR_V_PLANE(YUV, width, height);
174 while (i < (width * height)) {
180 RGB2YUV(r1->R, r1->G, r1->B, y1, u1, v1);
181 RGB2YUV(r2->R, r2->G, r2->B, y2, u2, v2);
185 *up++ = (u1 + u2) / 2;
186 *vp++ = (v1 + v2) / 2;
204 convert_line_rgb_to_yuv422packed(
const unsigned char *RGB,
208 unsigned int rgb_line,
209 unsigned int yuv_line)
212 int y1, y2, u1, u2, v1, v2;
216 p = YUV + (width * yuv_line) * 2;
218 RGB += 3 * width * rgb_line;
226 RGB2YUV(r1->R, r1->G, r1->B, y1, u1, v1);
227 RGB2YUV(r2->R, r2->G, r2->B, y2, u2, v2);
229 *p++ = (u1 + u2) / 2;
231 *p++ = (v1 + v2) / 2;
248 rgb_to_yuv422packed_plainc(
const unsigned char *RGB,
254 int y1, y2, u1, u2, v1, v2;
260 while (i < (width * height)) {
266 RGB2YUV(r1->R, r1->G, r1->B, y1, u1, v1);
267 RGB2YUV(r2->R, r2->G, r2->B, y2, u2, v2);
269 *p++ = (u1 + u2) / 2;
271 *p++ = (v1 + v2) / 2;
279 rgb_planar_to_yuv422packed_plainc(
const unsigned char *rgb_planar,
284 const unsigned char *r = rgb_planar;
285 const unsigned char *g = rgb_planar + (width * height);
286 const unsigned char *b = rgb_planar + (width * height * 2);
289 int y1, y2, u1, u2, v1, v2;
291 unsigned char r1, r2, g1, g2, b1, b2;
295 while (i < (width * height)) {
302 RGB2YUV(r1, g1, b1, y1, u1, v1);
303 RGB2YUV(r2, g2, b2, y2, u2, v2);
305 *p++ = (u1 + u2) / 2;
307 *p++ = (v1 + v2) / 2;
324 bgr_to_yuv422planar_plainc(
const unsigned char *BGR,
330 int y1, y2, u1, u2, v1, v2;
332 unsigned char *yp, *up, *vp;
335 up = YUV422_PLANAR_U_PLANE(YUV, width, height);
336 vp = YUV422_PLANAR_V_PLANE(YUV, width, height);
338 while (i < (width * height)) {
344 RGB2YUV(r1->R, r1->G, r1->B, y1, u1, v1);
345 RGB2YUV(r2->R, r2->G, r2->B, y2, u2, v2);
349 *up++ = (u1 + u2) / 2;
350 *vp++ = (v1 + v2) / 2;