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

📄 rdopt.c

📁 Mobile IP VCEG的信道模拟程序
💻 C
📖 第 1 页 / 共 4 页
字号:
	    /*==============================================*
	     *=== DIRECT PREDICTED MACROBLOCK in B-FRAME ===*
	     *==============================================*/
	    currMB->intraOrInter = INTER_MB;
	    img->imod            = B_Direct;
	    get_dir (&dummy);
	    if (dummy != 100000000 /*MAX_DIR_SAD*/)
	      {
		RDCost_Macroblock (&rd, mode, 0, 0, 0);
	      }
	  }
	else
	  {
	    /*=====================================================*
	     *=== BIDIRECTIONAL PREDICTED MACROBLOCK in B-FRAME ===*
	     *=====================================================*/
	    /*--- get best backward prediction ---*/
	    min_rdcost = 1e30;
	    for (blocktype = 1; blocktype < 8; blocktype++)
	      if (valid_mode[blocktype+NO_INTER_MBMODES])
		{
		  if (backward_rdcost[blocktype] < 0.0)
		    {
		      /*--- get rd-cost's ---*/
		      currMB->intraOrInter = INTER_MB;
		      img->imod            = B_Backward;
		      if (!backward_me_done[blocktype])
			{
			  SingleUnifiedMotionSearch (0, blocktype,
						     bw_refFrArr, tmp_bwMV, img->p_bwMV, B_BACKWARD, img->all_bmv,
						     rdopt->lambda_motion);
			  backward_me_done[mode]=1;
			}
		      else
			for (j = 0; j < 4; j++)
			  for (i = 0; i < 4; i++)
			    {
			      tmp_bwMV[0][img->block_y+j][img->block_x+i+4]=
				img->all_bmv[i][j][0][blocktype][0];
			      tmp_bwMV[1][img->block_y+j][img->block_x+i+4]=
				img->all_bmv[i][j][0][blocktype][1];
			    }
		      RDCost_Macroblock (&rd, blocktype+NO_INTER_MBMODES, 0, 0, blocktype);
		      backward_rdcost[blocktype] = rd.rdcost;
		    }
		  if (backward_rdcost[blocktype] < min_rdcost)
		    {
		      min_rdcost = backward_rdcost[blocktype];
		      k0         = blocktype;
		    }
		}
	    blocktype_back = k0;

	    /*--- get best forward prediction ---*/
	    min_rdcost = 1e30;
	    for (blocktype = 1; blocktype < 8; blocktype++)
	      if (valid_mode[blocktype])
		{
		  if (forward_rdcost[blocktype] < 0.0)
		    {
		      /*--- get rd-cost's ---*/
		      currMB->intraOrInter = INTER_MB;
		      img->imod            = B_Forward;
		      min_inter_sad        = MAX_VALUE;
		      for (k=0; k<max_ref_frame; k++)
#ifdef _ADDITIONAL_REFERENCE_FRAME_
			if (k <  input->no_multpred ||
			    k == input->add_ref_frame)
#endif
			  {
			    if (!forward_me_done[blocktype][k])
			      {
				tot_for_sad[blocktype][k]  = (int)floor(rdopt->lambda_motion * (1+2*floor(log(k+1)/log(2)+1e-10)));
				tot_for_sad[blocktype][k] += SingleUnifiedMotionSearch (k, blocktype,
											fw_refFrArr, tmp_fwMV, img->p_fwMV,
											B_FORWARD, img->all_mv,
											rdopt->lambda_motion);
				forward_me_done[blocktype][k] = 1;
			      }
			    if (tot_for_sad[blocktype][k] < min_inter_sad)
			      {
				k0 = k;
				min_inter_sad = tot_for_sad[blocktype][k];
			      }
			  }
		      for (  i=0; i < 4; i++)
			for (j=0; j < 4; j++)
			  {
			    tmp_fwMV[0][img->block_y+j][img->block_x+i+4]=
			      img->all_mv[i][j][k0][blocktype][0];
			    tmp_fwMV[1][img->block_y+j][img->block_x+i+4]=
			      img->all_mv[i][j][k0][blocktype][1];
			  }
		      RDCost_Macroblock (&rd, blocktype, k0, blocktype, 0);
		      forward_rdcost[blocktype] = rd.rdcost;
		      best_refframe [blocktype] = k0;
		    }
		  if (forward_rdcost[blocktype] < min_rdcost)
		    {
		      min_rdcost = forward_rdcost[blocktype];
		      k1         = blocktype;
		    }
		}
	    blocktype = k1;
	    k0        = best_refframe[blocktype];

	    /*===== COST CALCULATION =====*/
	    for (j = 0; j < 4; j++)
	      for (i = 0; i < 4; i++)
		{
		  tmp_bwMV[0][img->block_y+j][img->block_x+i+4]=
		    img->all_bmv[i][j][0][blocktype_back][0];
		  tmp_bwMV[1][img->block_y+j][img->block_x+i+4]=
		    img->all_bmv[i][j][0][blocktype_back][1];
		  tmp_fwMV[0][img->block_y+j][img->block_x+i+4]=
		    img->all_mv[i][j][k0][blocktype][0];
		  tmp_fwMV[1][img->block_y+j][img->block_x+i+4]=
		    img->all_mv[i][j][k0][blocktype][1];
		}
	    img->fw_blc_size_h = input->blc_size[blocktype][0];
	    img->fw_blc_size_v = input->blc_size[blocktype][1];
	    img->bw_blc_size_h = input->blc_size[blocktype_back][0];
	    img->bw_blc_size_v = input->blc_size[blocktype_back][1];
	    currMB->intraOrInter = INTER_MB;
	    img->imod            = B_Bidirect;
	    RDCost_Macroblock (&rd, mode, k0, blocktype, blocktype_back);
	  }
      }



  /*======================================*
   *===  SET PARAMETERS FOR BEST MODE  ===*
   *======================================*/
  mode           = rdopt->best_mode;
  refframe       = rdopt->ref_or_i16mode;
  intra16mode    = rdopt->ref_or_i16mode;
  blocktype      = rdopt->blocktype;
  blocktype_back = rdopt->blocktype_back;


  /*=== RECONSTRUCTED MACROBLOCK ===*/
  for   (j=0; j<MB_BLOCK_SIZE; j++)
    for (i=0; i<MB_BLOCK_SIZE; i++)
      imgY[img->pix_y+j][img->pix_x+i] = rdopt->rec_mb_Y[j][i];
  for   (j=0; j<(BLOCK_SIZE<<1); j++)
    for (i=0; i<(BLOCK_SIZE<<1); i++)
      {
	imgUV[0][img->pix_c_y+j][img->pix_c_x+i] = rdopt->rec_mb_U[j][i];
	imgUV[1][img->pix_c_y+j][img->pix_c_x+i] = rdopt->rec_mb_V[j][i];
      }

  /*=== INTRAORINTER and IMOD ===*/
  if (mode == MBMODE_INTRA4x4)
    {
      currMB->intraOrInter = INTRA_MB_4x4;
      img->imod            = INTRA_MB_OLD;
    }
  else if (mode == MBMODE_INTRA16x16)
    {
      currMB->intraOrInter = INTRA_MB_16x16;
      img->imod            = INTRA_MB_NEW;
    }
  else if (!bframe && (mode >= MBMODE_COPY && mode <= MBMODE_INTER4x4))
    {
      currMB->intraOrInter = INTER_MB;
      img->imod            = INTRA_MB_INTER;
    }
  else if (mode >= MBMODE_INTER16x16 && mode <= MBMODE_INTER4x4)
    {
      currMB->intraOrInter = INTER_MB;
      img->imod            = B_Forward;
    }
  else if (mode >= MBMODE_BACKWARD16x16 && mode <= MBMODE_BACKWARD4x4)
    {
      currMB->intraOrInter = INTER_MB;
      img->imod            = B_Backward;
    }
  else if (mode == MBMODE_BIDIRECTIONAL)
    {
      currMB->intraOrInter = INTER_MB;
      img->imod            = B_Bidirect;
    }
  else /* mode == MBMODE_DIRECT */
    {
      currMB->intraOrInter = INTER_MB;
      img->imod            = B_Direct;
    }

  /*=== DCT-COEFFICIENTS, CBP and KAC ===*/
  if (mode != MBMODE_COPY)
    {
      memcpy (img->cof,  rdopt->cof,  1728*sizeof(int));
      memcpy (img->cofu, rdopt->cofu,   20*sizeof(int));
      currMB->cbp = rdopt->cbp;
      img->kac    = rdopt->kac;

      if (img->imod==INTRA_MB_NEW)
	currMB->cbp += 15*img->kac; /* correct cbp for new intra modes: needed by CABAC */
    }
  else
    {
      memset (img->cof,  0, 1728*sizeof(int));
      memset (img->cofu, 0,   20*sizeof(int));
      currMB->cbp = 0;
      img->kac    = 0;
    }

  /*=== INTRA PREDICTION MODES ===*/
  if (mode == MBMODE_INTRA4x4)
    memcpy (currMB->intra_pred_modes, rdopt->ipredmode, 16*sizeof(int));
  else
    {
      for (i=0;i<4;i++)
	for (j=0;j<4;j++)
	  img->ipredmode[img->block_x+i+1][img->block_y+j+1]=0;
    }

  /*=== MOTION VECTORS, REFERENCE FRAME and BLOCK DIMENSIONS ===*/
  /*--- init all motion vectors with (0,0) ---*/
  currMB->ref_frame = 0;
  if (bframe)
    for   (j=0; j<BLOCK_SIZE; j++)
      for (i=0; i<BLOCK_SIZE; i++)
	{
	  tmp_fwMV[0][img->block_y+j][img->block_x+4+i] = 0;
	  tmp_fwMV[1][img->block_y+j][img->block_x+4+i] = 0;
	  tmp_bwMV[0][img->block_y+j][img->block_x+4+i] = 0;
	  tmp_bwMV[1][img->block_y+j][img->block_x+4+i] = 0;
	}
  else
    for   (j=0; j<BLOCK_SIZE; j++)
      for (i=0; i<BLOCK_SIZE; i++)
	{
	  tmp_mv  [0][img->block_y+j][img->block_x+4+i] = 0;
	  tmp_mv  [1][img->block_y+j][img->block_x+4+i] = 0;
	}
  /*--- set used motion vectors ---*/
  if (!bframe && (mode >= MBMODE_INTER16x16 && mode <= MBMODE_INTER4x4))
    {
      for   (j=0; j<BLOCK_SIZE; j++)
	for (i=0; i<BLOCK_SIZE; i++)
	  {
	    tmp_mv[0][img->block_y+j][img->block_x+4+i] = rdopt->mv[j][i][0];
	    tmp_mv[1][img->block_y+j][img->block_x+4+i] = rdopt->mv[j][i][1];
	  }
      currMB->ref_frame = refframe;
      img->blc_size_h   = input->blc_size[blocktype][0];
      img->blc_size_v   = input->blc_size[blocktype][1];
    }
  else if (mode >= MBMODE_INTER16x16 && mode <= MBMODE_INTER4x4)
    {
      for   (j=0; j<BLOCK_SIZE; j++)
	for (i=0; i<BLOCK_SIZE; i++)
	  {
	    tmp_fwMV[0][img->block_y+j][img->block_x+4+i] = rdopt->mv[j][i][0];
	    tmp_fwMV[1][img->block_y+j][img->block_x+4+i] = rdopt->mv[j][i][1];
	    dfMV    [0][img->block_y+j][img->block_x+4+i] = 0;
	    dfMV    [1][img->block_y+j][img->block_x+4+i] = 0;
	    dbMV    [0][img->block_y+j][img->block_x+4+i] = 0;
	    dbMV    [1][img->block_y+j][img->block_x+4+i] = 0;
	  }
      currMB->ref_frame  = refframe;
      img->fw_blc_size_h = input->blc_size[blocktype][0];
      img->fw_blc_size_v = input->blc_size[blocktype][1];
    }
  else if (mode >= MBMODE_BACKWARD16x16 && mode <= MBMODE_BACKWARD4x4)
    {
      for   (j=0; j<BLOCK_SIZE; j++)
	for (i=0; i<BLOCK_SIZE; i++)
	  {
	    tmp_bwMV[0][img->block_y+j][img->block_x+4+i] = rdopt->bw_mv[j][i][0];
	    tmp_bwMV[1][img->block_y+j][img->block_x+4+i] = rdopt->bw_mv[j][i][1];
	    dfMV    [0][img->block_y+j][img->block_x+4+i] = 0;
	    dfMV    [1][img->block_y+j][img->block_x+4+i] = 0;
	    dbMV    [0][img->block_y+j][img->block_x+4+i] = 0;
	    dbMV    [1][img->block_y+j][img->block_x+4+i] = 0;
	  }
      currMB->ref_frame  = refframe;
      img->bw_blc_size_h = input->blc_size[blocktype_back][0];
      img->bw_blc_size_v = input->blc_size[blocktype_back][1];
    }
  else if (mode == MBMODE_BIDIRECTIONAL)
    {
      for   (j=0; j<BLOCK_SIZE; j++)
	for (i=0; i<BLOCK_SIZE; i++)
	  {
	    tmp_fwMV[0][img->block_y+j][img->block_x+4+i] = rdopt->   mv[j][i][0];
	    tmp_fwMV[1][img->block_y+j][img->block_x+4+i] = rdopt->   mv[j][i][1];
	    tmp_bwMV[0][img->block_y+j][img->block_x+4+i] = rdopt->bw_mv[j][i][0];
	    tmp_bwMV[1][img->block_y+j][img->block_x+4+i] = rdopt->bw_mv[j][i][1];
	    dfMV    [0][img->block_y+j][img->block_x+4+i] = 0;
	    dfMV    [1][img->block_y+j][img->block_x+4+i] = 0;
	    dbMV    [0][img->block_y+j][img->block_x+4+i] = 0;
	    dbMV    [1][img->block_y+j][img->block_x+4+i] = 0;
	  }
      currMB->ref_frame  = refframe;
      img->fw_blc_size_h = input->blc_size[blocktype     ][0];
      img->fw_blc_size_v = input->blc_size[blocktype     ][1];
      img->bw_blc_size_h = input->blc_size[blocktype_back][0];
      img->bw_blc_size_v = input->blc_size[blocktype_back][1];
    }

  /*=== MACROBLOCK MODE ===*/
  if      (mode == MBMODE_COPY || mode == MBMODE_DIRECT)
    img->mb_mode = 0;
  else if (mode == MBMODE_INTRA4x4)
    img->mb_mode = 8*img->type + img->imod;
  else if (mode == MBMODE_INTRA16x16)
    img->mb_mode = 8*img->type + img->imod + intra16mode + 12*img->kac + 4*((currMB->cbp&0xF0)>>4);
  else if (mode == MBMODE_BIDIRECTIONAL)
    img->mb_mode = 3;
  else if (mode >= MBMODE_BACKWARD16x16 && mode <= MBMODE_BACKWARD4x4)
    img->mb_mode = (blocktype_back == 1 ? blocktype_back+1 : 2*blocktype_back+1);
  else if (mode >= MBMODE_INTER16x16 && mode <= MBMODE_INTER4x4 && bframe)
    img->mb_mode = (blocktype == 1 ? blocktype : 2*blocktype);
  else if (blocktype                               == M16x16_MB &&
	   currMB->cbp                             == 0         &&
	   currMB->ref_frame                       == 0         &&
	   tmp_mv[0][img->block_y][img->block_x+4] == 0         &&
	   tmp_mv[1][img->block_y][img->block_x+4] == 0)
    img->mb_mode = 0;
  else
    img->mb_mode = blocktype;
  currMB->mb_type = img->mb_mode;


  /*===========================================================*
   *===  SET LOOP FILTER STRENGTH and REFERENCE FRAME INFO  ===*
   *===========================================================*/
  if (!bframe)
    {
      /* Set loop filter strength depending on mode decision */
      SetLoopfilterStrength_P(); 
      /* Set reference frame information for motion vector prediction of future MBs */
      SetRefFrameInfo_P();	
    }
  else
    {
      /* Set loop filter strength depending on mode decision */
      SetLoopfilterStrength_B(); 
      /* Set reference frame information for motion vector prediction of future MBs */
      SetRefFrameInfo_B();	
    }
}



#endif /* _RD_OPT_ */



⌨️ 快捷键说明

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