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

📄 image.c

📁 包含了从MPEG4的视频解码到H.264的视频编码部分的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
				PSLLW mm6,4
				PSLLW mm7,2
				paddw mm6,mm7
				paddw mm3,mm6

				movq mm6,mm1
				PSLLW mm6,2
				paddw mm6,mm1
				psubw mm3,mm6
				paddw mm3,mm2
				pxor mm6,mm6
				movq [edi],mm3				
				
				paddw mm3,f16
				PSRAW mm3,5
				PACKUSWB mm3,mm6
				PUNPCKLBW mm3,mm6
				
				movq2dq xmm0,mm3
				movq [ebx],mm3
				
				paddw mm3,mm5
				paddw mm3,f1
				PSRAw mm3,1
				movq [ecx],mm3				

				movdq2q mm3,xmm0
				paddw mm3,mm0
				paddw mm3,f1
				PSRAw mm3,1
				movq [edx],mm3	
 
				emms
			} 
}
static void calcj(_int16*pt1,_int32*pt2)
{
	static _int64 zero[2]={0,0};
    static _int64 f512[2]={0x0000020000000200,0x0000020000000200};	
	_int64 *pt=f512;
	_int64 *ptz=zero;
	int imgw=(img->width+4*IMG_PAD_SIZE)*2;

	_asm
			{

				mov eax,pt1
				mov ebx,pt2
				mov ecx,pt
				mov edx,ptz


				//计算第一列
				
				MOVQ mm0,[eax]				
				add eax,imgw
				MOVQ mm1,[eax]				
				add eax,imgw
				MOVQ mm2,[eax]				
				add eax,imgw
				MOVQ mm3,[eax]			

				//转秩	
				movq mm4,mm0
				movq mm5,mm1
				movq mm6,mm2 
				PUNPCKLWD mm0,mm1
				PUNPCKLWD mm2,mm3
				movq mm1,mm0
				PUNPCKLDQ mm0,mm2
				PUNPCKHDQ mm1,mm2

				PUNPCKHWD mm4,mm5
				PUNPCKHWD mm6,mm3
				movq mm3,mm4
				PUNPCKLDQ mm4,mm6
				PUNPCKHDQ mm3,mm6
				movq mm2,mm4
				
				MOVQ2DQ XMM0,MM0
				MOVQ2DQ XMM1,MM1
				MOVQ2DQ XMM2,MM2
				MOVQ2DQ XMM3,MM3
				pxor xmm6,xmm6
				PUNPCKLWD xmm0,xmm6//扩展为32位
				PUNPCKLWD xmm1,xmm6
				PUNPCKLWD xmm2,xmm6
				PUNPCKLWD xmm3,xmm6
			
				MOVDQU  xmm6,xmm1
				PSLLD xmm6,2
				paddd xmm6,xmm1
				psubd xmm0,xmm6
	
				MOVDQU xmm6,xmm2
				MOVDQU xmm7,xmm2
				PSLLD xmm6,4
				PSLLD xmm7,2
				paddd xmm6,xmm7
				paddd xmm0,xmm6
	
				MOVDQU xmm6,xmm3
				MOVDQU xmm7,xmm3
				PSLLD xmm6,4
				PSLLD xmm7,2
				paddd xmm6,xmm7
				paddd xmm0,xmm6
					
				//再读入两列
				mov eax,pt1
				add eax,8				
				movd mm4,[eax]				
				add eax,imgw
				movd mm5,[eax]				
				add eax,imgw
				movd mm6,[eax]				
				add eax,imgw
				movd mm7,[eax]				

				//转秩					
				PUNPCKLWD mm4,mm5
				PUNPCKLWD mm6,mm7
				movq mm5,mm4
				PUNPCKLDQ mm4,mm6
				PUNPCKHDQ mm5,mm6
				MOVQ2DQ XMM4,MM4
				MOVQ2DQ XMM5,MM5
				pxor xmm6,xmm6
				PUNPCKLWD xmm4,xmm6//扩展为32位
				PUNPCKLWD xmm5,xmm6

				MOVDQU xmm6,xmm4
				PSLLd xmm6,2
				paddd xmm6,xmm4
				psubd xmm0,xmm6
	
				paddd xmm0,xmm5					
				MOVDQU xmm6,[ecx]
	
				paddd xmm0,xmm6
				PSRAd xmm0,10
	
				pxor xmm6,xmm6	
				PACKUSwb xmm0,xmm6
				PUNPCKLbw xmm0,xmm6			
				MOVDQU [ebx],xmm0
				add ebx,16
				
							
				//计算第二列
				//再读入两列
				mov eax,pt1
				add eax,10				
				movd mm5,[eax]				
				add eax,imgw
				movd mm0,[eax]				
				add eax,imgw
				movd mm6,[eax]				
				add eax,imgw
				movd mm7,[eax]					

				//转秩					
				PUNPCKLWD mm5,mm0
				PUNPCKLWD mm6,mm7
				movq mm0,mm5
				PUNPCKLDQ mm5,mm6
				PUNPCKHDQ mm0,mm6	
				MOVQ2DQ XMM0,MM0
				MOVQ2DQ XMM5,MM5
				pxor xmm6,xmm6
				PUNPCKLWD xmm0,xmm6//扩展为32位
				PUNPCKLWD xmm5,xmm6

				MOVDQU xmm6,xmm2
				PSLLD xmm6,2
				paddd xmm6,xmm2
				psubd xmm1,xmm6

				MOVDQU xmm6,xmm3
				MOVDQU xmm7,xmm3
				PSLLd xmm6,4
				PSLLd xmm7,2
				paddd xmm6,xmm7
				paddd xmm1,xmm6

				MOVDQU xmm6,xmm4
				MOVDQU xmm7,xmm4
				PSLLd xmm6,4
				PSLLd xmm7,2
				paddd xmm6,xmm7
				paddd xmm1,xmm6

				MOVDQU xmm6,xmm5
				PSLLd xmm6,2
				paddd xmm6,xmm5
				psubd xmm1,xmm6
				paddd xmm1,xmm0

				MOVDQU xmm6,[ecx]				
				paddd xmm1,xmm6
				PSRAd xmm1,10
				pxor xmm6,xmm6
				PACKUSwb xmm1,xmm6
				PUNPCKLbw xmm1,xmm6				
				MOVDQU [ebx],xmm1
				add ebx,16
			
								
				//计算第三列
				//再读入两列
				mov eax,pt1
				add eax,12			
				movd mm0,[eax]				
				add eax,imgw
				movd mm1,[eax]				
				add eax,imgw
				movd mm6,[eax]				
				add eax,imgw
				movd mm7,[eax]				

				//转秩					
				PUNPCKLWD mm0,mm1
				PUNPCKLWD mm6,mm7
				movq mm1,mm0
				PUNPCKLDQ mm0,mm6
				PUNPCKHDQ mm1,mm6	
				MOVQ2DQ XMM0,MM0
				MOVQ2DQ XMM1,MM1
				pxor xmm6,xmm6
				PUNPCKLWD xmm0,xmm6//扩展为32位
				PUNPCKLWD xmm1,xmm6

				MOVDQU xmm6,xmm3
				PSLLD xmm6,2
				paddd xmm6,xmm3
				psubd xmm2,xmm6

				MOVDQU xmm6,xmm4
				MOVDQU xmm7,xmm4
				PSLLd xmm6,4
				PSLLd xmm7,2
				paddd xmm6,xmm7
				paddd xmm2,xmm6

				MOVDQU xmm6,xmm5
				MOVDQU xmm7,xmm5
				PSLLd xmm6,4
				PSLLd xmm7,2
				paddd xmm6,xmm7
				paddd xmm2,xmm6

				MOVDQU xmm6,xmm0
				PSLLd xmm6,2
				paddd xmm6,xmm0
				psubd xmm2,xmm6
				paddd xmm2,xmm1				
				MOVDQU xmm6,[ecx]				
				paddd xmm2,xmm6
				PSRAd xmm2,10
				pxor xmm6,xmm6
				PACKUSWB xmm2,xmm6
				PUNPCKLBW xmm2,xmm6			
				MOVDQU [ebx],xmm2
				add ebx,16


				
				//计算第四列
				//再读入两列
				mov eax,pt1
				add eax,14				
				movd mm1,[eax]				
				add eax,imgw
				movd mm2,[eax]				
				add eax,imgw
				movd mm6,[eax]				
				add eax,imgw
				movd mm7,[eax]						

				//转秩					
				PUNPCKLWD mm1,mm2
				PUNPCKLWD mm6,mm7
				movq mm2,mm1
				PUNPCKLDQ mm1,mm6
				PUNPCKHDQ mm2,mm6	
				MOVQ2DQ XMM2,MM2
				MOVQ2DQ XMM1,MM1
				pxor xmm6,xmm6
				PUNPCKLWD xmm1,xmm6//扩展为32位
				PUNPCKLWD xmm2,xmm6

				
				MOVDQU xmm6,xmm4
				PSLLd xmm6,2
				paddd xmm6,xmm4
				psubd xmm3,xmm6

				MOVDQU xmm6,xmm5
				MOVDQU xmm7,xmm5
				PSLLd xmm6,4
				PSLLd xmm7,2
				paddd xmm6,xmm7
				paddd xmm3,xmm6

				MOVDQU xmm6,xmm0
				MOVDQU xmm7,xmm0
				PSLLd xmm6,4
				PSLLd xmm7,2
				paddd xmm6,xmm7
				paddd xmm3,xmm6

				MOVDQU xmm6,xmm1
				PSLLd xmm6,2
				paddd xmm6,xmm1
				psubd xmm3,xmm6
				paddd xmm3,xmm2				
				MOVDQU xmm6,[ecx]				
				paddd xmm3,xmm6
				PSRAd xmm3,10
				pxor xmm6,xmm6
				PACKUSWB xmm3,xmm6
				PUNPCKLBW xmm3,xmm6		
				MOVDQU [ebx],xmm3
				
				
 
				emms
			} 
}
static void UnifiedOneForthPix (pel_t ** imgY, pel_t ** imgU, pel_t ** imgV,
                                pel_t ** out4Y, pel_t ** outU, pel_t ** outV,
                                pel_t ** ref11)
{
   int is;
    int i, j, j4,i4;
    int ie2, je2, jj, maxy;
	static _int16 buff[8][4][4];
	static _int32 buff1[4][4],*ptbuff1=buff1[0];
	int indj,indi,j1,i1,indj1,indi1;
	int maxheight=(img->height+2*IMG_PAD_SIZE)<<2;
	int maxwidth=(img->width+2*IMG_PAD_SIZE)<<2;
	int w=(img->width+4*IMG_PAD_SIZE)*2;
	byte *pt1,*pt2;
	_int16 *pt3,*pbuff0=buff[0][0],*pbuff1=buff[1][0],*pbuff2=buff[2][0],*pbuff3=buff[3][0],*pbuff4=buff[4][0],*pbuff5=buff[5][0],*pbuff6=buff[6][0],*pbuff7=buff[7][0];
	int imgwp32=img->width+32;
	copyframewithextend16(&(tmpImgY[0][0]),&(imgY[0][0]),img->height,img->width);    
	for (j = -IMG_PAD_SIZE; j < img->height + IMG_PAD_SIZE; j+=4)
    {
		indj=(IMG_PAD_SIZE+j)<<2;
        for (i = -IMG_PAD_SIZE; i < img->width + IMG_PAD_SIZE; i+=4)
        {		
			calcabc(&(tmpImgY[j][i-2]),&(buff[0][0][0]),&(buff[1][0][0]),&(buff[2][0][0]),&(buff[3][0][0]));
			calcdhn(&(tmpImgY[j-2][i]),&(buff[4][0][0]),&(buff[5][0][0]),&(buff[6][0][0]),&(buff[7][0][0]));
			indi=(IMG_PAD_SIZE+i)<<2;
			pt1=&(out4Y[indj][indi]);
			pt2=&(tmpImgY[j][i]);
			pt3=&(img4Y_tmp[(IMG_PAD_SIZE+j)][(2*IMG_PAD_SIZE+i)]);
			_asm
			{
				mov edi,pt1
				mov esi,pt2
				mov eax,imgwp32
				mov ebx,maxwidth
				shl ebx,2
				pxor mm7,mm7
				pxor xmm7,xmm7
				movd mm0,[esi]
				PUNPCKLBW mm0,mm7
				movq2dq xmm0,mm0
				PUNPCKLWD xmm0,xmm7
				add esi,eax
				movd mm0,[esi]
				PUNPCKLBW mm0,mm7
				movq2dq xmm1,mm0
				PUNPCKLWD xmm1,xmm7
				add esi,eax
				movd mm0,[esi]
				PUNPCKLBW mm0,mm7
				movq2dq xmm2,mm0
				PUNPCKLWD xmm2,xmm7
				add esi,eax
				movd mm0,[esi]
				PUNPCKLBW mm0,mm7
				movq2dq xmm3,mm0
				PUNPCKLWD xmm3,xmm7

				mov esi,pbuff1
				movq mm0,[esi]				
				movq mm1,[esi+8]			
				movq mm2,[esi+16]
				movq mm3,[esi+24]
				//转秩	
				movq mm4,mm0
				movq mm5,mm1
				movq mm6,mm2 
				PUNPCKLWD mm0,mm1
				PUNPCKLWD mm2,mm3
				movq mm1,mm0
				PUNPCKLDQ mm0,mm2
				PUNPCKHDQ mm1,mm2

				PUNPCKHWD mm4,mm5
				PUNPCKHWD mm6,mm3
				movq mm3,mm4
				PUNPCKLDQ mm4,mm6
				PUNPCKHDQ mm3,mm6
				movq mm2,mm4

				movq2dq xmm4,mm0
				PUNPCKLWD xmm4,xmm7
				pslld xmm4,8
				por xmm0,xmm4
				movq2dq xmm4,mm1
				PUNPCKLWD xmm4,xmm7
				pslld xmm4,8
				por xmm1,xmm4
				movq2dq xmm4,mm2
				PUNPCKLWD xmm4,xmm7
				pslld xmm4,8
				por xmm2,xmm4
				movq2dq xmm4,mm3
				PUNPCKLWD xmm4,xmm7
				pslld xmm4,8
				por xmm3,xmm4

				mov esi,pbuff0
				movq mm0,[esi]				
				movq mm1,[esi+8]			
				movq mm2,[esi+16]
				movq mm3,[esi+24]
				//转秩	
				movq mm4,mm0
				movq mm5,mm1
				movq mm6,mm2 
				PUNPCKLWD mm0,mm1
				PUNPCKLWD mm2,mm3
				movq mm1,mm0
				PUNPCKLDQ mm0,mm2
				PUNPCKHDQ mm1,mm2

				PUNPCKHWD mm4,mm5
				PUNPCKHWD mm6,mm3
				movq mm3,mm4
				PUNPCKLDQ mm4,mm6
				PUNPCKHDQ mm3,mm6
				movq mm2,mm4

				movq2dq xmm4,mm0
				PUNPCKLWD xmm4,xmm7
				pslld xmm4,16
				por xmm0,xmm4
				movq2dq xmm4,mm1
				PUNPCKLWD xmm4,xmm7
				pslld xmm4,16
				por xmm1,xmm4
				movq2dq xmm4,mm2
				PUNPCKLWD xmm4,xmm7
				pslld xmm4,16
				por xmm2,xmm4
				movq2dq xmm4,mm3
				PUNPCKLWD xmm4,xmm7
				pslld xmm4,16
				por xmm3,xmm4

				mov esi,pbuff2
				movq mm0,[esi]				
				movq mm1,[esi+8]			
				movq mm2,[esi+16]
				movq mm3,[esi+24]
				//转秩	
				movq mm4,mm0
				movq mm5,mm1
				movq mm6,mm2 
				PUNPCKLWD mm0,mm1
				PUNPCKLWD mm2,mm3
				movq mm1,mm0
				PUNPCKLDQ mm0,mm2
				PUNPCKHDQ mm1,mm2

				PUNPCKHWD mm4,mm5
				PUNPCKHWD mm6,mm3
				movq mm3,mm4
				PUNPCKLDQ mm4,mm6
				PUNPCKHDQ mm3,mm6
				movq mm2,mm4

				movq2dq xmm4,mm0
				PUNPCKLWD xmm4,xmm7
				pslld xmm4,24
				por xmm0,xmm4
				movq2dq xmm4,mm1
				PUNPCKLWD xmm4,xmm7
				pslld xmm4,24
				por xmm1,xmm4
				movq2dq xmm4,mm2
				PUNPCKLWD xmm4,xmm7
				pslld xmm4,24
				por xmm2,xmm4
				movq2dq xmm4,mm3
				PUNPCKLWD xmm4,xmm7
				pslld xmm4,24
				por xmm3,xmm4

			

⌨️ 快捷键说明

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