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

📄 block.cpp

📁 h264编解码.用C++实现了图像的编解码功能。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  VER_ICVT(p0,p1,p2,p3);
  B0=p0;B1=p1;B2=p2;B3=p3;
  p0=outD[5];p1=outD[7];p2=outD[11];p3=outD[14];
  VER_ICVT(p0,p1,p2,p3);
  C0=p0;C1=p1;C2=p2;C3=p3;
  p0=outD[6];p1=outD[12];p2=outD[13];p3=outD[15];
  VER_ICVT(p0,p1,p2,p3);
  D0=p0;D1=p1;D2=p2;D3=p3;
  
  
  HOR_ICVT(A0,B0,C0,D0);
  M4[0][0] = p0;	M4[0][1]=p1;
  M4[0][2] = p2;	M4[0][3]=p3;
  HOR_ICVT(A1,B1,C1,D1);
  M4[1][0] = p0;	M4[1][1]=p1;
  M4[1][2] = p2;	M4[1][3]=p3;
  HOR_ICVT(A2,B2,C2,D2);
  M4[2][0] = p0;	M4[2][1]=p1;
  M4[2][2] = p2;	M4[2][3]=p3;
  HOR_ICVT(A3,B3,C3,D3);
  M4[3][0] = p0;	M4[3][1]=p1;
  M4[3][2] = p2;	M4[3][3]=p3;

  M0[0][0][0][0] = ((M4[0][0]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
  M0[0][0][0][3] = ((M4[3][0]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
  M0[0][0][0][1] = ((M4[1][0]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
  M0[0][0][0][2] = ((M4[2][0]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
  M0[0][1][0][0] = ((M4[0][1]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
  M0[0][1][0][3] = ((M4[3][1]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
  M0[0][1][0][1] = ((M4[1][1]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
  M0[0][1][0][2] = ((M4[2][1]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
  M0[0][2][0][0] = ((M4[0][2]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
  M0[0][2][0][3] = ((M4[3][2]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
  M0[0][2][0][1] = ((M4[1][2]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
  M0[0][2][0][2] = ((M4[2][2]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
  M0[0][3][0][0] = ((M4[0][3]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
  M0[0][3][0][3] = ((M4[3][3]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
  M0[0][3][0][1] = ((M4[1][3]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;
  M0[0][3][0][2] = ((M4[2][3]*dequant_coef[qp_rem][0][0]<<qp_per)+2)>>2;

  // AC invers trans/quant for MB
  for (jj=0;jj<4;jj++)
  {
    for (ii=0;ii<4;ii++)
    {
      run      = -1;
      scan_pos =  0;

	  for (coeff_ctr=1;coeff_ctr < 16;coeff_ctr++)
	  { 
		  i=SNGL_SCAN[coeff_ctr][0];
		  j=SNGL_SCAN[coeff_ctr][1];

		  pp=M0[i][ii][j][jj];
		  run++;
		  ilev=0;
		  level = (abs (pp) * quant_coef1[qp_rem][coeff_ctr] + qp_const) >> q_bits;
		  if (level != 0)
		  {
			  ac_coef = 15;
			  img->cof[jj][ii][scan_pos][0]=sign(level,pp);
			  img->cof[jj][ii][scan_pos][1]=run;
			  ++scan_pos;
			  run=-1;                     // reset zero level counter
			  ilev=level*dequant_coef1[qp_rem][coeff_ctr]<<qp_per;
		  }
		  M0[i][ii][j][jj]=sign(ilev,pp);
	  }
	  img->cof[jj][ii][scan_pos][0]=0;


	  // invers AC transform
      // IDCT horizontal
	  p0=M0[0][ii][0][jj];p1=M0[1][ii][0][jj];
	  p2=M0[2][ii][0][jj];p3=M0[3][ii][0][jj];
	  VER_IDCT(p0,p1,p2,p3);
	  A0=p0;A1=p1;A2=p2;A3=p3;
	  p0=M0[0][ii][1][jj];p1=M0[1][ii][1][jj];
	  p2=M0[2][ii][1][jj];p3=M0[3][ii][1][jj];
	  VER_IDCT(p0,p1,p2,p3);
	  B0=p0;B1=p1;B2=p2;B3=p3;
	  p0=M0[0][ii][2][jj];p1=M0[1][ii][2][jj];
	  p2=M0[2][ii][2][jj];p3=M0[3][ii][2][jj];
	  VER_IDCT(p0,p1,p2,p3);
	  C0=p0;C1=p1;C2=p2;C3=p3;
	  p0=M0[0][ii][3][jj];p1=M0[1][ii][3][jj];
	  p2=M0[2][ii][3][jj];p3=M0[3][ii][3][jj];
	  VER_IDCT(p0,p1,p2,p3);
	  D0=p0;D1=p1;D2=p2;D3=p3;
	  

	  i=ii<<2;	j=jj<<2;
	  HOR_IDCT(A0,B0,C0,D0);
	  M1[0+i][0+j] = p0;	M1[0+i][1+j] = p1;
	  M1[0+i][2+j] = p2;	M1[0+i][3+j] = p3;
	  HOR_IDCT(A1,B1,C1,D1);	  
	  M1[1+i][0+j] = p0;	M1[1+i][1+j] = p1;
	  M1[1+i][2+j] = p2;	M1[1+i][3+j] = p3;
	  HOR_IDCT(A2,B2,C2,D2);	  
	  M1[2+i][0+j] = p0;	M1[2+i][1+j] = p1;
	  M1[2+i][2+j] = p2;	M1[2+i][3+j] = p3;
	  HOR_IDCT(A3,B3,C3,D3);
	  M1[3+i][0+j] = p0;	M1[3+i][1+j] = p1;
	  M1[3+i][2+j] = p2;	M1[3+i][3+j] = p3;
    }
  }

 for (j=0;j<16;j++)
 {
	 pp=(img->pix_y+j)*lx+img->pix_x;
	 for (i=0;i<16;i+=4)
	 {
		 imgY[pp+i]   = (byte)IDCT_SHIFT(M1[i][j],  img->mprr_2[new_intra_mode][j*16+i]);
		 imgY[pp+i+1] = (byte)IDCT_SHIFT(M1[i+1][j],img->mprr_2[new_intra_mode][j*16+i+1]);
		 imgY[pp+i+2] = (byte)IDCT_SHIFT(M1[i+2][j],img->mprr_2[new_intra_mode][j*16+i+2]);
		 imgY[pp+i+3] = (byte)IDCT_SHIFT(M1[i+3][j],img->mprr_2[new_intra_mode][j*16+i+3]);
	 }
 }
    return ac_coef;
}

int inter_dct_luma(int *ii, int *coeff, int block_x,int block_y,int *coeff_cost, struct img_par *img)
{ 
  int sign(int a,int b);
 
  int ilev,coeff_ctr;
  int qp_const,level,scan_pos,run;
  int nonzero;
  int qp_per,qp_rem,q_bits;

  int   pos_x   = block_x/BLOCK_SIZE;
  int   pos_y   = block_y/BLOCK_SIZE;

  int p0,p1,p2,p3;
  int q0,q1,q2,q3;
  int A0,A1,A2,A3;
  int B0,B1,B2,B3;
  int C0,C1,C2,C3;
  int D0,D1,D2,D3;
  //int width=img->width+IMG_PAD_SIZE;
  int outD[16];

  qp_per    = (img->qp-MIN_QP)/6;
  qp_rem    = (img->qp-MIN_QP)%6;
  q_bits    = Q_BITS+qp_per;

  if (img->type == INTRA_IMG)
    qp_const=(1<<q_bits)/3;    // intra
  else
    qp_const=(1<<q_bits)/6;    // inter
  
  p0=ii[0];
  p1=ii[1];
  p2=ii[2];
  p3=ii[3];
  HOR_DCT(p0,p1,p2,p3);
  A0=p0;A1=p1;A2=p2;A3=p3;
  ii+=16;

  p0=ii[0];
  p1=ii[1];
  p2=ii[2];
  p3=ii[3];
  HOR_DCT(p0,p1,p2,p3);
  B0=p0;B1=p1;B2=p2;B3=p3;
  ii+=16;
  
  p0=ii[0];
  p1=ii[1];
  p2=ii[2];
  p3=ii[3];
  HOR_DCT(p0,p1,p2,p3);
  C0=p0;C1=p1;C2=p2;C3=p3;
  ii+=16;
  
  p0=ii[0];
  p1=ii[1];
  p2=ii[2];
  p3=ii[3];
  HOR_DCT(p0,p1,p2,p3);
  D0=p0;D1=p1;D2=p2;D3=p3;
  
  VER_DCT(A0,B0,C0,D0);
  outD[0]=p0;outD[2]=p1;outD[3]=p2;outD[9]=p3;
  VER_DCT(A1,B1,C1,D1);
  outD[1]=p0;outD[4]=p1;outD[8]=p2;outD[10]=p3;
  VER_DCT(A2,B2,C2,D2);
  outD[5]=p0;outD[7]=p1;outD[11]=p2;outD[14]=p3;
  VER_DCT(A3,B3,C3,D3);
  outD[6]=p0;outD[12]=p1;outD[13]=p2;outD[15]=p3;
  // Quant

  nonzero=FALSE;

  run=-1;
  scan_pos=0;
  
  for (coeff_ctr=0;coeff_ctr < 16;coeff_ctr++)
  { 
    p0=outD[coeff_ctr];
    run++;
    ilev=0;
    level = (abs (p0) * quant_coef1[qp_rem][coeff_ctr] + qp_const) >> q_bits;
    if (level != 0)
    {
      nonzero=TRUE;
      if (level > 1)
        *coeff_cost += MAX_VALUE;
      else
        *coeff_cost += COEFF_COST[run];
      img->cof[pos_x][pos_y][scan_pos][0]=sign(level,p0);
      img->cof[pos_x][pos_y][scan_pos][1]=run;
      ++scan_pos;
      run=-1;
      ilev=level*dequant_coef1[qp_rem][coeff_ctr]<<qp_per;
    }
    coeff[coeff_ctr]=sign(ilev,p0);
  }
  img->cof[pos_x][pos_y][scan_pos][0]=0;

  cbp_blk[img->block_y+pos_y][img->block_x+pos_x]=nonzero;
  return nonzero;
}

void inter_idct_luma(int *outD, byte *pp, int block_x,int block_y,struct img_par *img,int width)
{ 
  int sign(int a,int b);
 
  int j;
  //int qp_const,level,scan_pos,run;
  //int qp_per,qp_rem,q_bits;

  int   pos_x   = block_x/BLOCK_SIZE;
  int   pos_y   = block_y/BLOCK_SIZE;

  int p0,p1,p2,p3;
  int q0,q1,q2,q3;
  int A0,A1,A2,A3;
  int B0,B1,B2,B3;
  int C0,C1,C2,C3;
  int D0,D1,D2,D3;
  //int width=img->width;
  int out[256];
  
  p0=outD[0];p1=outD[2];p2=outD[3];p3=outD[9];
  VER_IDCT(p0,p1,p2,p3);
  A0=p0;A1=p1;A2=p2;A3=p3;
  p0=outD[1];p1=outD[4];p2=outD[8];p3=outD[10];
  VER_IDCT(p0,p1,p2,p3);
  B0=p0;B1=p1;B2=p2;B3=p3;
  p0=outD[5];p1=outD[7];p2=outD[11];p3=outD[14];
  VER_IDCT(p0,p1,p2,p3);
  C0=p0;C1=p1;C2=p2;C3=p3;
  p0=outD[6];p1=outD[12];p2=outD[13];p3=outD[15];
  VER_IDCT(p0,p1,p2,p3);
  D0=p0;D1=p1;D2=p2;D3=p3;
  
  
  HOR_IDCT(A0,B0,C0,D0);
  out[0]=IDCT_SHIFT(p0,pp[0]);
  out[1]=IDCT_SHIFT(p1,pp[1]);
  out[2]=IDCT_SHIFT(p2,pp[2]);
  out[3]=IDCT_SHIFT(p3,pp[3]);
  pp+=width;
  HOR_IDCT(A1,B1,C1,D1);
  out[4]=IDCT_SHIFT(p0,pp[0]);
  out[5]=IDCT_SHIFT(p1,pp[1]);
  out[6]=IDCT_SHIFT(p2,pp[2]);
  out[7]=IDCT_SHIFT(p3,pp[3]);
  pp+=width;
  HOR_IDCT(A2,B2,C2,D2);
  out[8]=IDCT_SHIFT(p0,pp[0]);
  out[9]=IDCT_SHIFT(p1,pp[1]);
  out[10]=IDCT_SHIFT(p2,pp[2]);
  out[11]=IDCT_SHIFT(p3,pp[3]);
  pp+=width;
  HOR_IDCT(A3,B3,C3,D3);
  out[12]=IDCT_SHIFT(p0,pp[0]);
  out[13]=IDCT_SHIFT(p1,pp[1]);
  out[14]=IDCT_SHIFT(p2,pp[2]);
  out[15]=IDCT_SHIFT(p3,pp[3]);
  
  for (j=0; j < BLOCK_SIZE; j++) 
  {
	  p0=(img->pix_y+block_y+j)*(img->width+IMG_PAD_SIZE)+img->pix_x+block_x;
	  p1=j*4;
	  imgY[p0  ]=out[p1  ];
	  imgY[p0+1]=out[p1+1];
	  imgY[p0+2]=out[p1+2];
	  imgY[p0+3]=out[p1+3];
  }
}

#define UVFILTER1(f0,f1,x0,x1) (((f0)*(x0)+(f1)*(x1)+4)>>3)
#define UVFILTER2(if0,if1,jf0,jf1,x0,y0,x1,y1)\
	 (((if0)*(jf0)*(x0)+(if1)*(jf0)*(x1)+(if0)*(jf1)*(y0)+(if1)*(jf1)*(y1)+32)>>6)

void Predict(struct img_par *img)
{
	int m,n;
	int x = img->pix_x;
	int y = img->pix_y;
	int mvx = curr_mvx;
	int mvy = curr_mvy;
	int*  Cb;
	int*  Cr;
	int offset1;
	int offset2;
	int cc;
	byte*  iCb1;
	byte*  iCb2;
	byte*  iCr1;
	byte*  iCr2;
	//byte*  cCr;
	//byte*  cCb;

	int lx=img->width+IMG_PAD_SIZE;
	byte*  curr=imgY_org + x+y*lx;
	byte*  prev=ipol[img->comp] + img->offset;
	int*  error=MbLum;
	
	int if0,if1,jf0,jf1;

	int x0,x1,x2,x3,x4,x5,x6,x7,x8;
	int y0,y1,y2,y3,y4,y5,y6,y7,y8;
	int z0,z1,z2,z3,z4,z5,z6,z7;

	for (n = 0; n < MB_BLOCK_SIZE; n++)
	{
		z0=curr[ 0];		y0=prev[ 0];
		z1=curr[ 1];		y1=prev[ 1];
		z2=curr[ 2];		y2=prev[ 2];
		z3=curr[ 3];		y3=prev[ 3];
		z4=curr[ 4];		y4=prev[ 4];
		z5=curr[ 5];		y5=prev[ 5];
		z6=curr[ 6];		y6=prev[ 6];
		z7=curr[ 7];		y7=prev[ 7];
		error[ 0]=z0-y0;
		error[ 1]=z1-y1;
		error[ 2]=z2-y2;
		error[ 3]=z3-y3;
		error[ 4]=z4-y4;
		error[ 5]=z5-y5;
		error[ 6]=z6-y6;
		error[ 7]=z7-y7;
		z0=curr[ 8];		y0=prev[ 8];
		z1=curr[ 9];		y1=prev[ 9];
		z2=curr[10];		y2=prev[10];
		z3=curr[11];		y3=prev[11];
		z4=curr[12];		y4=prev[12];
		z5=curr[13];		y5=prev[13];
		z6=curr[14];		y6=prev[14];
		z7=curr[15];		y7=prev[15];
		error[ 8]=z0-y0;
		error[ 9]=z1-y1;
		error[10]=z2-y2;
		error[11]=z3-y3;
		error[12]=z4-y4;
		error[13]=z5-y5;
		error[14]=z6-y6;
		error[15]=z7-y7;
		error+=16;
		curr+=lx;
		prev+=lx;
	}
	
  x = img->pix_c_x;
  y = img->pix_c_y;
  m=( (mvx&7)==0 ? 0:1);
  n=( (mvy&7)==0 ? 0:1);
  cc=m+(n<<1);
  lx = img->width_cr+IMG_PAD_SIZE;
  Cb=MbCb;
  Cr=MbCr;
  offset1=x + (mvx>>3) + (y + (mvy>>3))*lx;
  offset2=x + y*lx;	
  iCb1=mcef[0]+offset1;
  iCb2=iCb1+lx;
  iCr1=mcef[1]+offset1;
  iCr2=iCr1+lx;

  switch(cc)
  {
  	case 0:
  		for (n = 0; n < 8; n++)
		{
			x0=iCb1[0];
			x1=iCb1[1];
			x2=iCb1[2];
			x3=iCb1[3];
			x4=iCb1[4];
			x5=iCb1[5];
			x6=iCb1[6];
			x7=iCb1[7];
			Cb[0]=x0;
			Cb[1]=x1;
			Cb[2]=x2;
			Cb[3]=x3;
			Cb[4]=x4;
			Cb[5]=x5;
			Cb[6]=x6;
			Cb[7]=x7;
			x0=iCr1[0];
			x1=iCr1[1];
			x2=iCr1[2];
			x3=iCr1[3];
			x4=iCr1[4];
			x5=iCr1[5];
			x6=iCr1[6];
			x7=iCr1[7];
			Cr[0]=x0;
			Cr[1]=x1;
			Cr[2]=x2;
			Cr[3]=x3;
			Cr[4]=x4;
			Cr[5]=x5;
			Cr[6]=x6;
			Cr[7]=x7;
			Cb+=8;			Cr+=8;
			iCb1+=lx;		iCr1+=lx;
		}
		break;
	case 1:
		if1=(mvx & 7);
	        if0=8-if1;	 
		for (n = 0; n < 8; n++)
		{
			x0=iCb1[0];
			x1=iCb1[1];
			x2=iCb1[2];
			x3=iCb1[3];
			x4=iCb1[4];
			x5=iCb1[5];
			x6=iCb1[6];
			x7=iCb1[7];
			x8=iCb1[8];
			Cb[0]=UVFILTER1(if0,if1,x0,x1);
			Cb[1]=UVFILTER1(if0,if1,x1,x2);
			Cb[2]=UVFILTER1(if0,if1,x2,x3);
			Cb[3]=UVFILTER1(if0,if1,x3,x4);
			Cb[4]=UVFILTER1(if0,if1,x4,x5);
			Cb[5]=UVFILTER1(if0,if1,x5,x6);
			Cb[6]=UVFILTER1(if0,if1,x6,x7);
			Cb[7]=UVFILTER1(if0,if1,x7,x8);
			x0=iCr1[0];
			x1=iCr1[1];
			x2=iCr1[2];
			x3=iCr1[3];
			x4=iCr1[4];
			x5=iCr1[5];
			x6=iCr1[6];
			x7=iCr1[7];
			x8=iCr1[8];
			Cr[0]=UVFILTER1(if0,if1,x0,x1);
		

⌨️ 快捷键说明

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