Commit 25c42234 authored by Ronald S. Bultje's avatar Ronald S. Bultje

swscale: make monowhite/black RGB-independent.

Disadvantage is that it no longer allows modifying brightness through
adjustment of the RGB lookup table. Advantage is that now monowhite/black
no longer need to be identified as a RGB format.
parent 52e4018b
...@@ -295,6 +295,9 @@ static void yuv2nv12cX_c(SwsContext *c, const int16_t *chrFilter, int chrFilterS ...@@ -295,6 +295,9 @@ static void yuv2nv12cX_c(SwsContext *c, const int16_t *chrFilter, int chrFilterS
} }
} }
#define accumulate_bit(acc, val) \
acc <<= 1; \
acc |= (val) >= (128 + 110)
#define output_pixel(pos, acc) \ #define output_pixel(pos, acc) \
if (target == PIX_FMT_MONOBLACK) { \ if (target == PIX_FMT_MONOBLACK) { \
pos = acc; \ pos = acc; \
...@@ -311,7 +314,6 @@ yuv2mono_X_c_template(SwsContext *c, const int16_t *lumFilter, ...@@ -311,7 +314,6 @@ yuv2mono_X_c_template(SwsContext *c, const int16_t *lumFilter,
int y, enum PixelFormat target) int y, enum PixelFormat target)
{ {
const uint8_t * const d128=dither_8x8_220[y&7]; const uint8_t * const d128=dither_8x8_220[y&7];
uint8_t *g = c->table_gU[128] + c->table_gV[128];
int i; int i;
unsigned acc = 0; unsigned acc = 0;
...@@ -330,8 +332,8 @@ yuv2mono_X_c_template(SwsContext *c, const int16_t *lumFilter, ...@@ -330,8 +332,8 @@ yuv2mono_X_c_template(SwsContext *c, const int16_t *lumFilter,
Y1 = av_clip_uint8(Y1); Y1 = av_clip_uint8(Y1);
Y2 = av_clip_uint8(Y2); Y2 = av_clip_uint8(Y2);
} }
acc += acc + g[Y1 + d128[(i + 0) & 7]]; accumulate_bit(acc, Y1 + d128[(i + 0) & 7]);
acc += acc + g[Y2 + d128[(i + 1) & 7]]; accumulate_bit(acc, Y2 + d128[(i + 1) & 7]);
if ((i & 7) == 6) { if ((i & 7) == 6) {
output_pixel(*dest++, acc); output_pixel(*dest++, acc);
} }
...@@ -347,19 +349,29 @@ yuv2mono_2_c_template(SwsContext *c, const int16_t *buf[2], ...@@ -347,19 +349,29 @@ yuv2mono_2_c_template(SwsContext *c, const int16_t *buf[2],
{ {
const int16_t *buf0 = buf[0], *buf1 = buf[1]; const int16_t *buf0 = buf[0], *buf1 = buf[1];
const uint8_t * const d128 = dither_8x8_220[y & 7]; const uint8_t * const d128 = dither_8x8_220[y & 7];
uint8_t *g = c->table_gU[128] + c->table_gV[128];
int yalpha1 = 4095 - yalpha; int yalpha1 = 4095 - yalpha;
int i; int i;
for (i = 0; i < dstW - 7; i += 8) { for (i = 0; i < dstW - 7; i += 8) {
int acc = g[((buf0[i ] * yalpha1 + buf1[i ] * yalpha) >> 19) + d128[0]]; int Y, acc = 0;
acc += acc + g[((buf0[i + 1] * yalpha1 + buf1[i + 1] * yalpha) >> 19) + d128[1]];
acc += acc + g[((buf0[i + 2] * yalpha1 + buf1[i + 2] * yalpha) >> 19) + d128[2]]; Y = (buf0[i + 0] * yalpha1 + buf1[i + 0] * yalpha) >> 19;
acc += acc + g[((buf0[i + 3] * yalpha1 + buf1[i + 3] * yalpha) >> 19) + d128[3]]; accumulate_bit(acc, Y + d128[0]);
acc += acc + g[((buf0[i + 4] * yalpha1 + buf1[i + 4] * yalpha) >> 19) + d128[4]]; Y = (buf0[i + 1] * yalpha1 + buf1[i + 1] * yalpha) >> 19;
acc += acc + g[((buf0[i + 5] * yalpha1 + buf1[i + 5] * yalpha) >> 19) + d128[5]]; accumulate_bit(acc, Y + d128[1]);
acc += acc + g[((buf0[i + 6] * yalpha1 + buf1[i + 6] * yalpha) >> 19) + d128[6]]; Y = (buf0[i + 2] * yalpha1 + buf1[i + 2] * yalpha) >> 19;
acc += acc + g[((buf0[i + 7] * yalpha1 + buf1[i + 7] * yalpha) >> 19) + d128[7]]; accumulate_bit(acc, Y + d128[2]);
Y = (buf0[i + 3] * yalpha1 + buf1[i + 3] * yalpha) >> 19;
accumulate_bit(acc, Y + d128[3]);
Y = (buf0[i + 4] * yalpha1 + buf1[i + 4] * yalpha) >> 19;
accumulate_bit(acc, Y + d128[4]);
Y = (buf0[i + 5] * yalpha1 + buf1[i + 5] * yalpha) >> 19;
accumulate_bit(acc, Y + d128[5]);
Y = (buf0[i + 6] * yalpha1 + buf1[i + 6] * yalpha) >> 19;
accumulate_bit(acc, Y + d128[6]);
Y = (buf0[i + 7] * yalpha1 + buf1[i + 7] * yalpha) >> 19;
accumulate_bit(acc, Y + d128[7]);
output_pixel(*dest++, acc); output_pixel(*dest++, acc);
} }
} }
...@@ -371,23 +383,26 @@ yuv2mono_1_c_template(SwsContext *c, const int16_t *buf0, ...@@ -371,23 +383,26 @@ yuv2mono_1_c_template(SwsContext *c, const int16_t *buf0,
int uvalpha, int y, enum PixelFormat target) int uvalpha, int y, enum PixelFormat target)
{ {
const uint8_t * const d128 = dither_8x8_220[y & 7]; const uint8_t * const d128 = dither_8x8_220[y & 7];
uint8_t *g = c->table_gU[128] + c->table_gV[128];
int i; int i;
for (i = 0; i < dstW - 7; i += 8) { for (i = 0; i < dstW - 7; i += 8) {
int acc = g[(buf0[i ] >> 7) + d128[0]]; int acc = 0;
acc += acc + g[(buf0[i + 1] >> 7) + d128[1]];
acc += acc + g[(buf0[i + 2] >> 7) + d128[2]]; accumulate_bit(acc, (buf0[i + 0] >> 7) + d128[0]);
acc += acc + g[(buf0[i + 3] >> 7) + d128[3]]; accumulate_bit(acc, (buf0[i + 1] >> 7) + d128[1]);
acc += acc + g[(buf0[i + 4] >> 7) + d128[4]]; accumulate_bit(acc, (buf0[i + 2] >> 7) + d128[2]);
acc += acc + g[(buf0[i + 5] >> 7) + d128[5]]; accumulate_bit(acc, (buf0[i + 3] >> 7) + d128[3]);
acc += acc + g[(buf0[i + 6] >> 7) + d128[6]]; accumulate_bit(acc, (buf0[i + 4] >> 7) + d128[4]);
acc += acc + g[(buf0[i + 7] >> 7) + d128[7]]; accumulate_bit(acc, (buf0[i + 5] >> 7) + d128[5]);
accumulate_bit(acc, (buf0[i + 6] >> 7) + d128[6]);
accumulate_bit(acc, (buf0[i + 7] >> 7) + d128[7]);
output_pixel(*dest++, acc); output_pixel(*dest++, acc);
} }
} }
#undef output_pixel #undef output_pixel
#undef accumulate_bit
#define YUV2PACKEDWRAPPER(name, base, ext, fmt) \ #define YUV2PACKEDWRAPPER(name, base, ext, fmt) \
static void name ## ext ## _X_c(SwsContext *c, const int16_t *lumFilter, \ static void name ## ext ## _X_c(SwsContext *c, const int16_t *lumFilter, \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment