Mercurial > libavcodec.hg
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 { |