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

📄 pred.c

📁 文件内包含H.263视频编码算法和解码算法2个文件
💻 C
📖 第 1 页 / 共 2 页
字号:
      }    }  }  else { /* xh && yh */    for (n = 0; n < 8; n++) 
	{      for (m = 0; m < 8; m++) 
	  {        ofx = x + xint + m;        ofy = y + yint + n;        pel=(*(prev->Cr+ofx    + (ofy   )*lx)+             *(prev->Cr+ofx+xh + (ofy   )*lx)+             *(prev->Cr+ofx    + (ofy+yh)*lx)+             *(prev->Cr+ofx+xh + (ofy+yh)*lx)+             2)>>2;        data->Cr[n][m] += pel;        pel=(*(prev->Cb+ofx    + (ofy   )*lx)+             *(prev->Cb+ofx+xh + (ofy   )*lx)+             *(prev->Cb+ofx    + (ofy+yh)*lx)+             *(prev->Cb+ofx+xh + (ofy+yh)*lx)+             2)>>2;        data->Cb[n][m] += pel;            }    }  }  return;}void FindChromBlock_P(int x_curr, int y_curr, int dx, int dy,              PictImage *prev, MB_Structure *data){  int m,n;  int x, y, ofx, ofy, pel,lx;  int xint, yint;  int xh, yh;  lx = cpels;  x = x_curr>>1;  y = y_curr>>1;  xint = dx>>1;  xh = dx & 1;  yint = dy>>1;  yh = dy & 1;      if (!xh && !yh) 
  {    for (n = 0; n < 8; n++)
	{      for (m = 0; m < 8; m++)
	  {        ofx = x + xint + m;        ofy = y + yint + n;        pel=*(prev->Cr+ofx    + (ofy   )*lx);        data->Cr[n][m] = pel;        pel=*(prev->Cb+ofx    + (ofy   )*lx);        data->Cb[n][m] = pel;      }    }  }  else if (!xh && yh) 
  {    for (n = 0; n < 8; n++) 
	{      for (m = 0; m < 8; m++)
	  {        ofx = x + xint + m;        ofy = y + yint + n;        pel=(*(prev->Cr+ofx    + (ofy   )*lx)+             *(prev->Cr+ofx    + (ofy+yh)*lx) + 1)>>1;        data->Cr[n][m] = pel;        pel=(*(prev->Cb+ofx    + (ofy   )*lx)+             *(prev->Cb+ofx    + (ofy+yh)*lx) + 1)>>1;        data->Cb[n][m] = pel;            }    }  }  else if (xh && !yh) 
  {    for (n = 0; n < 8; n++)
	{      for (m = 0; m < 8; m++) 
	  {        ofx = x + xint + m;        ofy = y + yint + n;        pel=(*(prev->Cr+ofx    + (ofy   )*lx)+             *(prev->Cr+ofx+xh + (ofy   )*lx) + 1)>>1;        data->Cr[n][m] = pel;        pel=(*(prev->Cb+ofx    + (ofy   )*lx)+             *(prev->Cb+ofx+xh + (ofy   )*lx) + 1)>>1;        data->Cb[n][m] = pel;            }    }  }  else { /* xh && yh */    for (n = 0; n < 8; n++) 
	{      for (m = 0; m < 8; m++) 
	  {        ofx = x + xint + m;        ofy = y + yint + n;        pel=(*(prev->Cr+ofx    + (ofy   )*lx)+             *(prev->Cr+ofx+xh + (ofy   )*lx)+             *(prev->Cr+ofx    + (ofy+yh)*lx)+             *(prev->Cr+ofx+xh + (ofy+yh)*lx)+             2)>>2;        data->Cr[n][m] = pel;        pel=(*(prev->Cb+ofx    + (ofy   )*lx)+             *(prev->Cb+ofx+xh + (ofy   )*lx)+             *(prev->Cb+ofx    + (ofy+yh)*lx)+             *(prev->Cb+ofx+xh + (ofy+yh)*lx)+             2)>>2;        data->Cb[n][m] = pel;            }    }  }  return;}int ModifyMode(int Mode, int dquant){  if (Mode == MODE_INTRA) 
  {    if(dquant!=0)      return MODE_INTRA_Q;    else      return MODE_INTRA;  }  else
  {     if(dquant!=0)      return MODE_INTER_Q;    else      return Mode;  }}
int ChooseMode_MY(unsigned char *curr, int x_pos, int y_pos, int min_SAD)
{
  int i,j;
  int MB_mean = 0, A = 0;
  int y_off;
  unsigned int t0, t1, t2, t3;
  unsigned int temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7;
  unsigned char *p1;
  unsigned int *p2;

  p1 = curr + x_pos + y_pos * pels;
  for (i=0; i<MB_SIZE; i++)
  {
	  temp0 = p1[0] + p1[1];
	  temp1 = p1[2] + p1[3];
	  temp2 = p1[4] + p1[5];
	  temp3 = p1[6] + p1[7];
	  temp4 = p1[8] + p1[9];
	  temp5 = p1[10] + p1[11];
	  temp6 = p1[12] + p1[13];
	  temp7 = p1[14] + p1[15];
	  MB_mean += temp0 + temp1 + temp2 + temp3 + temp4 + temp5 + temp6 + temp7;
	  p1 += pels;
  }
  MB_mean /= (MB_SIZE*MB_SIZE);

  p2 = (unsigned int *)(curr + x_pos + y_pos * pels);
  temp0 = MB_mean & 0x000000ff;
  temp1 = temp0 << 8;
  temp2 = temp0 << 16;
  temp3 = temp0 << 24;
  t0 = t1 = t2 = t3 = temp0 | temp1 | temp2 | temp3;
  for (i= 0; i<MB_SIZE; i++)
  {
	  temp0 = UME8UU( p2[0], t0 );
	  temp1 = UME8UU( p2[1], t1 );
	  temp2 = UME8UU( p2[2], t2 );
	  temp3 = UME8UU( p2[3], t3 );
	  A += temp0 + temp1 + temp2 + temp3;
	  p2 += (pels>>2);
  }

  if (A < (min_SAD - 500)) 
    return MODE_INTRA;
  else
    return MODE_INTER;
}


void FindHalfPel_MY(int x, int y, MotionVector *fr, unsigned char *prev, 
					short int *curr, int bs, int comp)
{
  fr->min_error = 100;
  fr->x_half = 0;
  fr->y_half = 0;
  return;
}

void FindPred_MY(int x, int y, MotionVector *fr, unsigned char *prev, 
                 short int *pred, int bs, int comp)
{
  int m, n;
  int new_x, new_y;
  int lx;

  int *p1, *p2;
  int t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15;
  int s0=0, s1=0, s2=0, s3=0;

  lx = pels;

  new_x = x + fr->x;
  new_y = y + fr->y;

  p1 = (int *)( prev+new_x*2+fr->x_half+(new_y*2+fr->y_half)*lx*2 );
  p2 = (int *)pred;
  switch( new_x-(new_x>>1<<1) )
  {
  case 0:
	  {
		  for (n = 0; n < bs; n++) 
		  { 
			  t0 = UBYTESEL( p1[0], 0 );
			  t1 = UBYTESEL( p1[1], 0 );
			  t2 = UBYTESEL( p1[2], 0 );
			  t3 = UBYTESEL( p1[3], 0 );
			  t4 = UBYTESEL( p1[0], 2 );
			  t5 = UBYTESEL( p1[1], 2 );
			  t6 = UBYTESEL( p1[2], 2 );
			  t7 = UBYTESEL( p1[3], 2 );
			  t8 = UBYTESEL( p1[4], 0 );
			  t9 = UBYTESEL( p1[5], 0 );
			  t10 = UBYTESEL( p1[6], 0 );
			  t11 = UBYTESEL( p1[7], 0 );
			  t12 = UBYTESEL( p1[4], 2 );
			  t13 = UBYTESEL( p1[5], 2 );
			  t14 = UBYTESEL( p1[6], 2 );
			  t15 = UBYTESEL( p1[7], 2 );
			  p2[0] = PACK16LSB( t4, t0 );
			  p2[1] = PACK16LSB( t5, t1 );
			  p2[2] = PACK16LSB( t6, t2 );
			  p2[3] = PACK16LSB( t7, t3 );
			  p2[4] = PACK16LSB( t12, t8 );
			  p2[5] = PACK16LSB( t13, t9 );
			  p2[6] = PACK16LSB( t14, t10 );
			  p2[7] = PACK16LSB( t15, t11 );
			  p1 += lx;
			  p2 += 8;
		  }
		  break;
	  }
  case 1:
	  {
		  for (n = 0; n < bs; n++) 
		  { 
			  t0 = UBYTESEL( p1[0], 2 );
			  t1 = UBYTESEL( p1[1], 0 );
			  t2 = UBYTESEL( p1[1], 2 );
			  t3 = UBYTESEL( p1[2], 0 );
			  t4 = UBYTESEL( p1[2], 2 );
			  t5 = UBYTESEL( p1[3], 0 );
			  t6 = UBYTESEL( p1[3], 2 );
			  t7 = UBYTESEL( p1[4], 0 );
			  t8 = UBYTESEL( p1[4], 2 );
			  t9 = UBYTESEL( p1[5], 0 );
			  t10 = UBYTESEL( p1[5], 2 );
			  t11 = UBYTESEL( p1[6], 0 );
			  t12 = UBYTESEL( p1[6], 2 );
			  t13 = UBYTESEL( p1[7], 0 );
			  t14 = UBYTESEL( p1[7], 2 );
			  t15 = UBYTESEL( p1[8], 0 );
			  p2[0] = PACK16LSB( t1, t0 );
			  p2[1] = PACK16LSB( t3, t2 );
			  p2[2] = PACK16LSB( t5, t4 );
			  p2[3] = PACK16LSB( t7, t6 );
			  p2[4] = PACK16LSB( t9, t8 );
			  p2[5] = PACK16LSB( t11, t10 );
			  p2[6] = PACK16LSB( t13, t12 );
			  p2[7] = PACK16LSB( t15, t14 );
			  p1 += lx;
			  p2 += 8;
		  }
		  break;
	  }
  default:
	  {
		  printf( "FindPred switch error!\n" );
		  exit(35);
	  }
  }

  return;
}

void FindPred_MY2(int x, int y, MotionVector *fr, unsigned char *prev, 
                  short int *pred, int bs, int comp)
{
  int m, n;
  int new_x, new_y;
  int lx;

  int *p1, *p2;
  int t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15;
  int s0=0, s1=0, s2=0, s3=0;

  lx = pels>>1;

  new_x = x + fr->x;
  new_y = y + fr->y;

  p1 = (int *)( prev + new_x + (new_y)*lx );
  p2 = (int *)pred;
  switch( new_x-(new_x>>1<<1) )
  {
  case 0:
	  {
		  for (n = 0; n < bs; n++) 
		  { 
			  p2[0] = p1[0];
			  p2[1] = p1[1];
			  p2[2] = p1[2];
			  p2[3] = p1[3];
			  p2[4] = p1[4];
			  p2[5] = p1[5];
			  p2[6] = p1[6];
			  p2[7] = p1[7];
			  p1 += lx;
			  p2 += 8;
		  }
		  break;
	  }
  case 1:
	  {
		  for (n = 0; n < bs; n++) 
		  { 
			  t0 = UBYTESEL( p1[0], 2 );
			  t1 = UBYTESEL( p1[1], 0 );
			  t2 = UBYTESEL( p1[1], 2 );
			  t3 = UBYTESEL( p1[2], 0 );
			  t4 = UBYTESEL( p1[2], 2 );
			  t5 = UBYTESEL( p1[3], 0 );
			  t6 = UBYTESEL( p1[3], 2 );
			  t7 = UBYTESEL( p1[4], 0 );
			  t8 = UBYTESEL( p1[4], 2 );
			  t9 = UBYTESEL( p1[5], 0 );
			  t10 = UBYTESEL( p1[5], 2 );
			  t11 = UBYTESEL( p1[6], 0 );
			  t12 = UBYTESEL( p1[6], 2 );
			  t13 = UBYTESEL( p1[7], 0 );
			  t14 = UBYTESEL( p1[7], 2 );
			  t15 = UBYTESEL( p1[8], 0 );
			  p2[0] = PACK16LSB( t1, t0 );
			  p2[1] = PACK16LSB( t3, t2 );
			  p2[2] = PACK16LSB( t5, t4 );
			  p2[3] = PACK16LSB( t7, t6 );
			  p2[4] = PACK16LSB( t9, t8 );
			  p2[5] = PACK16LSB( t11, t10 );
			  p2[6] = PACK16LSB( t13, t12 );
			  p2[7] = PACK16LSB( t15, t14 );
			  p1 += lx;
			  p2 += 8;
		  }
		  break;
	  }
  default:
	  {
		  printf( "FindPred switch error!\n" );
		  exit(35);
	  }
  }

  return;
}

void ReconLumBlock_P_MY(int x, int y, MotionVector *fr,
						unsigned char *prev, short int *data, int bs, int comp)
{
  int m, n;
  int x1, y1;
  int lx;

  int *p1, *p2;
  int t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15;
  int s0, s1, s2, s3, s4, s5, s6, s7;  

  lx = pels;

  x1 = x + fr->x;
  y1 = y + fr->y;
  
  p1 = (int *)( prev+x1*2+fr->x_half + (y1*2+fr->y_half)*2*lx );
  p2 = (int *)data;
  switch( x1-(x1>>1<<1) )
  {
  case 0:
	  {
		  for (n = 0; n < bs; n++) 
		  { 
			  t0 = UBYTESEL( p1[0], 0 );
			  t1 = UBYTESEL( p1[1], 0 );
			  t2 = UBYTESEL( p1[2], 0 );
			  t3 = UBYTESEL( p1[3], 0 );
			  t4 = UBYTESEL( p1[0], 2 );
			  t5 = UBYTESEL( p1[1], 2 );
			  t6 = UBYTESEL( p1[2], 2 );
			  t7 = UBYTESEL( p1[3], 2 );
			  t8 = UBYTESEL( p1[4], 0 );
			  t9 = UBYTESEL( p1[5], 0 );
			  t10 = UBYTESEL( p1[6], 0 );
			  t11 = UBYTESEL( p1[7], 0 );
			  t12 = UBYTESEL( p1[4], 2 );
			  t13 = UBYTESEL( p1[5], 2 );
			  t14 = UBYTESEL( p1[6], 2 );
			  t15 = UBYTESEL( p1[7], 2 );
			  s0 = PACK16LSB( t4, t0 );
			  s1 = PACK16LSB( t5, t1 );
			  s2 = PACK16LSB( t6, t2 );
			  s3 = PACK16LSB( t7, t3 );
			  s4 = PACK16LSB( t12, t8 );
			  s5 = PACK16LSB( t13, t9 );
			  s6 = PACK16LSB( t14, t10 );
			  s7 = PACK16LSB( t15, t11 );
			  p2[0] = DSPIDUALADD( s0, p2[0] );
			  p2[1] = DSPIDUALADD( s1, p2[1] );
			  p2[2] = DSPIDUALADD( s2, p2[2] );
			  p2[3] = DSPIDUALADD( s3, p2[3] );
			  p2[4] = DSPIDUALADD( s4, p2[4] );
			  p2[5] = DSPIDUALADD( s5, p2[5] );
			  p2[6] = DSPIDUALADD( s6, p2[6] );
			  p2[7] = DSPIDUALADD( s7, p2[7] );
			  p1 += lx;
			  p2 += 8;
		  }
		  break;
	  }
  case 1:
	  {
		  for (n = 0; n < bs; n++) 
		  { 
			  t0 = UBYTESEL( p1[0], 2 );
			  t1 = UBYTESEL( p1[1], 0 );
			  t2 = UBYTESEL( p1[1], 2 );
			  t3 = UBYTESEL( p1[2], 0 );
			  t4 = UBYTESEL( p1[2], 2 );
			  t5 = UBYTESEL( p1[3], 0 );
			  t6 = UBYTESEL( p1[3], 2 );
			  t7 = UBYTESEL( p1[4], 0 );
			  t8 = UBYTESEL( p1[4], 2 );
			  t9 = UBYTESEL( p1[5], 0 );
			  t10 = UBYTESEL( p1[5], 2 );
			  t11 = UBYTESEL( p1[6], 0 );
			  t12 = UBYTESEL( p1[6], 2 );
			  t13 = UBYTESEL( p1[7], 0 );
			  t14 = UBYTESEL( p1[7], 2 );
			  t15 = UBYTESEL( p1[8], 0 );
			  s0 = PACK16LSB( t1, t0 );
			  s1 = PACK16LSB( t3, t2 );
			  s2 = PACK16LSB( t5, t4 );
			  s3 = PACK16LSB( t7, t6 );
			  s4 = PACK16LSB( t9, t8 );
			  s5 = PACK16LSB( t11, t10 );
			  s6 = PACK16LSB( t13, t12 );
			  s7 = PACK16LSB( t15, t14 );
			  p2[0] = DSPIDUALADD( s0, p2[0] );
			  p2[1] = DSPIDUALADD( s1, p2[1] );
			  p2[2] = DSPIDUALADD( s2, p2[2] );
			  p2[3] = DSPIDUALADD( s3, p2[3] );
			  p2[4] = DSPIDUALADD( s4, p2[4] );
			  p2[5] = DSPIDUALADD( s5, p2[5] );
			  p2[6] = DSPIDUALADD( s6, p2[6] );
			  p2[7] = DSPIDUALADD( s7, p2[7] );
			  p1 += lx;
			  p2 += 8;
		  }
		  break;
	  }
  default:
	  {
		  printf( "ReconLumBlock_P switch error!\n" );
		  exit(36);
	  }
  }

  return;
}

⌨️ 快捷键说明

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