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

📄 predict.c

📁 avi2mpg1_src 中包含了mpeg1编码的源程序
💻 C
📖 第 1 页 / 共 4 页
字号:
				}
				return;
			}

			if(w == 16)
			{
				_asm
				{
					mov esi, s					;// esi = s
					mov edi, d					;// edi = d
					mov edx, lx					;// edx = lx
					mov ecx, h					;// ecx = h
pred_comp__l14:
					movd mm0, [esi]				;// lower 4 bytes into mm0 = esi[0..3]
					movd mm1, [esi+1]			;// lower 4 bytes into mm1 = esi[1..4]
					movd mm2, [esi+edx]			;// lower 4 bytes into mm2 = (esi + edx)[0..3]
					movd mm3, [esi+edx+1]		;// lower 4 bytes into mm3 = (esi + edx)[1..4]
					movd mm4, [esi+4]			;// lower 4 bytes into mm4 = esi[4..7]
					movd mm5, [esi+5]			;// lower 4 bytes into mm5 = esi[5..8]
					movd mm6, [esi+edx+4]		;// lower 4 bytes into mm6 = (esi + edx)[4..7]
					movd mm7, [esi+edx+5]		;// lower 4 bytes into mm7 = (esi + edx)[5..8]
					punpcklbw mm0, PACKED_0		;// unpack the lower 4 bytes into mm0
					punpcklbw mm1, PACKED_0		;// unpack the lower 4 bytes into mm1
					punpcklbw mm2, PACKED_0		;// unpack the lower 4 bytes into mm2
					punpcklbw mm3, PACKED_0		;// unpack the lower 4 bytes into mm3
					punpcklbw mm4, PACKED_0		;// unpack the lower 4 bytes into mm4
					punpcklbw mm5, PACKED_0		;// unpack the lower 4 bytes into mm5
					punpcklbw mm6, PACKED_0		;// unpack the lower 4 bytes into mm6
					punpcklbw mm7, PACKED_0		;// unpack the lower 4 bytes into mm7
					paddw mm0, mm1
					paddw mm2, mm3
					paddw mm4, mm5
					paddw mm6, mm7
					paddw mm0, mm2				;// mm0 += mm1 + mm2 + mm3
					paddw mm4, mm6				;// mm4 += mm5 + mm6 + mm7
					movd mm1, [edi]				;// lower 4 bytes into mm1 = edi[0..3]
					movd mm5, [edi+4]			;// lower 4 bytes into mm5 = edi[4..7]
					paddw mm0, PACKED_2			;// mm0 += (2, 2, 2, 2)
					paddw mm4, PACKED_2			;// mm4 += (2, 2, 2, 2)
					punpcklbw mm1, PACKED_0		;// unpack the lower 4 bytes into mm1
					punpcklbw mm5, PACKED_0		;// unpack the lower 4 bytes into mm5
					psrlw mm0, 2
					psrlw mm4, 2
					paddw mm0, PACKED_1
					paddw mm4, PACKED_1
					paddw mm0, mm1
					paddw mm4, mm5
					psrlw mm0, 1				;// mm0 = (mm0 >> 2) + (1, 1, 1, 1) + mm1
					psrlw mm4, 1				;// mm4 = (mm4 >> 2) + (1, 1, 1, 1) + mm5
					packuswb mm0, mm4			;// pack mm0 and mm4
					movq [edi], mm0				;// store mm0 into edi[0..7]

					movd mm0, [esi+8]			;// lower 4 bytes into mm0 = esi[8..11]
					movd mm1, [esi+9]			;// lower 4 bytes into mm1 = esi[9..12]
					movd mm2, [esi+edx+8]		;// lower 4 bytes into mm2 = (esi + edx)[8..11]
					movd mm3, [esi+edx+9]		;// lower 4 bytes into mm3 = (esi + edx)[9..12]
					movd mm4, [esi+12]			;// lower 4 bytes into mm4 = esi[12..15]
					movd mm5, [esi+13]			;// lower 4 bytes into mm5 = esi[13..16]
					movd mm6, [esi+edx+12]		;// lower 4 bytes into mm6 = (esi + edx)[12..15]
					movd mm7, [esi+edx+13]		;// lower 4 bytes into mm7 = (esi + edx)[13..16]
					punpcklbw mm0, PACKED_0		;// unpack the lower 4 bytes into mm0
					punpcklbw mm1, PACKED_0		;// unpack the lower 4 bytes into mm1
					punpcklbw mm2, PACKED_0		;// unpack the lower 4 bytes into mm2
					punpcklbw mm3, PACKED_0		;// unpack the lower 4 bytes into mm3
					punpcklbw mm4, PACKED_0		;// unpack the lower 4 bytes into mm4
					punpcklbw mm5, PACKED_0		;// unpack the lower 4 bytes into mm5
					punpcklbw mm6, PACKED_0		;// unpack the lower 4 bytes into mm6
					punpcklbw mm7, PACKED_0		;// unpack the lower 4 bytes into mm7
					paddw mm0, mm1
					paddw mm2, mm3
					paddw mm4, mm5
					paddw mm6, mm7
					paddw mm0, mm2				;// mm0 += mm1 + mm2 + mm3
					paddw mm4, mm6				;// mm4 += mm5 + mm6 + mm7
					movd mm1, [edi+8]			;// lower 4 bytes into mm1 = edi[8..11]
					movd mm5, [edi+12]			;// lower 4 bytes into mm5 = edi[12..15]
					paddw mm0, PACKED_2			;// mm0 += (2, 2, 2, 2)
					paddw mm4, PACKED_2			;// mm4 += (2, 2, 2, 2)
					punpcklbw mm1, PACKED_0		;// unpack the lower 4 bytes into mm1
					punpcklbw mm5, PACKED_0		;// unpack the lower 4 bytes into mm5
					psrlw mm0, 2
					psrlw mm4, 2
					paddw mm0, PACKED_1
					paddw mm4, PACKED_1
					paddw mm0, mm1
					paddw mm4, mm5
					psrlw mm0, 1				;// mm0 = (mm0 >> 2) + (1, 1, 1, 1) + mm1
					psrlw mm4, 1				;// mm4 = (mm4 >> 2) + (1, 1, 1, 1) + mm5
					packuswb mm0, mm4			;// pack mm0 and mm4
					movq [edi+8], mm0			;// store mm0 into edi[8..15]

					add esi, edx				;// esi += edx
					add edi, edx				;// edi += edx
					dec ecx						;// decrement ecx
					jnz pred_comp__l14			;// loop while not zero
					emms						;// empty MMX state
				}
				return;
			}
		}

		for (j=0; j<h; j++)		{			for (i=0; i<w; i++)				d[i] = (d[i] + ((unsigned int)(s[i]+s[i+1]+s[i+lx]+s[i+lx+1]+2)>>2)+1)>>1;
			s+= lx;			d+= lx;		}
	}	else
	{
		if(cpu_MMX)
		{
			if(w == 8)
			{
				_asm
				{
					mov esi, s					;// esi = s
					mov edi, d					;// edi = d
					mov edx, lx					;// edx = lx
					mov ecx, h					;// ecx = h
pred_comp__l15:
					movd mm0, [esi]				;// lower 4 bytes into mm0 = esi[0..3]
					movd mm1, [esi+1]			;// lower 4 bytes into mm1 = esi[1..4]
					movd mm2, [esi+edx]			;// lower 4 bytes into mm2 = (esi + edx)[0..3]
					movd mm3, [esi+edx+1]		;// lower 4 bytes into mm3 = (esi + edx)[1..4]
					movd mm4, [esi+4]			;// lower 4 bytes into mm4 = esi[4..7]
					movd mm5, [esi+5]			;// lower 4 bytes into mm5 = esi[5..8]
					movd mm6, [esi+edx+4]		;// lower 4 bytes into mm6 = (esi + edx)[4..7]
					movd mm7, [esi+edx+5]		;// lower 4 bytes into mm7 = (esi + edx)[5..8]
					punpcklbw mm0, PACKED_0		;// unpack the lower 4 bytes into mm0
					punpcklbw mm1, PACKED_0		;// unpack the lower 4 bytes into mm1
					punpcklbw mm2, PACKED_0		;// unpack the lower 4 bytes into mm2
					punpcklbw mm3, PACKED_0		;// unpack the lower 4 bytes into mm3
					punpcklbw mm4, PACKED_0		;// unpack the lower 4 bytes into mm4
					punpcklbw mm5, PACKED_0		;// unpack the lower 4 bytes into mm5
					punpcklbw mm6, PACKED_0		;// unpack the lower 4 bytes into mm6
					punpcklbw mm7, PACKED_0		;// unpack the lower 4 bytes into mm7
					paddw mm0, mm1
					paddw mm2, mm3
					paddw mm4, mm5
					paddw mm6, mm7
					paddw mm0, mm2				;// mm0 += mm1 + mm2 + mm3
					paddw mm4, mm6				;// mm4 += mm5 + mm6 + mm7
					paddw mm0, PACKED_2			;// mm0 += (2, 2, 2, 2)
					paddw mm4, PACKED_2			;// mm4 += (2, 2, 2, 2)
					psrlw mm0, 2				;// mm0 >>= 2
					psrlw mm4, 2				;// mm4 >>= 2
					packuswb mm0, mm4			;// pack mm0 and mm4
					movq [edi], mm0				;// store mm0 into edi[0..7]

					add esi, edx				;// esi += edx
					add edi, edx				;// edi += edx
					dec ecx						;// decrement ecx
					jnz pred_comp__l15			;// loop while not zero
					emms						;// empty MMX state
				}
				return;
			}

			if(w == 16)
			{
				_asm
				{
					mov esi, s					;// esi = s
					mov edi, d					;// edi = d
					mov edx, lx					;// edx = lx
					mov ecx, h					;// ecx = h
pred_comp__l16:
					movd mm0, [esi]				;// lower 4 bytes into mm0 = esi[0..3]
					movd mm1, [esi+1]			;// lower 4 bytes into mm1 = esi[1..4]
					movd mm2, [esi+edx]			;// lower 4 bytes into mm2 = (esi + edx)[0..3]
					movd mm3, [esi+edx+1]		;// lower 4 bytes into mm3 = (esi + edx)[1..4]
					movd mm4, [esi+4]			;// lower 4 bytes into mm4 = esi[4..7]
					movd mm5, [esi+5]			;// lower 4 bytes into mm5 = esi[5..8]
					movd mm6, [esi+edx+4]		;// lower 4 bytes into mm6 = (esi + edx)[4..7]
					movd mm7, [esi+edx+5]		;// lower 4 bytes into mm7 = (esi + edx)[5..8]
					punpcklbw mm0, PACKED_0		;// unpack the lower 4 bytes into mm0
					punpcklbw mm1, PACKED_0		;// unpack the lower 4 bytes into mm1
					punpcklbw mm2, PACKED_0		;// unpack the lower 4 bytes into mm2
					punpcklbw mm3, PACKED_0		;// unpack the lower 4 bytes into mm3
					punpcklbw mm4, PACKED_0		;// unpack the lower 4 bytes into mm4
					punpcklbw mm5, PACKED_0		;// unpack the lower 4 bytes into mm5
					punpcklbw mm6, PACKED_0		;// unpack the lower 4 bytes into mm6
					punpcklbw mm7, PACKED_0		;// unpack the lower 4 bytes into mm7
					paddw mm0, mm1
					paddw mm2, mm3
					paddw mm4, mm5
					paddw mm6, mm7
					paddw mm0, mm2				;// mm0 += mm1 + mm2 + mm3
					paddw mm4, mm6				;// mm4 += mm5 + mm6 + mm7
					paddw mm0, PACKED_2			;// mm0 += (2, 2, 2, 2)
					paddw mm4, PACKED_2			;// mm4 += (2, 2, 2, 2)
					psrlw mm0, 2				;// mm0 >>= 2
					psrlw mm4, 2				;// mm4 >>= 2
					packuswb mm0, mm4			;// pack mm0 and mm4
					movq [edi], mm0				;// store mm0 into edi[0..7]

					movd mm0, [esi+8]			;// lower 4 bytes into mm0 = esi[8..11]
					movd mm1, [esi+9]			;// lower 4 bytes into mm1 = esi[9..12]
					movd mm2, [esi+edx+8]		;// lower 4 bytes into mm2 = (esi + edx)[8..11]
					movd mm3, [esi+edx+9]		;// lower 4 bytes into mm3 = (esi + edx)[9..12]
					movd mm4, [esi+12]			;// lower 4 bytes into mm4 = esi[12..15]
					movd mm5, [esi+13]			;// lower 4 bytes into mm5 = esi[13..16]
					movd mm6, [esi+edx+12]		;// lower 4 bytes into mm6 = (esi + edx)[12..15]
					movd mm7, [esi+edx+13]		;// lower 4 bytes into mm7 = (esi + edx)[13..16]
					punpcklbw mm0, PACKED_0		;// unpack the lower 4 bytes into mm0
					punpcklbw mm1, PACKED_0		;// unpack the lower 4 bytes into mm1
					punpcklbw mm2, PACKED_0		;// unpack the lower 4 bytes into mm2
					punpcklbw mm3, PACKED_0		;// unpack the lower 4 bytes into mm3
					punpcklbw mm4, PACKED_0		;// unpack the lower 4 bytes into mm4
					punpcklbw mm5, PACKED_0		;// unpack the lower 4 bytes into mm5
					punpcklbw mm6, PACKED_0		;// unpack the lower 4 bytes into mm6
					punpcklbw mm7, PACKED_0		;// unpack the lower 4 bytes into mm7
					paddw mm0, mm1
					paddw mm2, mm3
					paddw mm4, mm5
					paddw mm6, mm7
					paddw mm0, mm2				;// mm0 += mm1 + mm2 + mm3
					paddw mm4, mm6				;// mm4 += mm5 + mm6 + mm7
					paddw mm0, PACKED_2			;// mm0 += (2, 2, 2, 2)
					paddw mm4, PACKED_2			;// mm4 += (2, 2, 2, 2)
					psrlw mm0, 2				;// mm0 >>= 2
					psrlw mm4, 2				;// mm0 >>= 2
					packuswb mm0, mm4			;// pack mm0 and mm4
					movq [edi+8], mm0			;// store mm0 into edi[8..15]

					add esi, edx				;// esi += edx
					add edi, edx				;// edi += edx
					dec ecx						;// decrement ecx
					jnz pred_comp__l16			;// loop while not zero
					emms						;// empty MMX state
				}
				return;
			}
		}

		for (j=0; j<h; j++)		{			for (i=0; i<w; i++)				d[i] = (unsigned int)(s[i]+s[i+1]+s[i+lx]+s[i+lx+1]+2)>>2;
			s+= lx;			d+= lx;		}
	}}static void calc_DMV(DMV,dmvector,mvx,mvy)int DMV[][2];int *dmvector;int mvx, mvy;{  if (pict_struct==FRAME_PICTURE)  {    if (topfirst)    {      /* vector for prediction of top field from bottom field */      DMV[0][0] = ((mvx  +(mvx>0))>>1) + dmvector[0];      DMV[0][1] = ((mvy  +(mvy>0))>>1) + dmvector[1] - 1;      /* vector for prediction of bottom field from top field */      DMV[1][0] = ((3*mvx+(mvx>0))>>1) + dmvector[0];      DMV[1][1] = ((3*mvy+(mvy>0))>>1) + dmvector[1] + 1;    }    else    {      /* vector for prediction of top field from bottom field */      DMV[0][0] = ((3*mvx+(mvx>0))>>1) + dmvector[0];      DMV[0][1] = ((3*mvy+(mvy>0))>>1) + dmvector[1] - 1;      /* vector for prediction of bottom field from top field */      DMV[1][0] = ((mvx  +(mvx>0))>>1) + dmvector[0];      DMV[1][1] = ((mvy  +(mvy>0))>>1) + dmvector[1] + 1;    }  }  else  {    /* vector for prediction from field of opposite 'parity' */    DMV[0][0] = ((mvx+(mvx>0))>>1) + dmvector[0];    DMV[0][1] = ((mvy+(mvy>0))>>1) + dmvector[1];    /* correct for vertical field shift */    if (pict_struct==TOP_FIELD)      DMV[0][1]--;    else      DMV[0][1]++;  }}static void clearblock(cur,i0,j0)unsigned char *cur[];int i0, j0;{  int i, j, w, h;  unsigned char *p;  p = cur[0] + ((pict_struct==BOTTOM_FIELD) ? width : 0) + i0 + width2*j0;  for (j=0; j<16; j++)  {    for (i=0; i<16; i++)      p[i] = 128;    p+= width2;  }  w = h = 16;  if (chroma_format!=CHROMA444)  {    i0>>=1; w>>=1;  }  if (chroma_format==CHROMA420)  {    j0>>=1; h>>=1;  }  p = cur[1] + ((pict_struct==BOTTOM_FIELD) ? chrom_width : 0) + i0             + chrom_width2*j0;  for (j=0; j<h; j++)  {    for (i=0; i<w; i++)      p[i] = 128;    p+= chrom_width2;  }  p = cur[2] + ((pict_struct==BOTTOM_FIELD) ? chrom_width : 0) + i0             + chrom_width2*j0;  for (j=0; j<h; j++)  {    for (i=0; i<w; i++)      p[i] = 128;    p+= chrom_width2;  }}

⌨️ 快捷键说明

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