| Index: patched-ffmpeg-mt/libswscale/yuv2rgb.c
|
| ===================================================================
|
| --- patched-ffmpeg-mt/libswscale/yuv2rgb.c (revision 41250)
|
| +++ patched-ffmpeg-mt/libswscale/yuv2rgb.c (working copy)
|
| @@ -33,7 +33,9 @@
|
| #include "swscale.h"
|
| #include "swscale_internal.h"
|
| #include "libavutil/x86_cpu.h"
|
| +#include "libavutil/bswap.h"
|
|
|
| +extern const uint8_t dither_4x4_16[4][8];
|
| extern const uint8_t dither_8x8_32[8][8];
|
| extern const uint8_t dither_8x8_73[8][8];
|
| extern const uint8_t dither_8x8_220[8][8];
|
| @@ -49,6 +51,13 @@
|
| {117579, 136230, 16907, 35559} /* SMPTE 240M (1987) */
|
| };
|
|
|
| +const int *sws_getCoefficients(int colorspace)
|
| +{
|
| + if (colorspace > 7 || colorspace < 0)
|
| + colorspace = SWS_CS_DEFAULT;
|
| + return ff_yuv2rgb_coeffs[colorspace];
|
| +}
|
| +
|
| #define LOADCHROMA(i) \
|
| U = pu[i]; \
|
| V = pv[i]; \
|
| @@ -344,6 +353,32 @@
|
| #endif
|
|
|
| // r, g, b, dst_1, dst_2
|
| +YUV2RGBFUNC(yuv2rgb_c_12_ordered_dither, uint16_t, 0)
|
| + const uint8_t *d16 = dither_4x4_16[y&3];
|
| +#define PUTRGB12(dst,src,i,o) \
|
| + Y = src[2*i]; \
|
| + dst[2*i] = r[Y+d16[0+o]] + g[Y+d16[0+o]] + b[Y+d16[0+o]]; \
|
| + Y = src[2*i+1]; \
|
| + dst[2*i+1] = r[Y+d16[1+o]] + g[Y+d16[1+o]] + b[Y+d16[1+o]];
|
| +
|
| + LOADCHROMA(0);
|
| + PUTRGB12(dst_1,py_1,0,0);
|
| + PUTRGB12(dst_2,py_2,0,0+8);
|
| +
|
| + LOADCHROMA(1);
|
| + PUTRGB12(dst_2,py_2,1,2+8);
|
| + PUTRGB12(dst_1,py_1,1,2);
|
| +
|
| + LOADCHROMA(2);
|
| + PUTRGB12(dst_1,py_1,2,4);
|
| + PUTRGB12(dst_2,py_2,2,4+8);
|
| +
|
| + LOADCHROMA(3);
|
| + PUTRGB12(dst_2,py_2,3,6+8);
|
| + PUTRGB12(dst_1,py_1,3,6);
|
| +CLOSEYUV2RGBFUNC(8)
|
| +
|
| +// r, g, b, dst_1, dst_2
|
| YUV2RGBFUNC(yuv2rgb_c_8_ordered_dither, uint8_t, 0)
|
| const uint8_t *d32 = dither_8x8_32[y&7];
|
| const uint8_t *d64 = dither_8x8_73[y&7];
|
| @@ -545,6 +580,8 @@
|
| case PIX_FMT_BGR565:
|
| case PIX_FMT_RGB555:
|
| case PIX_FMT_BGR555: return yuv2rgb_c_16;
|
| + case PIX_FMT_RGB444:
|
| + case PIX_FMT_BGR444: return yuv2rgb_c_12_ordered_dither;
|
| case PIX_FMT_RGB8:
|
| case PIX_FMT_BGR8: return yuv2rgb_c_8_ordered_dither;
|
| case PIX_FMT_RGB4:
|
| @@ -589,12 +626,22 @@
|
| const int isRgb = c->dstFormat==PIX_FMT_RGB32
|
| || c->dstFormat==PIX_FMT_RGB32_1
|
| || c->dstFormat==PIX_FMT_BGR24
|
| - || c->dstFormat==PIX_FMT_RGB565
|
| - || c->dstFormat==PIX_FMT_RGB555
|
| + || c->dstFormat==PIX_FMT_RGB565BE
|
| + || c->dstFormat==PIX_FMT_RGB565LE
|
| + || c->dstFormat==PIX_FMT_RGB555BE
|
| + || c->dstFormat==PIX_FMT_RGB555LE
|
| + || c->dstFormat==PIX_FMT_RGB444BE
|
| + || c->dstFormat==PIX_FMT_RGB444LE
|
| || c->dstFormat==PIX_FMT_RGB8
|
| || c->dstFormat==PIX_FMT_RGB4
|
| || c->dstFormat==PIX_FMT_RGB4_BYTE
|
| || c->dstFormat==PIX_FMT_MONOBLACK;
|
| + const int isNotNe = c->dstFormat==PIX_FMT_NE(RGB565LE,RGB565BE)
|
| + || c->dstFormat==PIX_FMT_NE(RGB555LE,RGB555BE)
|
| + || c->dstFormat==PIX_FMT_NE(RGB444LE,RGB444BE)
|
| + || c->dstFormat==PIX_FMT_NE(BGR565LE,BGR565BE)
|
| + || c->dstFormat==PIX_FMT_NE(BGR555LE,BGR555BE)
|
| + || c->dstFormat==PIX_FMT_NE(BGR444LE,BGR444BE);
|
| const int bpp = c->dstFormatBpp;
|
| uint8_t *y_table;
|
| uint16_t *y_table16;
|
| @@ -687,6 +734,28 @@
|
| fill_table(c->table_bU, 1, cbu, y_table + yoffs + 2048);
|
| fill_gv_table(c->table_gV, 1, cgv);
|
| break;
|
| + case 12:
|
| + rbase = isRgb ? 8 : 0;
|
| + gbase = 4;
|
| + bbase = isRgb ? 0 : 8;
|
| + c->yuvTable = av_malloc(1024*3*2);
|
| + y_table16 = c->yuvTable;
|
| + yb = -(384<<16) - oy;
|
| + for (i = 0; i < 1024; i++) {
|
| + uint8_t yval = av_clip_uint8((yb + 0x8000) >> 16);
|
| + y_table16[i ] = (yval >> 4) << rbase;
|
| + y_table16[i+1024] = (yval >> 4) << gbase;
|
| + y_table16[i+2048] = (yval >> 4) << bbase;
|
| + yb += cy;
|
| + }
|
| + if (isNotNe)
|
| + for (i = 0; i < 1024*3; i++)
|
| + y_table16[i] = bswap_16(y_table16[i]);
|
| + fill_table(c->table_rV, 2, crv, y_table16 + yoffs);
|
| + fill_table(c->table_gU, 2, cgu, y_table16 + yoffs + 1024);
|
| + fill_table(c->table_bU, 2, cbu, y_table16 + yoffs + 2048);
|
| + fill_gv_table(c->table_gV, 2, cgv);
|
| + break;
|
| case 15:
|
| case 16:
|
| rbase = isRgb ? bpp - 5 : 0;
|
| @@ -702,6 +771,9 @@
|
| y_table16[i+2048] = (yval >> 3) << bbase;
|
| yb += cy;
|
| }
|
| + if(isNotNe)
|
| + for (i = 0; i < 1024*3; i++)
|
| + y_table16[i] = bswap_16(y_table16[i]);
|
| fill_table(c->table_rV, 2, crv, y_table16 + yoffs);
|
| fill_table(c->table_gU, 2, cgu, y_table16 + yoffs + 1024);
|
| fill_table(c->table_bU, 2, cbu, y_table16 + yoffs + 2048);
|
|
|