25 #include <fvutils/color/yuv.h> 26 #include <fvutils/color/colorspaces.h> 35 iyu1_to_yuy2(
const unsigned char *src,
unsigned char *dest,
unsigned int width,
unsigned int height)
37 unsigned int i=0, j=0;
38 int y0, y1, y2, y3, u, v;
39 while (i < width * height * 3 / 2) {
64 gray8_to_yuy2(
const unsigned char *src,
unsigned char *dest,
unsigned int width,
unsigned int height)
66 unsigned int i=0, j=0;
67 while (i < width * height) {
79 gray8_to_yuv422planar_plainc(
const unsigned char *src,
unsigned char *dst,
80 unsigned int width,
unsigned int height)
83 memcpy(dst, src, width * height);
85 memset(YUV422_PLANAR_U_PLANE(dst, width, height), 128, width * height);
91 gray8_to_yuv422packed_plainc(
const unsigned char *src,
unsigned char *dst,
92 unsigned int width,
unsigned int height)
94 unsigned int i=0, j=0;
95 while (i < width * height) {
108 yuv422planar_copy_uv(
const unsigned char *src,
unsigned char *dst,
109 unsigned int width,
unsigned int height,
110 unsigned int x,
unsigned int y,
111 unsigned int copy_width,
unsigned int copy_height)
114 const unsigned char *sup = YUV422_PLANAR_U_PLANE(src, width, height) + (x / 2);
115 const unsigned char *svp = YUV422_PLANAR_V_PLANE(src, width, height) + (x / 2);
117 unsigned char *dup = YUV422_PLANAR_U_PLANE(dst, width, height) + (x / 2);
118 unsigned char *dvp = YUV422_PLANAR_V_PLANE(dst, width, height) + (x / 2);
123 unsigned const char *lsup = sup, *lsvp = svp, *ldup = dup, *ldvp = dvp;
125 for (h = 0; h < copy_height; ++h) {
126 for ( w = 0; w < copy_width; w += 2 ) {
141 yuv420planar_to_yuv422planar(
const unsigned char *src,
unsigned char *dst,
142 unsigned int width,
unsigned int height)
144 const unsigned char *sup = YUV420_PLANAR_U_PLANE(src, width, height);
145 const unsigned char *svp = YUV420_PLANAR_V_PLANE(src, width, height);
147 unsigned char *dup = YUV422_PLANAR_U_PLANE(dst, width, height);
148 unsigned char *dvp = YUV422_PLANAR_V_PLANE(dst, width, height);
153 memcpy(dst, src, width * height);
155 for (h = 0; h < height / 2; ++h) {
157 memcpy(dup, sup, width / 2);
159 memcpy(dup, sup, width / 2);
164 memcpy(dvp, svp, width / 2);
166 memcpy(dvp, svp, width / 2);
174 yuv422planar_to_yuv422packed(
const unsigned char *planar,
unsigned char *packed,
175 unsigned int width,
unsigned int height)
177 const unsigned char *y, *u, *v;
181 u = planar + (width * height);
182 v = u + (width * height / 2);
184 for (i = 0; i < (width * height / 2); ++i) {
193 yuv422planar_quarter_to_yuv422packed(
const unsigned char *planar,
unsigned char *packed,
194 const unsigned int width,
195 const unsigned int height)
197 volatile const unsigned char *y, *u, *v;
200 const unsigned int w_h_4 = (width * height) / 4;
201 const unsigned int w_h_8 = (width * height) / 8;
202 const unsigned int w_t_2 = width * 2;
203 const unsigned int w_b_2 = width / 2;
204 const unsigned int w_b_4 = width / 4;
207 for (h = 0; h < height / 2; ++h) {
208 y = planar + (h * w_b_2);
209 u = planar + w_h_4 + (h * w_b_4);
210 v = planar + w_h_4 + w_h_8 + (h * w_b_4);
212 for (w = 0; w < w_b_4; ++w) {
213 packed[h * w_t_2 + w * 4 ] = *u++;
214 packed[h * w_t_2 + w * 4 + 1] = *y++;
215 packed[h * w_t_2 + w * 4 + 2] = *v++;
216 packed[h * w_t_2 + w * 4 + 3] = *y++;
229 yuv422planar_quarter_to_yuv422planar(
const unsigned char *quarter,
230 unsigned char *planar,
231 const unsigned int width,
232 const unsigned int height)
234 volatile const unsigned char *y, *u, *v;
237 const unsigned int w_h_4 = (width * height) / 4;
238 const unsigned int w_h_8 = (width * height) / 8;
240 const unsigned int w_b_2 = width / 2;
241 const unsigned int w_b_4 = width / 4;
243 unsigned char *yp, *up, *vp, t;
245 up = YUV422_PLANAR_U_PLANE(planar, width, height);
246 vp = YUV422_PLANAR_V_PLANE(planar, width, height);
248 for (h = 0; h < height / 2; ++h) {
249 y = quarter + (h * w_b_2);
250 u = quarter + w_h_4 + (h * w_b_4);
251 v = quarter + w_h_4 + w_h_8 + (h * w_b_4);
253 for (w = 0; w < w_b_4; ++w) {
268 memcpy(yp, yp - width, width);
269 memcpy(up, up - w_b_2, w_b_2);
270 memcpy(vp, vp - w_b_2, w_b_2);
279 yuv422packed_to_yuv422planar(
const unsigned char *packed,
unsigned char *planar,
280 unsigned int width,
unsigned int height)
282 volatile unsigned char *y, *u, *v;
285 unsigned int wh = (width * height);
292 #pragma omp parallel for firstprivate(wh2) private(i, iy, iiy) shared(y, u, v, packed) schedule(static) 294 for (i = 0; i < wh2; ++i) {
298 y[iy] = packed[iiy + 1];
299 v[i] = packed[iiy + 2];
300 y[iy+1] = packed[iiy + 3];
306 yuy2_to_yuv422planar(
const unsigned char *packed,
unsigned char *planar,
307 unsigned int width,
unsigned int height)
309 volatile unsigned char *y, *u, *v;
312 unsigned int wh = (width * height);
319 #pragma omp parallel for firstprivate(wh2) private(i, iy, iiy) shared(y, u, v, packed) schedule(static) 321 for (i = 0; i < wh2; ++i) {
325 u[i] = packed[iiy + 1];
326 y[iy+1] = packed[iiy + 2];
327 v[i] = packed[iiy + 3];
333 yvy2_to_yuv422planar(
const unsigned char *packed,
unsigned char *planar,
334 unsigned int width,
unsigned int height)
336 volatile unsigned char *y, *u, *v;
339 unsigned int wh = (width * height);
346 #pragma omp parallel for firstprivate(wh2) private(i, iy, iiy) shared(y, u, v, packed) schedule(static) 348 for (i = 0; i < wh2; ++i) {
352 v[i] = packed[iiy + 1];
353 y[iy+1] = packed[iiy + 2];
354 u[i] = packed[iiy + 3];
360 yuy2_to_yuv422planar_quarter(
const unsigned char *packed,
unsigned char *planar,
361 const unsigned int width,
const unsigned int height)
363 volatile unsigned char *y, *u, *v;
366 unsigned int wh = (width * height);
368 u = planar + (wh / 4);
371 const unsigned int w_b_2 = width / 2;
372 const unsigned int w_b_4 = width / 4;
373 const unsigned int w_t_2 = width * 2;
374 unsigned int packpix;
376 for (h = 0; h < height / 2; ++h) {
377 for (w = 0; w < width; w += 4) {
378 packpix = (h * w_t_2 + w) * 2;
379 y[h * w_b_2 + w / 2 ] = (packed[packpix + 0] + packed[packpix + 2]) / 2;
380 u[h * w_b_4 + w / 4 ] = (packed[packpix + 1] + packed[packpix + 5]) / 2;
381 y[h * w_b_2 + w / 2 + 1] = (packed[packpix + 4] + packed[packpix + 6]) / 2;
382 v[h * w_b_4 + w / 4 ] = (packed[packpix + 3] + packed[packpix + 7]) / 2;
389 yuv444packed_to_yuv422planar(
const unsigned char *yuv444,
unsigned char *yuv422,
390 unsigned int width,
unsigned int height)
392 volatile unsigned char *y, *u, *v;
395 unsigned int wh = (width * height);
402 #pragma omp parallel for firstprivate(wh2) private(i, iy, iiy) shared(y, u, v, yuv444) schedule(static) 404 for (i = 0; i < wh2; ++i) {
408 y[iy+1] = yuv444[iiy + 3];
409 u[i] = (yuv444[iiy + 1] + yuv444[iiy + 4]) >> 1;
410 v[i] = (yuv444[iiy + 2] + yuv444[iiy + 5]) >> 1;
416 yuv444packed_to_yuv422packed(
const unsigned char *yvu444,
unsigned char *yuv422,
417 unsigned int width,
unsigned int height)
421 unsigned int wh = (width * height);
425 # pragma omp parallel for firstprivate(wh2) private(i, iiy) shared(yuv422, yvu444) schedule(static) 427 for (i = 0; i < wh2; i += 4) {
429 yuv422[i] = (yvu444[iiy + 1] + yvu444[iiy + 4]) >> 1;
430 yuv422[i+1] = yvu444[iiy];
431 yuv422[i+2] = (yvu444[iiy + 2] + yvu444[iiy + 5]) >> 1;
432 yuv422[i+3] = yvu444[iiy + 3];
438 yvu444packed_to_yuv422planar(
const unsigned char *yvu444,
unsigned char *yuv422,
439 unsigned int width,
unsigned int height)
441 volatile unsigned char *y, *u, *v;
444 unsigned int wh = (width * height);
451 # pragma omp parallel for firstprivate(wh2) private(i, iy, iiy) shared(y, u, v, yvu444) schedule(static) 453 for (i = 0; i < wh2; ++i) {
457 y[iy+1] = yvu444[iiy + 3];
458 u[i] = (yvu444[iiy + 2] + yvu444[iiy + 5]) >> 1;
459 v[i] = (yvu444[iiy + 1] + yvu444[iiy + 4]) >> 1;
465 yvu444packed_to_yuv422packed(
const unsigned char *yvu444,
unsigned char *yuv422,
466 unsigned int width,
unsigned int height)
470 unsigned int wh = (width * height);
474 # pragma omp parallel for firstprivate(wh2) private(i, iiy) shared(yuv422, yvu444) schedule(static) 476 for (i = 0; i < wh2; i += 4) {
478 yuv422[i] = (yvu444[iiy + 2] + yvu444[iiy + 5]) >> 1;
479 yuv422[i+1] = yvu444[iiy];
480 yuv422[i+2] = (yvu444[iiy + 1] + yvu444[iiy + 4]) >> 1;
481 yuv422[i+3] = yvu444[iiy + 3];
487 yuv422planar_erase_y_plane(
unsigned char *yuv,
unsigned int width,
unsigned int height)
489 memset(yuv, 128, (width * height));
494 yuv422planar_erase_u_plane(
unsigned char *yuv,
unsigned int width,
unsigned int height)
496 memset(yuv + (width * height), 128, (width * height / 2));
501 yuv422planar_erase_v_plane(
unsigned char *yuv,
unsigned int width,
unsigned int height)
503 memset(yuv + (width * height * 3/2), 128, (width * height / 2));
508 grayscale_yuv422packed(
const unsigned char *src,
unsigned char *dst,
509 unsigned int width,
unsigned int height)
513 while (p < colorspace_buffer_size(YUV422_PACKED, width, height)) {
514 if ( (p % 2) == 0 ) {
525 grayscale_yuv422planar(
const unsigned char *src,
unsigned char *dst,
526 unsigned int width,
unsigned int height)
528 memcpy(dst, src, width * height);
529 memset(dst + width * height, 128, width * height);