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

📄 swscale_template.c

📁 uclinux 下的vlc播放器源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
		"paddw %%mm2, %%mm3		\n\t" /* uvbuf0[eax] + uvbuf1[eax]*/\		"paddw %%mm5, %%mm4		\n\t" /* uvbuf0[eax+2048] + uvbuf1[eax+2048]*/\		"psrlw $5, %%mm3		\n\t" /*FIXME might overflow*/\		"psrlw $5, %%mm4		\n\t" /*FIXME might overflow*/\		"psubw "U_OFFSET"("#c"), %%mm3	\n\t" /* (U-128)8*/\		"psubw "V_OFFSET"("#c"), %%mm4	\n\t" /* (V-128)8*/\		"movq %%mm3, %%mm2		\n\t" /* (U-128)8*/\		"movq %%mm4, %%mm5		\n\t" /* (V-128)8*/\		"pmulhw "UG_COEFF"("#c"), %%mm3\n\t"\		"pmulhw "VG_COEFF"("#c"), %%mm4\n\t"\	/* mm2=(U-128)8, mm3=ug, mm4=vg mm5=(V-128)8 */\		"movq (%0, "#index", 2), %%mm1	\n\t" /*buf0[eax]*/\		"movq 8(%0, "#index", 2), %%mm7	\n\t" /*buf0[eax]*/\		"psraw $4, %%mm1		\n\t" /* buf0[eax] - buf1[eax] >>4*/\		"psraw $4, %%mm7		\n\t" /* buf0[eax] - buf1[eax] >>4*/\		"pmulhw "UB_COEFF"("#c"), %%mm2\n\t"\		"pmulhw "VR_COEFF"("#c"), %%mm5\n\t"\		"psubw "Y_OFFSET"("#c"), %%mm1	\n\t" /* 8(Y-16)*/\		"psubw "Y_OFFSET"("#c"), %%mm7	\n\t" /* 8(Y-16)*/\		"pmulhw "Y_COEFF"("#c"), %%mm1	\n\t"\		"pmulhw "Y_COEFF"("#c"), %%mm7	\n\t"\	/* mm1= Y1, mm2=ub, mm3=ug, mm4=vg mm5=vr, mm7=Y2 */\		"paddw %%mm3, %%mm4		\n\t"\		"movq %%mm2, %%mm0		\n\t"\		"movq %%mm5, %%mm6		\n\t"\		"movq %%mm4, %%mm3		\n\t"\		"punpcklwd %%mm2, %%mm2		\n\t"\		"punpcklwd %%mm5, %%mm5		\n\t"\		"punpcklwd %%mm4, %%mm4		\n\t"\		"paddw %%mm1, %%mm2		\n\t"\		"paddw %%mm1, %%mm5		\n\t"\		"paddw %%mm1, %%mm4		\n\t"\		"punpckhwd %%mm0, %%mm0		\n\t"\		"punpckhwd %%mm6, %%mm6		\n\t"\		"punpckhwd %%mm3, %%mm3		\n\t"\		"paddw %%mm7, %%mm0		\n\t"\		"paddw %%mm7, %%mm6		\n\t"\		"paddw %%mm7, %%mm3		\n\t"\		/* mm0=B1, mm2=B2, mm3=G2, mm4=G1, mm5=R1, mm6=R2 */\		"packuswb %%mm0, %%mm2		\n\t"\		"packuswb %%mm6, %%mm5		\n\t"\		"packuswb %%mm3, %%mm4		\n\t"\		"pxor %%mm7, %%mm7		\n\t"#define WRITEBGR32(dst, dstw, index) \		/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */\			"movq %%mm2, %%mm1		\n\t" /* B */\			"movq %%mm5, %%mm6		\n\t" /* R */\			"punpcklbw %%mm4, %%mm2		\n\t" /* GBGBGBGB 0 */\			"punpcklbw %%mm7, %%mm5		\n\t" /* 0R0R0R0R 0 */\			"punpckhbw %%mm4, %%mm1		\n\t" /* GBGBGBGB 2 */\			"punpckhbw %%mm7, %%mm6		\n\t" /* 0R0R0R0R 2 */\			"movq %%mm2, %%mm0		\n\t" /* GBGBGBGB 0 */\			"movq %%mm1, %%mm3		\n\t" /* GBGBGBGB 2 */\			"punpcklwd %%mm5, %%mm0		\n\t" /* 0RGB0RGB 0 */\			"punpckhwd %%mm5, %%mm2		\n\t" /* 0RGB0RGB 1 */\			"punpcklwd %%mm6, %%mm1		\n\t" /* 0RGB0RGB 2 */\			"punpckhwd %%mm6, %%mm3		\n\t" /* 0RGB0RGB 3 */\\			MOVNTQ(%%mm0, (dst, index, 4))\			MOVNTQ(%%mm2, 8(dst, index, 4))\			MOVNTQ(%%mm1, 16(dst, index, 4))\			MOVNTQ(%%mm3, 24(dst, index, 4))\\			"addl $8, "#index"		\n\t"\			"cmpl "#dstw", "#index"		\n\t"\			" jb 1b				\n\t"#define WRITEBGR16(dst, dstw, index) \			"pand "MANGLE(bF8)", %%mm2	\n\t" /* B */\			"pand "MANGLE(bFC)", %%mm4	\n\t" /* G */\			"pand "MANGLE(bF8)", %%mm5	\n\t" /* R */\			"psrlq $3, %%mm2		\n\t"\\			"movq %%mm2, %%mm1		\n\t"\			"movq %%mm4, %%mm3		\n\t"\\			"punpcklbw %%mm7, %%mm3		\n\t"\			"punpcklbw %%mm5, %%mm2		\n\t"\			"punpckhbw %%mm7, %%mm4		\n\t"\			"punpckhbw %%mm5, %%mm1		\n\t"\\			"psllq $3, %%mm3		\n\t"\			"psllq $3, %%mm4		\n\t"\\			"por %%mm3, %%mm2		\n\t"\			"por %%mm4, %%mm1		\n\t"\\			MOVNTQ(%%mm2, (dst, index, 2))\			MOVNTQ(%%mm1, 8(dst, index, 2))\\			"addl $8, "#index"		\n\t"\			"cmpl "#dstw", "#index"		\n\t"\			" jb 1b				\n\t"#define WRITEBGR15(dst, dstw, index) \			"pand "MANGLE(bF8)", %%mm2	\n\t" /* B */\			"pand "MANGLE(bF8)", %%mm4	\n\t" /* G */\			"pand "MANGLE(bF8)", %%mm5	\n\t" /* R */\			"psrlq $3, %%mm2		\n\t"\			"psrlq $1, %%mm5		\n\t"\\			"movq %%mm2, %%mm1		\n\t"\			"movq %%mm4, %%mm3		\n\t"\\			"punpcklbw %%mm7, %%mm3		\n\t"\			"punpcklbw %%mm5, %%mm2		\n\t"\			"punpckhbw %%mm7, %%mm4		\n\t"\			"punpckhbw %%mm5, %%mm1		\n\t"\\			"psllq $2, %%mm3		\n\t"\			"psllq $2, %%mm4		\n\t"\\			"por %%mm3, %%mm2		\n\t"\			"por %%mm4, %%mm1		\n\t"\\			MOVNTQ(%%mm2, (dst, index, 2))\			MOVNTQ(%%mm1, 8(dst, index, 2))\\			"addl $8, "#index"		\n\t"\			"cmpl "#dstw", "#index"		\n\t"\			" jb 1b				\n\t"#define WRITEBGR24OLD(dst, dstw, index) \		/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */\			"movq %%mm2, %%mm1		\n\t" /* B */\			"movq %%mm5, %%mm6		\n\t" /* R */\			"punpcklbw %%mm4, %%mm2		\n\t" /* GBGBGBGB 0 */\			"punpcklbw %%mm7, %%mm5		\n\t" /* 0R0R0R0R 0 */\			"punpckhbw %%mm4, %%mm1		\n\t" /* GBGBGBGB 2 */\			"punpckhbw %%mm7, %%mm6		\n\t" /* 0R0R0R0R 2 */\			"movq %%mm2, %%mm0		\n\t" /* GBGBGBGB 0 */\			"movq %%mm1, %%mm3		\n\t" /* GBGBGBGB 2 */\			"punpcklwd %%mm5, %%mm0		\n\t" /* 0RGB0RGB 0 */\			"punpckhwd %%mm5, %%mm2		\n\t" /* 0RGB0RGB 1 */\			"punpcklwd %%mm6, %%mm1		\n\t" /* 0RGB0RGB 2 */\			"punpckhwd %%mm6, %%mm3		\n\t" /* 0RGB0RGB 3 */\\			"movq %%mm0, %%mm4		\n\t" /* 0RGB0RGB 0 */\			"psrlq $8, %%mm0		\n\t" /* 00RGB0RG 0 */\			"pand "MANGLE(bm00000111)", %%mm4\n\t" /* 00000RGB 0 */\			"pand "MANGLE(bm11111000)", %%mm0\n\t" /* 00RGB000 0.5 */\			"por %%mm4, %%mm0		\n\t" /* 00RGBRGB 0 */\			"movq %%mm2, %%mm4		\n\t" /* 0RGB0RGB 1 */\			"psllq $48, %%mm2		\n\t" /* GB000000 1 */\			"por %%mm2, %%mm0		\n\t" /* GBRGBRGB 0 */\\			"movq %%mm4, %%mm2		\n\t" /* 0RGB0RGB 1 */\			"psrld $16, %%mm4		\n\t" /* 000R000R 1 */\			"psrlq $24, %%mm2		\n\t" /* 0000RGB0 1.5 */\			"por %%mm4, %%mm2		\n\t" /* 000RRGBR 1 */\			"pand "MANGLE(bm00001111)", %%mm2\n\t" /* 0000RGBR 1 */\			"movq %%mm1, %%mm4		\n\t" /* 0RGB0RGB 2 */\			"psrlq $8, %%mm1		\n\t" /* 00RGB0RG 2 */\			"pand "MANGLE(bm00000111)", %%mm4\n\t" /* 00000RGB 2 */\			"pand "MANGLE(bm11111000)", %%mm1\n\t" /* 00RGB000 2.5 */\			"por %%mm4, %%mm1		\n\t" /* 00RGBRGB 2 */\			"movq %%mm1, %%mm4		\n\t" /* 00RGBRGB 2 */\			"psllq $32, %%mm1		\n\t" /* BRGB0000 2 */\			"por %%mm1, %%mm2		\n\t" /* BRGBRGBR 1 */\\			"psrlq $32, %%mm4		\n\t" /* 000000RG 2.5 */\			"movq %%mm3, %%mm5		\n\t" /* 0RGB0RGB 3 */\			"psrlq $8, %%mm3		\n\t" /* 00RGB0RG 3 */\			"pand "MANGLE(bm00000111)", %%mm5\n\t" /* 00000RGB 3 */\			"pand "MANGLE(bm11111000)", %%mm3\n\t" /* 00RGB000 3.5 */\			"por %%mm5, %%mm3		\n\t" /* 00RGBRGB 3 */\			"psllq $16, %%mm3		\n\t" /* RGBRGB00 3 */\			"por %%mm4, %%mm3		\n\t" /* RGBRGBRG 2.5 */\\			MOVNTQ(%%mm0, (dst))\			MOVNTQ(%%mm2, 8(dst))\			MOVNTQ(%%mm3, 16(dst))\			"addl $24, "#dst"		\n\t"\\			"addl $8, "#index"		\n\t"\			"cmpl "#dstw", "#index"		\n\t"\			" jb 1b				\n\t"#define WRITEBGR24MMX(dst, dstw, index) \		/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */\			"movq %%mm2, %%mm1		\n\t" /* B */\			"movq %%mm5, %%mm6		\n\t" /* R */\			"punpcklbw %%mm4, %%mm2		\n\t" /* GBGBGBGB 0 */\			"punpcklbw %%mm7, %%mm5		\n\t" /* 0R0R0R0R 0 */\			"punpckhbw %%mm4, %%mm1		\n\t" /* GBGBGBGB 2 */\			"punpckhbw %%mm7, %%mm6		\n\t" /* 0R0R0R0R 2 */\			"movq %%mm2, %%mm0		\n\t" /* GBGBGBGB 0 */\			"movq %%mm1, %%mm3		\n\t" /* GBGBGBGB 2 */\			"punpcklwd %%mm5, %%mm0		\n\t" /* 0RGB0RGB 0 */\			"punpckhwd %%mm5, %%mm2		\n\t" /* 0RGB0RGB 1 */\			"punpcklwd %%mm6, %%mm1		\n\t" /* 0RGB0RGB 2 */\			"punpckhwd %%mm6, %%mm3		\n\t" /* 0RGB0RGB 3 */\\			"movq %%mm0, %%mm4		\n\t" /* 0RGB0RGB 0 */\			"movq %%mm2, %%mm6		\n\t" /* 0RGB0RGB 1 */\			"movq %%mm1, %%mm5		\n\t" /* 0RGB0RGB 2 */\			"movq %%mm3, %%mm7		\n\t" /* 0RGB0RGB 3 */\\			"psllq $40, %%mm0		\n\t" /* RGB00000 0 */\			"psllq $40, %%mm2		\n\t" /* RGB00000 1 */\			"psllq $40, %%mm1		\n\t" /* RGB00000 2 */\			"psllq $40, %%mm3		\n\t" /* RGB00000 3 */\\			"punpckhdq %%mm4, %%mm0		\n\t" /* 0RGBRGB0 0 */\			"punpckhdq %%mm6, %%mm2		\n\t" /* 0RGBRGB0 1 */\			"punpckhdq %%mm5, %%mm1		\n\t" /* 0RGBRGB0 2 */\			"punpckhdq %%mm7, %%mm3		\n\t" /* 0RGBRGB0 3 */\\			"psrlq $8, %%mm0		\n\t" /* 00RGBRGB 0 */\			"movq %%mm2, %%mm6		\n\t" /* 0RGBRGB0 1 */\			"psllq $40, %%mm2		\n\t" /* GB000000 1 */\			"por %%mm2, %%mm0		\n\t" /* GBRGBRGB 0 */\			MOVNTQ(%%mm0, (dst))\\			"psrlq $24, %%mm6		\n\t" /* 0000RGBR 1 */\			"movq %%mm1, %%mm5		\n\t" /* 0RGBRGB0 2 */\			"psllq $24, %%mm1		\n\t" /* BRGB0000 2 */\			"por %%mm1, %%mm6		\n\t" /* BRGBRGBR 1 */\			MOVNTQ(%%mm6, 8(dst))\\			"psrlq $40, %%mm5		\n\t" /* 000000RG 2 */\			"psllq $8, %%mm3		\n\t" /* RGBRGB00 3 */\			"por %%mm3, %%mm5		\n\t" /* RGBRGBRG 2 */\			MOVNTQ(%%mm5, 16(dst))\\			"addl $24, "#dst"		\n\t"\\			"addl $8, "#index"			\n\t"\			"cmpl "#dstw", "#index"			\n\t"\			" jb 1b				\n\t"#define WRITEBGR24MMX2(dst, dstw, index) \		/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */\			"movq "MANGLE(M24A)", %%mm0	\n\t"\			"movq "MANGLE(M24C)", %%mm7	\n\t"\			"pshufw $0x50, %%mm2, %%mm1	\n\t" /* B3 B2 B3 B2  B1 B0 B1 B0 */\			"pshufw $0x50, %%mm4, %%mm3	\n\t" /* G3 G2 G3 G2  G1 G0 G1 G0 */\			"pshufw $0x00, %%mm5, %%mm6	\n\t" /* R1 R0 R1 R0  R1 R0 R1 R0 */\\			"pand %%mm0, %%mm1		\n\t" /*    B2        B1       B0 */\			"pand %%mm0, %%mm3		\n\t" /*    G2        G1       G0 */\			"pand %%mm7, %%mm6		\n\t" /*       R1        R0       */\\			"psllq $8, %%mm3		\n\t" /* G2        G1       G0    */\			"por %%mm1, %%mm6		\n\t"\			"por %%mm3, %%mm6		\n\t"\			MOVNTQ(%%mm6, (dst))\\			"psrlq $8, %%mm4		\n\t" /* 00 G7 G6 G5  G4 G3 G2 G1 */\			"pshufw $0xA5, %%mm2, %%mm1	\n\t" /* B5 B4 B5 B4  B3 B2 B3 B2 */\			"pshufw $0x55, %%mm4, %%mm3	\n\t" /* G4 G3 G4 G3  G4 G3 G4 G3 */\			"pshufw $0xA5, %%mm5, %%mm6	\n\t" /* R5 R4 R5 R4  R3 R2 R3 R2 */\\			"pand "MANGLE(M24B)", %%mm1	\n\t" /* B5       B4        B3    */\			"pand %%mm7, %%mm3		\n\t" /*       G4        G3       */\			"pand %%mm0, %%mm6		\n\t" /*    R4        R3       R2 */\\			"por %%mm1, %%mm3		\n\t" /* B5    G4 B4     G3 B3    */\			"por %%mm3, %%mm6		\n\t"\			MOVNTQ(%%mm6, 8(dst))\\			"pshufw $0xFF, %%mm2, %%mm1	\n\t" /* B7 B6 B7 B6  B7 B6 B6 B7 */\			"pshufw $0xFA, %%mm4, %%mm3	\n\t" /* 00 G7 00 G7  G6 G5 G6 G5 */\			"pshufw $0xFA, %%mm5, %%mm6	\n\t" /* R7 R6 R7 R6  R5 R4 R5 R4 */\\			"pand %%mm7, %%mm1		\n\t" /*       B7        B6       */\			"pand %%mm0, %%mm3		\n\t" /*    G7        G6       G5 */\			"pand "MANGLE(M24B)", %%mm6	\n\t" /* R7       R6        R5    */\\			"por %%mm1, %%mm3		\n\t"\			"por %%mm3, %%mm6		\n\t"\			MOVNTQ(%%mm6, 16(dst))\\			"addl $24, "#dst"		\n\t"\\			"addl $8, "#index"		\n\t"\			"cmpl "#dstw", "#index"		\n\t"\			" jb 1b				\n\t"#ifdef HAVE_MMX2#undef WRITEBGR24#define WRITEBGR24 WRITEBGR24MMX2#else#undef WRITEBGR24#define WRITEBGR24 WRITEBGR24MMX#endif#define WRITEYUY2(dst, dstw, index) \			"packuswb %%mm3, %%mm3		\n\t"\			"packuswb %%mm4, %%mm4		\n\t"\			"packuswb %%mm7, %%mm1		\n\t"\			"punpcklbw %%mm4, %%mm3		\n\t"\			"movq %%mm1, %%mm7		\n\t"\			"punpcklbw %%mm3, %%mm1		\n\t"\			"punpckhbw %%mm3, %%mm7		\n\t"\\			MOVNTQ(%%mm1, (dst, index, 2))\			MOVNTQ(%%mm7, 8(dst, index, 2))\\			"addl $8, "#index"		\n\t"\			"cmpl "#dstw", "#index"		\n\t"\			" jb 1b				\n\t"static inline void RENAME(yuv2yuvX)(SwsContext *c, int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize,				    int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize,				    uint8_t *dest, uint8_t *uDest, uint8_t *vDest, int dstW, int chrDstW){#ifdef HAVE_MMX	if(uDest != NULL)	{		asm volatile(				YSCALEYUV2YV12X(0, CHR_MMX_FILTER_OFFSET)				:: "r" (&c->redDither),				"r" (uDest), "m" (chrDstW)				: "%eax", "%edx", "%esi"			);		asm volatile(				YSCALEYUV2YV12X(4096, CHR_MMX_FILTER_OFFSET)				:: "r" (&c->redDither),				"r" (vDest), "m" (chrDstW)				: "%eax", "%edx", "%esi"			);	}	asm volatile(			YSCALEYUV2YV12X(0, LUM_MMX_FILTER_OFFSET)			:: "r" (&c->redDither),			   "r" (dest), "m" (dstW)			: "%eax", "%edx", "%esi"		);#else#ifdef HAVE_ALTIVECyuv2yuvX_altivec_real(lumFilter, lumSrc, lumFilterSize,		      chrFilter, chrSrc, chrFilterSize,		      dest, uDest, vDest, dstW, chrDstW);#else //HAVE_ALTIVECyuv2yuvXinC(lumFilter, lumSrc, lumFilterSize,	    chrFilter, chrSrc, chrFilterSize,	    dest, uDest, vDest, dstW, chrDstW);#endif //!HAVE_ALTIVEC#endif}static inline void RENAME(yuv2yuv1)(int16_t *lumSrc, int16_t *chrSrc,				    uint8_t *dest, uint8_t *uDest, uint8_t *vDest, int dstW, int chrDstW){#ifdef HAVE_MMX	if(uDest != NULL)	{		asm volatile(				YSCALEYUV2YV121				:: "r" (chrSrc + chrDstW), "r" (uDest + chrDstW),				"g" (-chrDstW)				: "%eax"			);		asm volatile(				YSCALEYUV2YV121				:: "r" (chrSrc + 2048 + chrDstW), "r" (vDest + chrDstW),				"g" (-chrDstW)				: "%eax"			);	}	asm volatile(		YSCALEYUV2YV121		:: "r" (lumSrc + dstW), "r" (dest + dstW),		"g" (-dstW)		: "%eax"	);#else	int i;	for(i=0; i<dstW; i++)	{		int val= lumSrc[i]>>7;				if(val&256){			if(val<0) val=0;			else      val=255;		}		dest[i]= val;	}	if(uDest != NULL)		for(i=0; i<chrDstW; i++)		{			int u=chrSrc[i]>>7;			int v=chrSrc[i + 2048]>>7;			if((u|v)&256){				if(u<0)         u=0;				else if (u>255) u=255;				if(v<0)         v=0;				else if (v>255) v=255;			}			uDest[i]= u;			vDest[i]= v;		}#endif}/** * vertical scale YV12 to RGB */static inline void RENAME(yuv2packedX)(SwsContext *c, int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize,				    int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize,			    uint8_t *dest, int dstW, int dstY){	int dummy=0;	switch(c->dstFormat)	{#ifdef HAVE_MMX	case IMGFMT_BGR32:		{			asm volatile(				YSCALEYUV2RGBX				WRITEBGR32(%4, %5, %%eax)			:: "r" (&c->redDither), 			   "m" (dummy), "m" (dummy), "m" (dummy),			   "r" (dest), "m" (dstW)			: "%eax", "%edx", "%esi"			);		}		break;	case IMGFMT_BGR24:		{			asm volatile(				YSCALEYUV2RGBX				"leal (%%eax, %%eax, 2), %%ebx	\n\t" //FIXME optimize				"addl %4, %%ebx			\n\t"				WRITEBGR24(%%ebx, %5, %%eax)

⌨️ 快捷键说明

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