mirror of https://git.ffmpeg.org/ffmpeg.git
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.
This commit is contained in:
parent
52e4018be4
commit
25c42234a9
|
@ -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) \
|
||||
if (target == PIX_FMT_MONOBLACK) { \
|
||||
pos = acc; \
|
||||
|
@ -311,7 +314,6 @@ yuv2mono_X_c_template(SwsContext *c, const int16_t *lumFilter,
|
|||
int y, enum PixelFormat target)
|
||||
{
|
||||
const uint8_t * const d128=dither_8x8_220[y&7];
|
||||
uint8_t *g = c->table_gU[128] + c->table_gV[128];
|
||||
int i;
|
||||
unsigned acc = 0;
|
||||
|
||||
|
@ -330,8 +332,8 @@ yuv2mono_X_c_template(SwsContext *c, const int16_t *lumFilter,
|
|||
Y1 = av_clip_uint8(Y1);
|
||||
Y2 = av_clip_uint8(Y2);
|
||||
}
|
||||
acc += acc + g[Y1 + d128[(i + 0) & 7]];
|
||||
acc += acc + g[Y2 + d128[(i + 1) & 7]];
|
||||
accumulate_bit(acc, Y1 + d128[(i + 0) & 7]);
|
||||
accumulate_bit(acc, Y2 + d128[(i + 1) & 7]);
|
||||
if ((i & 7) == 6) {
|
||||
output_pixel(*dest++, acc);
|
||||
}
|
||||
|
@ -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 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 i;
|
||||
|
||||
for (i = 0; i < dstW - 7; i += 8) {
|
||||
int acc = g[((buf0[i ] * yalpha1 + buf1[i ] * yalpha) >> 19) + d128[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]];
|
||||
acc += acc + g[((buf0[i + 3] * yalpha1 + buf1[i + 3] * yalpha) >> 19) + d128[3]];
|
||||
acc += acc + g[((buf0[i + 4] * yalpha1 + buf1[i + 4] * yalpha) >> 19) + d128[4]];
|
||||
acc += acc + g[((buf0[i + 5] * yalpha1 + buf1[i + 5] * yalpha) >> 19) + d128[5]];
|
||||
acc += acc + g[((buf0[i + 6] * yalpha1 + buf1[i + 6] * yalpha) >> 19) + d128[6]];
|
||||
acc += acc + g[((buf0[i + 7] * yalpha1 + buf1[i + 7] * yalpha) >> 19) + d128[7]];
|
||||
int Y, acc = 0;
|
||||
|
||||
Y = (buf0[i + 0] * yalpha1 + buf1[i + 0] * yalpha) >> 19;
|
||||
accumulate_bit(acc, Y + d128[0]);
|
||||
Y = (buf0[i + 1] * yalpha1 + buf1[i + 1] * yalpha) >> 19;
|
||||
accumulate_bit(acc, Y + d128[1]);
|
||||
Y = (buf0[i + 2] * yalpha1 + buf1[i + 2] * yalpha) >> 19;
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -371,23 +383,26 @@ yuv2mono_1_c_template(SwsContext *c, const int16_t *buf0,
|
|||
int uvalpha, int y, enum PixelFormat target)
|
||||
{
|
||||
const uint8_t * const d128 = dither_8x8_220[y & 7];
|
||||
uint8_t *g = c->table_gU[128] + c->table_gV[128];
|
||||
int i;
|
||||
|
||||
for (i = 0; i < dstW - 7; i += 8) {
|
||||
int acc = g[(buf0[i ] >> 7) + d128[0]];
|
||||
acc += acc + g[(buf0[i + 1] >> 7) + d128[1]];
|
||||
acc += acc + g[(buf0[i + 2] >> 7) + d128[2]];
|
||||
acc += acc + g[(buf0[i + 3] >> 7) + d128[3]];
|
||||
acc += acc + g[(buf0[i + 4] >> 7) + d128[4]];
|
||||
acc += acc + g[(buf0[i + 5] >> 7) + d128[5]];
|
||||
acc += acc + g[(buf0[i + 6] >> 7) + d128[6]];
|
||||
acc += acc + g[(buf0[i + 7] >> 7) + d128[7]];
|
||||
int acc = 0;
|
||||
|
||||
accumulate_bit(acc, (buf0[i + 0] >> 7) + d128[0]);
|
||||
accumulate_bit(acc, (buf0[i + 1] >> 7) + d128[1]);
|
||||
accumulate_bit(acc, (buf0[i + 2] >> 7) + d128[2]);
|
||||
accumulate_bit(acc, (buf0[i + 3] >> 7) + d128[3]);
|
||||
accumulate_bit(acc, (buf0[i + 4] >> 7) + d128[4]);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
#undef output_pixel
|
||||
#undef accumulate_bit
|
||||
|
||||
#define YUV2PACKEDWRAPPER(name, base, ext, fmt) \
|
||||
static void name ## ext ## _X_c(SwsContext *c, const int16_t *lumFilter, \
|
||||
|
|
Loading…
Reference in New Issue