25 #include <fvutils/color/colorspaces.h> 26 #include <fvutils/color/yuv.h> 30 namespace firevision {
33 iyu1_to_yuy2(
const unsigned char *src,
unsigned char *dest,
unsigned int width,
unsigned int height)
35 unsigned int i = 0, j = 0;
36 int y0, y1, y2, y3, u, v;
37 while (i < width * height * 3 / 2) {
61 gray8_to_yuy2(
const unsigned char *src,
66 unsigned int i = 0, j = 0;
67 while (i < width * height) {
78 gray8_to_yuv422planar_plainc(
const unsigned char *src,
84 memcpy(dst, src, (
size_t)width * (
size_t)height);
86 memset(YUV422_PLANAR_U_PLANE(dst, width, height), 128, (
size_t)width * (
size_t)height);
92 gray8_to_yuv422packed_plainc(
const unsigned char *src,
97 unsigned int i = 0, j = 0;
98 while (i < width * height) {
109 yuv422planar_copy_uv(
const unsigned char *src,
115 unsigned int copy_width,
116 unsigned int copy_height)
118 const unsigned char *sup = YUV422_PLANAR_U_PLANE(src, width, height) + (x / 2);
119 const unsigned char *svp = YUV422_PLANAR_V_PLANE(src, width, height) + (x / 2);
121 unsigned char *dup = YUV422_PLANAR_U_PLANE(dst, width, height) + (x / 2);
122 unsigned char *dvp = YUV422_PLANAR_V_PLANE(dst, width, height) + (x / 2);
127 unsigned const char *lsup = sup, *lsvp = svp, *ldup = dup, *ldvp = dvp;
129 for (h = 0; h < copy_height; ++h) {
130 for (w = 0; w < copy_width; w += 2) {
144 yuv420planar_to_yuv422planar(
const unsigned char *src,
149 const unsigned char *sup = YUV420_PLANAR_U_PLANE(src, width, height);
150 const unsigned char *svp = YUV420_PLANAR_V_PLANE(src, width, height);
152 unsigned char *dup = YUV422_PLANAR_U_PLANE(dst, width, height);
153 unsigned char *dvp = YUV422_PLANAR_V_PLANE(dst, width, height);
158 memcpy(dst, src, (
size_t)width * (
size_t)height);
160 for (h = 0; h < height / 2; ++h) {
162 memcpy(dup, sup, width / 2);
164 memcpy(dup, sup, width / 2);
169 memcpy(dvp, svp, width / 2);
171 memcpy(dvp, svp, width / 2);
178 yuv422planar_to_yuv422packed(
const unsigned char *planar,
179 unsigned char * packed,
183 const unsigned char *y, *u, *v;
187 u = planar + (width * height);
188 v = u + (width * height / 2);
190 for (i = 0; i < (width * height / 2); ++i) {
199 yuv422planar_quarter_to_yuv422packed(
const unsigned char *planar,
200 unsigned char * packed,
201 const unsigned int width,
202 const unsigned int height)
204 volatile const unsigned char *y, *u, *v;
207 const unsigned int w_h_4 = (width * height) / 4;
208 const unsigned int w_h_8 = (width * height) / 8;
209 const unsigned int w_t_2 = width * 2;
210 const unsigned int w_b_2 = width / 2;
211 const unsigned int w_b_4 = width / 4;
213 for (h = 0; h < height / 2; ++h) {
214 y = planar + (h * w_b_2);
215 u = planar + w_h_4 + (h * w_b_4);
216 v = planar + w_h_4 + w_h_8 + (h * w_b_4);
218 for (w = 0; w < w_b_4; ++w) {
219 packed[h * w_t_2 + w * 4] = *u++;
220 packed[h * w_t_2 + w * 4 + 1] = *y++;
221 packed[h * w_t_2 + w * 4 + 2] = *v++;
222 packed[h * w_t_2 + w * 4 + 3] = *y++;
234 yuv422planar_quarter_to_yuv422planar(
const unsigned char *quarter,
235 unsigned char * planar,
236 const unsigned int width,
237 const unsigned int height)
239 volatile const unsigned char *y, *u, *v;
242 const unsigned int w_h_4 = (width * height) / 4;
243 const unsigned int w_h_8 = (width * height) / 8;
245 const unsigned int w_b_2 = width / 2;
246 const unsigned int w_b_4 = width / 4;
248 unsigned char *yp, *up, *vp, t;
250 up = YUV422_PLANAR_U_PLANE(planar, width, height);
251 vp = YUV422_PLANAR_V_PLANE(planar, width, height);
253 for (h = 0; h < height / 2; ++h) {
254 y = quarter + (h * w_b_2);
255 u = quarter + w_h_4 + (h * w_b_4);
256 v = quarter + w_h_4 + w_h_8 + (h * w_b_4);
258 for (w = 0; w < w_b_4; ++w) {
273 memcpy(yp, yp - width, width);
274 memcpy(up, up - w_b_2, w_b_2);
275 memcpy(vp, vp - w_b_2, w_b_2);
283 yuv422packed_to_yuv422planar(
const unsigned char *packed,
284 unsigned char * planar,
288 volatile unsigned char *y, *u, *v;
291 unsigned int wh = (width * height);
298 # pragma omp parallel for firstprivate(wh2) private(i, iy, iiy) shared(y, u, v, packed) \ 301 for (i = 0; i < wh2; ++i) {
305 y[iy] = packed[iiy + 1];
306 v[i] = packed[iiy + 2];
307 y[iy + 1] = packed[iiy + 3];
312 yuy2_to_yuv422planar(
const unsigned char *packed,
313 unsigned char * planar,
317 volatile unsigned char *y, *u, *v;
320 unsigned int wh = (width * height);
327 # pragma omp parallel for firstprivate(wh2) private(i, iy, iiy) shared(y, u, v, packed) \ 330 for (i = 0; i < wh2; ++i) {
334 u[i] = packed[iiy + 1];
335 y[iy + 1] = packed[iiy + 2];
336 v[i] = packed[iiy + 3];
341 yvy2_to_yuv422planar(
const unsigned char *packed,
342 unsigned char * planar,
346 volatile unsigned char *y, *u, *v;
349 unsigned int wh = (width * height);
356 # pragma omp parallel for firstprivate(wh2) private(i, iy, iiy) shared(y, u, v, packed) \ 359 for (i = 0; i < wh2; ++i) {
363 v[i] = packed[iiy + 1];
364 y[iy + 1] = packed[iiy + 2];
365 u[i] = packed[iiy + 3];
370 yuy2_to_yuv422planar_quarter(
const unsigned char *packed,
371 unsigned char * planar,
372 const unsigned int width,
373 const unsigned int height)
375 volatile unsigned char *y, *u, *v;
378 unsigned int wh = (width * height);
380 u = planar + (wh / 4);
383 const unsigned int w_b_2 = width / 2;
384 const unsigned int w_b_4 = width / 4;
385 const unsigned int w_t_2 = width * 2;
386 unsigned int packpix;
388 for (h = 0; h < height / 2; ++h) {
389 for (w = 0; w < width; w += 4) {
390 packpix = (h * w_t_2 + w) * 2;
391 y[h * w_b_2 + w / 2] = (packed[packpix + 0] + packed[packpix + 2]) / 2;
392 u[h * w_b_4 + w / 4] = (packed[packpix + 1] + packed[packpix + 5]) / 2;
393 y[h * w_b_2 + w / 2 + 1] = (packed[packpix + 4] + packed[packpix + 6]) / 2;
394 v[h * w_b_4 + w / 4] = (packed[packpix + 3] + packed[packpix + 7]) / 2;
400 yuv444packed_to_yuv422planar(
const unsigned char *yuv444,
401 unsigned char * yuv422,
405 volatile unsigned char *y, *u, *v;
408 unsigned int wh = (width * height);
415 # pragma omp parallel for firstprivate(wh2) private(i, iy, iiy) shared(y, u, v, yuv444) \ 418 for (i = 0; i < wh2; ++i) {
422 y[iy + 1] = yuv444[iiy + 3];
423 u[i] = (yuv444[iiy + 1] + yuv444[iiy + 4]) >> 1;
424 v[i] = (yuv444[iiy + 2] + yuv444[iiy + 5]) >> 1;
429 yuv444packed_to_yuv422packed(
const unsigned char *yvu444,
430 unsigned char * yuv422,
436 unsigned int wh = (width * height);
440 # pragma omp parallel for firstprivate(wh2) private(i, iiy) shared(yuv422, yvu444) schedule(static) 442 for (i = 0; i < wh2; i += 4) {
444 yuv422[i] = (yvu444[iiy + 1] + yvu444[iiy + 4]) >> 1;
445 yuv422[i + 1] = yvu444[iiy];
446 yuv422[i + 2] = (yvu444[iiy + 2] + yvu444[iiy + 5]) >> 1;
447 yuv422[i + 3] = yvu444[iiy + 3];
452 yvu444packed_to_yuv422planar(
const unsigned char *yvu444,
453 unsigned char * yuv422,
457 volatile unsigned char *y, *u, *v;
460 unsigned int wh = (width * height);
467 # pragma omp parallel for firstprivate(wh2) private(i, iy, iiy) shared(y, u, v, yvu444) \ 470 for (i = 0; i < wh2; ++i) {
474 y[iy + 1] = yvu444[iiy + 3];
475 u[i] = (yvu444[iiy + 2] + yvu444[iiy + 5]) >> 1;
476 v[i] = (yvu444[iiy + 1] + yvu444[iiy + 4]) >> 1;
481 yvu444packed_to_yuv422packed(
const unsigned char *yvu444,
482 unsigned char * yuv422,
488 unsigned int wh = (width * height);
492 # pragma omp parallel for firstprivate(wh2) private(i, iiy) shared(yuv422, yvu444) schedule(static) 494 for (i = 0; i < wh2; i += 4) {
496 yuv422[i] = (yvu444[iiy + 2] + yvu444[iiy + 5]) >> 1;
497 yuv422[i + 1] = yvu444[iiy];
498 yuv422[i + 2] = (yvu444[iiy + 1] + yvu444[iiy + 4]) >> 1;
499 yuv422[i + 3] = yvu444[iiy + 3];
504 yuv422planar_erase_y_plane(
unsigned char *yuv,
unsigned int width,
unsigned int height)
506 memset(yuv, 128, (width * height));
510 yuv422planar_erase_u_plane(
unsigned char *yuv,
unsigned int width,
unsigned int height)
512 memset(yuv + (width * height), 128, (width * height / 2));
516 yuv422planar_erase_v_plane(
unsigned char *yuv,
unsigned int width,
unsigned int height)
518 memset(yuv + (width * height * 3 / 2), 128, (width * height / 2));
522 grayscale_yuv422packed(
const unsigned char *src,
529 while (p < colorspace_buffer_size(YUV422_PACKED, width, height)) {
540 grayscale_yuv422planar(
const unsigned char *src,
545 memcpy(dst, src, (
size_t)width * (
size_t)height);
546 memset(dst + width * height, 128, (
size_t)width * (
size_t)height);