⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 swscale.c

📁 uclinux 下的vlc播放器源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
				((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+= ABS(last_new[y][i] - new);\				error_in3+= ABS(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 IMGFMT_YUY2:\		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 IMGFMT_UYVY:\		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 IMGFMT_RGB32:	case IMGFMT_BGR32:		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 IMGFMT_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 IMGFMT_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 IMGFMT_RGB16:	case IMGFMT_BGR16:		{			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 IMGFMT_RGB15:	case IMGFMT_BGR15:		{			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];			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 IMGFMT_RGB8:	case IMGFMT_BGR8:		{			const uint8_t * const d64= dither_8x8_73[y&7];			const uint8_t * const d32= dither_8x8_32[y&7];			YSCALE_YUV_2_RGBX_C(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 IMGFMT_RGB4:	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 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]];			}		}		break;	case IMGFMT_RGB1:	case IMGFMT_BGR1:		{			const uint8_t * const d128=dither_8x8_220[y&7];			uint8_t *g= c->table_gU[128] + c->table_gV[128];			int acc=0;			for(i=0; i<dstW-1; i+=2){				int j;				int Y1=1<<18;				int Y2=1<<18;				for(j=0; j<lumFilterSize; j++)				{					Y1 += lumSrc[j][i] * lumFilter[j];					Y2 += lumSrc[j][i+1] * lumFilter[j];				}				Y1>>=19;				Y2>>=19;				if((Y1|Y2)&256)				{					if(Y1>255)   Y1=255;					else if(Y1<0)Y1=0;					if(Y2>255)   Y2=255;					else if(Y2<0)Y2=0;				}				acc+= acc + g[Y1+d128[(i+0)&7]];				acc+= acc + g[Y2+d128[(i+1)&7]];				if((i&7)==6){					((uint8_t*)dest)[0]= acc;					dest++;				}			}		}		break;	case IMGFMT_YUY2:		YSCALE_YUV_2_PACKEDX_C(void)			((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 IMGFMT_UYVY:		YSCALE_YUV_2_PACKEDX_C(void)			((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;	}}//Note: we have C, X86, MMX, MMX2, 3DNOW version therse no 3DNOW+MMX2 one//Plain C versions#if !defined (HAVE_MMX) || defined (RUNTIME_CPUDETECT)#define COMPILE_C#endif#ifdef ARCH_POWERPC#ifdef HAVE_ALTIVEC#define COMPILE_ALTIVEC#endif //HAVE_ALTIVEC#endif //ARCH_POWERPC#ifdef ARCH_X86#if (defined (HAVE_MMX) && !defined (HAVE_3DNOW) && !defined (HAVE_MMX2)) || defined (RUNTIME_CPUDETECT)#define COMPILE_MMX#endif#if defined (HAVE_MMX2) || defined (RUNTIME_CPUDETECT)#define COMPILE_MMX2#endif#if (defined (HAVE_3DNOW) && !defined (HAVE_MMX2)) || defined (RUNTIME_CPUDETECT)#define COMPILE_3DNOW#endif#endif //ARCH_X86#undef HAVE_MMX#undef HAVE_MMX2#undef HAVE_3DNOW#ifdef COMPILE_C#undef HAVE_MMX#undef HAVE_MMX2#undef HAVE_3DNOW#undef HAVE_ALTIVEC#define RENAME(a) a ## _C#include "swscale_template.c"#endif#ifdef ARCH_POWERPC#ifdef COMPILE_ALTIVEC#undef RENAME#define HAVE_ALTIVEC#define RENAME(a) a ## _altivec#include "swscale_template.c"#endif#endif //ARCH_POWERPC#ifdef ARCH_X86//X86 versions/*#undef RENAME#undef HAVE_MMX#undef HAVE_MMX2#undef HAVE_3DNOW#define ARCH_X86#define RENAME(a) a ## _X86#include "swscale_template.c"*///MMX versions#ifdef COMPILE_MMX#undef RENAME#define HAVE_MMX#undef HAVE_MMX2#undef HAVE_3DNOW#define RENAME(a) a ## _MMX#include "swscale_template.c"#endif//MMX2 versions#ifdef COMPILE_MMX2#undef RENAME#define HAVE_MMX#define HAVE_MMX2#undef HAVE_3DNOW#define RENAME(a) a ## _MMX2#include "swscale_template.c"#endif//3DNOW versions#ifdef COMPILE_3DNOW#undef RENAME#define HAVE_MMX#undef HAVE_MMX2#define HAVE_3DNOW#define RENAME(a) a ## _3DNow#include "swscale_template.c"#endif#endif //ARCH_X86// minor note: the HAVE_xyz is messed up after that line so don't use itstatic double getSplineCoeff(double a, double b, double c, double d, double dist){//	printf("%f %f %f %f %f\n", a,b,c,d,dist);	if(dist<=1.0) 	return ((d*dist + c)*dist + b)*dist +a;	else		return getSplineCoeff(	0.0, 						 b+ 2.0*c + 3.0*d,						        c + 3.0*d,						-b- 3.0*c - 6.0*d,						dist-1.0);}static inline void initFilter(int16_t **outFilter, int16_t **filterPos, int *outFilterSize, int xInc,			      int srcW, int dstW, int filterAlign, int one, int flags,			      SwsVector *srcFilter, SwsVector *dstFilter){	int i;	int filterSize;	int filter2Size;	int minFilterSize;	double *filter=NULL;	double *filter2=NULL;#ifdef ARCH_X86	if(flags & SWS_CPU_CAPS_MMX)		asm volatile("emms\n\t"::: "memory"); //FIXME this shouldnt be required but it IS (even for non mmx versions)#endif	// Note the +1 is for the MMXscaler which reads over the end	*filterPos = (int16_t*)memalign(8, (dstW+1)*sizeof(int16_t));	if(ABS(xInc - 0x10000) <10) // unscaled	{		int i;		filterSize= 1;		filter= (double*)memalign(8, dstW*sizeof(double)*filterSize);		for(i=0; i<dstW*filterSize; i++) filter[i]=0;		for(i=0; i<dstW; i++)		{			filter[i*filterSize]=1;			(*filterPos)[i]=i;		}	}	else if(flags&SWS_POINT) // lame looking point sampling mode	{		int i;		int xDstInSrc;		filterSize= 1;		filter= (double*)memalign(8, dstW*sizeof(double)*filterSize);				xDstInSrc= xInc/2 - 0x8000;		for(i=0; i<dstW; i++)		{			int xx= (xDstInSrc - ((filterSize-1)<<15) + (1<<15))>>16;			(*filterPos)[i]= xx;			filter[i]= 1.0;			xDstInSrc+= xInc;		}	}	else if((xInc <= (1<<16) && (flags&SWS_AREA)) || (flags&SWS_FAST_BILINEAR)) // bilinear upscale	{		int i;		int xDstInSrc;		if     (flags&SWS_BICUBIC) filterSize= 4;		else if(flags&SWS_X      ) filterSize= 4;		else			   filterSize= 2; // SWS_BILINEAR / SWS_AREA 		filter= (double*)memalign(8, dstW*sizeof(double)*filterSize);		xDstInSrc= xInc/2 - 0x8000;		for(i=0; i<dstW; i++)		{			int xx= (xDstInSrc - ((filterSize-1)<<15) + (1<<15))>>16;			int j;			(*filterPos)[i]= xx;				//Bilinear upscale / linear interpolate / Area averaging				for(j=0; j<filterSize; j++)				{					double d= ABS((xx<<16) - xDstInSrc)/(double)(1<<16);					double coeff= 1.0 - d;					if(coeff<0) coeff=0;					filter[i*filterSize + j]= coeff;					xx++;				}			xDstInSrc+= xInc;		}	}	else	{		double xDstInSrc;		double sizeFactor, filterSizeInSrc;		const double xInc1= (double)xInc / (double)(1<<16);		int param= (flags&SWS_PARAM_MASK)>>SWS_PARAM_SHIFT;		if     (flags&SWS_BICUBIC)	sizeFactor= 4.0;		else if(flags&SWS_X)		sizeFactor= 8.0;		else if(flags&SWS_AREA)		sizeFactor= 1.0; //downscale only, for upscale it is bilinear		else if(flags&SWS_GAUSS)	sizeFactor= 8.0;   // infinite ;)		else if(flags&SWS_LANCZOS)	sizeFactor= param ? 2.0*param : 6.0;		else if(flags&SWS_SINC)		sizeFactor= 20.0; // infinite ;)		else if(flags&SWS_SPLINE)	sizeFactor= 20.0;  // infinite ;)		else if(flags&SWS_BILINEAR)	sizeFactor= 2.0;		else {			sizeFactor= 0.0; //GCC warning killer			ASSERT(0)		}				if(xInc1 <= 1.0)	filterSizeInSrc= sizeFactor; // upscale		else			filterSizeInSrc= sizeFactor*srcW / (double)dstW;		filterSize= (int)ceil(1 + filterSizeInSrc); // will be reduced later if possible		if(filterSize > srcW-2) filterSize=srcW-2;		filter= (double*)memalign(16, dstW*sizeof(double)*filterSize);		xDstInSrc= xInc1 / 2.0 - 0.5;		for(i=0; i<dstW; i++)		{			int xx= (int)(xDstInSrc - (filterSize-1)*0.5 + 0.5);			int j;			(*filterPos)[i]= xx;			for(j=0; j<filterSize; j++)			{				double d= ABS(xx - xDstInSrc)/filterSizeInSrc*sizeFactor;				double coeff;				if(flags & SWS_BICUBIC)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -