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

📄 macroblock.cpp

📁 264的播放器
💻 CPP
📖 第 1 页 / 共 4 页
字号:
  for (block_y=0; block_y < 4; block_y += 2) /* all modes */
  {
    for (block_x=0; block_x < 4; block_x += 2)
    {

      b8 = 2*(block_y/2) + block_x/2;
      for (j=block_y; j < block_y+2; j++)
      {
        for (i=block_x; i < block_x+2; i++)
        {
          ii = block_x/2; jj = block_y/2;
          b8 = 2*jj+ii;

          if (cbp & (1<<b8))  /* are there any coeff in current block at all */
          {
            if (IS_NEWINTRA(currMB))
            {
              readCoeff4x4_CAVLC(img, LUMA_INTRA16x16AC, i, j,
                                  levarr, runarr, &numcoeff);
              start_scan = 1;
            }
            else
            {
              readCoeff4x4_CAVLC(img, LUMA, i, j,
                                  levarr, runarr, &numcoeff);
              start_scan = 0;
            }

			coef_ctr = start_scan-1;
            for (k = 0; k < numcoeff; k++)
            {
              if (levarr[k] != 0)
              {
                coef_ctr             += runarr[k]+1;
                i0=SNGL_SCAN[coef_ctr][0];
                j0=SNGL_SCAN[coef_ctr][1];
                
                currMB->cbp_blk      |= 1 << ((j<<2) + i) ;
                img->cof[i][j][i0][j0]= levarr[k]*dequant_coef[qp_rem][i0][j0]<<qp_per;
              }
            }
          }
          else
          {
            img->nz_coeff[img->current_mb_nr][i][j] = 0;
          }
        }
      }
    }
  }

  /*img->cof和luma的初始化合并*/

  m2 =img->mb_x*2;
  jg2=img->mb_y*2;

  // chroma 2x2 DC coeff
  if(cbp>15)
  {
    for (ll=0;ll<3;ll+=2)
    {
      memset(img->cofu,0,4*sizeof(int));

      readCoeff4x4_CAVLC(img, CHROMA_DC, 0, 0,
                          levarr, runarr, &numcoeff);
      coef_ctr=-1;
      level=1;
      for(k = 0; k < numcoeff; k++)
      {
        if (levarr[k] != 0)
        {
          currMB->cbp_blk |= 0xf0000 << (ll<<1) ;
          coef_ctr=coef_ctr+runarr[k]+1;
          img->cofu[coef_ctr]=levarr[k];
        }
      }

//      for (i=0;i<4;i++)
	  int dequant_cofu=dequant_coef[qp_rem_uv][0][0]<<qp_per_uv;
      img->cofu[0]*=dequant_cofu;
	  img->cofu[1]*=dequant_cofu;
	  img->cofu[2]*=dequant_cofu;
	  img->cofu[3]*=dequant_cofu;

      img->cof[0+ll][4][0][0]=(img->cofu[0]+img->cofu[1]+img->cofu[2]+img->cofu[3])>>1;
      img->cof[1+ll][4][0][0]=(img->cofu[0]-img->cofu[1]+img->cofu[2]-img->cofu[3])>>1;
      img->cof[0+ll][5][0][0]=(img->cofu[0]+img->cofu[1]-img->cofu[2]-img->cofu[3])>>1;
      img->cof[1+ll][5][0][0]=(img->cofu[0]-img->cofu[1]-img->cofu[2]+img->cofu[3])>>1;
    }
  }

  // chroma AC coeff, all zero fram start_scan
  if (cbp<=31)
    for (i=0; i < 4; i++)
      for (j=4; j < 6; j++)
        img->nz_coeff [img->current_mb_nr ][i][j]=0;


  // chroma AC coeff, all zero fram start_scan
  uv=-1;
  if (cbp>31)
  {
    block_y=4;
    for (block_x=0; block_x < 4; block_x += 2)
    {
      for (j=block_y; j < block_y+2; j++)
      {
        jj=j>>1;
        j1=j-4;
        for (i=block_x; i < block_x+2; i++)
        {

          ii=i>>1;
          i1=i&0x0001;

		  readCoeff4x4_CAVLC(img, CHROMA_AC, i, j,
                              levarr, runarr, &numcoeff);
          coef_ctr=0;
          level=1;
          uv++;
          for(k = 0; k < numcoeff;k++)
          {
            if (levarr[k] != 0)
            {
              currMB->cbp_blk |= 1 << (16 + (j1<<1) + i1 + (block_x<<1) ) ;
              coef_ctr=coef_ctr+runarr[k]+1;
              i0=SNGL_SCAN[coef_ctr][0];
              j0=SNGL_SCAN[coef_ctr][1];
              
              img->cof[i][j][i0][j0]=levarr[k]*dequant_coef[qp_rem_uv][i0][j0]<<qp_per_uv;
            }
          }
        }
      }
    }
  }
}


/*!
 ************************************************************************
 * \brief
 *    Copy IPCM coefficients to decoded picture buffer and set parameters for this MB
 *    (for IPCM CABAC and IPCM CAVLC  28/11/2003)
 *
 * \author
 *    Dong Wang <Dong.Wang@bristol.ac.uk>
 ************************************************************************
 */

void decode_ipcm_mb(struct img_par *img)
{
  int i,j;

  Macroblock *currMb = &img->mb_data[img->mb_y*img->PicWidthInMbs + img->mb_x] ;    

  int dy;


  //Copy coefficents to decoded picture buffer
  //IPCM coefficents are stored in img->cof which is set in function readIPCMcoeffsFromNAL()
  dy=1;

  for(i=0;i<16;i++)
    for(j=0;j<16;j++)
      dec_picture->imgY[img->pix_y+i*dy][img->pix_x+j]=img->cof[i/4][j/4][i&0x0003][j&0x0003];

  for(i=0;i<8;i++)
    for(j=0;j<8;j++)
      dec_picture->imgUV[0][img->pix_c_y+i*dy][img->pix_c_x+j]=img->cof[i/4][j/4+4][i&0x0003][j&0x0003];

  for(i=0;i<8;i++)
    for(j=0;j<8;j++)
      dec_picture->imgUV[1][img->pix_c_y+i*dy][img->pix_c_x+j]=img->cof[i/4+2][j/4+4][i&0x0003][j&0x0003];



  //For Deblocking Filter  16/08/2003
  if (currMb->mb_type==IPCM)
    currMb->qp=0;

  //For CAVLC
  //Set the nz_coeff to 16. 
  //These parameters are to be used in CAVLC decoding of neighbour blocks
  for(i=0;i<4;i++)
    for (j=0;j<6;j++)
      img->nz_coeff[img->current_mb_nr][i][j]=16;
}

/*!
 ************************************************************************
 * \brief
 *    decode one macroblock
 ************************************************************************
 */
int decode_one_macroblock(struct img_par *img)
{
  const byte decode_block_scan[16] = {0,1,4,5,2,3,6,7,8,9,12,13,10,11,14,15};
  Macroblock *currMB   = &img->mb_data[img->current_mb_nr];

  
  int i=0,j=0,k,ii=0,jj,j4=0,i4=0;
  int block8x8;   // needed for ABT
  int uv;
  int ioff,joff;

  if(currMB->mb_type==IPCM)
  {
    //copy readed data into imgY and set parameters
    decode_ipcm_mb(img);
    return 0;
  }

  //I16
  if (IS_NEWINTRA (currMB))
  {
    intrapred_luma_16x16(img, currMB->i16mode);
	for (block8x8=0; block8x8<4; block8x8++)
	{
		for (k = block8x8*4; k < block8x8*4+4; k ++)
		{
			i = (decode_block_scan[k] & 3);
			j = ((decode_block_scan[k] >> 2) & 3);
			
			ioff=i<<2;
			i4=(img->block_x+i)<<2;
			
			joff=j<<2;
			j4=(img->block_y+j)<<2;

			itrans   (img,ioff,joff,i,j);      // use DCT transform and make 4x4 block m7 from prediction block mpr
			
			for(ii=0;ii<4;ii++)
				for(jj=0;jj<4;jj++)
					dec_picture->imgY[j4+jj][i4+ii]=img->m7[ii][jj];
		}
	}
	//chroma
	for(uv=0;uv<2;uv++)
	{
		intrapred_chroma(img, uv);
		
		for (j=4;j<6;j++)
		{
			joff=(j-4)<<2;
			j4=img->pix_c_y+joff;

			for(i=0;i<2;i++)
			{
				ioff=i<<2;
				i4=img->pix_c_x+ioff;

				itrans(img,ioff,joff,2*uv+i,j);
				for(ii=0;ii<4;ii++)
					for(jj=0;jj<4;jj++)
						dec_picture->imgUV[uv][j4+jj][i4+ii]=img->m7[ii][jj];
			}
		}
	}
	return 0;
  }

  if(IS_OLDINTRA(currMB))
  {
	for (block8x8=0; block8x8<4; block8x8++)
	{
		for (k = block8x8*4; k < block8x8*4+4; k ++)
		{
			i = (decode_block_scan[k] & 3);
			j = ((decode_block_scan[k] >> 2) & 3);
			
			ioff=i<<2;
			i4=img->block_x+i;
			
			joff=j<<2;
			j4=img->block_y+j;

			if (intrapred(img,ioff,joff,i4,j4)==SEARCH_SYNC)  /* make 4x4 prediction block mpr from given prediction img->mb_mode */
				return SEARCH_SYNC;

			itrans   (img,ioff,joff,i,j);      // use DCT transform and make 4x4 block m7 from prediction block mpr
			i4=i4<<2;
			j4=j4<<2;
			for(ii=0;ii<4;ii++)
				for(jj=0;jj<4;jj++)
					dec_picture->imgY[j4+jj][i4+ii]=img->m7[ii][jj];
		}
	}
	//chroma
	for(uv=0;uv<2;uv++)
	{
		intrapred_chroma(img, uv);
		
		for (j=4;j<6;j++)
		{
			joff=(j-4)<<2;
			j4=img->pix_c_y+joff;
			for(i=0;i<2;i++)
			{
				ioff=i<<2;
				i4=img->pix_c_x+ioff;

				itrans(img,ioff,joff,2*uv+i,j);
				for(ii=0;ii<4;ii++)
					for(jj=0;jj<4;jj++)					
						dec_picture->imgUV[uv][j4+jj][i4+ii]=img->m7[ii][jj];
			}
		}
	}
	return 0;
  }

  int tmp_block[4][4];
  int i1=0,j1=0;
  int vec1_x=0,vec1_y=0;

  int pred;
  int ii0,jj0,ii1,jj1,if1,jf1,if0,jf0;
  int /*mv_mul,*/f1,f2,f3,f4;

  int ref_idx, pred_dir; 

  int  *** mv_array;
  int max_y_cr;

  StorablePicture **list;

  int jf;

  // find out the correct list offsets
  max_y_cr = img->height_cr-1;
  
//  mv_mul=4;
  f1=8;	  f2=7;  f3=64/*f1*f1*/;  f4=f3/2;

  // luma decoding **************************************************

  // get prediction for INTRA_MB_16x16
  for (block8x8=0; block8x8<4; block8x8++)
  {
    for (k = block8x8*4; k < block8x8*4+4; k ++)
    {
      i = (decode_block_scan[k] & 3);
      j = ((decode_block_scan[k] >> 2) & 3);
      
      ioff=i<<2;
      i4=img->block_x+i;
      joff=j<<2;
      j4=img->block_y+j;

      pred_dir = currMB->b8pdir[2*(j>>1)+(i>>1)];
      assert (pred_dir<=2);

      //===== FORWARD/BACKWARD PREDICTION =====
          ref_idx  = dec_picture->ref_idx[LIST_0 + pred_dir][i4][j4];
          mv_array = dec_picture->mv[LIST_0 + pred_dir];
          list     = listX[0+ pred_dir];
          vec1_x = (i4<<4) + mv_array[i4][j4][0];
          vec1_y = (j4<<4) + mv_array[i4][j4][1];

          get_block (ref_idx, list, vec1_x, vec1_y, img, tmp_block);

          if (img->apply_weights)
          {
            for(ii=0;ii<4;ii++)
              for(jj=0;jj<4;jj++)  
                img->mpr[ii+ioff][jj+joff] = Clip1(((img->wp_weight[pred_dir][ref_idx][0] *  tmp_block[ii][jj]+ img->wp_round_luma) >>img->luma_log2_weight_denom)  + img->wp_offset[pred_dir][ref_idx][0] );
          }
          else
          {
			  for(ii=0;ii<4;ii++)
				memcpy(img->mpr[ii+ioff]+joff,tmp_block[ii],4*sizeof(int));
          }

      itrans   (img,ioff,joff,i,j);      // use DCT transform and make 4x4 block m7 from prediction block mpr
       j4<<=2;
	   i4<<=2;
      for(ii=0;ii<4;ii++)
		  for(jj=0;jj<4;jj++)
			  dec_picture->imgY[j4+jj][i4+ii]=img->m7[ii][jj];
    }
  }
  
  // chroma decoding *******************************************************
  for(uv=0;uv<2;uv++)
  {
    for (j=4;j<6;j++)
    {
      joff=(j-4)<<2;
      j4=img->pix_c_y+joff;
      for(i=0;i<2;i++)
      {
        ioff=i*4;
        i4=img->pix_c_x+ioff;
        
        pred_dir = currMB->b8pdir[2*(j-4)+i];
        assert (pred_dir<=2);

        mv_array = dec_picture->mv[LIST_0 + pred_dir];
		list = listX[0+pred_dir];
		for(jj=0;jj<4;jj++)
		{
			jf=(j4+jj)>>1;
			for(ii=0;ii<4;ii++)
			{
                if1=(i4+ii)>>1;
                
                ref_idx   = dec_picture->ref_idx[LIST_0+pred_dir][if1][jf];
                
                i1=(img->pix_c_x+ii+ioff)*f1+mv_array[if1][jf][0];
                j1=(img->pix_c_y+jj+joff)*f1+mv_array[if1][jf][1];
                
                ii0=max (0, min (i1/f1, img->width_cr-1));
                jj0=max (0, min (j1/f1, max_y_cr));
                ii1=max (0, min ((i1+f2)/f1, img->width_cr-1));
                jj1=max (0, min ((j1+f2)/f1, max_y_cr));
                
                if1=(i1 & f2);
                jf1=(j1 & f2);
                if0=f1-if1;
                jf0=f1-jf1;
                
                if (img->apply_weights)
                {
                  pred = (if0*jf0*list[ref_idx]->imgUV[uv][jj0][ii0]+
                          if1*jf0*list[ref_idx]->imgUV[uv][jj0][ii1]+
                          if0*jf1*list[ref_idx]->imgUV[uv][jj1][ii0]+
                          if1*jf1*list[ref_idx]->imgUV[uv][jj1][ii1]+f4)>>6;///f3;
                  img->mpr[ii+ioff][jj+joff] = Clip1(((img->wp_weight[pred_dir][ref_idx][uv+1] * pred  + img->wp_round_chroma)>>img->chroma_log2_weight_denom) + img->wp_offset[pred_dir][ref_idx][uv+1]);
                }
                else
                {
                  img->mpr[ii+ioff][jj+joff]=(if0*jf0*list[ref_idx]->imgUV[uv][jj0][ii0]+
                                              if1*jf0*list[ref_idx]->imgUV[uv][jj0][ii1]+
                                              if0*jf1*list[ref_idx]->imgUV[uv][jj1][ii0]+
                                              if1*jf1*list[ref_idx]->imgUV[uv][jj1][ii1]+f4)>>6;///f3;
                }
			}
		}
        
        itrans(img,ioff,joff,2*uv+i,j);
        for(ii=0;ii<4;ii++)
			for(jj=0;jj<4;jj++)
				dec_picture->imgUV[uv][j4+jj][i4+ii]=img->m7[ii][jj];
      }
    }
  }
  return 0;
}

⌨️ 快捷键说明

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