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

📄 mvmc.c

📁 优化过的xvid1.1.2源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
						case 0:
							transfer8x8_copy( dst, src, stride);
							break;
						case 1:
							interpolate8x8_quarterpel_ha(dst, src, 8, stride, rounding);
							break;
						case 2:
							interpolate8x8_quarterpel_h(dst, src, 8, stride, rounding);
							break;
						case 3:
							interpolate8x8_quarterpel_ha_up(dst, src, 8, stride, rounding);
							break;
						case 4:
							interpolate8x8_quarterpel_va(dst, src, 8, stride, rounding);
							break;
						case 5:
							interpolate8x8_quarterpel_ha(tmp, src, 9, stride, rounding);
							interpolate8x8_quarterpel_va(dst, tmp, 8, stride, rounding);
							break;
						case 6:
							interpolate8x8_quarterpel_h(tmp, src, 9, stride, rounding);
							interpolate8x8_quarterpel_va(dst, tmp, 8, stride, rounding);
							break;
						case 7:
							interpolate8x8_quarterpel_ha_up(tmp, src, 9, stride, rounding);
							interpolate8x8_quarterpel_va(dst, tmp, 8, stride, rounding);
							break;
						case 8:
							interpolate8x8_quarterpel_v(dst, src, 8, stride, rounding);
							break;
						case 9:
							interpolate8x8_quarterpel_ha(tmp, src, 9, stride, rounding);
							interpolate8x8_quarterpel_v(dst, tmp, 8, stride, rounding);
							break;
						case 10:
							interpolate8x8_quarterpel_h(tmp, src, 9, stride, rounding);
							interpolate8x8_quarterpel_v(dst, tmp, 8, stride, rounding);
							break;
						case 11:
							interpolate8x8_quarterpel_ha_up(tmp, src, 9, stride, rounding);
							interpolate8x8_quarterpel_v(dst, tmp, 8, stride, rounding);
							break;
						case 12:
							interpolate8x8_quarterpel_va_up(dst, src, 8, stride, rounding);
							break;
						case 13:
							interpolate8x8_quarterpel_ha(tmp, src, 9, stride, rounding);
							interpolate8x8_quarterpel_va_up(dst, tmp, 8, stride, rounding);
							break;
						case 14:
							interpolate8x8_quarterpel_h(tmp, src, 9, stride, rounding);
							interpolate8x8_quarterpel_va_up( dst, tmp, 8, stride, rounding);
							break;
						case 15:
							interpolate8x8_quarterpel_ha_up(tmp, src, 9, stride, rounding);
							interpolate8x8_quarterpel_va_up(dst, tmp, 8, stride, rounding);
							break;
				}
}
#undef STORE

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
//
//              B-vop functions
//
///////////////////////////////////////////////////////////

#define STORE(d,s)  (d) = ( (s)+(d)+1 ) >> 1

void  transfer_16to8_add(uint8_t * const dst, const int16_t * const src,
													uint32_t stride)
{
	int i, j, tmp_j, tmp_stride;

	for (j = 0; j < 8; j++)
	{
	  tmp_j = j << 3;
	  tmp_stride = j * stride;
	  
		for (i = 0; i < 8; i++)
		{
            const int16_t pixel = (int16_t) dst[tmp_stride] + src[tmp_j++];
			const uint8_t value = (uint8_t)( (pixel&~255) ? (-pixel)>>(8*sizeof(pixel)-1) : pixel );
			dst[tmp_stride++] = value;
		}
	}
}

void interpolate8x8_halfpel_add(uint8_t * dst, const uint8_t * src1, 
                               const uint8_t *src2, 
                               const uint32_t stride,
                               const uint32_t rounding, 
                               const uint32_t height)
{
  uint32_t i;
	const int32_t round = 1 - rounding;

    for(i = 0; i < height; i++) 
    {
        dst[0] = (src1[0] + src2[0] + round) >> 1;
        dst[1] = (src1[1] + src2[1] + round) >> 1;
        dst[2] = (src1[2] + src2[2] + round) >> 1;
        dst[3] = (src1[3] + src2[3] + round) >> 1;
        dst[4] = (src1[4] + src2[4] + round) >> 1;
        dst[5] = (src1[5] + src2[5] + round) >> 1;
        dst[6] = (src1[6] + src2[6] + round) >> 1;
        dst[7] = (src1[7] + src2[7] + round) >> 1;

        dst += stride;
        src1 += stride;
        src2 += stride;
    }
}

void interpolate8x8_halfpel_h_add(uint8_t * const dst,
							   const uint8_t * const src,
							   const uint32_t stride,
							   const uint32_t rounding)
{
	int j, s, t, k = stride << 3;

	if (rounding) 
	{
		for (j = 0; j < k; j+=stride) 
		{
				s = j; t = s + 1;
				
				dst[s++] = (uint8_t)((((src[s] + src[t++] )>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] )>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] )>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] )>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] )>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] )>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] )>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] )>>1) + dst[s] + 1)>>1);
				
		}
	}
	else
	{
		for (j = 0; j < k; j+=stride) 
		{
				s = j; t = s + 1;
				
				dst[s++] = (uint8_t)((((src[s] + src[t++] + 1)>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + 1)>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + 1)>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + 1)>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + 1)>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + 1)>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + 1)>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + 1)>>1) + dst[s] + 1)>>1);
		}
	}
}

void interpolate8x8_halfpel_v_add(uint8_t * const dst,
								   const uint8_t * const src,
								   const uint32_t stride,
								   const uint32_t rounding)
{
	int j, s, t, k = stride << 3;


	if (rounding) 
	{
		for (j = 0; j < k; j+=stride) 
		{
				s = j; t = j + stride;
				dst[s++] = (uint8_t)((((src[s] + src[t++] )>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] )>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] )>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] )>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] )>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] )>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] )>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] )>>1) + dst[s] + 1)>>1);
				
		}
	} 
	else
	{
		for (j = 0; j < k; j+=stride) 
		{
		    s = j; t = j + stride;
		    
				dst[s++] = (uint8_t)((((src[s] + src[t++] + 1)>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + 1)>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + 1)>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + 1)>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + 1)>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + 1)>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + 1)>>1) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + 1)>>1) + dst[s] + 1)>>1);
		}
	}
	
}

void interpolate8x8_halfpel_hv_add(uint8_t * const dst,
																			const uint8_t * const src,
																			const uint32_t stride,
																			const uint32_t rounding)
{
	int j, s, t, p, q, k = stride << 3;

	if (rounding) 
	{
		for (j = 0; j < k; j+=stride) 
		{
				s = j; t = s + 1; p = j + stride; q = p + 1;
				
				dst[s++] = (uint8_t)((((src[s] + src[t++] + src[p++] + src[q++] +1)>>2) + dst[s])>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + src[p++] + src[q++] +1)>>2) + dst[s])>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + src[p++] + src[q++] +1)>>2) + dst[s])>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + src[p++] + src[q++] +1)>>2) + dst[s])>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + src[p++] + src[q++] +1)>>2) + dst[s])>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + src[p++] + src[q++] +1)>>2) + dst[s])>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + src[p++] + src[q++] +1)>>2) + dst[s])>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + src[p++] + src[q++] +1)>>2) + dst[s])>>1);
				
		}
	} 
	else
	{
		for (j = 0; j < k; j+=stride) 
		{
		    s = j; t = s + 1; p = j + stride; q = p + 1;
		    
				dst[s++] = (uint8_t)((((src[s] + src[t++] + src[p++] + src[q++] +2)>>2) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + src[p++] + src[q++] +2)>>2) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + src[p++] + src[q++] +2)>>2) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + src[p++] + src[q++] +2)>>2) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + src[p++] + src[q++] +2)>>2) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + src[p++] + src[q++] +2)>>2) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + src[p++] + src[q++] +2)>>2) + dst[s] + 1)>>1);
				dst[s++] = (uint8_t)((((src[s] + src[t++] + src[p++] + src[q++] +2)>>2) + dst[s] + 1)>>1);
		}
	}
}

void interpolate8x8_switch_add(uint8_t * const cur,
							  const uint8_t * const refn,
							  const uint32_t x,
							  const uint32_t y,
							  const int32_t dx,
							  const int dy,
							  const uint32_t stride,
							  const uint32_t rounding)
{

	const uint8_t * const src = refn + (int)((y + (dy>>1)) * stride + x + (dx>>1));
	uint8_t * const dst = cur + (int)(y * stride + x);

	switch (((dx & 1) << 1) + (dy & 1))
	{ 
		case 0:
			interpolate8x8_halfpel_add(dst, dst, src, stride, 0, 8);
			break;
		case 1:
			interpolate8x8_halfpel_v_add(dst, src, stride, rounding);
			break;
		case 2:
			interpolate8x8_halfpel_h_add(dst, src, stride, rounding);
			break;
		default:
			interpolate8x8_halfpel_hv_add(dst, src, stride, rounding);
			break;
	}
}

#undef CLIP_STORE
#define CLIP_STORE(D,C) \
  if (C<0) C = 0; else if (C>(255<<5)) C = 255; else C = C>>5;  \
  STORE(D, C)

void interpolate16x16_quarterpel_h_add(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t RND)
{
   while(H-->0)
   {
		    int C;
		    C = 16-RND +14*Src[0] +23*Src[1] - 7*Src[2] + 3*Src[3] -   Src[4];
		    CLIP_STORE(Dst[ 0],C);
		    C = 16-RND - 3*(Src[0]-Src[4]) +19*Src[1] +20*Src[2] - 6*Src[3] - Src[5];
		    CLIP_STORE(Dst[ 1],C);
		    C = 16-RND + 2*Src[0] - 6*(Src[1]+Src[4]) +20*(Src[2]+Src[3]) + 3*Src[5] - Src[6];
		    CLIP_STORE(Dst[ 2],C);
		    C = 16-RND - (Src[0]+Src[7 ]) + 3*(Src[ 1]+Src[ 6])-6*(Src[ 2]+Src[ 5]) + 20*(Src[ 3]+Src[ 4]);
		    CLIP_STORE(Dst[ 3],C);
		    C = 16-RND - (Src[1]+Src[8 ]) + 3*(Src[ 2]+Src[ 7])-6*(Src[ 3]+Src[ 6]) + 20*(Src[ 4]+Src[ 5]);
		    CLIP_STORE(Dst[ 4],C);
		    C = 16-RND - (Src[2]+Src[9 ]) + 3*(Src[ 3]+Src[ 8])-6*(Src[ 4]+Src[ 7]) + 20*(Src[ 5]+Src[ 6]);
		    CLIP_STORE(Dst[ 5],C);
		    C = 16-RND - (Src[3]+Src[10]) + 3*(Src[ 4]+Src[ 9])-6*(Src[ 5]+Src[ 8]) + 20*(Src[ 6]+Src[ 7]);
		    CLIP_STORE(Dst[ 6],C);
		    C = 16-RND - (Src[4]+Src[11]) + 3*(Src[ 5]+Src[10])-6*(Src[ 6]+Src[ 9]) + 20*(Src[ 7]+Src[ 8]);
		    CLIP_STORE(Dst[ 7],C);
		    C = 16-RND - (Src[5]+Src[12]) + 3*(Src[ 6]+Src[11])-6*(Src[ 7]+Src[10]) + 20*(Src[ 8]+Src[ 9]);
		    CLIP_STORE(Dst[ 8],C);
		    C = 16-RND - (Src[6]+Src[13]) + 3*(Src[ 7]+Src[12])-6*(Src[ 8]+Src[11]) + 20*(Src[ 9]+Src[10]);
		    CLIP_STORE(Dst[ 9],C);
		    C = 16-RND - (Src[7]+Src[14]) + 3*(Src[ 8]+Src[13])-6*(Src[ 9]+Src[12]) + 20*(Src[10]+Src[11]);
		    CLIP_STORE(Dst[10],C);
		    C = 16-RND - (Src[8]+Src[15]) + 3*(Src[ 9]+Src[14])-6*(Src[10]+Src[13]) + 20*(Src[11]+Src[12]);
		    CLIP_STORE(Dst[11],C);
		    C = 16-RND - (Src[9]+Src[16]) + 3*(Src[10]+Src[15])-6*(Src[11]+Src[14]) + 20*(Src[12]+Src[13]);
		    CLIP_STORE(Dst[12],C);
		    C = 16-RND - Src[10] +3*Src[11] -6*(Src[12]+Src[15]) + 20*(Src[13]+Src[14]) +2*Src[16];
		    CLIP_STORE(Dst[13],C);
		    C = 16-RND - Src[11] +3*(Src[12]-Src[16]) -6*Src[13] + 20*Src[14] + 19*Src[15];
		    CLIP_STORE(Dst[14],C);
		    C = 16-RND - Src[12] +3*Src[13] -7*Src[14] + 23*Src[15] + 14*Src[16];
		    CLIP_STORE(Dst[15],C);
		    Src += BpS;
		    Dst += BpS;
  }    
}
#undef CLIP_STORE

#define CLIP_STORE(i,C) \
  if (C<0) C = 0; else if (C>(255<<5)) C = 255; else C = C>>5;  \
  C = (C+Src[i]+1-RND) >> 1;  \
  STORE(Dst[i], C)

void interpolate16x16_quarterpel_ha_add(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t RND)
{
    while(H-->0)
    {
		    int C;
		    C = 16-RND +14*Src[0] +23*Src[1] - 7*Src[2] + 3*Src[3] -   Src[4];
		    CLIP_STORE(0,C);
		    C = 16-RND - 3*(Src[0]-Src[4]) +19*Src[1] +20*Src[2] - 6*Src[3] - Src[5];
		    CLIP_STORE( 1,C);
		    C = 16-RND + 2*Src[0] - 6*(Src[1]+Src[4]) +20*(Src[2]+Src[3]) + 3*Src[5] - Src[6];
		    CLIP_STORE( 2,C);
		    C = 16-RND - (Src[0]+Src[7 ]) + 3*(Src[ 1]+Src[ 6])-6*(Src[ 2]+Src[ 5]) + 20*(Src[ 3]+Src[ 4]);
		    CLIP_STORE( 3,C);
		    C = 16-RND - (Src[1]+Src[8 ]) + 3*(Src[ 2]+Src[ 7])-6*(Src[ 3]+Src[ 6]) + 20*(Src[ 4]+Src[ 5]);
		    CLIP_STORE( 4,C);
		    C = 16-RND - (Src[2]+Src[9 ]) + 3*(Src[ 3]+Src[ 8])-6*(Src[ 4]+Src[ 7]) + 20*(Src[ 5]+Src[ 6]);
		    CLIP_STORE( 5,C);
		    C = 16-RND - (Src[3]+Src[10]) + 3*(Src[ 4]+Src[ 9])-6*(Src[ 5]+Src[ 8]) + 20*(Src[ 6]+Src[ 7]);
		    CLIP_STORE( 6,C);
		    C = 16-RND - (Src[4]+Src[11]) + 3*(Src[ 5]+Src[10])-6*(Src[ 6]+Src[ 9]) + 20*(Src[ 7]+Src[ 8]);
		    CLIP_STORE( 7,C);
		    C = 16-RND - (Src[5]+Src[12]) + 3*(Src[ 6]+Src[11])-6*(Src[ 7]+Src[10]) + 20*(Src[ 8]+Src[ 9]);
		    CLIP_STORE( 8,C);

⌨️ 快捷键说明

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