mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-15 03:34:56 +00:00
swscale: split yuv2packed[12X]_c() remainders into small functions.
This is part of the Great Evil Plan to simplify swscale.
This commit is contained in:
parent
dc179ec819
commit
6fba14eecb
@ -885,53 +885,321 @@ YUV2PACKEDWRAPPER(yuv2, rgb48, rgb48be, PIX_FMT_RGB48BE);
|
||||
YUV2PACKEDWRAPPER(yuv2, rgb48, bgr48be, PIX_FMT_BGR48BE);
|
||||
//YUV2PACKEDWRAPPER(yuv2, rgb48, bgr48le, PIX_FMT_BGR48LE);
|
||||
|
||||
#define YSCALE_YUV_2_RGBX_C(type,alpha) \
|
||||
for (i=0; i<(dstW>>1); i++) {\
|
||||
int j;\
|
||||
int Y1 = 1<<18;\
|
||||
int Y2 = 1<<18;\
|
||||
int U = 1<<18;\
|
||||
int V = 1<<18;\
|
||||
int av_unused A1, A2;\
|
||||
type av_unused *r, *b, *g;\
|
||||
const int i2= 2*i;\
|
||||
\
|
||||
for (j=0; j<lumFilterSize; j++) {\
|
||||
Y1 += lumSrc[j][i2] * lumFilter[j];\
|
||||
Y2 += lumSrc[j][i2+1] * lumFilter[j];\
|
||||
}\
|
||||
for (j=0; j<chrFilterSize; j++) {\
|
||||
U += chrUSrc[j][i] * chrFilter[j];\
|
||||
V += chrVSrc[j][i] * chrFilter[j];\
|
||||
}\
|
||||
Y1>>=19;\
|
||||
Y2>>=19;\
|
||||
U >>=19;\
|
||||
V >>=19;\
|
||||
if ((Y1|Y2|U|V)&0x100) {\
|
||||
Y1 = av_clip_uint8(Y1); \
|
||||
Y2 = av_clip_uint8(Y2); \
|
||||
U = av_clip_uint8(U); \
|
||||
V = av_clip_uint8(V); \
|
||||
}\
|
||||
if (alpha) {\
|
||||
A1 = 1<<18;\
|
||||
A2 = 1<<18;\
|
||||
for (j=0; j<lumFilterSize; j++) {\
|
||||
A1 += alpSrc[j][i2 ] * lumFilter[j];\
|
||||
A2 += alpSrc[j][i2+1] * lumFilter[j];\
|
||||
}\
|
||||
A1>>=19;\
|
||||
A2>>=19;\
|
||||
if ((A1|A2)&0x100) {\
|
||||
A1 = av_clip_uint8(A1); \
|
||||
A2 = av_clip_uint8(A2); \
|
||||
}\
|
||||
}\
|
||||
/* FIXME fix tables so that clipping is not needed and then use _NOCLIP*/\
|
||||
r = (type *)c->table_rV[V]; \
|
||||
g = (type *)(c->table_gU[U] + c->table_gV[V]); \
|
||||
b = (type *)c->table_bU[U];
|
||||
static av_always_inline void
|
||||
yuv2rgb_write(uint8_t *_dest, int i, int Y1, int Y2,
|
||||
int U, int V, int A1, int A2,
|
||||
const void *_r, const void *_g, const void *_b, int y,
|
||||
enum PixelFormat target, int hasAlpha)
|
||||
{
|
||||
if (target == PIX_FMT_ARGB || target == PIX_FMT_RGBA ||
|
||||
target == PIX_FMT_ABGR || target == PIX_FMT_BGRA) {
|
||||
uint32_t *dest = (uint32_t *) _dest;
|
||||
const uint32_t *r = (const uint32_t *) _r;
|
||||
const uint32_t *g = (const uint32_t *) _g;
|
||||
const uint32_t *b = (const uint32_t *) _b;
|
||||
|
||||
#if CONFIG_SMALL
|
||||
int sh = hasAlpha ? ((fmt == PIX_FMT_RGB32_1 || fmt == PIX_FMT_BGR32_1) ? 0 : 24) : 0;
|
||||
|
||||
dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1] + (hasAlpha ? A1 << sh : 0);
|
||||
dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2] + (hasAlpha ? A2 << sh : 0);
|
||||
#else
|
||||
if (hasAlpha) {
|
||||
int sh = (target == PIX_FMT_RGB32_1 || target == PIX_FMT_BGR32_1) ? 0 : 24;
|
||||
|
||||
dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1] + (A1 << sh);
|
||||
dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2] + (A2 << sh);
|
||||
} else {
|
||||
dest[i * 2 + 0] = r[Y1] + g[Y1] + b[Y1];
|
||||
dest[i * 2 + 1] = r[Y2] + g[Y2] + b[Y2];
|
||||
}
|
||||
#endif
|
||||
} else if (target == PIX_FMT_RGB24 || target == PIX_FMT_BGR24) {
|
||||
uint8_t *dest = (uint8_t *) _dest;
|
||||
const uint8_t *r = (const uint8_t *) _r;
|
||||
const uint8_t *g = (const uint8_t *) _g;
|
||||
const uint8_t *b = (const uint8_t *) _b;
|
||||
|
||||
#define r_b ((target == PIX_FMT_RGB24) ? r : b)
|
||||
#define b_r ((target == PIX_FMT_RGB24) ? b : r)
|
||||
dest[i * 6 + 0] = r_b[Y1];
|
||||
dest[i * 6 + 1] = g[Y1];
|
||||
dest[i * 6 + 2] = b_r[Y1];
|
||||
dest[i * 6 + 3] = r_b[Y2];
|
||||
dest[i * 6 + 4] = g[Y2];
|
||||
dest[i * 6 + 5] = b_r[Y2];
|
||||
#undef r_b
|
||||
#undef b_r
|
||||
} else if (target == PIX_FMT_RGB565 || target == PIX_FMT_BGR565 ||
|
||||
target == PIX_FMT_RGB555 || target == PIX_FMT_BGR555 ||
|
||||
target == PIX_FMT_RGB444 || target == PIX_FMT_BGR444) {
|
||||
uint16_t *dest = (uint16_t *) _dest;
|
||||
const uint16_t *r = (const uint16_t *) _r;
|
||||
const uint16_t *g = (const uint16_t *) _g;
|
||||
const uint16_t *b = (const uint16_t *) _b;
|
||||
int dr1, dg1, db1, dr2, dg2, db2;
|
||||
|
||||
if (target == PIX_FMT_RGB565 || target == PIX_FMT_BGR565) {
|
||||
dr1 = dither_2x2_8[ y & 1 ][0];
|
||||
dg1 = dither_2x2_4[ y & 1 ][0];
|
||||
db1 = dither_2x2_8[(y & 1) ^ 1][0];
|
||||
dr2 = dither_2x2_8[ y & 1 ][1];
|
||||
dg2 = dither_2x2_4[ y & 1 ][1];
|
||||
db2 = dither_2x2_8[(y & 1) ^ 1][1];
|
||||
} else if (target == PIX_FMT_RGB555 || target == PIX_FMT_BGR555) {
|
||||
dr1 = dither_2x2_8[ y & 1 ][0];
|
||||
dg1 = dither_2x2_8[ y & 1 ][1];
|
||||
db1 = dither_2x2_8[(y & 1) ^ 1][0];
|
||||
dr2 = dither_2x2_8[ y & 1 ][1];
|
||||
dg2 = dither_2x2_8[ y & 1 ][0];
|
||||
db2 = dither_2x2_8[(y & 1) ^ 1][1];
|
||||
} else {
|
||||
dr1 = dither_4x4_16[ y & 3 ][0];
|
||||
dg1 = dither_4x4_16[ y & 3 ][1];
|
||||
db1 = dither_4x4_16[(y & 3) ^ 3][0];
|
||||
dr2 = dither_4x4_16[ y & 3 ][1];
|
||||
dg2 = dither_4x4_16[ y & 3 ][0];
|
||||
db2 = dither_4x4_16[(y & 3) ^ 3][1];
|
||||
}
|
||||
|
||||
dest[i * 2 + 0] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1];
|
||||
dest[i * 2 + 1] = r[Y2 + dr2] + g[Y2 + dg2] + b[Y2 + db2];
|
||||
} else /* 8/4-bit */ {
|
||||
uint8_t *dest = (uint8_t *) _dest;
|
||||
const uint8_t *r = (const uint8_t *) _r;
|
||||
const uint8_t *g = (const uint8_t *) _g;
|
||||
const uint8_t *b = (const uint8_t *) _b;
|
||||
int dr1, dg1, db1, dr2, dg2, db2;
|
||||
|
||||
if (target == PIX_FMT_RGB8 || target == PIX_FMT_BGR8) {
|
||||
const uint8_t * const d64 = dither_8x8_73[y & 7];
|
||||
const uint8_t * const d32 = dither_8x8_32[y & 7];
|
||||
dr1 = dg1 = d32[(i * 2 + 0) & 7];
|
||||
db1 = d64[(i * 2 + 0) & 7];
|
||||
dr2 = dg2 = d32[(i * 2 + 1) & 7];
|
||||
db2 = d64[(i * 2 + 1) & 7];
|
||||
} else {
|
||||
const uint8_t * const d64 = dither_8x8_73 [y & 7];
|
||||
const uint8_t * const d128 = dither_8x8_220[y & 7];
|
||||
dr1 = db1 = d128[(i * 2 + 0) & 7];
|
||||
dg1 = d64[(i * 2 + 0) & 7];
|
||||
dr2 = db2 = d128[(i * 2 + 1) & 7];
|
||||
dg2 = d64[(i * 2 + 1) & 7];
|
||||
}
|
||||
|
||||
if (target == PIX_FMT_RGB4 || target == PIX_FMT_BGR4) {
|
||||
dest[i] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1] +
|
||||
((r[Y2 + dr2] + g[Y2 + dg2] + b[Y2 + db2]) << 4);
|
||||
} else {
|
||||
dest[i * 2 + 0] = r[Y1 + dr1] + g[Y1 + dg1] + b[Y1 + db1];
|
||||
dest[i * 2 + 1] = r[Y2 + dr2] + g[Y2 + dg2] + b[Y2 + db2];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static av_always_inline void
|
||||
yuv2rgb_X_c_template(SwsContext *c, const int16_t *lumFilter,
|
||||
const int16_t **lumSrc, int lumFilterSize,
|
||||
const int16_t *chrFilter, const int16_t **chrUSrc,
|
||||
const int16_t **chrVSrc, int chrFilterSize,
|
||||
const int16_t **alpSrc, uint8_t *dest, int dstW,
|
||||
int y, enum PixelFormat target, int hasAlpha)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < (dstW >> 1); i++) {
|
||||
int j;
|
||||
int Y1 = 1 << 18;
|
||||
int Y2 = 1 << 18;
|
||||
int U = 1 << 18;
|
||||
int V = 1 << 18;
|
||||
int av_unused A1, A2;
|
||||
const void *r, *g, *b;
|
||||
|
||||
for (j = 0; j < lumFilterSize; j++) {
|
||||
Y1 += lumSrc[j][i * 2] * lumFilter[j];
|
||||
Y2 += lumSrc[j][i * 2 + 1] * lumFilter[j];
|
||||
}
|
||||
for (j = 0; j < chrFilterSize; j++) {
|
||||
U += chrUSrc[j][i] * chrFilter[j];
|
||||
V += chrVSrc[j][i] * chrFilter[j];
|
||||
}
|
||||
Y1 >>= 19;
|
||||
Y2 >>= 19;
|
||||
U >>= 19;
|
||||
V >>= 19;
|
||||
if ((Y1 | Y2 | U | V) & 0x100) {
|
||||
Y1 = av_clip_uint8(Y1);
|
||||
Y2 = av_clip_uint8(Y2);
|
||||
U = av_clip_uint8(U);
|
||||
V = av_clip_uint8(V);
|
||||
}
|
||||
if (hasAlpha) {\
|
||||
A1 = 1 << 18;
|
||||
A2 = 1 << 18;
|
||||
for (j = 0; j < lumFilterSize; j++) {
|
||||
A1 += alpSrc[j][i * 2 ] * lumFilter[j];
|
||||
A2 += alpSrc[j][i * 2 + 1] * lumFilter[j];
|
||||
}
|
||||
A1 >>= 19;
|
||||
A2 >>= 19;
|
||||
if ((A1 | A2) & 0x100) {
|
||||
A1 = av_clip_uint8(A1);
|
||||
A2 = av_clip_uint8(A2);
|
||||
}
|
||||
}
|
||||
|
||||
/* FIXME fix tables so that clipping is not needed and then use _NOCLIP*/
|
||||
r = c->table_rV[V];
|
||||
g = (c->table_gU[U] + c->table_gV[V]);
|
||||
b = c->table_bU[U];
|
||||
|
||||
yuv2rgb_write(dest, i, Y1, Y2, U, V, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
|
||||
r, g, b, y, target, hasAlpha);
|
||||
}
|
||||
}
|
||||
|
||||
static av_always_inline void
|
||||
yuv2rgb_2_c_template(SwsContext *c, const uint16_t *buf0,
|
||||
const uint16_t *buf1, const uint16_t *ubuf0,
|
||||
const uint16_t *ubuf1, const uint16_t *vbuf0,
|
||||
const uint16_t *vbuf1, const uint16_t *abuf0,
|
||||
const uint16_t *abuf1, uint8_t *dest, int dstW,
|
||||
int yalpha, int uvalpha, int y,
|
||||
enum PixelFormat target, int hasAlpha)
|
||||
{
|
||||
int yalpha1 = 4095 - yalpha;
|
||||
int uvalpha1 = 4095 - uvalpha;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < (dstW >> 1); i++) {
|
||||
int Y1 = (buf0[i * 2] * yalpha1 + buf1[i * 2] * yalpha) >> 19;
|
||||
int Y2 = (buf0[i * 2 + 1] * yalpha1 + buf1[i * 2 + 1] * yalpha) >> 19;
|
||||
int U = (ubuf0[i] * uvalpha1 + ubuf1[i] * uvalpha) >> 19;
|
||||
int V = (vbuf0[i] * uvalpha1 + vbuf1[i] * uvalpha) >> 19;
|
||||
int A1, A2;
|
||||
const void *r = c->table_rV[V],
|
||||
*g = (c->table_gU[U] + c->table_gV[V]),
|
||||
*b = c->table_bU[U];
|
||||
|
||||
if (hasAlpha) {
|
||||
A1 = (abuf0[i * 2 ] * yalpha1 + abuf1[i * 2 ] * yalpha) >> 19;
|
||||
A2 = (abuf0[i * 2 + 1] * yalpha1 + abuf1[i * 2 + 1] * yalpha) >> 19;
|
||||
}
|
||||
|
||||
yuv2rgb_write(dest, i, Y1, Y2, U, V, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
|
||||
r, g, b, y, target, hasAlpha);
|
||||
}
|
||||
}
|
||||
|
||||
static av_always_inline void
|
||||
yuv2rgb_1_c_template(SwsContext *c, const uint16_t *buf0,
|
||||
const uint16_t *ubuf0, const uint16_t *ubuf1,
|
||||
const uint16_t *vbuf0, const uint16_t *vbuf1,
|
||||
const uint16_t *abuf0, uint8_t *dest, int dstW,
|
||||
int uvalpha, enum PixelFormat dstFormat,
|
||||
int flags, int y, enum PixelFormat target,
|
||||
int hasAlpha)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (uvalpha < 2048) {
|
||||
for (i = 0; i < (dstW >> 1); i++) {
|
||||
int Y1 = buf0[i * 2] >> 7;
|
||||
int Y2 = buf0[i * 2 + 1] >> 7;
|
||||
int U = ubuf1[i] >> 7;
|
||||
int V = vbuf1[i] >> 7;
|
||||
int A1, A2;
|
||||
const void *r = c->table_rV[V],
|
||||
*g = (c->table_gU[U] + c->table_gV[V]),
|
||||
*b = c->table_bU[U];
|
||||
|
||||
if (hasAlpha) {
|
||||
A1 = abuf0[i * 2 ] >> 7;
|
||||
A2 = abuf0[i * 2 + 1] >> 7;
|
||||
}
|
||||
|
||||
yuv2rgb_write(dest, i, Y1, Y2, U, V, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
|
||||
r, g, b, y, target, hasAlpha);
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < (dstW >> 1); i++) {
|
||||
int Y1 = buf0[i * 2] >> 7;
|
||||
int Y2 = buf0[i * 2 + 1] >> 7;
|
||||
int U = (ubuf0[i] + ubuf1[i]) >> 8;
|
||||
int V = (vbuf0[i] + vbuf1[i]) >> 8;
|
||||
int A1, A2;
|
||||
const void *r = c->table_rV[V],
|
||||
*g = (c->table_gU[U] + c->table_gV[V]),
|
||||
*b = c->table_bU[U];
|
||||
|
||||
if (hasAlpha) {
|
||||
A1 = abuf0[i * 2 ] >> 7;
|
||||
A2 = abuf0[i * 2 + 1] >> 7;
|
||||
}
|
||||
|
||||
yuv2rgb_write(dest, i, Y1, Y2, U, V, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
|
||||
r, g, b, y, target, hasAlpha);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#define YUV2RGBWRAPPER(name, base, ext, fmt, hasAlpha) \
|
||||
static void name ## ext ## _X_c(SwsContext *c, const int16_t *lumFilter, \
|
||||
const int16_t **lumSrc, int lumFilterSize, \
|
||||
const int16_t *chrFilter, const int16_t **chrUSrc, \
|
||||
const int16_t **chrVSrc, int chrFilterSize, \
|
||||
const int16_t **alpSrc, uint8_t *dest, int dstW, \
|
||||
int y) \
|
||||
{ \
|
||||
name ## base ## _X_c_template(c, lumFilter, lumSrc, lumFilterSize, \
|
||||
chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
|
||||
alpSrc, dest, dstW, y, fmt, hasAlpha); \
|
||||
} \
|
||||
\
|
||||
static void name ## ext ## _2_c(SwsContext *c, const uint16_t *buf0, \
|
||||
const uint16_t *buf1, const uint16_t *ubuf0, \
|
||||
const uint16_t *ubuf1, const uint16_t *vbuf0, \
|
||||
const uint16_t *vbuf1, const uint16_t *abuf0, \
|
||||
const uint16_t *abuf1, uint8_t *dest, int dstW, \
|
||||
int yalpha, int uvalpha, int y) \
|
||||
{ \
|
||||
name ## base ## _2_c_template(c, buf0, buf1, ubuf0, ubuf1, \
|
||||
vbuf0, vbuf1, abuf0, abuf1, \
|
||||
dest, dstW, yalpha, uvalpha, y, fmt, hasAlpha); \
|
||||
} \
|
||||
\
|
||||
static void name ## ext ## _1_c(SwsContext *c, const uint16_t *buf0, \
|
||||
const uint16_t *ubuf0, const uint16_t *ubuf1, \
|
||||
const uint16_t *vbuf0, const uint16_t *vbuf1, \
|
||||
const uint16_t *abuf0, uint8_t *dest, int dstW, \
|
||||
int uvalpha, enum PixelFormat dstFormat, \
|
||||
int flags, int y) \
|
||||
{ \
|
||||
name ## base ## _1_c_template(c, buf0, ubuf0, ubuf1, vbuf0, \
|
||||
vbuf1, abuf0, dest, dstW, uvalpha, \
|
||||
dstFormat, flags, y, fmt, hasAlpha); \
|
||||
}
|
||||
|
||||
#if CONFIG_SMALL
|
||||
YUV2RGBWRAPPER(yuv2rgb,, 32_1, PIX_FMT_RGB32_1, CONFIG_SWSCALE_ALPHA && c->alpPixBuf);
|
||||
YUV2RGBWRAPPER(yuv2rgb,, 32, PIX_FMT_RGB32, CONFIG_SWSCALE_ALPHA && c->alpPixBuf);
|
||||
#else
|
||||
#if CONFIG_SWSCALE_ALPHA
|
||||
YUV2RGBWRAPPER(yuv2rgb,, a32_1, PIX_FMT_RGB32_1, 1);
|
||||
YUV2RGBWRAPPER(yuv2rgb,, a32, PIX_FMT_RGB32, 1);
|
||||
#endif
|
||||
YUV2RGBWRAPPER(yuv2rgb,, x32_1, PIX_FMT_RGB32_1, 0);
|
||||
YUV2RGBWRAPPER(yuv2rgb,, x32, PIX_FMT_RGB32, 0);
|
||||
#endif
|
||||
YUV2RGBWRAPPER(yuv2, rgb, rgb24, PIX_FMT_RGB24, 0);
|
||||
YUV2RGBWRAPPER(yuv2, rgb, bgr24, PIX_FMT_BGR24, 0);
|
||||
YUV2RGBWRAPPER(yuv2rgb,, 16, PIX_FMT_RGB565, 0);
|
||||
YUV2RGBWRAPPER(yuv2rgb,, 15, PIX_FMT_RGB555, 0);
|
||||
YUV2RGBWRAPPER(yuv2rgb,, 12, PIX_FMT_RGB444, 0);
|
||||
YUV2RGBWRAPPER(yuv2rgb,, 8, PIX_FMT_RGB8, 0);
|
||||
YUV2RGBWRAPPER(yuv2rgb,, 4, PIX_FMT_RGB4, 0);
|
||||
YUV2RGBWRAPPER(yuv2rgb,, 4b, PIX_FMT_RGB4_BYTE, 0);
|
||||
|
||||
#define YSCALE_YUV_2_RGBX_FULL_C(rnd,alpha) \
|
||||
for (i=0; i<dstW; i++) {\
|
||||
@ -972,215 +1240,6 @@ YUV2PACKEDWRAPPER(yuv2, rgb48, bgr48be, PIX_FMT_BGR48BE);
|
||||
B = av_clip_uintp2(B, 30); \
|
||||
}
|
||||
|
||||
#define YSCALE_YUV_2_RGB2_C(type,alpha) \
|
||||
for (i=0; i<(dstW>>1); i++) { \
|
||||
const int i2= 2*i; \
|
||||
int Y1= (buf0[i2 ]*yalpha1+buf1[i2 ]*yalpha)>>19; \
|
||||
int Y2= (buf0[i2+1]*yalpha1+buf1[i2+1]*yalpha)>>19; \
|
||||
int U= (ubuf0[i]*uvalpha1+ubuf1[i]*uvalpha)>>19; \
|
||||
int V= (vbuf0[i]*uvalpha1+vbuf1[i]*uvalpha)>>19; \
|
||||
type av_unused *r, *b, *g; \
|
||||
int av_unused A1, A2; \
|
||||
if (alpha) {\
|
||||
A1= (abuf0[i2 ]*yalpha1+abuf1[i2 ]*yalpha)>>19; \
|
||||
A2= (abuf0[i2+1]*yalpha1+abuf1[i2+1]*yalpha)>>19; \
|
||||
}\
|
||||
r = (type *)c->table_rV[V];\
|
||||
g = (type *)(c->table_gU[U] + c->table_gV[V]);\
|
||||
b = (type *)c->table_bU[U];
|
||||
|
||||
#define YSCALE_YUV_2_RGB1_C(type,alpha) \
|
||||
for (i=0; i<(dstW>>1); i++) {\
|
||||
const int i2= 2*i;\
|
||||
int Y1= buf0[i2 ]>>7;\
|
||||
int Y2= buf0[i2+1]>>7;\
|
||||
int U= (ubuf1[i])>>7;\
|
||||
int V= (vbuf1[i])>>7;\
|
||||
type av_unused *r, *b, *g;\
|
||||
int av_unused A1, A2;\
|
||||
if (alpha) {\
|
||||
A1= abuf0[i2 ]>>7;\
|
||||
A2= abuf0[i2+1]>>7;\
|
||||
}\
|
||||
r = (type *)c->table_rV[V];\
|
||||
g = (type *)(c->table_gU[U] + c->table_gV[V]);\
|
||||
b = (type *)c->table_bU[U];
|
||||
|
||||
#define YSCALE_YUV_2_RGB1B_C(type,alpha) \
|
||||
for (i=0; i<(dstW>>1); i++) {\
|
||||
const int i2= 2*i;\
|
||||
int Y1= buf0[i2 ]>>7;\
|
||||
int Y2= buf0[i2+1]>>7;\
|
||||
int U= (ubuf0[i] + ubuf1[i])>>8;\
|
||||
int V= (vbuf0[i] + vbuf1[i])>>8;\
|
||||
type av_unused *r, *b, *g;\
|
||||
int av_unused A1, A2;\
|
||||
if (alpha) {\
|
||||
A1= abuf0[i2 ]>>7;\
|
||||
A2= abuf0[i2+1]>>7;\
|
||||
}\
|
||||
r = (type *)c->table_rV[V];\
|
||||
g = (type *)(c->table_gU[U] + c->table_gV[V]);\
|
||||
b = (type *)c->table_bU[U];
|
||||
|
||||
#define YSCALE_YUV_2_ANYRGB_C(func)\
|
||||
switch(c->dstFormat) {\
|
||||
case PIX_FMT_RGBA:\
|
||||
case PIX_FMT_BGRA:\
|
||||
if (CONFIG_SMALL) {\
|
||||
int needAlpha = CONFIG_SWSCALE_ALPHA && c->alpPixBuf;\
|
||||
func(uint32_t,needAlpha)\
|
||||
((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1] + (needAlpha ? (A1<<24) : 0);\
|
||||
((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2] + (needAlpha ? (A2<<24) : 0);\
|
||||
}\
|
||||
} else {\
|
||||
if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) {\
|
||||
func(uint32_t,1)\
|
||||
((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1] + (A1<<24);\
|
||||
((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2] + (A2<<24);\
|
||||
}\
|
||||
} else {\
|
||||
func(uint32_t,0)\
|
||||
((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1];\
|
||||
((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2];\
|
||||
}\
|
||||
}\
|
||||
}\
|
||||
break;\
|
||||
case PIX_FMT_ARGB:\
|
||||
case PIX_FMT_ABGR:\
|
||||
if (CONFIG_SMALL) {\
|
||||
int needAlpha = CONFIG_SWSCALE_ALPHA && c->alpPixBuf;\
|
||||
func(uint32_t,needAlpha)\
|
||||
((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1] + (needAlpha ? A1 : 0);\
|
||||
((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2] + (needAlpha ? A2 : 0);\
|
||||
}\
|
||||
} else {\
|
||||
if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) {\
|
||||
func(uint32_t,1)\
|
||||
((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1] + A1;\
|
||||
((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2] + A2;\
|
||||
}\
|
||||
} else {\
|
||||
func(uint32_t,0)\
|
||||
((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1];\
|
||||
((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2];\
|
||||
}\
|
||||
}\
|
||||
} \
|
||||
break;\
|
||||
case PIX_FMT_RGB24:\
|
||||
func(uint8_t,0)\
|
||||
((uint8_t*)dest)[0]= r[Y1];\
|
||||
((uint8_t*)dest)[1]= g[Y1];\
|
||||
((uint8_t*)dest)[2]= b[Y1];\
|
||||
((uint8_t*)dest)[3]= r[Y2];\
|
||||
((uint8_t*)dest)[4]= g[Y2];\
|
||||
((uint8_t*)dest)[5]= b[Y2];\
|
||||
dest+=6;\
|
||||
}\
|
||||
break;\
|
||||
case PIX_FMT_BGR24:\
|
||||
func(uint8_t,0)\
|
||||
((uint8_t*)dest)[0]= b[Y1];\
|
||||
((uint8_t*)dest)[1]= g[Y1];\
|
||||
((uint8_t*)dest)[2]= r[Y1];\
|
||||
((uint8_t*)dest)[3]= b[Y2];\
|
||||
((uint8_t*)dest)[4]= g[Y2];\
|
||||
((uint8_t*)dest)[5]= r[Y2];\
|
||||
dest+=6;\
|
||||
}\
|
||||
break;\
|
||||
case PIX_FMT_RGB565:\
|
||||
case PIX_FMT_BGR565:\
|
||||
{\
|
||||
const int dr1= dither_2x2_8[y&1 ][0];\
|
||||
const int dg1= dither_2x2_4[y&1 ][0];\
|
||||
const int db1= dither_2x2_8[(y&1)^1][0];\
|
||||
const int dr2= dither_2x2_8[y&1 ][1];\
|
||||
const int dg2= dither_2x2_4[y&1 ][1];\
|
||||
const int db2= dither_2x2_8[(y&1)^1][1];\
|
||||
func(uint16_t,0)\
|
||||
((uint16_t*)dest)[i2+0]= r[Y1+dr1] + g[Y1+dg1] + b[Y1+db1];\
|
||||
((uint16_t*)dest)[i2+1]= r[Y2+dr2] + g[Y2+dg2] + b[Y2+db2];\
|
||||
}\
|
||||
}\
|
||||
break;\
|
||||
case PIX_FMT_RGB555:\
|
||||
case PIX_FMT_BGR555:\
|
||||
{\
|
||||
const int dr1= dither_2x2_8[y&1 ][0];\
|
||||
const int dg1= dither_2x2_8[y&1 ][1];\
|
||||
const int db1= dither_2x2_8[(y&1)^1][0];\
|
||||
const int dr2= dither_2x2_8[y&1 ][1];\
|
||||
const int dg2= dither_2x2_8[y&1 ][0];\
|
||||
const int db2= dither_2x2_8[(y&1)^1][1];\
|
||||
func(uint16_t,0)\
|
||||
((uint16_t*)dest)[i2+0]= r[Y1+dr1] + g[Y1+dg1] + b[Y1+db1];\
|
||||
((uint16_t*)dest)[i2+1]= r[Y2+dr2] + g[Y2+dg2] + b[Y2+db2];\
|
||||
}\
|
||||
}\
|
||||
break;\
|
||||
case PIX_FMT_RGB444:\
|
||||
case PIX_FMT_BGR444:\
|
||||
{\
|
||||
const int dr1= dither_4x4_16[y&3 ][0];\
|
||||
const int dg1= dither_4x4_16[y&3 ][1];\
|
||||
const int db1= dither_4x4_16[(y&3)^3][0];\
|
||||
const int dr2= dither_4x4_16[y&3 ][1];\
|
||||
const int dg2= dither_4x4_16[y&3 ][0];\
|
||||
const int db2= dither_4x4_16[(y&3)^3][1];\
|
||||
func(uint16_t,0)\
|
||||
((uint16_t*)dest)[i2+0]= r[Y1+dr1] + g[Y1+dg1] + b[Y1+db1];\
|
||||
((uint16_t*)dest)[i2+1]= r[Y2+dr2] + g[Y2+dg2] + b[Y2+db2];\
|
||||
}\
|
||||
}\
|
||||
break;\
|
||||
case PIX_FMT_RGB8:\
|
||||
case PIX_FMT_BGR8:\
|
||||
{\
|
||||
const uint8_t * const d64= dither_8x8_73[y&7];\
|
||||
const uint8_t * const d32= dither_8x8_32[y&7];\
|
||||
func(uint8_t,0)\
|
||||
((uint8_t*)dest)[i2+0]= r[Y1+d32[(i2+0)&7]] + g[Y1+d32[(i2+0)&7]] + b[Y1+d64[(i2+0)&7]];\
|
||||
((uint8_t*)dest)[i2+1]= r[Y2+d32[(i2+1)&7]] + g[Y2+d32[(i2+1)&7]] + b[Y2+d64[(i2+1)&7]];\
|
||||
}\
|
||||
}\
|
||||
break;\
|
||||
case PIX_FMT_RGB4:\
|
||||
case PIX_FMT_BGR4:\
|
||||
{\
|
||||
const uint8_t * const d64= dither_8x8_73 [y&7];\
|
||||
const uint8_t * const d128=dither_8x8_220[y&7];\
|
||||
func(uint8_t,0)\
|
||||
((uint8_t*)dest)[i]= r[Y1+d128[(i2+0)&7]] + g[Y1+d64[(i2+0)&7]] + b[Y1+d128[(i2+0)&7]]\
|
||||
+ ((r[Y2+d128[(i2+1)&7]] + g[Y2+d64[(i2+1)&7]] + b[Y2+d128[(i2+1)&7]])<<4);\
|
||||
}\
|
||||
}\
|
||||
break;\
|
||||
case PIX_FMT_RGB4_BYTE:\
|
||||
case PIX_FMT_BGR4_BYTE:\
|
||||
{\
|
||||
const uint8_t * const d64= dither_8x8_73 [y&7];\
|
||||
const uint8_t * const d128=dither_8x8_220[y&7];\
|
||||
func(uint8_t,0)\
|
||||
((uint8_t*)dest)[i2+0]= r[Y1+d128[(i2+0)&7]] + g[Y1+d64[(i2+0)&7]] + b[Y1+d128[(i2+0)&7]];\
|
||||
((uint8_t*)dest)[i2+1]= r[Y2+d128[(i2+1)&7]] + g[Y2+d64[(i2+1)&7]] + b[Y2+d128[(i2+1)&7]];\
|
||||
}\
|
||||
}\
|
||||
break;\
|
||||
}
|
||||
|
||||
static void yuv2packedX_c(SwsContext *c, const int16_t *lumFilter,
|
||||
const int16_t **lumSrc, int lumFilterSize,
|
||||
const int16_t *chrFilter, const int16_t **chrUSrc,
|
||||
const int16_t **chrVSrc, int chrFilterSize,
|
||||
const int16_t **alpSrc, uint8_t *dest, int dstW, int y)
|
||||
{
|
||||
int i;
|
||||
YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGBX_C)
|
||||
}
|
||||
|
||||
static void yuv2rgbX_c_full(SwsContext *c, const int16_t *lumFilter,
|
||||
const int16_t **lumSrc, int lumFilterSize,
|
||||
const int16_t *chrFilter, const int16_t **chrUSrc,
|
||||
@ -1267,42 +1326,6 @@ static void yuv2rgbX_c_full(SwsContext *c, const int16_t *lumFilter,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* vertical bilinear scale YV12 to RGB
|
||||
*/
|
||||
static void yuv2packed2_c(SwsContext *c, const uint16_t *buf0,
|
||||
const uint16_t *buf1, const uint16_t *ubuf0,
|
||||
const uint16_t *ubuf1, const uint16_t *vbuf0,
|
||||
const uint16_t *vbuf1, const uint16_t *abuf0,
|
||||
const uint16_t *abuf1, uint8_t *dest, int dstW,
|
||||
int yalpha, int uvalpha, int y)
|
||||
{
|
||||
int yalpha1=4095- yalpha;
|
||||
int uvalpha1=4095-uvalpha;
|
||||
int i;
|
||||
|
||||
YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB2_C)
|
||||
}
|
||||
|
||||
/**
|
||||
* YV12 to RGB without scaling or interpolating
|
||||
*/
|
||||
static void yuv2packed1_c(SwsContext *c, const uint16_t *buf0,
|
||||
const uint16_t *ubuf0, const uint16_t *ubuf1,
|
||||
const uint16_t *vbuf0, const uint16_t *vbuf1,
|
||||
const uint16_t *abuf0, uint8_t *dest, int dstW,
|
||||
int uvalpha, enum PixelFormat dstFormat,
|
||||
int flags, int y)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (uvalpha < 2048) {
|
||||
YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB1_C)
|
||||
} else {
|
||||
YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB1B_C)
|
||||
}
|
||||
}
|
||||
|
||||
static av_always_inline void fillPlane(uint8_t* plane, int stride,
|
||||
int width, int height,
|
||||
int y, uint8_t val)
|
||||
@ -2008,10 +2031,93 @@ find_c_packed_planar_out_funcs(SwsContext *c,
|
||||
*yuv2packed2 = yuv2bgr48be_2_c;
|
||||
*yuv2packedX = yuv2bgr48be_X_c;
|
||||
break;
|
||||
default:
|
||||
*yuv2packed1 = yuv2packed1_c;
|
||||
*yuv2packed2 = yuv2packed2_c;
|
||||
*yuv2packedX = yuv2packedX_c;
|
||||
case PIX_FMT_RGB32:
|
||||
case PIX_FMT_BGR32:
|
||||
#if CONFIG_SMALL
|
||||
*yuv2packed1 = yuv2rgb32_1_c;
|
||||
*yuv2packed2 = yuv2rgb32_2_c;
|
||||
*yuv2packedX = yuv2rgb32_X_c;
|
||||
#else
|
||||
#if CONFIG_SWSCALE_ALPHA
|
||||
if (c->alpPixBuf) {
|
||||
*yuv2packed1 = yuv2rgba32_1_c;
|
||||
*yuv2packed2 = yuv2rgba32_2_c;
|
||||
*yuv2packedX = yuv2rgba32_X_c;
|
||||
} else
|
||||
#endif /* CONFIG_SWSCALE_ALPHA */
|
||||
{
|
||||
*yuv2packed1 = yuv2rgbx32_1_c;
|
||||
*yuv2packed2 = yuv2rgbx32_2_c;
|
||||
*yuv2packedX = yuv2rgbx32_X_c;
|
||||
}
|
||||
#endif /* !CONFIG_SMALL */
|
||||
break;
|
||||
case PIX_FMT_RGB32_1:
|
||||
case PIX_FMT_BGR32_1:
|
||||
#if CONFIG_SMALL
|
||||
*yuv2packed1 = yuv2rgb32_1_1_c;
|
||||
*yuv2packed2 = yuv2rgb32_1_2_c;
|
||||
*yuv2packedX = yuv2rgb32_1_X_c;
|
||||
#else
|
||||
#if CONFIG_SWSCALE_ALPHA
|
||||
if (c->alpPixBuf) {
|
||||
*yuv2packed1 = yuv2rgba32_1_1_c;
|
||||
*yuv2packed2 = yuv2rgba32_1_2_c;
|
||||
*yuv2packedX = yuv2rgba32_1_X_c;
|
||||
} else
|
||||
#endif /* CONFIG_SWSCALE_ALPHA */
|
||||
{
|
||||
*yuv2packed1 = yuv2rgbx32_1_1_c;
|
||||
*yuv2packed2 = yuv2rgbx32_1_2_c;
|
||||
*yuv2packedX = yuv2rgbx32_1_X_c;
|
||||
}
|
||||
#endif /* !CONFIG_SMALL */
|
||||
break;
|
||||
case PIX_FMT_RGB24:
|
||||
*yuv2packed1 = yuv2rgb24_1_c;
|
||||
*yuv2packed2 = yuv2rgb24_2_c;
|
||||
*yuv2packedX = yuv2rgb24_X_c;
|
||||
break;
|
||||
case PIX_FMT_BGR24:
|
||||
*yuv2packed1 = yuv2bgr24_1_c;
|
||||
*yuv2packed2 = yuv2bgr24_2_c;
|
||||
*yuv2packedX = yuv2bgr24_X_c;
|
||||
break;
|
||||
case PIX_FMT_RGB565:
|
||||
case PIX_FMT_BGR565:
|
||||
*yuv2packed1 = yuv2rgb16_1_c;
|
||||
*yuv2packed2 = yuv2rgb16_2_c;
|
||||
*yuv2packedX = yuv2rgb16_X_c;
|
||||
break;
|
||||
case PIX_FMT_RGB555:
|
||||
case PIX_FMT_BGR555:
|
||||
*yuv2packed1 = yuv2rgb15_1_c;
|
||||
*yuv2packed2 = yuv2rgb15_2_c;
|
||||
*yuv2packedX = yuv2rgb15_X_c;
|
||||
break;
|
||||
case PIX_FMT_RGB444:
|
||||
case PIX_FMT_BGR444:
|
||||
*yuv2packed1 = yuv2rgb12_1_c;
|
||||
*yuv2packed2 = yuv2rgb12_2_c;
|
||||
*yuv2packedX = yuv2rgb12_X_c;
|
||||
break;
|
||||
case PIX_FMT_RGB8:
|
||||
case PIX_FMT_BGR8:
|
||||
*yuv2packed1 = yuv2rgb8_1_c;
|
||||
*yuv2packed2 = yuv2rgb8_2_c;
|
||||
*yuv2packedX = yuv2rgb8_X_c;
|
||||
break;
|
||||
case PIX_FMT_RGB4:
|
||||
case PIX_FMT_BGR4:
|
||||
*yuv2packed1 = yuv2rgb4_1_c;
|
||||
*yuv2packed2 = yuv2rgb4_2_c;
|
||||
*yuv2packedX = yuv2rgb4_X_c;
|
||||
break;
|
||||
case PIX_FMT_RGB4_BYTE:
|
||||
case PIX_FMT_BGR4_BYTE:
|
||||
*yuv2packed1 = yuv2rgb4b_1_c;
|
||||
*yuv2packed2 = yuv2rgb4b_2_c;
|
||||
*yuv2packedX = yuv2rgb4b_X_c;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user