mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-21 10:55:51 +02:00
fixing rgb4 & bgr4 (2 pixels per byte)
adding bg4b & rg4b (1 pixel per byte) Originally committed as revision 9172 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc
This commit is contained in:
parent
782c5984f1
commit
f17457ac49
@ -583,6 +583,17 @@ static inline void yuv2yuvXinC(int16_t *lumFilter, int16_t **lumSrc, int lumFilt
|
|||||||
break;\
|
break;\
|
||||||
case IMGFMT_RGB4:\
|
case IMGFMT_RGB4:\
|
||||||
case IMGFMT_BGR4:\
|
case IMGFMT_BGR4:\
|
||||||
|
{\
|
||||||
|
const uint8_t * const d64= dither_8x8_73 [y&7];\
|
||||||
|
const uint8_t * const d128=dither_8x8_220[y&7];\
|
||||||
|
func(uint8_t)\
|
||||||
|
((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 IMGFMT_RG4B:\
|
||||||
|
case IMGFMT_BG4B:\
|
||||||
{\
|
{\
|
||||||
const uint8_t * const d64= dither_8x8_73 [y&7];\
|
const uint8_t * const d64= dither_8x8_73 [y&7];\
|
||||||
const uint8_t * const d128=dither_8x8_220[y&7];\
|
const uint8_t * const d128=dither_8x8_220[y&7];\
|
||||||
@ -747,6 +758,17 @@ static inline void yuv2packedXinC(SwsContext *c, int16_t *lumFilter, int16_t **l
|
|||||||
break;
|
break;
|
||||||
case IMGFMT_RGB4:
|
case IMGFMT_RGB4:
|
||||||
case IMGFMT_BGR4:
|
case IMGFMT_BGR4:
|
||||||
|
{
|
||||||
|
const uint8_t * const d64= dither_8x8_73 [y&7];
|
||||||
|
const uint8_t * const d128=dither_8x8_220[y&7];
|
||||||
|
YSCALE_YUV_2_RGBX_C(uint8_t)
|
||||||
|
((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 IMGFMT_RG4B:
|
||||||
|
case IMGFMT_BG4B:
|
||||||
{
|
{
|
||||||
const uint8_t * const d64= dither_8x8_73 [y&7];
|
const uint8_t * const d64= dither_8x8_73 [y&7];
|
||||||
const uint8_t * const d128=dither_8x8_220[y&7];
|
const uint8_t * const d128=dither_8x8_220[y&7];
|
||||||
|
@ -608,6 +608,118 @@ static void yuv2rgb_c_4 (uint8_t * py_1, uint8_t * py_2,
|
|||||||
dst_1 = _dst_1;
|
dst_1 = _dst_1;
|
||||||
dst_2 = _dst_2;
|
dst_2 = _dst_2;
|
||||||
|
|
||||||
|
while (h_size--) {
|
||||||
|
int acc;
|
||||||
|
#define DST1_4(i) \
|
||||||
|
Y = py_1[2*i]; \
|
||||||
|
acc = r[Y] + g[Y] + b[Y]; \
|
||||||
|
Y = py_1[2*i+1]; \
|
||||||
|
acc |= (r[Y] + g[Y] + b[Y])<<4;\
|
||||||
|
dst_1[i] = acc;
|
||||||
|
|
||||||
|
#define DST2_4(i) \
|
||||||
|
Y = py_2[2*i]; \
|
||||||
|
acc = r[Y] + g[Y] + b[Y]; \
|
||||||
|
Y = py_2[2*i+1]; \
|
||||||
|
acc |= (r[Y] + g[Y] + b[Y])<<4;\
|
||||||
|
dst_2[i] = acc;
|
||||||
|
|
||||||
|
RGB(0);
|
||||||
|
DST1_4(0);
|
||||||
|
DST2_4(0);
|
||||||
|
|
||||||
|
RGB(1);
|
||||||
|
DST2_4(1);
|
||||||
|
DST1_4(1);
|
||||||
|
|
||||||
|
RGB(2);
|
||||||
|
DST1_4(2);
|
||||||
|
DST2_4(2);
|
||||||
|
|
||||||
|
RGB(3);
|
||||||
|
DST2_4(3);
|
||||||
|
DST1_4(3);
|
||||||
|
|
||||||
|
pu += 4;
|
||||||
|
pv += 4;
|
||||||
|
py_1 += 8;
|
||||||
|
py_2 += 8;
|
||||||
|
dst_1 += 4;
|
||||||
|
dst_2 += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void yuv2rgb_c_4_ordered_dither (uint8_t * py_1, uint8_t * py_2,
|
||||||
|
uint8_t * pu, uint8_t * pv,
|
||||||
|
void * _dst_1, void * _dst_2, int h_size, int v_pos)
|
||||||
|
{
|
||||||
|
int U, V, Y;
|
||||||
|
uint8_t * r, * g, * b;
|
||||||
|
uint8_t * dst_1, * dst_2;
|
||||||
|
|
||||||
|
h_size >>= 3;
|
||||||
|
dst_1 = _dst_1;
|
||||||
|
dst_2 = _dst_2;
|
||||||
|
|
||||||
|
while (h_size--) {
|
||||||
|
const uint8_t *d64= dither_8x8_73[v_pos&7];
|
||||||
|
const uint8_t *d128=dither_8x8_220[v_pos&7];
|
||||||
|
int acc;
|
||||||
|
|
||||||
|
#define DST1bpp4(i,o) \
|
||||||
|
Y = py_1[2*i]; \
|
||||||
|
acc = r[Y+d128[0+o]] + g[Y+d64[0+o]] + b[Y+d128[0+o]]; \
|
||||||
|
Y = py_1[2*i+1]; \
|
||||||
|
acc |= (r[Y+d128[1+o]] + g[Y+d64[1+o]] + b[Y+d128[1+o]])<<4;\
|
||||||
|
dst_1[i]= acc;
|
||||||
|
|
||||||
|
#define DST2bpp4(i,o) \
|
||||||
|
Y = py_2[2*i]; \
|
||||||
|
acc = r[Y+d128[8+o]] + g[Y+d64[8+o]] + b[Y+d128[8+o]]; \
|
||||||
|
Y = py_2[2*i+1]; \
|
||||||
|
acc |= (r[Y+d128[9+o]] + g[Y+d64[9+o]] + b[Y+d128[9+o]])<<4;\
|
||||||
|
dst_2[i]= acc;
|
||||||
|
|
||||||
|
|
||||||
|
RGB(0);
|
||||||
|
DST1bpp4(0,0);
|
||||||
|
DST2bpp4(0,0);
|
||||||
|
|
||||||
|
RGB(1);
|
||||||
|
DST2bpp4(1,2);
|
||||||
|
DST1bpp4(1,2);
|
||||||
|
|
||||||
|
RGB(2);
|
||||||
|
DST1bpp4(2,4);
|
||||||
|
DST2bpp4(2,4);
|
||||||
|
|
||||||
|
RGB(3);
|
||||||
|
DST2bpp4(3,6);
|
||||||
|
DST1bpp4(3,6);
|
||||||
|
|
||||||
|
pu += 4;
|
||||||
|
pv += 4;
|
||||||
|
py_1 += 8;
|
||||||
|
py_2 += 8;
|
||||||
|
dst_1 += 4;
|
||||||
|
dst_2 += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is exactly the same code as yuv2rgb_c_32 except for the types of
|
||||||
|
// r, g, b, dst_1, dst_2
|
||||||
|
static void yuv2rgb_c_4b (uint8_t * py_1, uint8_t * py_2,
|
||||||
|
uint8_t * pu, uint8_t * pv,
|
||||||
|
void * _dst_1, void * _dst_2, int h_size, int v_pos)
|
||||||
|
{
|
||||||
|
int U, V, Y;
|
||||||
|
uint8_t * r, * g, * b;
|
||||||
|
uint8_t * dst_1, * dst_2;
|
||||||
|
|
||||||
|
h_size >>= 3;
|
||||||
|
dst_1 = _dst_1;
|
||||||
|
dst_2 = _dst_2;
|
||||||
|
|
||||||
while (h_size--) {
|
while (h_size--) {
|
||||||
RGB(0);
|
RGB(0);
|
||||||
DST1(0);
|
DST1(0);
|
||||||
@ -634,7 +746,7 @@ static void yuv2rgb_c_4 (uint8_t * py_1, uint8_t * py_2,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void yuv2rgb_c_4_ordered_dither (uint8_t * py_1, uint8_t * py_2,
|
static void yuv2rgb_c_4b_ordered_dither (uint8_t * py_1, uint8_t * py_2,
|
||||||
uint8_t * pu, uint8_t * pv,
|
uint8_t * pu, uint8_t * pv,
|
||||||
void * _dst_1, void * _dst_2, int h_size, int v_pos)
|
void * _dst_1, void * _dst_2, int h_size, int v_pos)
|
||||||
{
|
{
|
||||||
@ -650,13 +762,13 @@ static void yuv2rgb_c_4_ordered_dither (uint8_t * py_1, uint8_t * py_2,
|
|||||||
const uint8_t *d64= dither_8x8_73[v_pos&7];
|
const uint8_t *d64= dither_8x8_73[v_pos&7];
|
||||||
const uint8_t *d128=dither_8x8_220[v_pos&7];
|
const uint8_t *d128=dither_8x8_220[v_pos&7];
|
||||||
|
|
||||||
#define DST1bpp4(i,o) \
|
#define DST1bpp4b(i,o) \
|
||||||
Y = py_1[2*i]; \
|
Y = py_1[2*i]; \
|
||||||
dst_1[2*i] = r[Y+d128[0+o]] + g[Y+d64[0+o]] + b[Y+d128[0+o]]; \
|
dst_1[2*i] = r[Y+d128[0+o]] + g[Y+d64[0+o]] + b[Y+d128[0+o]]; \
|
||||||
Y = py_1[2*i+1]; \
|
Y = py_1[2*i+1]; \
|
||||||
dst_1[2*i+1] = r[Y+d128[1+o]] + g[Y+d64[1+o]] + b[Y+d128[1+o]];
|
dst_1[2*i+1] = r[Y+d128[1+o]] + g[Y+d64[1+o]] + b[Y+d128[1+o]];
|
||||||
|
|
||||||
#define DST2bpp4(i,o) \
|
#define DST2bpp4b(i,o) \
|
||||||
Y = py_2[2*i]; \
|
Y = py_2[2*i]; \
|
||||||
dst_2[2*i] = r[Y+d128[8+o]] + g[Y+d64[8+o]] + b[Y+d128[8+o]]; \
|
dst_2[2*i] = r[Y+d128[8+o]] + g[Y+d64[8+o]] + b[Y+d128[8+o]]; \
|
||||||
Y = py_2[2*i+1]; \
|
Y = py_2[2*i+1]; \
|
||||||
@ -664,20 +776,20 @@ static void yuv2rgb_c_4_ordered_dither (uint8_t * py_1, uint8_t * py_2,
|
|||||||
|
|
||||||
|
|
||||||
RGB(0);
|
RGB(0);
|
||||||
DST1bpp4(0,0);
|
DST1bpp4b(0,0);
|
||||||
DST2bpp4(0,0);
|
DST2bpp4b(0,0);
|
||||||
|
|
||||||
RGB(1);
|
RGB(1);
|
||||||
DST2bpp4(1,2);
|
DST2bpp4b(1,2);
|
||||||
DST1bpp4(1,2);
|
DST1bpp4b(1,2);
|
||||||
|
|
||||||
RGB(2);
|
RGB(2);
|
||||||
DST1bpp4(2,4);
|
DST1bpp4b(2,4);
|
||||||
DST2bpp4(2,4);
|
DST2bpp4b(2,4);
|
||||||
|
|
||||||
RGB(3);
|
RGB(3);
|
||||||
DST2bpp4(3,6);
|
DST2bpp4b(3,6);
|
||||||
DST1bpp4(3,6);
|
DST1bpp4b(3,6);
|
||||||
|
|
||||||
pu += 4;
|
pu += 4;
|
||||||
pv += 4;
|
pv += 4;
|
||||||
@ -879,7 +991,11 @@ void *yuv2rgb_c_init (unsigned bpp, int mode, void *table_rV[256], void *table_g
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
yuv2rgb_c_internal = yuv2rgb_c_4_ordered_dither; //yuv2rgb_c_4;
|
case 4|128:
|
||||||
|
if(bpp==4)
|
||||||
|
yuv2rgb_c_internal = yuv2rgb_c_4_ordered_dither; //yuv2rgb_c_4;
|
||||||
|
else
|
||||||
|
yuv2rgb_c_internal = yuv2rgb_c_4b_ordered_dither; //yuv2rgb_c_4;
|
||||||
|
|
||||||
table_start= table_121 = malloc ((197 + 2*682 + 256 + 132) * sizeof (uint8_t));
|
table_start= table_121 = malloc ((197 + 2*682 + 256 + 132) * sizeof (uint8_t));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user