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

📄 pred.c

📁 h.263+ vc++商业源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		curry = nyt + extray;
		summary += InterpolatePel(image_edge,currx,curry) * Mt[n][m];
	  }
	  if( n >= 4 )
	  {
		currx = nxb + extrax;
		curry = nyb + extray;
		summary += InterpolatePel(image_edge,currx,curry) * Mb[n][m];
	  }
	  if( m >= 4 )
	  {
		currx = nxr + extrax;
		curry = nyr + extray;
		summary += InterpolatePel(image_edge,currx,curry) * Mr[n][m];
	  }
	  if( m < 4 )
	  {
		currx = nxl + extrax;
		curry = nyl + extray;
	    summary += InterpolatePel(image_edge,currx,curry) * Ml[n][m];
	  }
	  
      *(pred + m + n*16) = summary >>3;
	  extrax += 2 ;
    }
	extray += 2 ;
	extrax = 64 ;
  }
 return;
}
//==================================================================

/**********************************************************************
 *
 *	Name:		ReconMacroblock_P
 *	Description:	Reconstructs MB after quantization for P_images
 *	
 *	Input:		pointers to current and previous image,
 *			current slice and mb, and which mode
 *			of prediction has been used
 *	Returns:
 *	Side effects:
 *
 ***********************************************************************/
//This function only deal with one macro block 
void MB_Pred(unsigned char _huge *image_edge ,
			 PictImage *prev_image,MB_Structure *pred, int x_curr, 
			 int y_curr,MotionVector *MV[6][MBR+1][MBC+2])
{
  MotionVector *fr0,*fr1,*fr2,*fr3,*fr4;
  int dx, dy, sum;
  int i = MB_SIZE,j = MB_SIZE;
  int y = y_curr/MB_SIZE + 1, x = x_curr/MB_SIZE + 1;
  //unsigned char _huge *in;
  int *out;
  int currx ,curry ; 	
  int lx = (pels + 64)<<1;

  fr0 = MV[0][y][x];

  if (advanced) 
  {
	FindPredOBMC(image_edge,x_curr, y_curr, MV, &pred->lum[0][0], 0);
	FindPredOBMC(image_edge,x_curr, y_curr, MV, &pred->lum[0][8], 1);
	FindPredOBMC(image_edge,x_curr, y_curr, MV, &pred->lum[8][0], 2);
	FindPredOBMC(image_edge,x_curr, y_curr, MV, &pred->lum[8][8], 3);

    if (fr0->Mode == MODE_INTER || fr0->Mode == MODE_INTER_Q) {
      dx = 2*fr0->x + fr0->x_half;
      dy = 2*fr0->y + fr0->y_half;
      dx = ( dx % 4 == 0 ? dx >> 1 : (dx>>1)|1 );
      dy = ( dy % 4 == 0 ? dy >> 1 : (dy>>1)|1 );
      ReconChromBlock_P(x_curr, y_curr, dx, dy, prev_image, pred);
    }
	else if(fr0->Mode == MODE_INTER0)
      ReconChromBlock_P(x_curr, y_curr, 0, 0, prev_image, pred);
    else if (fr0->Mode == MODE_INTER4V) 
    { // Inter 8x8 
      fr1 = MV[1][y][x];
      fr2 = MV[2][y][x];
      fr3 = MV[3][y][x];
      fr4 = MV[4][y][x];

      sum = 2*fr1->x + fr1->x_half + 2*fr2->x + fr2->x_half +
	2*fr3->x + fr3->x_half + 2*fr4->x + fr4->x_half ; 
      dx = sign(sum)*(roundtab[abs(sum)%16] + (abs(sum)/16)*2);

      sum = 2*fr1->y + fr1->y_half + 2*fr2->y + fr2->y_half +
	2*fr3->y + fr3->y_half + 2*fr4->y + fr4->y_half;
      dy = sign(sum)*(roundtab[abs(sum)%16] + (abs(sum)/16)*2);

      ReconChromBlock_P(x_curr, y_curr, dx, dy, prev_image, pred);
    }
  }
  // here is the commom pred mode
  else 
  {
    if (fr0->Mode == MODE_INTER || fr0->Mode == MODE_INTER_Q || fr0->Mode == MODE_INTER0) 
	{
      dx = 2*fr0->x + fr0->x_half;
      dy = 2*fr0->y + fr0->y_half;
	  out = pred->lum[0];
	  //MB_SIZE * MB_SIZE次
	  while (j--) {
		while (i--)
		{
			currx = (x_curr<<1) + dx + ((15-i)<<1) +4*B ;
			curry = (y_curr<<1) + dy + ((15-j)<<1) +4*B ;
			*out++ = InterpolatePel(image_edge,currx,curry);   
	  
		}
		i = MB_SIZE;
	  }

      dx = ( dx % 4 == 0 ? dx >> 1 : (dx>>1)|1 );
      dy = ( dy % 4 == 0 ? dy >> 1 : (dy>>1)|1 );
      ReconChromBlock_P(x_curr, y_curr, dx, dy, prev_image, pred);

    }
  }
}


//===============================================================
void ReconChromBlock_P(int x_curr, int y_curr, int dx, int dy,
		       PictImage *prev, MB_Structure *data)

{
 int m,n;
 int x = x_curr>>1, y = y_curr>>1,lx = pels/2 + 32;
 int xint = dx>>1, yint = dy>>1;
 int xh = dx & 1, yh = dy & 1;
 int *cr = data->Cr[0], *cb = data->Cb[0];
 unsigned char _huge *pr = prev->Cr + x + xint + (y + yint)*lx;
 unsigned char _huge *pb = prev->Cb + x + xint + (y + yint)*lx;;

 for (n = 0; n < 8; n++) 
 {
	 for (m = 0; m < 8; m++) 
	 {
	    if (!xh && !yh) 
		{
			*cr++ = *(pr + m);
			*cb++ = *(pb + m);
		}
	    else if (!xh && yh) 
		{
			*cr++ = ((*(pr + m) + *(pr + m + lx) + 1)>>1);
			*cb++ = ((*(pb + m) + *(pb + m + lx) + 1)>>1);
		}
		else if (xh && !yh) {
			*cr++ = ((*(pr + m) + *(pr + m + 1) + 1)>>1);
			*cb++ = ((*(pb + m) + *(pb + m + 1) + 1)>>1);;
      
		}
		else { /* xh && yh */
			*cr++ = ((*(pr + m) + *(pr + m + 1) + 
						  *(pr + m + lx) + *(pr + m + lx +1) + 2)>>2);
			*cb++ = ((*(pb + m) + *(pb + m + 1) + 
						  *(pb + m + lx) + *(pb + m + lx +1) + 2)>>2);;
		}
	 }
	 pr += lx;
	 pb += lx;
 }
		
  return;
}


/**********************************************************************
 *
 *	Name:		ReconLumBlock_P
 *	Description:	Reconstructs one block of luminance data
 *	
 *	Input:		position, vector-data, previous image, data-block
 *	Returns:
 *	Side effects:	reconstructs data-block
 *
 ***********************************************************************/

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

  lx = pels + 64;

  x1 = 2*(x + fr->x) + fr->x_half;
  y1 = 2*(y + fr->y) + fr->y_half;
  
  x1 += ((comp&1)<<4);
  y1 += ((comp&2)<<3);

  for (n = 0; n < bs; n++) {
    for (m = 0; m < bs; m++) {
      *(data+m+n*16) += *(prev+x1+2*m + (long)(y1+2*n)*2L*lx);
    }
  }

  return;
}

/**********************************************************************
 *
 *	Name:		FindChromBlock_P
 *	Description:   	Finds chrominance of one block in P frame
 *	
 *	Input:	      	position, vector-data, previous image, data-block
 *
 ***********************************************************************/

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 = pels/2 + 32;

  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    + (long)(ofy   )*lx);
	data->Cr[n][m] = pel;

	pel=*(prev->Cb+ofx    + (long)(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    + (long)(ofy   )*lx)+
	     *(prev->Cr+ofx    + (long)(ofy+yh)*lx) + 1)>>1;

	data->Cr[n][m] = pel;

	pel=(*(prev->Cb+ofx    + (long)(ofy   )*lx)+
	     *(prev->Cb+ofx    + (long)(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    + (long)(ofy   )*lx)+
	     *(prev->Cr+ofx+xh + (long)(ofy   )*lx) + 1)>>1;

	data->Cr[n][m] = pel;

	pel=(*(prev->Cb+ofx    + (long)(ofy   )*lx)+
	     *(prev->Cb+ofx+xh + (long)(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    + (long)(ofy   )*lx)+
	     *(prev->Cr+ofx+xh + (long)(ofy   )*lx)+
	     *(prev->Cr+ofx    + (long)(ofy+yh)*lx)+
	     *(prev->Cr+ofx+xh + (long)(ofy+yh)*lx)+
	     2)>>2;

	data->Cr[n][m] = pel;

	pel=(*(prev->Cb+ofx    + (long)(ofy   )*lx)+
	     *(prev->Cb+ofx+xh + (long)(ofy   )*lx)+
	     *(prev->Cb+ofx    + (long)(ofy+yh)*lx)+
	     *(prev->Cb+ofx+xh + (long)(ofy+yh)*lx)+
	     2)>>2;

	data->Cb[n][m] = pel;
      
      }
    }
  }
  return;
}



/**********************************************************************
 *
 *	Name:		ChooseMode
 *	Description:    chooses coding mode
 *	
 *	Input:	        pointer to original fram, min_error from 
 *                      integer pel search, DQUANT
 *	Returns:        1 for Inter, 0 for Intra
 *
 *
 ***********************************************************************/

int ChooseMode(unsigned char *curr, int min_SAD)
{
  int i,j;
  int MB_mean = 0, A = 0;
  int SIZE_MB = MB_SIZE*MB_SIZE;

  for (j = 0; j < SIZE_MB; j += MB_SIZE) 
    for (i = 0; i < MB_SIZE; i++) 
      MB_mean += *(curr + i + j);

  MB_mean /= SIZE_MB;
  for (j = 0; j < SIZE_MB; j += MB_SIZE)
    for (i = 0; i < MB_SIZE; i++)
      A += abs( *(curr + i + j) - MB_mean );

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

int ModifyMode(int Mode, int dquant)
{

  if (Mode == MODE_INTRA) {
    if(dquant!=0)
      return MODE_INTRA_Q;
    else
      return MODE_INTRA;
  }
  else if(Mode != MODE_INTER0){ 
    if(dquant!=0)
      return MODE_INTER_Q;
    else
      return Mode;
  }
  else
      return Mode;
}

⌨️ 快捷键说明

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