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

Unified 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 side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698