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

📄 swscale_template.c

📁 uclinux 下的vlc播放器源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
			:: "r" (&c->redDither), 			   "m" (dummy), "m" (dummy), "m" (dummy),			   "r" (dest), "m" (dstW)			: "%eax", "%ebx", "%edx", "%esi" //FIXME ebx			);		}		break;	case IMGFMT_BGR15:		{			asm volatile(				YSCALEYUV2RGBX		/* 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(%4, %5, %%eax)			:: "r" (&c->redDither), 			   "m" (dummy), "m" (dummy), "m" (dummy),			   "r" (dest), "m" (dstW)			: "%eax", "%edx", "%esi"			);		}		break;	case IMGFMT_BGR16:		{			asm volatile(				YSCALEYUV2RGBX		/* 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(%4, %5, %%eax)			:: "r" (&c->redDither), 			   "m" (dummy), "m" (dummy), "m" (dummy),			   "r" (dest), "m" (dstW)			: "%eax", "%edx", "%esi"			);		}		break;	case IMGFMT_YUY2:		{			asm volatile(				YSCALEYUV2PACKEDX		/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */				"psraw $3, %%mm3		\n\t"				"psraw $3, %%mm4		\n\t"				"psraw $3, %%mm1		\n\t"				"psraw $3, %%mm7		\n\t"				WRITEYUY2(%4, %5, %%eax)			:: "r" (&c->redDither), 			   "m" (dummy), "m" (dummy), "m" (dummy),			   "r" (dest), "m" (dstW)			: "%eax", "%edx", "%esi"			);		}		break;#endif	default:#ifdef HAVE_ALTIVEC		altivec_yuv2packedX (c, lumFilter, lumSrc, lumFilterSize,			    chrFilter, chrSrc, chrFilterSize,			    dest, dstW, dstY);#else		yuv2packedXinC(c, lumFilter, lumSrc, lumFilterSize,			    chrFilter, chrSrc, chrFilterSize,			    dest, dstW, dstY);#endif		break;	}}/** * vertical bilinear scale YV12 to RGB */static inline void RENAME(yuv2packed2)(SwsContext *c, uint16_t *buf0, uint16_t *buf1, uint16_t *uvbuf0, uint16_t *uvbuf1,			    uint8_t *dest, int dstW, int yalpha, int uvalpha, int y){	int yalpha1=yalpha^4095;	int uvalpha1=uvalpha^4095;	int i;#if 0 //isn't used	if(flags&SWS_FULL_CHR_H_INT)	{		switch(dstFormat)		{#ifdef HAVE_MMX		case IMGFMT_BGR32:			asm volatile(FULL_YSCALEYUV2RGB			"punpcklbw %%mm1, %%mm3		\n\t" // BGBGBGBG			"punpcklbw %%mm7, %%mm0		\n\t" // R0R0R0R0			"movq %%mm3, %%mm1		\n\t"			"punpcklwd %%mm0, %%mm3		\n\t" // BGR0BGR0			"punpckhwd %%mm0, %%mm1		\n\t" // BGR0BGR0			MOVNTQ(%%mm3, (%4, %%eax, 4))			MOVNTQ(%%mm1, 8(%4, %%eax, 4))			"addl $4, %%eax			\n\t"			"cmpl %5, %%eax			\n\t"			" jb 1b				\n\t"			:: "r" (buf0), "r" (buf1), "r" (uvbuf0), "r" (uvbuf1), "r" (dest), "m" (dstW),			"m" (yalpha1), "m" (uvalpha1)			: "%eax"			);			break;		case IMGFMT_BGR24:			asm volatile(FULL_YSCALEYUV2RGB								// lsb ... msb			"punpcklbw %%mm1, %%mm3		\n\t" // BGBGBGBG			"punpcklbw %%mm7, %%mm0		\n\t" // R0R0R0R0			"movq %%mm3, %%mm1		\n\t"			"punpcklwd %%mm0, %%mm3		\n\t" // BGR0BGR0			"punpckhwd %%mm0, %%mm1		\n\t" // BGR0BGR0			"movq %%mm3, %%mm2		\n\t" // BGR0BGR0			"psrlq $8, %%mm3		\n\t" // GR0BGR00			"pand "MANGLE(bm00000111)", %%mm2\n\t" // BGR00000			"pand "MANGLE(bm11111000)", %%mm3\n\t" // 000BGR00			"por %%mm2, %%mm3		\n\t" // BGRBGR00			"movq %%mm1, %%mm2		\n\t"			"psllq $48, %%mm1		\n\t" // 000000BG			"por %%mm1, %%mm3		\n\t" // BGRBGRBG			"movq %%mm2, %%mm1		\n\t" // BGR0BGR0			"psrld $16, %%mm2		\n\t" // R000R000			"psrlq $24, %%mm1		\n\t" // 0BGR0000			"por %%mm2, %%mm1		\n\t" // RBGRR000			"movl %4, %%ebx			\n\t"			"addl %%eax, %%ebx		\n\t"#ifdef HAVE_MMX2			//FIXME Alignment			"movntq %%mm3, (%%ebx, %%eax, 2)\n\t"			"movntq %%mm1, 8(%%ebx, %%eax, 2)\n\t"#else			"movd %%mm3, (%%ebx, %%eax, 2)	\n\t"			"psrlq $32, %%mm3		\n\t"			"movd %%mm3, 4(%%ebx, %%eax, 2)	\n\t"			"movd %%mm1, 8(%%ebx, %%eax, 2)	\n\t"#endif			"addl $4, %%eax			\n\t"			"cmpl %5, %%eax			\n\t"			" jb 1b				\n\t"			:: "r" (buf0), "r" (buf1), "r" (uvbuf0), "r" (uvbuf1), "m" (dest), "m" (dstW),			"m" (yalpha1), "m" (uvalpha1)			: "%eax", "%ebx"			);			break;		case IMGFMT_BGR15:			asm volatile(FULL_YSCALEYUV2RGB#ifdef DITHER1XBPP			"paddusb "MANGLE(g5Dither)", %%mm1\n\t"			"paddusb "MANGLE(r5Dither)", %%mm0\n\t"			"paddusb "MANGLE(b5Dither)", %%mm3\n\t"#endif			"punpcklbw %%mm7, %%mm1		\n\t" // 0G0G0G0G			"punpcklbw %%mm7, %%mm3		\n\t" // 0B0B0B0B			"punpcklbw %%mm7, %%mm0		\n\t" // 0R0R0R0R			"psrlw $3, %%mm3		\n\t"			"psllw $2, %%mm1		\n\t"			"psllw $7, %%mm0		\n\t"			"pand "MANGLE(g15Mask)", %%mm1	\n\t"			"pand "MANGLE(r15Mask)", %%mm0	\n\t"			"por %%mm3, %%mm1		\n\t"			"por %%mm1, %%mm0		\n\t"			MOVNTQ(%%mm0, (%4, %%eax, 2))			"addl $4, %%eax			\n\t"			"cmpl %5, %%eax			\n\t"			" jb 1b				\n\t"			:: "r" (buf0), "r" (buf1), "r" (uvbuf0), "r" (uvbuf1), "r" (dest), "m" (dstW),			"m" (yalpha1), "m" (uvalpha1)			: "%eax"			);			break;		case IMGFMT_BGR16:			asm volatile(FULL_YSCALEYUV2RGB#ifdef DITHER1XBPP			"paddusb "MANGLE(g6Dither)", %%mm1\n\t"			"paddusb "MANGLE(r5Dither)", %%mm0\n\t"			"paddusb "MANGLE(b5Dither)", %%mm3\n\t"#endif			"punpcklbw %%mm7, %%mm1		\n\t" // 0G0G0G0G			"punpcklbw %%mm7, %%mm3		\n\t" // 0B0B0B0B			"punpcklbw %%mm7, %%mm0		\n\t" // 0R0R0R0R			"psrlw $3, %%mm3		\n\t"			"psllw $3, %%mm1		\n\t"			"psllw $8, %%mm0		\n\t"			"pand "MANGLE(g16Mask)", %%mm1	\n\t"			"pand "MANGLE(r16Mask)", %%mm0	\n\t"			"por %%mm3, %%mm1		\n\t"			"por %%mm1, %%mm0		\n\t"			MOVNTQ(%%mm0, (%4, %%eax, 2))			"addl $4, %%eax			\n\t"			"cmpl %5, %%eax			\n\t"			" jb 1b				\n\t"			:: "r" (buf0), "r" (buf1), "r" (uvbuf0), "r" (uvbuf1), "r" (dest), "m" (dstW),			"m" (yalpha1), "m" (uvalpha1)			: "%eax"			);		break;#endif		case IMGFMT_RGB32:#ifndef HAVE_MMX		case IMGFMT_BGR32:#endif		if(dstFormat==IMGFMT_BGR32)		{			int i;#ifdef WORDS_BIGENDIAN			dest++;#endif			for(i=0;i<dstW;i++){				// vertical linear interpolation && yuv2rgb in a single step:				int Y=yuvtab_2568[((buf0[i]*yalpha1+buf1[i]*yalpha)>>19)];				int U=((uvbuf0[i]*uvalpha1+uvbuf1[i]*uvalpha)>>19);				int V=((uvbuf0[i+2048]*uvalpha1+uvbuf1[i+2048]*uvalpha)>>19);				dest[0]=clip_table[((Y + yuvtab_40cf[U]) >>13)];				dest[1]=clip_table[((Y + yuvtab_1a1e[V] + yuvtab_0c92[U]) >>13)];				dest[2]=clip_table[((Y + yuvtab_3343[V]) >>13)];				dest+= 4;			}		}		else if(dstFormat==IMGFMT_BGR24)		{			int i;			for(i=0;i<dstW;i++){				// vertical linear interpolation && yuv2rgb in a single step:				int Y=yuvtab_2568[((buf0[i]*yalpha1+buf1[i]*yalpha)>>19)];				int U=((uvbuf0[i]*uvalpha1+uvbuf1[i]*uvalpha)>>19);				int V=((uvbuf0[i+2048]*uvalpha1+uvbuf1[i+2048]*uvalpha)>>19);				dest[0]=clip_table[((Y + yuvtab_40cf[U]) >>13)];				dest[1]=clip_table[((Y + yuvtab_1a1e[V] + yuvtab_0c92[U]) >>13)];				dest[2]=clip_table[((Y + yuvtab_3343[V]) >>13)];				dest+= 3;			}		}		else if(dstFormat==IMGFMT_BGR16)		{			int i;			for(i=0;i<dstW;i++){				// vertical linear interpolation && yuv2rgb in a single step:				int Y=yuvtab_2568[((buf0[i]*yalpha1+buf1[i]*yalpha)>>19)];				int U=((uvbuf0[i]*uvalpha1+uvbuf1[i]*uvalpha)>>19);				int V=((uvbuf0[i+2048]*uvalpha1+uvbuf1[i+2048]*uvalpha)>>19);				((uint16_t*)dest)[i] =					clip_table16b[(Y + yuvtab_40cf[U]) >>13] |					clip_table16g[(Y + yuvtab_1a1e[V] + yuvtab_0c92[U]) >>13] |					clip_table16r[(Y + yuvtab_3343[V]) >>13];			}		}		else if(dstFormat==IMGFMT_BGR15)		{			int i;			for(i=0;i<dstW;i++){				// vertical linear interpolation && yuv2rgb in a single step:				int Y=yuvtab_2568[((buf0[i]*yalpha1+buf1[i]*yalpha)>>19)];				int U=((uvbuf0[i]*uvalpha1+uvbuf1[i]*uvalpha)>>19);				int V=((uvbuf0[i+2048]*uvalpha1+uvbuf1[i+2048]*uvalpha)>>19);				((uint16_t*)dest)[i] =					clip_table15b[(Y + yuvtab_40cf[U]) >>13] |					clip_table15g[(Y + yuvtab_1a1e[V] + yuvtab_0c92[U]) >>13] |					clip_table15r[(Y + yuvtab_3343[V]) >>13];			}		}	}//FULL_UV_IPOL	else	{#endif // if 0#ifdef HAVE_MMX	switch(c->dstFormat)	{//Note 8280 == DSTW_OFFSET but the preprocessor can't handle that there :(	case IMGFMT_BGR32:			asm volatile(				"movl %%esp, "ESP_OFFSET"(%5)		\n\t"				"movl %4, %%esp				\n\t"				YSCALEYUV2RGB(%%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"				YSCALEYUV2RGB(%%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"				YSCALEYUV2RGB(%%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"				YSCALEYUV2RGB(%%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"				YSCALEYUV2PACKED(%%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;	default: break;	}#endif //HAVE_MMXYSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB2_C, YSCALE_YUV_2_PACKED2_C)}/** * YV12 to RGB without scaling or interpolating */static inline void RENAME(yuv2packed1)(SwsContext *c, uint16_t *buf0, uint16_t *uvbuf0, uint16_t *uvbuf1,			    uint8_t *dest, int dstW, int uvalpha, int dstFormat, int flags, int y){	const int yalpha1=0;	int i;		uint16_t *buf1= buf0; //FIXME needed for the rgb1/bgr1	const int yalpha= 4096; //FIXME ...	if(flags&SWS_FULL_CHR_H_INT)	{		RENAME(yuv2packed2)(c, buf0, buf0, uvbuf0, uvbuf1, dest, dstW, 0, uvalpha, y);		return;	}#ifdef HAVE_MMX	if( uvalpha < 2048 ) // note this is not correct (shifts chrominance by 0.5 pixels) but its a bit faster	{		switch(dstFormat)		{		case IMGFMT_BGR32:			asm volatile(				"movl %%esp, "ESP_OFFSET"(%5)		\n\t"				"movl %4, %%esp				\n\t"				YSCALEYUV2RGB1(%%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"				YSCALEYUV2RGB1(%%eax, %5)				WRITEBGR24(%%esp, 8280(%5), %%eax)				"movl "ESP_OFFSET"(%5), %%esp		\n\t"

⌨️ 快捷键说明

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