comparison imgconvert.c @ 583:d6955d0d7d27 libavcodec

Add conversions to and from RGBA32 and BGRA32.
author philipjsg
date Sat, 27 Jul 2002 03:08:04 +0000
parents 9aa5f0d0124e
children 918756bffda2
comparison
equal deleted inserted replaced
582:5132a4ee50cd 583:d6955d0d7d27
115 p += wrap3; 115 p += wrap3;
116 lum += wrap; 116 lum += wrap;
117 } 117 }
118 } 118 }
119 119
120 static void rgba32_to_yuv420p(UINT8 *lum, UINT8 *cb, UINT8 *cr,
121 UINT8 *src, int width, int height)
122 {
123 int wrap, wrap4, x, y;
124 int r, g, b, r1, g1, b1;
125 UINT8 *p;
126
127 wrap = width;
128 wrap4 = width * 4;
129 p = src;
130 for(y=0;y<height;y+=2) {
131 for(x=0;x<width;x+=2) {
132 r = p[0];
133 g = p[1];
134 b = p[2];
135 r1 = r;
136 g1 = g;
137 b1 = b;
138 lum[0] = (FIX(0.29900) * r + FIX(0.58700) * g +
139 FIX(0.11400) * b + ONE_HALF) >> SCALEBITS;
140 r = p[4];
141 g = p[5];
142 b = p[6];
143 r1 += r;
144 g1 += g;
145 b1 += b;
146 lum[1] = (FIX(0.29900) * r + FIX(0.58700) * g +
147 FIX(0.11400) * b + ONE_HALF) >> SCALEBITS;
148 p += wrap4;
149 lum += wrap;
150
151 r = p[0];
152 g = p[1];
153 b = p[2];
154 r1 += r;
155 g1 += g;
156 b1 += b;
157 lum[0] = (FIX(0.29900) * r + FIX(0.58700) * g +
158 FIX(0.11400) * b + ONE_HALF) >> SCALEBITS;
159 r = p[4];
160 g = p[5];
161 b = p[6];
162 r1 += r;
163 g1 += g;
164 b1 += b;
165 lum[1] = (FIX(0.29900) * r + FIX(0.58700) * g +
166 FIX(0.11400) * b + ONE_HALF) >> SCALEBITS;
167
168 cb[0] = ((- FIX(0.16874) * r1 - FIX(0.33126) * g1 +
169 FIX(0.50000) * b1 + 4 * ONE_HALF - 1) >> (SCALEBITS + 2)) + 128;
170 cr[0] = ((FIX(0.50000) * r1 - FIX(0.41869) * g1 -
171 FIX(0.08131) * b1 + 4 * ONE_HALF - 1) >> (SCALEBITS + 2)) + 128;
172
173 cb++;
174 cr++;
175 p += -wrap4 + 2 * 4;
176 lum += -wrap + 2;
177 }
178 p += wrap4;
179 lum += wrap;
180 }
181 }
182
120 static void bgr24_to_yuv420p(UINT8 *lum, UINT8 *cb, UINT8 *cr, 183 static void bgr24_to_yuv420p(UINT8 *lum, UINT8 *cb, UINT8 *cr,
121 UINT8 *src, int width, int height) 184 UINT8 *src, int width, int height)
122 { 185 {
123 int wrap, wrap3, x, y; 186 int wrap, wrap3, x, y;
124 int r, g, b, r1, g1, b1; 187 int r, g, b, r1, g1, b1;
178 p += wrap3; 241 p += wrap3;
179 lum += wrap; 242 lum += wrap;
180 } 243 }
181 } 244 }
182 245
246 static void bgra32_to_yuv420p(UINT8 *lum, UINT8 *cb, UINT8 *cr,
247 UINT8 *src, int width, int height)
248 {
249 int wrap, wrap4, x, y;
250 int r, g, b, r1, g1, b1;
251 UINT8 *p;
252
253 wrap = width;
254 wrap4 = width * 4;
255 p = src;
256 for(y=0;y<height;y+=2) {
257 for(x=0;x<width;x+=2) {
258 b = p[0];
259 g = p[1];
260 r = p[2];
261 r1 = r;
262 g1 = g;
263 b1 = b;
264 lum[0] = (FIX(0.29900) * r + FIX(0.58700) * g +
265 FIX(0.11400) * b + ONE_HALF) >> SCALEBITS;
266 b = p[4];
267 g = p[5];
268 r = p[6];
269 r1 += r;
270 g1 += g;
271 b1 += b;
272 lum[1] = (FIX(0.29900) * r + FIX(0.58700) * g +
273 FIX(0.11400) * b + ONE_HALF) >> SCALEBITS;
274 p += wrap4;
275 lum += wrap;
276
277 b = p[0];
278 g = p[1];
279 r = p[2];
280 r1 += r;
281 g1 += g;
282 b1 += b;
283 lum[0] = (FIX(0.29900) * r + FIX(0.58700) * g +
284 FIX(0.11400) * b + ONE_HALF) >> SCALEBITS;
285 b = p[4];
286 g = p[5];
287 r = p[6];
288 r1 += r;
289 g1 += g;
290 b1 += b;
291 lum[1] = (FIX(0.29900) * r + FIX(0.58700) * g +
292 FIX(0.11400) * b + ONE_HALF) >> SCALEBITS;
293
294 cb[0] = ((- FIX(0.16874) * r1 - FIX(0.33126) * g1 +
295 FIX(0.50000) * b1 + 4 * ONE_HALF - 1) >> (SCALEBITS + 2)) + 128;
296 cr[0] = ((FIX(0.50000) * r1 - FIX(0.41869) * g1 -
297 FIX(0.08131) * b1 + 4 * ONE_HALF - 1) >> (SCALEBITS + 2)) + 128;
298
299 cb++;
300 cr++;
301 p += -wrap4 + 2 * 4;
302 lum += -wrap + 2;
303 }
304 p += wrap4;
305 lum += wrap;
306 }
307 }
308
183 /* XXX: use generic filter ? */ 309 /* XXX: use generic filter ? */
184 /* 1x2 -> 1x1 */ 310 /* 1x2 -> 1x1 */
185 static void shrink2(UINT8 *dst, int dst_wrap, 311 static void shrink2(UINT8 *dst, int dst_wrap,
186 UINT8 *src, int src_wrap, 312 UINT8 *src, int src_wrap,
187 int width, int height) 313 int width, int height)
296 {\ 422 {\
297 y = (y1 - 16) * C_Y;\ 423 y = (y1 - 16) * C_Y;\
298 r = cm[(y + r_add) >> SCALE_BITS];\ 424 r = cm[(y + r_add) >> SCALE_BITS];\
299 g = cm[(y + g_add) >> SCALE_BITS];\ 425 g = cm[(y + g_add) >> SCALE_BITS];\
300 b = cm[(y + b_add) >> SCALE_BITS];\ 426 b = cm[(y + b_add) >> SCALE_BITS];\
427 }
428
429 /* XXX: no chroma interpolating is done */
430 static void yuv420p_to_bgra32(AVPicture *dst, AVPicture *src,
431 int width, int height)
432 {
433 UINT8 *y1_ptr, *y2_ptr, *cb_ptr, *cr_ptr, *d, *d1, *d2;
434 int w, y, cb, cr, r_add, g_add, b_add, width2;
435 UINT8 *cm = cropTbl + MAX_NEG_CROP;
436
437 d = dst->data[0];
438 y1_ptr = src->data[0];
439 cb_ptr = src->data[1];
440 cr_ptr = src->data[2];
441 width2 = width >> 1;
442 for(;height > 0; height -= 2) {
443 d1 = d;
444 d2 = d + dst->linesize[0];
445 y2_ptr = y1_ptr + src->linesize[0];
446 for(w = width2; w > 0; w --) {
447 cb = cb_ptr[0] - 128;
448 cr = cr_ptr[0] - 128;
449 r_add = C_RV * cr + (1 << (SCALE_BITS - 1));
450 g_add = - C_GU * cb - C_GV * cr + (1 << (SCALE_BITS - 1));
451 b_add = C_BU * cb + (1 << (SCALE_BITS - 1));
452
453 /* output 4 pixels */
454 RGBOUT(d1[2], d1[1], d1[0], y1_ptr[0]);
455 RGBOUT(d1[6], d1[5], d1[4], y1_ptr[1]);
456 RGBOUT(d2[2], d2[1], d2[0], y2_ptr[0]);
457 RGBOUT(d2[6], d2[5], d2[4], y2_ptr[1]);
458
459 d1[3] = d1[7] = d2[3] = d2[7] = 255;
460
461 d1 += 8;
462 d2 += 8;
463 y1_ptr += 2;
464 y2_ptr += 2;
465 cb_ptr++;
466 cr_ptr++;
467 }
468 d += 2 * dst->linesize[0];
469 y1_ptr += 2 * src->linesize[0] - width;
470 cb_ptr += src->linesize[1] - width2;
471 cr_ptr += src->linesize[2] - width2;
472 }
473 }
474
475 /* XXX: no chroma interpolating is done */
476 static void yuv420p_to_rgba32(AVPicture *dst, AVPicture *src,
477 int width, int height)
478 {
479 UINT8 *y1_ptr, *y2_ptr, *cb_ptr, *cr_ptr, *d, *d1, *d2;
480 int w, y, cb, cr, r_add, g_add, b_add, width2;
481 UINT8 *cm = cropTbl + MAX_NEG_CROP;
482
483 d = dst->data[0];
484 y1_ptr = src->data[0];
485 cb_ptr = src->data[1];
486 cr_ptr = src->data[2];
487 width2 = width >> 1;
488 for(;height > 0; height -= 2) {
489 d1 = d;
490 d2 = d + dst->linesize[0];
491 y2_ptr = y1_ptr + src->linesize[0];
492 for(w = width2; w > 0; w --) {
493 cb = cb_ptr[0] - 128;
494 cr = cr_ptr[0] - 128;
495 r_add = C_RV * cr + (1 << (SCALE_BITS - 1));
496 g_add = - C_GU * cb - C_GV * cr + (1 << (SCALE_BITS - 1));
497 b_add = C_BU * cb + (1 << (SCALE_BITS - 1));
498
499 /* output 4 pixels */
500 RGBOUT(d1[0], d1[1], d1[2], y1_ptr[0]);
501 RGBOUT(d1[4], d1[5], d1[6], y1_ptr[1]);
502 RGBOUT(d2[0], d2[1], d2[2], y2_ptr[0]);
503 RGBOUT(d2[4], d2[5], d2[6], y2_ptr[1]);
504
505 d1[3] = d1[7] = d2[3] = d2[7] = 255;
506
507 d1 += 8;
508 d2 += 8;
509 y1_ptr += 2;
510 y2_ptr += 2;
511 cb_ptr++;
512 cr_ptr++;
513 }
514 d += 2 * dst->linesize[0];
515 y1_ptr += 2 * src->linesize[0] - width;
516 cb_ptr += src->linesize[1] - width2;
517 cr_ptr += src->linesize[2] - width2;
518 }
301 } 519 }
302 520
303 /* XXX: no chroma interpolating is done */ 521 /* XXX: no chroma interpolating is done */
304 static void yuv420p_to_rgb24(AVPicture *dst, AVPicture *src, 522 static void yuv420p_to_rgb24(AVPicture *dst, AVPicture *src,
305 int width, int height) 523 int width, int height)
458 break; 676 break;
459 case PIX_FMT_RGB24: 677 case PIX_FMT_RGB24:
460 rgb24_to_yuv420p(dst->data[0], dst->data[1], dst->data[2], 678 rgb24_to_yuv420p(dst->data[0], dst->data[1], dst->data[2],
461 src->data[0], width, height); 679 src->data[0], width, height);
462 break; 680 break;
681 case PIX_FMT_RGBA32:
682 rgba32_to_yuv420p(dst->data[0], dst->data[1], dst->data[2],
683 src->data[0], width, height);
684 break;
463 case PIX_FMT_BGR24: 685 case PIX_FMT_BGR24:
464 bgr24_to_yuv420p(dst->data[0], dst->data[1], dst->data[2], 686 bgr24_to_yuv420p(dst->data[0], dst->data[1], dst->data[2],
687 src->data[0], width, height);
688 break;
689 case PIX_FMT_BGRA32:
690 bgra32_to_yuv420p(dst->data[0], dst->data[1], dst->data[2],
465 src->data[0], width, height); 691 src->data[0], width, height);
466 break; 692 break;
467 default: 693 default:
468 return -1; 694 return -1;
469 } 695 }
472 case PIX_FMT_YUV420P: 698 case PIX_FMT_YUV420P:
473 yuv420p_to_rgb24(dst, src, width, height); 699 yuv420p_to_rgb24(dst, src, width, height);
474 break; 700 break;
475 case PIX_FMT_YUV422P: 701 case PIX_FMT_YUV422P:
476 yuv422p_to_rgb24(dst, src, width, height); 702 yuv422p_to_rgb24(dst, src, width, height);
703 break;
704 default:
705 return -1;
706 }
707 } else if (dst_pix_fmt == PIX_FMT_RGBA32) {
708 switch(pix_fmt) {
709 case PIX_FMT_YUV420P:
710 yuv420p_to_rgba32(dst, src, width, height);
711 break;
712 default:
713 return -1;
714 }
715 } else if (dst_pix_fmt == PIX_FMT_BGRA32) {
716 switch(pix_fmt) {
717 case PIX_FMT_YUV420P:
718 yuv420p_to_bgra32(dst, src, width, height);
477 break; 719 break;
478 default: 720 default:
479 return -1; 721 return -1;
480 } 722 }
481 } else { 723 } else {