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

📄 swscale_template.c

📁 uclinux 下的vlc播放器源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
			:: "r" (buf0), "r" (buf1), "r" (uvbuf0), "r" (uvbuf1), "m" (dest),			"r" (&c->redDither)			: "%eax"			);			return;		case IMGFMT_BGR15:			asm volatile(				"movl %%esp, "ESP_OFFSET"(%5)		\n\t"				"movl %4, %%esp				\n\t"				YSCALEYUV2RGB1(%%eax, %5)		/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */#ifdef DITHER1XBPP				"paddusb "MANGLE(b5Dither)", %%mm2\n\t"				"paddusb "MANGLE(g5Dither)", %%mm4\n\t"				"paddusb "MANGLE(r5Dither)", %%mm5\n\t"#endif				WRITEBGR15(%%esp, 8280(%5), %%eax)				"movl "ESP_OFFSET"(%5), %%esp		\n\t"			:: "r" (buf0), "r" (buf1), "r" (uvbuf0), "r" (uvbuf1), "m" (dest),			"r" (&c->redDither)			: "%eax"			);			return;		case IMGFMT_BGR16:			asm volatile(				"movl %%esp, "ESP_OFFSET"(%5)		\n\t"				"movl %4, %%esp				\n\t"				YSCALEYUV2RGB1(%%eax, %5)		/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */#ifdef DITHER1XBPP				"paddusb "MANGLE(b5Dither)", %%mm2\n\t"				"paddusb "MANGLE(g6Dither)", %%mm4\n\t"				"paddusb "MANGLE(r5Dither)", %%mm5\n\t"#endif				WRITEBGR16(%%esp, 8280(%5), %%eax)				"movl "ESP_OFFSET"(%5), %%esp		\n\t"			:: "r" (buf0), "r" (buf1), "r" (uvbuf0), "r" (uvbuf1), "m" (dest),			"r" (&c->redDither)			: "%eax"			);			return;		case IMGFMT_YUY2:			asm volatile(				"movl %%esp, "ESP_OFFSET"(%5)		\n\t"				"movl %4, %%esp				\n\t"				YSCALEYUV2PACKED1(%%eax, %5)				WRITEYUY2(%%esp, 8280(%5), %%eax)				"movl "ESP_OFFSET"(%5), %%esp		\n\t"			:: "r" (buf0), "r" (buf1), "r" (uvbuf0), "r" (uvbuf1), "m" (dest),			"r" (&c->redDither)			: "%eax"			);			return;		}	}	else	{		switch(dstFormat)		{		case IMGFMT_BGR32:			asm volatile(				"movl %%esp, "ESP_OFFSET"(%5)		\n\t"				"movl %4, %%esp				\n\t"				YSCALEYUV2RGB1b(%%eax, %5)				WRITEBGR32(%%esp, 8280(%5), %%eax)				"movl "ESP_OFFSET"(%5), %%esp		\n\t"			:: "r" (buf0), "r" (buf1), "r" (uvbuf0), "r" (uvbuf1), "m" (dest),			"r" (&c->redDither)			: "%eax"			);			return;		case IMGFMT_BGR24:			asm volatile(				"movl %%esp, "ESP_OFFSET"(%5)		\n\t"				"movl %4, %%esp				\n\t"				YSCALEYUV2RGB1b(%%eax, %5)				WRITEBGR24(%%esp, 8280(%5), %%eax)				"movl "ESP_OFFSET"(%5), %%esp		\n\t"			:: "r" (buf0), "r" (buf1), "r" (uvbuf0), "r" (uvbuf1), "m" (dest),			"r" (&c->redDither)			: "%eax"			);			return;		case IMGFMT_BGR15:			asm volatile(				"movl %%esp, "ESP_OFFSET"(%5)		\n\t"				"movl %4, %%esp				\n\t"				YSCALEYUV2RGB1b(%%eax, %5)		/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */#ifdef DITHER1XBPP				"paddusb "MANGLE(b5Dither)", %%mm2\n\t"				"paddusb "MANGLE(g5Dither)", %%mm4\n\t"				"paddusb "MANGLE(r5Dither)", %%mm5\n\t"#endif				WRITEBGR15(%%esp, 8280(%5), %%eax)				"movl "ESP_OFFSET"(%5), %%esp		\n\t"			:: "r" (buf0), "r" (buf1), "r" (uvbuf0), "r" (uvbuf1), "m" (dest),			"r" (&c->redDither)			: "%eax"			);			return;		case IMGFMT_BGR16:			asm volatile(				"movl %%esp, "ESP_OFFSET"(%5)		\n\t"				"movl %4, %%esp				\n\t"				YSCALEYUV2RGB1b(%%eax, %5)		/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */#ifdef DITHER1XBPP				"paddusb "MANGLE(b5Dither)", %%mm2\n\t"				"paddusb "MANGLE(g6Dither)", %%mm4\n\t"				"paddusb "MANGLE(r5Dither)", %%mm5\n\t"#endif				WRITEBGR16(%%esp, 8280(%5), %%eax)				"movl "ESP_OFFSET"(%5), %%esp		\n\t"			:: "r" (buf0), "r" (buf1), "r" (uvbuf0), "r" (uvbuf1), "m" (dest),			"r" (&c->redDither)			: "%eax"			);			return;		case IMGFMT_YUY2:			asm volatile(				"movl %%esp, "ESP_OFFSET"(%5)		\n\t"				"movl %4, %%esp				\n\t"				YSCALEYUV2PACKED1b(%%eax, %5)				WRITEYUY2(%%esp, 8280(%5), %%eax)				"movl "ESP_OFFSET"(%5), %%esp		\n\t"			:: "r" (buf0), "r" (buf1), "r" (uvbuf0), "r" (uvbuf1), "m" (dest),			"r" (&c->redDither)			: "%eax"			);			return;		}	}#endif	if( uvalpha < 2048 )	{		YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB1_C, YSCALE_YUV_2_PACKED1_C)	}else{		YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB1B_C, YSCALE_YUV_2_PACKED1B_C)	}}//FIXME yuy2* can read upto 7 samples to muchstatic inline void RENAME(yuy2ToY)(uint8_t *dst, uint8_t *src, int width){#ifdef HAVE_MMX	asm volatile(		"movq "MANGLE(bm01010101)", %%mm2\n\t"		"movl %0, %%eax			\n\t"		"1:				\n\t"		"movq (%1, %%eax,2), %%mm0	\n\t"		"movq 8(%1, %%eax,2), %%mm1	\n\t"		"pand %%mm2, %%mm0		\n\t"		"pand %%mm2, %%mm1		\n\t"		"packuswb %%mm1, %%mm0		\n\t"		"movq %%mm0, (%2, %%eax)	\n\t"		"addl $8, %%eax			\n\t"		" js 1b				\n\t"		: : "g" (-width), "r" (src+width*2), "r" (dst+width)		: "%eax"	);#else	int i;	for(i=0; i<width; i++)		dst[i]= src[2*i];#endif}static inline void RENAME(yuy2ToUV)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, int width){#if defined (HAVE_MMX2) || defined (HAVE_3DNOW)	asm volatile(		"movq "MANGLE(bm01010101)", %%mm4\n\t"		"movl %0, %%eax			\n\t"		"1:				\n\t"		"movq (%1, %%eax,4), %%mm0	\n\t"		"movq 8(%1, %%eax,4), %%mm1	\n\t"		"movq (%2, %%eax,4), %%mm2	\n\t"		"movq 8(%2, %%eax,4), %%mm3	\n\t"		PAVGB(%%mm2, %%mm0)		PAVGB(%%mm3, %%mm1)		"psrlw $8, %%mm0		\n\t"		"psrlw $8, %%mm1		\n\t"		"packuswb %%mm1, %%mm0		\n\t"		"movq %%mm0, %%mm1		\n\t"		"psrlw $8, %%mm0		\n\t"		"pand %%mm4, %%mm1		\n\t"		"packuswb %%mm0, %%mm0		\n\t"		"packuswb %%mm1, %%mm1		\n\t"		"movd %%mm0, (%4, %%eax)	\n\t"		"movd %%mm1, (%3, %%eax)	\n\t"		"addl $4, %%eax			\n\t"		" js 1b				\n\t"		: : "g" (-width), "r" (src1+width*4), "r" (src2+width*4), "r" (dstU+width), "r" (dstV+width)		: "%eax"	);#else	int i;	for(i=0; i<width; i++)	{		dstU[i]= (src1[4*i + 1] + src2[4*i + 1])>>1;		dstV[i]= (src1[4*i + 3] + src2[4*i + 3])>>1;	}#endif}//this is allmost identical to the previous, end exists only cuz yuy2ToY/UV)(dst, src+1, ...) would have 100% unaligned accessesstatic inline void RENAME(uyvyToY)(uint8_t *dst, uint8_t *src, int width){#ifdef HAVE_MMX	asm volatile(		"movl %0, %%eax			\n\t"		"1:				\n\t"		"movq (%1, %%eax,2), %%mm0	\n\t"		"movq 8(%1, %%eax,2), %%mm1	\n\t"		"psrlw $8, %%mm0		\n\t"		"psrlw $8, %%mm1		\n\t"		"packuswb %%mm1, %%mm0		\n\t"		"movq %%mm0, (%2, %%eax)	\n\t"		"addl $8, %%eax			\n\t"		" js 1b				\n\t"		: : "g" (-width), "r" (src+width*2), "r" (dst+width)		: "%eax"	);#else	int i;	for(i=0; i<width; i++)		dst[i]= src[2*i+1];#endif}static inline void RENAME(uyvyToUV)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, int width){#if defined (HAVE_MMX2) || defined (HAVE_3DNOW)	asm volatile(		"movq "MANGLE(bm01010101)", %%mm4\n\t"		"movl %0, %%eax			\n\t"		"1:				\n\t"		"movq (%1, %%eax,4), %%mm0	\n\t"		"movq 8(%1, %%eax,4), %%mm1	\n\t"		"movq (%2, %%eax,4), %%mm2	\n\t"		"movq 8(%2, %%eax,4), %%mm3	\n\t"		PAVGB(%%mm2, %%mm0)		PAVGB(%%mm3, %%mm1)		"pand %%mm4, %%mm0		\n\t"		"pand %%mm4, %%mm1		\n\t"		"packuswb %%mm1, %%mm0		\n\t"		"movq %%mm0, %%mm1		\n\t"		"psrlw $8, %%mm0		\n\t"		"pand %%mm4, %%mm1		\n\t"		"packuswb %%mm0, %%mm0		\n\t"		"packuswb %%mm1, %%mm1		\n\t"		"movd %%mm0, (%4, %%eax)	\n\t"		"movd %%mm1, (%3, %%eax)	\n\t"		"addl $4, %%eax			\n\t"		" js 1b				\n\t"		: : "g" (-width), "r" (src1+width*4), "r" (src2+width*4), "r" (dstU+width), "r" (dstV+width)		: "%eax"	);#else	int i;	for(i=0; i<width; i++)	{		dstU[i]= (src1[4*i + 0] + src2[4*i + 0])>>1;		dstV[i]= (src1[4*i + 2] + src2[4*i + 2])>>1;	}#endif}static inline void RENAME(bgr32ToY)(uint8_t *dst, uint8_t *src, int width){#ifdef HAVE_MMXFIXME#else	int i;	for(i=0; i<width; i++)	{		int b=  ((uint32_t*)src)[i]&0xFF;		int g= (((uint32_t*)src)[i]>>8)&0xFF;		int r= (((uint32_t*)src)[i]>>16)&0xFF;		dst[i]= ((RY*r + GY*g + BY*b + (33<<(RGB2YUV_SHIFT-1)) )>>RGB2YUV_SHIFT);	}#endif}static inline void RENAME(bgr32ToUV)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, int width){#ifdef HAVE_MMXFIXME#else	int i;	for(i=0; i<width; i++)	{		const int a= ((uint32_t*)src1)[2*i+0];		const int e= ((uint32_t*)src1)[2*i+1];		const int c= ((uint32_t*)src2)[2*i+0];		const int d= ((uint32_t*)src2)[2*i+1];		const int l= (a&0xFF00FF) + (e&0xFF00FF) + (c&0xFF00FF) + (d&0xFF00FF);		const int h= (a&0x00FF00) + (e&0x00FF00) + (c&0x00FF00) + (d&0x00FF00); 		const int b=  l&0x3FF;		const int g=  h>>8;		const int r=  l>>16;		dstU[i]= ((RU*r + GU*g + BU*b)>>(RGB2YUV_SHIFT+2)) + 128;		dstV[i]= ((RV*r + GV*g + BV*b)>>(RGB2YUV_SHIFT+2)) + 128;	}#endif}static inline void RENAME(bgr24ToY)(uint8_t *dst, uint8_t *src, int width){#ifdef HAVE_MMX	asm volatile(		"movl %2, %%eax			\n\t"		"movq "MANGLE(bgr2YCoeff)", %%mm6		\n\t"		"movq "MANGLE(w1111)", %%mm5		\n\t"		"pxor %%mm7, %%mm7		\n\t"		"leal (%%eax, %%eax, 2), %%ebx	\n\t"		".balign 16			\n\t"		"1:				\n\t"		PREFETCH" 64(%0, %%ebx)		\n\t"		"movd (%0, %%ebx), %%mm0	\n\t"		"movd 3(%0, %%ebx), %%mm1	\n\t"		"punpcklbw %%mm7, %%mm0		\n\t"		"punpcklbw %%mm7, %%mm1		\n\t"		"movd 6(%0, %%ebx), %%mm2	\n\t"		"movd 9(%0, %%ebx), %%mm3	\n\t"		"punpcklbw %%mm7, %%mm2		\n\t"		"punpcklbw %%mm7, %%mm3		\n\t"		"pmaddwd %%mm6, %%mm0		\n\t"		"pmaddwd %%mm6, %%mm1		\n\t"		"pmaddwd %%mm6, %%mm2		\n\t"		"pmaddwd %%mm6, %%mm3		\n\t"#ifndef FAST_BGR2YV12		"psrad $8, %%mm0		\n\t"		"psrad $8, %%mm1		\n\t"		"psrad $8, %%mm2		\n\t"		"psrad $8, %%mm3		\n\t"#endif		"packssdw %%mm1, %%mm0		\n\t"		"packssdw %%mm3, %%mm2		\n\t"		"pmaddwd %%mm5, %%mm0		\n\t"		"pmaddwd %%mm5, %%mm2		\n\t"		"packssdw %%mm2, %%mm0		\n\t"		"psraw $7, %%mm0		\n\t"		"movd 12(%0, %%ebx), %%mm4	\n\t"		"movd 15(%0, %%ebx), %%mm1	\n\t"		"punpcklbw %%mm7, %%mm4		\n\t"		"punpcklbw %%mm7, %%mm1		\n\t"		"movd 18(%0, %%ebx), %%mm2	\n\t"		"movd 21(%0, %%ebx), %%mm3	\n\t"		"punpcklbw %%mm7, %%mm2		\n\t"		"punpcklbw %%mm7, %%mm3		\n\t"		"pmaddwd %%mm6, %%mm4		\n\t"		"pmaddwd %%mm6, %%mm1		\n\t"		"pmaddwd %%mm6, %%mm2		\n\t"		"pmaddwd %%mm6, %%mm3		\n\t"#ifndef FAST_BGR2YV12		"psrad $8, %%mm4		\n\t"		"psrad $8, %%mm1		\n\t"		"psrad $8, %%mm2		\n\t"		"psrad $8, %%mm3		\n\t"#endif		"packssdw %%mm1, %%mm4		\n\t"		"packssdw %%mm3, %%mm2		\n\t"		"pmaddwd %%mm5, %%mm4		\n\t"		"pmaddwd %%mm5, %%mm2		\n\t"		"addl $24, %%ebx		\n\t"		"packssdw %%mm2, %%mm4		\n\t"		"psraw $7, %%mm4		\n\t"		"packuswb %%mm4, %%mm0		\n\t"		"paddusb "MANGLE(bgr2YOffset)", %%mm0	\n\t"		"movq %%mm0, (%1, %%eax)	\n\t"		"addl $8, %%eax			\n\t"		" js 1b				\n\t"		: : "r" (src+width*3), "r" (dst+width), "g" (-width)		: "%eax", "%ebx"	);#else	int i;	for(i=0; i<width; i++)	{		int b= src[i*3+0];		int g= src[i*3+1];		int r= src[i*3+2];		dst[i]= ((RY*r + GY*g + BY*b + (33<<(RGB2YUV_SHIFT-1)) )>>RGB2YUV_SHIFT);	}#endif}static inline void RENAME(bgr24ToUV)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, uint8_t *src2, int width){#ifdef HAVE_MMX	asm volatile(		"movl %4, %%eax			\n\t"		"movq "MANGLE(w1111)", %%mm5		\n\t"		"movq "MANGLE(bgr2UCoeff)", %%mm6		\n\t"		"pxor %%mm7, %%mm7		\n\t"		"leal (%%eax, %%eax, 2), %%ebx	\n\t"		"addl %%ebx, %%ebx		\n\t"		".balign 16			\n\t"		"1:				\n\t"		PREFETCH" 64(%0, %%ebx)		\n\t"		PREFETCH" 64(%1, %%ebx)		\n\t"#if defined (HAVE_MMX2) || defined (HAVE_3DNOW)		"movq (%0, %%ebx), %%mm0	\n\t"		"movq (%1, %%ebx), %%mm1	\n\t"		"movq 6(%0, %%ebx), %%mm2	\n\t"		"movq 6(%1, %%ebx), %%mm3	\n\t"		PAVGB(%%mm1, %%mm0)		PAVGB(%%mm3, %%mm2)		"movq %%mm0, %%mm1		\n\t"		"movq %%mm2, %%mm3		\n\t"		"psrlq $24, %%mm0		\n\t"		"psrlq $24, %%mm2		\n\t"		PAVGB(%%mm1, %%mm0)		PAVGB(%%mm3, %%mm2)		"punpcklbw %%mm7, %%mm0		\n\t"		"punpcklbw %%mm7, %%mm2		\n\t"#else		"movd (%0, %%ebx), %%mm0	\n\t"		"movd (%1, %%ebx), %%mm1	\n\t"		"movd 3(%0, %%ebx), %%mm2	\n\t"		"movd 3(%1, %%ebx), %%mm3	\n\t"

⌨️ 快捷键说明

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