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

📄 rgb2rgb_template.c

📁 video linux conference
💻 C
📖 第 1 页 / 共 5 页
字号:
			    (yc[1] << 16) + (vc[0] << 24);#endif			yc += 2;			uc++;			vc++;		}#endif#endif		if((y&(vertLumPerChroma-1))==(vertLumPerChroma-1) )		{			usrc += chromStride;			vsrc += chromStride;		}		ysrc += lumStride;		dst += dstStride;	}#ifdef HAVE_MMXasm(    EMMS" \n\t"        SFENCE" \n\t"        :::"memory");#endif}/** * * height should be a multiple of 2 and width should be a multiple of 16 (if this is a * problem for anyone then tell me, and ill fix it) */static inline void RENAME(yv12toyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst,	unsigned int width, unsigned int height,	int lumStride, int chromStride, int dstStride){	//FIXME interpolate chroma	RENAME(yuvPlanartoyuy2)(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride, 2);}static inline void RENAME(yuvPlanartouyvy)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst,	unsigned int width, unsigned int height,	int lumStride, int chromStride, int dstStride, int vertLumPerChroma){	unsigned y;	const unsigned chromWidth= width>>1;	for(y=0; y<height; y++)	{#ifdef HAVE_MMX//FIXME handle 2 lines a once (fewer prefetch, reuse some chrom, but very likely limited by mem anyway)		asm volatile(			"xorl %%eax, %%eax		\n\t"			".balign 16			\n\t"			"1:				\n\t"			PREFETCH" 32(%1, %%eax, 2)	\n\t"			PREFETCH" 32(%2, %%eax)		\n\t"			PREFETCH" 32(%3, %%eax)		\n\t"			"movq (%2, %%eax), %%mm0	\n\t" // U(0)			"movq %%mm0, %%mm2		\n\t" // U(0)			"movq (%3, %%eax), %%mm1	\n\t" // V(0)			"punpcklbw %%mm1, %%mm0		\n\t" // UVUV UVUV(0)			"punpckhbw %%mm1, %%mm2		\n\t" // UVUV UVUV(8)			"movq (%1, %%eax,2), %%mm3	\n\t" // Y(0)			"movq 8(%1, %%eax,2), %%mm5	\n\t" // Y(8)			"movq %%mm0, %%mm4		\n\t" // Y(0)			"movq %%mm2, %%mm6		\n\t" // Y(8)			"punpcklbw %%mm3, %%mm0		\n\t" // YUYV YUYV(0)			"punpckhbw %%mm3, %%mm4		\n\t" // YUYV YUYV(4)			"punpcklbw %%mm5, %%mm2		\n\t" // YUYV YUYV(8)			"punpckhbw %%mm5, %%mm6		\n\t" // YUYV YUYV(12)			MOVNTQ" %%mm0, (%0, %%eax, 4)	\n\t"			MOVNTQ" %%mm4, 8(%0, %%eax, 4)	\n\t"			MOVNTQ" %%mm2, 16(%0, %%eax, 4)	\n\t"			MOVNTQ" %%mm6, 24(%0, %%eax, 4)	\n\t"			"addl $8, %%eax			\n\t"			"cmpl %4, %%eax			\n\t"			" jb 1b				\n\t"			::"r"(dst), "r"(ysrc), "r"(usrc), "r"(vsrc), "g" (chromWidth)			: "%eax"		);#else//FIXME adapt the alpha asm code from yv12->yuy2#if __WORDSIZE >= 64		int i;		uint64_t *ldst = (uint64_t *) dst;		const uint8_t *yc = ysrc, *uc = usrc, *vc = vsrc;		for(i = 0; i < chromWidth; i += 2){			uint64_t k, l;			k = uc[0] + (yc[0] << 8) +			    (vc[0] << 16) + (yc[1] << 24);			l = uc[1] + (yc[2] << 8) +			    (vc[1] << 16) + (yc[3] << 24);			*ldst++ = k + (l << 32);			yc += 4;			uc += 2;			vc += 2;		}#else		int i, *idst = (int32_t *) dst;		const uint8_t *yc = ysrc, *uc = usrc, *vc = vsrc;		for(i = 0; i < chromWidth; i++){#ifdef WORDS_BIGENDIAN			*idst++ = (uc[0] << 24)+ (yc[0] << 16) +			    (vc[0] << 8) + (yc[1] << 0);#else			*idst++ = uc[0] + (yc[0] << 8) +			    (vc[0] << 16) + (yc[1] << 24);#endif			yc += 2;			uc++;			vc++;		}#endif#endif		if((y&(vertLumPerChroma-1))==(vertLumPerChroma-1) )		{			usrc += chromStride;			vsrc += chromStride;		}		ysrc += lumStride;		dst += dstStride;	}#ifdef HAVE_MMXasm(    EMMS" \n\t"        SFENCE" \n\t"        :::"memory");#endif}/** * * height should be a multiple of 2 and width should be a multiple of 16 (if this is a * problem for anyone then tell me, and ill fix it) */static inline void RENAME(yv12touyvy)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst,	unsigned int width, unsigned int height,	int lumStride, int chromStride, int dstStride){	//FIXME interpolate chroma	RENAME(yuvPlanartouyvy)(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride, 2);}/** * * width should be a multiple of 16 */static inline void RENAME(yuv422ptoyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst,	unsigned int width, unsigned int height,	int lumStride, int chromStride, int dstStride){	RENAME(yuvPlanartoyuy2)(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride, 1);}/** * * height should be a multiple of 2 and width should be a multiple of 16 (if this is a * problem for anyone then tell me, and ill fix it) */static inline void RENAME(yuy2toyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst,	unsigned int width, unsigned int height,	int lumStride, int chromStride, int srcStride){	unsigned y;	const unsigned chromWidth= width>>1;	for(y=0; y<height; y+=2)	{#ifdef HAVE_MMX		asm volatile(			"xorl %%eax, %%eax		\n\t"			"pcmpeqw %%mm7, %%mm7		\n\t"			"psrlw $8, %%mm7		\n\t" // FF,00,FF,00...			".balign 16			\n\t"			"1:				\n\t"			PREFETCH" 64(%0, %%eax, 4)	\n\t"			"movq (%0, %%eax, 4), %%mm0	\n\t" // YUYV YUYV(0)			"movq 8(%0, %%eax, 4), %%mm1	\n\t" // YUYV YUYV(4)			"movq %%mm0, %%mm2		\n\t" // YUYV YUYV(0)			"movq %%mm1, %%mm3		\n\t" // YUYV YUYV(4)			"psrlw $8, %%mm0		\n\t" // U0V0 U0V0(0)			"psrlw $8, %%mm1		\n\t" // U0V0 U0V0(4)			"pand %%mm7, %%mm2		\n\t" // Y0Y0 Y0Y0(0)			"pand %%mm7, %%mm3		\n\t" // Y0Y0 Y0Y0(4)			"packuswb %%mm1, %%mm0		\n\t" // UVUV UVUV(0)			"packuswb %%mm3, %%mm2		\n\t" // YYYY YYYY(0)			MOVNTQ" %%mm2, (%1, %%eax, 2)	\n\t"			"movq 16(%0, %%eax, 4), %%mm1	\n\t" // YUYV YUYV(8)			"movq 24(%0, %%eax, 4), %%mm2	\n\t" // YUYV YUYV(12)			"movq %%mm1, %%mm3		\n\t" // YUYV YUYV(8)			"movq %%mm2, %%mm4		\n\t" // YUYV YUYV(12)			"psrlw $8, %%mm1		\n\t" // U0V0 U0V0(8)			"psrlw $8, %%mm2		\n\t" // U0V0 U0V0(12)			"pand %%mm7, %%mm3		\n\t" // Y0Y0 Y0Y0(8)			"pand %%mm7, %%mm4		\n\t" // Y0Y0 Y0Y0(12)			"packuswb %%mm2, %%mm1		\n\t" // UVUV UVUV(8)			"packuswb %%mm4, %%mm3		\n\t" // YYYY YYYY(8)			MOVNTQ" %%mm3, 8(%1, %%eax, 2)	\n\t"			"movq %%mm0, %%mm2		\n\t" // UVUV UVUV(0)			"movq %%mm1, %%mm3		\n\t" // UVUV UVUV(8)			"psrlw $8, %%mm0		\n\t" // V0V0 V0V0(0)			"psrlw $8, %%mm1		\n\t" // V0V0 V0V0(8)			"pand %%mm7, %%mm2		\n\t" // U0U0 U0U0(0)			"pand %%mm7, %%mm3		\n\t" // U0U0 U0U0(8)			"packuswb %%mm1, %%mm0		\n\t" // VVVV VVVV(0)			"packuswb %%mm3, %%mm2		\n\t" // UUUU UUUU(0)			MOVNTQ" %%mm0, (%3, %%eax)	\n\t"			MOVNTQ" %%mm2, (%2, %%eax)	\n\t"			"addl $8, %%eax			\n\t"			"cmpl %4, %%eax			\n\t"			" jb 1b				\n\t"			::"r"(src), "r"(ydst), "r"(udst), "r"(vdst), "g" (chromWidth)			: "memory", "%eax"		);		ydst += lumStride;		src  += srcStride;		asm volatile(			"xorl %%eax, %%eax		\n\t"			".balign 16			\n\t"			"1:				\n\t"			PREFETCH" 64(%0, %%eax, 4)	\n\t"			"movq (%0, %%eax, 4), %%mm0	\n\t" // YUYV YUYV(0)			"movq 8(%0, %%eax, 4), %%mm1	\n\t" // YUYV YUYV(4)			"movq 16(%0, %%eax, 4), %%mm2	\n\t" // YUYV YUYV(8)			"movq 24(%0, %%eax, 4), %%mm3	\n\t" // YUYV YUYV(12)			"pand %%mm7, %%mm0		\n\t" // Y0Y0 Y0Y0(0)			"pand %%mm7, %%mm1		\n\t" // Y0Y0 Y0Y0(4)			"pand %%mm7, %%mm2		\n\t" // Y0Y0 Y0Y0(8)			"pand %%mm7, %%mm3		\n\t" // Y0Y0 Y0Y0(12)			"packuswb %%mm1, %%mm0		\n\t" // YYYY YYYY(0)			"packuswb %%mm3, %%mm2		\n\t" // YYYY YYYY(8)			MOVNTQ" %%mm0, (%1, %%eax, 2)	\n\t"			MOVNTQ" %%mm2, 8(%1, %%eax, 2)	\n\t"			"addl $8, %%eax			\n\t"			"cmpl %4, %%eax			\n\t"			" jb 1b				\n\t"			::"r"(src), "r"(ydst), "r"(udst), "r"(vdst), "g" (chromWidth)			: "memory", "%eax"		);#else		unsigned i;		for(i=0; i<chromWidth; i++)		{			ydst[2*i+0] 	= src[4*i+0];			udst[i] 	= src[4*i+1];			ydst[2*i+1] 	= src[4*i+2];			vdst[i] 	= src[4*i+3];		}		ydst += lumStride;		src  += srcStride;		for(i=0; i<chromWidth; i++)		{			ydst[2*i+0] 	= src[4*i+0];			ydst[2*i+1] 	= src[4*i+2];		}#endif		udst += chromStride;		vdst += chromStride;		ydst += lumStride;		src  += srcStride;	}#ifdef HAVE_MMXasm volatile(   EMMS" \n\t"        	SFENCE" \n\t"        	:::"memory");#endif}static inline void RENAME(yvu9toyv12)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc,	uint8_t *ydst, uint8_t *udst, uint8_t *vdst,	unsigned int width, unsigned int height, int lumStride, int chromStride){	/* Y Plane */	memcpy(ydst, ysrc, width*height);	/* XXX: implement upscaling for U,V */}static inline void RENAME(planar2x)(const uint8_t *src, uint8_t *dst, int srcWidth, int srcHeight, int srcStride, int dstStride){	int x,y;		dst[0]= src[0];        	// first line	for(x=0; x<srcWidth-1; x++){		dst[2*x+1]= (3*src[x] +   src[x+1])>>2;		dst[2*x+2]= (  src[x] + 3*src[x+1])>>2;	}	dst[2*srcWidth-1]= src[srcWidth-1];	        dst+= dstStride;	for(y=1; y<srcHeight; y++){#if defined (HAVE_MMX2) || defined (HAVE_3DNOW)		const int mmxSize= srcWidth&~15;		asm volatile(			"movl %4, %%eax			\n\t"			"1:				\n\t"			"movq (%0, %%eax), %%mm0	\n\t"			"movq (%1, %%eax), %%mm1	\n\t"			"movq 1(%0, %%eax), %%mm2	\n\t"			"movq 1(%1, %%eax), %%mm3	\n\t"			"movq -1(%0, %%eax), %%mm4	\n\t"			"movq -1(%1, %%eax), %%mm5	\n\t"			PAVGB" %%mm0, %%mm5		\n\t"			PAVGB" %%mm0, %%mm3		\n\t"			PAVGB" %%mm0, %%mm5		\n\t"			PAVGB" %%mm0, %%mm3		\n\t"			PAVGB" %%mm1, %%mm4		\n\t"			PAVGB" %%mm1, %%mm2		\n\t"			PAVGB" %%mm1, %%mm4		\n\t"			PAVGB" %%mm1, %%mm2		\n\t"			"movq %%mm5, %%mm7		\n\t"			"movq %%mm4, %%mm6		\n\t"			"punpcklbw %%mm3, %%mm5		\n\t"			"punpckhbw %%mm3, %%mm7		\n\t"			"punpcklbw %%mm2, %%mm4		\n\t"			"punpckhbw %%mm2, %%mm6		\n\t"#if 1			MOVNTQ" %%mm5, (%2, %%eax, 2)	\n\t"			MOVNTQ" %%mm7, 8(%2, %%eax, 2)	\n\t"			MOVNTQ" %%mm4, (%3, %%eax, 2)	\n\t"			MOVNTQ" %%mm6, 8(%3, %%eax, 2)	\n\t"#else			"movq %%mm5, (%2, %%eax, 2)	\n\t"			"movq %%mm7, 8(%2, %%eax, 2)	\n\t"			"movq %%mm4, (%3, %%eax, 2)	\n\t"			"movq %%mm6, 8(%3, %%eax, 2)	\n\t"#endif			"addl $8, %%eax			\n\t"			" js 1b				\n\t"			:: "r" (src + mmxSize  ), "r" (src + srcStride + mmxSize  ),			   "r" (dst + mmxSize*2), "r" (dst + dstStride + mmxSize*2),			   "g" (-mmxSize)			: "%eax"		);#else		const int mmxSize=1;#endif		dst[0        ]= (3*src[0] +   src[srcStride])>>2;		dst[dstStride]= (  src[0] + 3*src[srcStride])>>2;		for(x=mmxSize-1; x<srcWidth-1; x++){			dst[2*x          +1]= (3*src[x+0] +   src[x+srcStride+1])>>2;			dst[2*x+dstStride+2]= (  src[x+0] + 3*src[x+srcStride+1])>>2;			dst[2*x+dstStride+1]= (  src[x+1] + 3*src[x+srcStride  ])>>2;			dst[2*x          +2]= (3*src[x+1] +   src[x+srcStride  ])>>2;		}		dst[srcWidth*2 -1            ]= (3*src[srcWidth-1] +   src[srcWidth-1 + srcStride])>>2;		dst[srcWidth*2 -1 + dstStride]= (  src[srcWidth-1] + 3*src[srcWidth-1 + srcStride])>>2;		dst+=dstStride*2;		src+=srcStride;	}		// last line#if 1	dst[0]= src[0];        	for(x=0; x<srcWidth-1; x++){		dst[2*x+1]= (3*src[x] +   src[x+1])>>2;		dst[2*x+2]= (  src[x] + 3*src[x+1])>>2;	}	dst[2*srcWidth-1]= src[srcWidth-1];#else	for(x=0; x<srcWidth; x++){		dst[2*x+0]=		dst[2*x+1]= src[x];	}#endif#ifdef HAVE_MMXasm volatile(   EMMS" \n\t"        	SFENCE" \n\t"        	:::"memory");#endif}/** * * height should be a multiple of 2 and width should be a multiple of 16 (if this is a * problem for anyone then tell me, and ill fix it) * chrominance data is only taken from every secound line others are ignored FIXME write HQ version */static inline void RENAME(uyvytoyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst,	unsigned int width, unsigned int height,	int lumStride, int chromStride, int srcStride){	unsigned y;	const unsigned chromWidth= width>>1;	for(y=0; y<height; y+=2)	{#ifdef HAVE_MMX		asm volatile(			"xorl %%eax, %%eax		\n\t"			"pcmpeqw %%mm7, %%mm7		\n\t"			"psrlw $8, %%mm7		\n\t" // FF,00,FF,00...			".balign 16			\n\t"			"1:				\n\t"			PREFETCH" 64(%0, %%eax, 4)	\n\t"			"movq (%0, %%eax, 4), %%mm0	\n\t" // UYVY UYVY(0)			"movq 8(%0, %%eax, 4), %%mm1	\n\t" // UYVY UYVY(4)			"movq %%mm0, %%mm2		\n\t" // UYVY UYVY(0)			"movq %%mm1, %%mm3		\n\t" // UYVY UYVY(4)			"pand %%mm7, %%mm0		\n\t" // U0V0 U0V0(0)			"pand %%mm7, %%mm1		\n\t" // U0V0 U0V0(4)			"psrlw $8, %%mm2		\n\t" // Y0Y0 Y0Y0(0)			"psrlw $8, %%mm3		\n\t" // Y0Y0 Y0Y0(4)			"packuswb %%mm1, %%mm0		\n\t" // UVUV UVUV(0)			"packuswb %%mm3, %%mm2		\n\t" // YYYY YYYY(0)			MOVNTQ" %%mm2, (%1, %%eax, 2)	\n\t"			"movq 16(%0, %%eax, 4), %%mm1	\n\t" // UYVY UYVY(8)			"movq 24(%0, %%eax, 4), %%mm2	\n\t" // UYVY UYVY(12)			"movq %%mm1, %%mm3		\n\t" // UYVY UYVY(8)			"movq %%mm2, %%mm4		\n\t" // UYVY UYVY(12)			"pand %%mm7, %%mm1		\n\t" // U0V0 U0V0(8)			"pand %%mm7, %%mm2		\n\t" // U0V0 U0V0(12)			"psrlw $8, %%mm3		\n\t" // Y0Y0 Y0Y0(8)			"psrlw $8, %%mm4		\n\t" // Y0Y0 Y0Y0(12)			"packuswb %%mm2, %%mm1		\n\t" // UVUV UVUV(8)			"packuswb %%mm4, %%mm3		\n\t" // YYYY YYYY(8)			MOVNTQ" %%mm3, 8(%1, %%eax, 2)	\n\t"			"movq %%mm0, %%mm2		\n\t" // UVUV UVUV(0)			"movq %%mm1, %%mm3		\n\t" // UVUV UVUV(8)			"psrlw $8, %%mm0		\n\t" // V0V0 V0V0(0)			"psrlw $8, %%mm1		\n\t" // V0V0 V0V0(8)			"pand %%mm7, %%mm2		\n\t" // U0U0 U0U0(0)			"pand %%mm7, %%mm3		\n\t" // U0U0 U0U0(8)			"packuswb %%mm1, %%mm0		\n\t" // VVVV VVVV(0)			"packuswb %%mm3, %%mm2		\n\t" // UUUU UUUU(0)			MOVNTQ" %%mm0, (%3, %%eax)	\n\t"			MOVNTQ" %%mm2, (%2, %%eax)	\n\t"			"addl $8, %%eax			\n\t"			"cmpl %4, %%eax			\n\t"			" jb 1b				\n\t"			::"r"(src), "r"(ydst), "r"(udst), "r"(vdst), "g" (chromWidth)			: "memory", "%eax"		);		ydst += lumStride;		src  += srcStride;		asm volatile(			"xorl %%eax, %%eax		\n\t"			".balign 16			\n\t"			"1:				\n\t"			PREFETCH" 64(%0, %%eax, 4)	\n\t"			"movq (%0, %%eax, 4), %%mm0	\n\t" // YUYV YUYV(0)			"movq 8(%0, %%eax, 4), %%mm1	\n\t" // YUYV YUYV(4)			"movq 16(%0, %%eax, 4), %%mm2	\n\t" // YUYV YUYV(8)			"movq 24(%0, %%eax, 4), %%mm3	\n\t" // YUYV YUYV(12)			"psrlw $8, %%mm0		\n\t" // Y0Y0 Y0Y0(0)			"psrlw $8, %%mm1		\n\t" // Y0Y0 Y0Y0(4)			"psrlw $8, %%mm2		\n\t" // Y0Y0 Y0Y0(8)			"psrlw $8, %%mm3		\n\t" // Y0Y0 Y0Y0(12)			"packuswb %%mm1, %%mm0		\n\t" // YYYY YYYY(0)			"packuswb %%mm3, %%mm2		\n\t" // YYYY YYYY(8)			MOVNTQ" %%mm0, (%1, %%eax, 2)	\n\t"			MOVNTQ" %%mm2, 8(%1, %%eax, 2)	\n\t"			"addl $8, %%eax			\n\t"			"cmpl %4, %%eax			\n\t"			" jb 1b				\n\t"			::"r"(src), "r"(ydst), "r"(udst), "r"(vdst), "g" (chromWidth)			: "memory", "%eax"		);#else		unsigned i;		for(i=0; i<chromWidth; i++)		{			udst[i] 	= src[4*i+0];			ydst[2*i+0] 	= src[4*i+1];			vdst[i] 	= src[4*i+2];			ydst[2*i+1] 	= src[4*i+3];		}		ydst += lumStride;		src  += srcStride;		for(i=0; i<chromWidth; i++)		{			ydst[2*i+0] 	= src[4*i+1];			ydst[2*i+1] 	= src[4*i+3];		}#endif		udst += chromStride;		vdst += chromStride;		ydst += lumStride;		src  += srcStride;	}#ifdef HAVE_MMXasm volatile(   EMMS" \n\t"        	SFENCE" \n\t"

⌨️ 快捷键说明

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