Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(202)

Side by Side Diff: patched-ffmpeg-mt/libswscale/yuv2rgb.c

Issue 789004: ffmpeg roll of source to mar 9 version... (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/ffmpeg/
Patch Set: '' Created 10 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * software YUV to RGB converter 2 * software YUV to RGB converter
3 * 3 *
4 * Copyright (C) 2009 Konstantin Shishkov 4 * Copyright (C) 2009 Konstantin Shishkov
5 * 5 *
6 * 1,4,8bpp support and context / deglobalize stuff 6 * 1,4,8bpp support and context / deglobalize stuff
7 * by Michael Niedermayer (michaelni@gmx.at) 7 * by Michael Niedermayer (michaelni@gmx.at)
8 * 8 *
9 * This file is part of FFmpeg. 9 * This file is part of FFmpeg.
10 * 10 *
(...skipping 15 matching lines...) Expand all
26 #include <stdio.h> 26 #include <stdio.h>
27 #include <stdlib.h> 27 #include <stdlib.h>
28 #include <inttypes.h> 28 #include <inttypes.h>
29 #include <assert.h> 29 #include <assert.h>
30 30
31 #include "config.h" 31 #include "config.h"
32 #include "rgb2rgb.h" 32 #include "rgb2rgb.h"
33 #include "swscale.h" 33 #include "swscale.h"
34 #include "swscale_internal.h" 34 #include "swscale_internal.h"
35 #include "libavutil/x86_cpu.h" 35 #include "libavutil/x86_cpu.h"
36 #include "libavutil/bswap.h"
36 37
38 extern const uint8_t dither_4x4_16[4][8];
37 extern const uint8_t dither_8x8_32[8][8]; 39 extern const uint8_t dither_8x8_32[8][8];
38 extern const uint8_t dither_8x8_73[8][8]; 40 extern const uint8_t dither_8x8_73[8][8];
39 extern const uint8_t dither_8x8_220[8][8]; 41 extern const uint8_t dither_8x8_220[8][8];
40 42
41 const int32_t ff_yuv2rgb_coeffs[8][4] = { 43 const int32_t ff_yuv2rgb_coeffs[8][4] = {
42 {117504, 138453, 13954, 34903}, /* no sequence_display_extension */ 44 {117504, 138453, 13954, 34903}, /* no sequence_display_extension */
43 {117504, 138453, 13954, 34903}, /* ITU-R Rec. 709 (1990) */ 45 {117504, 138453, 13954, 34903}, /* ITU-R Rec. 709 (1990) */
44 {104597, 132201, 25675, 53279}, /* unspecified */ 46 {104597, 132201, 25675, 53279}, /* unspecified */
45 {104597, 132201, 25675, 53279}, /* reserved */ 47 {104597, 132201, 25675, 53279}, /* reserved */
46 {104448, 132798, 24759, 53109}, /* FCC */ 48 {104448, 132798, 24759, 53109}, /* FCC */
47 {104597, 132201, 25675, 53279}, /* ITU-R Rec. 624-4 System B, G */ 49 {104597, 132201, 25675, 53279}, /* ITU-R Rec. 624-4 System B, G */
48 {104597, 132201, 25675, 53279}, /* SMPTE 170M */ 50 {104597, 132201, 25675, 53279}, /* SMPTE 170M */
49 {117579, 136230, 16907, 35559} /* SMPTE 240M (1987) */ 51 {117579, 136230, 16907, 35559} /* SMPTE 240M (1987) */
50 }; 52 };
51 53
54 const int *sws_getCoefficients(int colorspace)
55 {
56 if (colorspace > 7 || colorspace < 0)
57 colorspace = SWS_CS_DEFAULT;
58 return ff_yuv2rgb_coeffs[colorspace];
59 }
60
52 #define LOADCHROMA(i) \ 61 #define LOADCHROMA(i) \
53 U = pu[i]; \ 62 U = pu[i]; \
54 V = pv[i]; \ 63 V = pv[i]; \
55 r = (void *)c->table_rV[V]; \ 64 r = (void *)c->table_rV[V]; \
56 g = (void *)(c->table_gU[U] + c->table_gV[V]); \ 65 g = (void *)(c->table_gU[U] + c->table_gV[V]); \
57 b = (void *)c->table_bU[U]; 66 b = (void *)c->table_bU[U];
58 67
59 #define PUTRGB(dst,src,i) \ 68 #define PUTRGB(dst,src,i) \
60 Y = src[2*i]; \ 69 Y = src[2*i]; \
61 dst[2*i ] = r[Y] + g[Y] + b[Y]; \ 70 dst[2*i ] = r[Y] + g[Y] + b[Y]; \
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 PUTRGB(dst_1,py_1,2); 346 PUTRGB(dst_1,py_1,2);
338 PUTRGB(dst_2,py_2,2); 347 PUTRGB(dst_2,py_2,2);
339 348
340 LOADCHROMA(3); 349 LOADCHROMA(3);
341 PUTRGB(dst_2,py_2,3); 350 PUTRGB(dst_2,py_2,3);
342 PUTRGB(dst_1,py_1,3); 351 PUTRGB(dst_1,py_1,3);
343 CLOSEYUV2RGBFUNC(8) 352 CLOSEYUV2RGBFUNC(8)
344 #endif 353 #endif
345 354
346 // r, g, b, dst_1, dst_2 355 // r, g, b, dst_1, dst_2
356 YUV2RGBFUNC(yuv2rgb_c_12_ordered_dither, uint16_t, 0)
357 const uint8_t *d16 = dither_4x4_16[y&3];
358 #define PUTRGB12(dst,src,i,o) \
359 Y = src[2*i]; \
360 dst[2*i] = r[Y+d16[0+o]] + g[Y+d16[0+o]] + b[Y+d16[0+o]]; \
361 Y = src[2*i+1]; \
362 dst[2*i+1] = r[Y+d16[1+o]] + g[Y+d16[1+o]] + b[Y+d16[1+o]];
363
364 LOADCHROMA(0);
365 PUTRGB12(dst_1,py_1,0,0);
366 PUTRGB12(dst_2,py_2,0,0+8);
367
368 LOADCHROMA(1);
369 PUTRGB12(dst_2,py_2,1,2+8);
370 PUTRGB12(dst_1,py_1,1,2);
371
372 LOADCHROMA(2);
373 PUTRGB12(dst_1,py_1,2,4);
374 PUTRGB12(dst_2,py_2,2,4+8);
375
376 LOADCHROMA(3);
377 PUTRGB12(dst_2,py_2,3,6+8);
378 PUTRGB12(dst_1,py_1,3,6);
379 CLOSEYUV2RGBFUNC(8)
380
381 // r, g, b, dst_1, dst_2
347 YUV2RGBFUNC(yuv2rgb_c_8_ordered_dither, uint8_t, 0) 382 YUV2RGBFUNC(yuv2rgb_c_8_ordered_dither, uint8_t, 0)
348 const uint8_t *d32 = dither_8x8_32[y&7]; 383 const uint8_t *d32 = dither_8x8_32[y&7];
349 const uint8_t *d64 = dither_8x8_73[y&7]; 384 const uint8_t *d64 = dither_8x8_73[y&7];
350 #define PUTRGB8(dst,src,i,o) \ 385 #define PUTRGB8(dst,src,i,o) \
351 Y = src[2*i]; \ 386 Y = src[2*i]; \
352 dst[2*i] = r[Y+d32[0+o]] + g[Y+d32[0+o]] + b[Y+d64[0+o]]; \ 387 dst[2*i] = r[Y+d32[0+o]] + g[Y+d32[0+o]] + b[Y+d64[0+o]]; \
353 Y = src[2*i+1]; \ 388 Y = src[2*i+1]; \
354 dst[2*i+1] = r[Y+d32[1+o]] + g[Y+d32[1+o]] + b[Y+d64[1+o]]; 389 dst[2*i+1] = r[Y+d32[1+o]] + g[Y+d32[1+o]] + b[Y+d64[1+o]];
355 390
356 LOADCHROMA(0); 391 LOADCHROMA(0);
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 case PIX_FMT_ARGB: 573 case PIX_FMT_ARGB:
539 case PIX_FMT_ABGR: if (CONFIG_SWSCALE_ALPHA && c->srcFormat == PIX_FMT _YUVA420P) return yuva2argb_c; 574 case PIX_FMT_ABGR: if (CONFIG_SWSCALE_ALPHA && c->srcFormat == PIX_FMT _YUVA420P) return yuva2argb_c;
540 case PIX_FMT_RGBA: 575 case PIX_FMT_RGBA:
541 case PIX_FMT_BGRA: return (CONFIG_SWSCALE_ALPHA && c->srcFormat == PIX _FMT_YUVA420P) ? yuva2rgba_c : yuv2rgb_c_32; 576 case PIX_FMT_BGRA: return (CONFIG_SWSCALE_ALPHA && c->srcFormat == PIX _FMT_YUVA420P) ? yuva2rgba_c : yuv2rgb_c_32;
542 case PIX_FMT_RGB24: return yuv2rgb_c_24_rgb; 577 case PIX_FMT_RGB24: return yuv2rgb_c_24_rgb;
543 case PIX_FMT_BGR24: return yuv2rgb_c_24_bgr; 578 case PIX_FMT_BGR24: return yuv2rgb_c_24_bgr;
544 case PIX_FMT_RGB565: 579 case PIX_FMT_RGB565:
545 case PIX_FMT_BGR565: 580 case PIX_FMT_BGR565:
546 case PIX_FMT_RGB555: 581 case PIX_FMT_RGB555:
547 case PIX_FMT_BGR555: return yuv2rgb_c_16; 582 case PIX_FMT_BGR555: return yuv2rgb_c_16;
583 case PIX_FMT_RGB444:
584 case PIX_FMT_BGR444: return yuv2rgb_c_12_ordered_dither;
548 case PIX_FMT_RGB8: 585 case PIX_FMT_RGB8:
549 case PIX_FMT_BGR8: return yuv2rgb_c_8_ordered_dither; 586 case PIX_FMT_BGR8: return yuv2rgb_c_8_ordered_dither;
550 case PIX_FMT_RGB4: 587 case PIX_FMT_RGB4:
551 case PIX_FMT_BGR4: return yuv2rgb_c_4_ordered_dither; 588 case PIX_FMT_BGR4: return yuv2rgb_c_4_ordered_dither;
552 case PIX_FMT_RGB4_BYTE: 589 case PIX_FMT_RGB4_BYTE:
553 case PIX_FMT_BGR4_BYTE: return yuv2rgb_c_4b_ordered_dither; 590 case PIX_FMT_BGR4_BYTE: return yuv2rgb_c_4b_ordered_dither;
554 case PIX_FMT_MONOBLACK: return yuv2rgb_c_1_ordered_dither; 591 case PIX_FMT_MONOBLACK: return yuv2rgb_c_1_ordered_dither;
555 default: 592 default:
556 assert(0); 593 assert(0);
557 } 594 }
(...skipping 24 matching lines...) Expand all
582 cb += inc; 619 cb += inc;
583 } 620 }
584 } 621 }
585 622
586 av_cold int ff_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4], int fullRange, 623 av_cold int ff_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4], int fullRange,
587 int brightness, int contrast, int saturatio n) 624 int brightness, int contrast, int saturatio n)
588 { 625 {
589 const int isRgb = c->dstFormat==PIX_FMT_RGB32 626 const int isRgb = c->dstFormat==PIX_FMT_RGB32
590 || c->dstFormat==PIX_FMT_RGB32_1 627 || c->dstFormat==PIX_FMT_RGB32_1
591 || c->dstFormat==PIX_FMT_BGR24 628 || c->dstFormat==PIX_FMT_BGR24
592 || c->dstFormat==PIX_FMT_RGB565 629 || c->dstFormat==PIX_FMT_RGB565BE
593 || c->dstFormat==PIX_FMT_RGB555 630 || c->dstFormat==PIX_FMT_RGB565LE
631 || c->dstFormat==PIX_FMT_RGB555BE
632 || c->dstFormat==PIX_FMT_RGB555LE
633 || c->dstFormat==PIX_FMT_RGB444BE
634 || c->dstFormat==PIX_FMT_RGB444LE
594 || c->dstFormat==PIX_FMT_RGB8 635 || c->dstFormat==PIX_FMT_RGB8
595 || c->dstFormat==PIX_FMT_RGB4 636 || c->dstFormat==PIX_FMT_RGB4
596 || c->dstFormat==PIX_FMT_RGB4_BYTE 637 || c->dstFormat==PIX_FMT_RGB4_BYTE
597 || c->dstFormat==PIX_FMT_MONOBLACK; 638 || c->dstFormat==PIX_FMT_MONOBLACK;
639 const int isNotNe = c->dstFormat==PIX_FMT_NE(RGB565LE,RGB565BE)
640 || c->dstFormat==PIX_FMT_NE(RGB555LE,RGB555BE)
641 || c->dstFormat==PIX_FMT_NE(RGB444LE,RGB444BE)
642 || c->dstFormat==PIX_FMT_NE(BGR565LE,BGR565BE)
643 || c->dstFormat==PIX_FMT_NE(BGR555LE,BGR555BE)
644 || c->dstFormat==PIX_FMT_NE(BGR444LE,BGR444BE);
598 const int bpp = c->dstFormatBpp; 645 const int bpp = c->dstFormatBpp;
599 uint8_t *y_table; 646 uint8_t *y_table;
600 uint16_t *y_table16; 647 uint16_t *y_table16;
601 uint32_t *y_table32; 648 uint32_t *y_table32;
602 int i, base, rbase, gbase, bbase, abase, needAlpha; 649 int i, base, rbase, gbase, bbase, abase, needAlpha;
603 const int yoffs = fullRange ? 384 : 326; 650 const int yoffs = fullRange ? 384 : 326;
604 651
605 int64_t crv = inv_table[0]; 652 int64_t crv = inv_table[0];
606 int64_t cbu = inv_table[1]; 653 int64_t cbu = inv_table[1];
607 int64_t cgu = -inv_table[2]; 654 int64_t cgu = -inv_table[2];
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
680 y_table[i+16 ] = ((yval + 18) / 36) << rbase; 727 y_table[i+16 ] = ((yval + 18) / 36) << rbase;
681 y_table[i+16+1024] = ((yval + 18) / 36) << gbase; 728 y_table[i+16+1024] = ((yval + 18) / 36) << gbase;
682 y_table[i+37+2048] = ((yval + 43) / 85) << bbase; 729 y_table[i+37+2048] = ((yval + 43) / 85) << bbase;
683 yb += cy; 730 yb += cy;
684 } 731 }
685 fill_table(c->table_rV, 1, crv, y_table + yoffs); 732 fill_table(c->table_rV, 1, crv, y_table + yoffs);
686 fill_table(c->table_gU, 1, cgu, y_table + yoffs + 1024); 733 fill_table(c->table_gU, 1, cgu, y_table + yoffs + 1024);
687 fill_table(c->table_bU, 1, cbu, y_table + yoffs + 2048); 734 fill_table(c->table_bU, 1, cbu, y_table + yoffs + 2048);
688 fill_gv_table(c->table_gV, 1, cgv); 735 fill_gv_table(c->table_gV, 1, cgv);
689 break; 736 break;
737 case 12:
738 rbase = isRgb ? 8 : 0;
739 gbase = 4;
740 bbase = isRgb ? 0 : 8;
741 c->yuvTable = av_malloc(1024*3*2);
742 y_table16 = c->yuvTable;
743 yb = -(384<<16) - oy;
744 for (i = 0; i < 1024; i++) {
745 uint8_t yval = av_clip_uint8((yb + 0x8000) >> 16);
746 y_table16[i ] = (yval >> 4) << rbase;
747 y_table16[i+1024] = (yval >> 4) << gbase;
748 y_table16[i+2048] = (yval >> 4) << bbase;
749 yb += cy;
750 }
751 if (isNotNe)
752 for (i = 0; i < 1024*3; i++)
753 y_table16[i] = bswap_16(y_table16[i]);
754 fill_table(c->table_rV, 2, crv, y_table16 + yoffs);
755 fill_table(c->table_gU, 2, cgu, y_table16 + yoffs + 1024);
756 fill_table(c->table_bU, 2, cbu, y_table16 + yoffs + 2048);
757 fill_gv_table(c->table_gV, 2, cgv);
758 break;
690 case 15: 759 case 15:
691 case 16: 760 case 16:
692 rbase = isRgb ? bpp - 5 : 0; 761 rbase = isRgb ? bpp - 5 : 0;
693 gbase = 5; 762 gbase = 5;
694 bbase = isRgb ? 0 : (bpp - 5); 763 bbase = isRgb ? 0 : (bpp - 5);
695 c->yuvTable = av_malloc(1024*3*2); 764 c->yuvTable = av_malloc(1024*3*2);
696 y_table16 = c->yuvTable; 765 y_table16 = c->yuvTable;
697 yb = -(384<<16) - oy; 766 yb = -(384<<16) - oy;
698 for (i = 0; i < 1024; i++) { 767 for (i = 0; i < 1024; i++) {
699 uint8_t yval = av_clip_uint8((yb + 0x8000) >> 16); 768 uint8_t yval = av_clip_uint8((yb + 0x8000) >> 16);
700 y_table16[i ] = (yval >> 3) << rbase; 769 y_table16[i ] = (yval >> 3) << rbase;
701 y_table16[i+1024] = (yval >> (18 - bpp)) << gbase; 770 y_table16[i+1024] = (yval >> (18 - bpp)) << gbase;
702 y_table16[i+2048] = (yval >> 3) << bbase; 771 y_table16[i+2048] = (yval >> 3) << bbase;
703 yb += cy; 772 yb += cy;
704 } 773 }
774 if(isNotNe)
775 for (i = 0; i < 1024*3; i++)
776 y_table16[i] = bswap_16(y_table16[i]);
705 fill_table(c->table_rV, 2, crv, y_table16 + yoffs); 777 fill_table(c->table_rV, 2, crv, y_table16 + yoffs);
706 fill_table(c->table_gU, 2, cgu, y_table16 + yoffs + 1024); 778 fill_table(c->table_gU, 2, cgu, y_table16 + yoffs + 1024);
707 fill_table(c->table_bU, 2, cbu, y_table16 + yoffs + 2048); 779 fill_table(c->table_bU, 2, cbu, y_table16 + yoffs + 2048);
708 fill_gv_table(c->table_gV, 2, cgv); 780 fill_gv_table(c->table_gV, 2, cgv);
709 break; 781 break;
710 case 24: 782 case 24:
711 case 48: 783 case 48:
712 c->yuvTable = av_malloc(1024); 784 c->yuvTable = av_malloc(1024);
713 y_table = c->yuvTable; 785 y_table = c->yuvTable;
714 yb = -(384<<16) - oy; 786 yb = -(384<<16) - oy;
(...skipping 29 matching lines...) Expand all
744 fill_table(c->table_bU, 4, cbu, y_table32 + yoffs + 2048); 816 fill_table(c->table_bU, 4, cbu, y_table32 + yoffs + 2048);
745 fill_gv_table(c->table_gV, 4, cgv); 817 fill_gv_table(c->table_gV, 4, cgv);
746 break; 818 break;
747 default: 819 default:
748 c->yuvTable = NULL; 820 c->yuvTable = NULL;
749 av_log(c, AV_LOG_ERROR, "%ibpp not supported by yuv2rgb\n", bpp); 821 av_log(c, AV_LOG_ERROR, "%ibpp not supported by yuv2rgb\n", bpp);
750 return -1; 822 return -1;
751 } 823 }
752 return 0; 824 return 0;
753 } 825 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698