?? swscale.c.svn-base
字號:
v += chrSrc[j][i + VOFW] * chrFilter[j]; } uDest[i]= av_clip_uint8(u>>19); vDest[i]= av_clip_uint8(v>>19); }}static inline void yuv2nv12XinC(int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize, int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize, uint8_t *dest, uint8_t *uDest, int dstW, int chrDstW, int dstFormat){ //FIXME Optimize (just quickly writen not opti..) int i; for (i=0; i<dstW; i++) { int val=1<<18; int j; for (j=0; j<lumFilterSize; j++) val += lumSrc[j][i] * lumFilter[j]; dest[i]= av_clip_uint8(val>>19); } if (!uDest) return; if (dstFormat == PIX_FMT_NV12) for (i=0; i<chrDstW; i++) { int u=1<<18; int v=1<<18; int j; for (j=0; j<chrFilterSize; j++) { u += chrSrc[j][i] * chrFilter[j]; v += chrSrc[j][i + VOFW] * chrFilter[j]; } uDest[2*i]= av_clip_uint8(u>>19); uDest[2*i+1]= av_clip_uint8(v>>19); } else for (i=0; i<chrDstW; i++) { int u=1<<18; int v=1<<18; int j; for (j=0; j<chrFilterSize; j++) { u += chrSrc[j][i] * chrFilter[j]; v += chrSrc[j][i + VOFW] * chrFilter[j]; } uDest[2*i]= av_clip_uint8(v>>19); uDest[2*i+1]= av_clip_uint8(u>>19); }}#define YSCALE_YUV_2_PACKEDX_C(type) \ 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;\ 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 += chrSrc[j][i] * chrFilter[j];\ V += chrSrc[j][i+VOFW] * chrFilter[j];\ }\ Y1>>=19;\ Y2>>=19;\ U >>=19;\ V >>=19;\ if ((Y1|Y2|U|V)&256)\ {\ if (Y1>255) Y1=255; \ else if (Y1<0)Y1=0; \ if (Y2>255) Y2=255; \ else if (Y2<0)Y2=0; \ if (U>255) U=255; \ else if (U<0) U=0; \ if (V>255) V=255; \ else if (V<0) V=0; \ }#define YSCALE_YUV_2_RGBX_C(type) \ YSCALE_YUV_2_PACKEDX_C(type) \ 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_PACKED2_C \ 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= (uvbuf0[i ]*uvalpha1+uvbuf1[i ]*uvalpha)>>19; \ int V= (uvbuf0[i+VOFW]*uvalpha1+uvbuf1[i+VOFW]*uvalpha)>>19; \#define YSCALE_YUV_2_RGB2_C(type) \ YSCALE_YUV_2_PACKED2_C\ type *r, *b, *g;\ 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_PACKED1_C \ 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= (uvbuf1[i ])>>7;\ int V= (uvbuf1[i+VOFW])>>7;\#define YSCALE_YUV_2_RGB1_C(type) \ YSCALE_YUV_2_PACKED1_C\ type *r, *b, *g;\ 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_PACKED1B_C \ 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= (uvbuf0[i ] + uvbuf1[i ])>>8;\ int V= (uvbuf0[i+VOFW] + uvbuf1[i+VOFW])>>8;\#define YSCALE_YUV_2_RGB1B_C(type) \ YSCALE_YUV_2_PACKED1B_C\ type *r, *b, *g;\ 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, func2)\ switch(c->dstFormat)\ {\ case PIX_FMT_RGB32:\ case PIX_FMT_BGR32:\ func(uint32_t)\ ((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)\ ((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)\ ((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)\ ((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)\ ((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)\ ((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)\ ((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)\ ((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;\ case PIX_FMT_MONOBLACK:\ {\ const uint8_t * const d128=dither_8x8_220[y&7];\ uint8_t *g= c->table_gU[128] + c->table_gV[128];\ for (i=0; i<dstW-7; i+=8){\ int acc;\ 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]];\ ((uint8_t*)dest)[0]= acc;\ dest++;\ }\\/*\((uint8_t*)dest)-= dstW>>4;\{\ int acc=0;\ int left=0;\ static int top[1024];\ static int last_new[1024][1024];\ static int last_in3[1024][1024];\ static int drift[1024][1024];\ int topLeft=0;\ int shift=0;\ int count=0;\ const uint8_t * const d128=dither_8x8_220[y&7];\ int error_new=0;\ int error_in3=0;\ int f=0;\ \ for (i=dstW>>1; i<dstW; i++){\ int in= ((buf0[i ]*yalpha1+buf1[i ]*yalpha)>>19);\ int in2 = (76309 * (in - 16) + 32768) >> 16;\ int in3 = (in2 < 0) ? 0 : ((in2 > 255) ? 255 : in2);\ int old= (left*7 + topLeft + top[i]*5 + top[i+1]*3)/20 + in3\ + (last_new[y][i] - in3)*f/256;\ int new= old> 128 ? 255 : 0;\\ error_new+= FFABS(last_new[y][i] - new);\ error_in3+= FFABS(last_in3[y][i] - in3);\ f= error_new - error_in3*4;\ if (f<0) f=0;\ if (f>256) f=256;\\ topLeft= top[i];\ left= top[i]= old - new;\ last_new[y][i]= new;\ last_in3[y][i]= in3;\\ acc+= acc + (new&1);\ if ((i&7)==6){\ ((uint8_t*)dest)[0]= acc;\ ((uint8_t*)dest)++;\ }\ }\}\*/\ }\ break;\ case PIX_FMT_YUYV422:\ func2\ ((uint8_t*)dest)[2*i2+0]= Y1;\ ((uint8_t*)dest)[2*i2+1]= U;\ ((uint8_t*)dest)[2*i2+2]= Y2;\ ((uint8_t*)dest)[2*i2+3]= V;\ } \ break;\ case PIX_FMT_UYVY422:\ func2\ ((uint8_t*)dest)[2*i2+0]= U;\ ((uint8_t*)dest)[2*i2+1]= Y1;\ ((uint8_t*)dest)[2*i2+2]= V;\ ((uint8_t*)dest)[2*i2+3]= Y2;\ } \ break;\ }\static inline void yuv2packedXinC(SwsContext *c, int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize, int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize, uint8_t *dest, int dstW, int y){ int i; switch(c->dstFormat) { case PIX_FMT_BGR32: case PIX_FMT_RGB32: YSCALE_YUV_2_RGBX_C(uint32_t) ((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: YSCALE_YUV_2_RGBX_C(uint8_t) ((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: YSCALE_YUV_2_RGBX_C(uint8_t) ((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]; YSCALE_YUV_2_RGBX_C(uint16_t) ((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];
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -