diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2003-01-30 09:15:09 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2003-01-30 09:15:09 +0000 |
commit | f17457ac4911001ac5f1c1cdc7f1d8383fd2562e (patch) | |
tree | 27d0ab688ba6c6017e76de267e5b551b20702299 /postproc | |
parent | 782c5984f130539b825ada941b600eef09552e05 (diff) | |
download | ffmpeg-f17457ac4911001ac5f1c1cdc7f1d8383fd2562e.tar.gz |
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
Diffstat (limited to 'postproc')
-rw-r--r-- | postproc/swscale.c | 22 | ||||
-rw-r--r-- | postproc/yuv2rgb.c | 140 |
2 files changed, 150 insertions, 12 deletions
diff --git a/postproc/swscale.c b/postproc/swscale.c index 9ee5b6d700..2a6a53fb61 100644 --- a/postproc/swscale.c +++ b/postproc/swscale.c @@ -587,6 +587,17 @@ static inline void yuv2yuvXinC(int16_t *lumFilter, int16_t **lumSrc, int lumFilt 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 d128=dither_8x8_220[y&7];\ + func(uint8_t)\ ((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]];\ }\ @@ -751,6 +762,17 @@ static inline void yuv2packedXinC(SwsContext *c, int16_t *lumFilter, int16_t **l 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 d128=dither_8x8_220[y&7]; + YSCALE_YUV_2_RGBX_C(uint8_t) ((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]]; } diff --git a/postproc/yuv2rgb.c b/postproc/yuv2rgb.c index cec5f3f9fb..658d8a37db 100644 --- a/postproc/yuv2rgb.c +++ b/postproc/yuv2rgb.c @@ -609,6 +609,118 @@ static void yuv2rgb_c_4 (uint8_t * py_1, uint8_t * py_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--) { RGB(0); DST1(0); DST2(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, 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 *d128=dither_8x8_220[v_pos&7]; -#define DST1bpp4(i,o) \ +#define DST1bpp4b(i,o) \ Y = py_1[2*i]; \ 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]; \ 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]; \ 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]; \ @@ -664,20 +776,20 @@ static void yuv2rgb_c_4_ordered_dither (uint8_t * py_1, uint8_t * py_2, RGB(0); - DST1bpp4(0,0); - DST2bpp4(0,0); + DST1bpp4b(0,0); + DST2bpp4b(0,0); RGB(1); - DST2bpp4(1,2); - DST1bpp4(1,2); + DST2bpp4b(1,2); + DST1bpp4b(1,2); RGB(2); - DST1bpp4(2,4); - DST2bpp4(2,4); + DST1bpp4b(2,4); + DST2bpp4b(2,4); RGB(3); - DST2bpp4(3,6); - DST1bpp4(3,6); + DST2bpp4b(3,6); + DST1bpp4b(3,6); pu += 4; pv += 4; @@ -879,7 +991,11 @@ void *yuv2rgb_c_init (unsigned bpp, int mode, void *table_rV[256], void *table_g } break; 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)); |