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

📄 rdopt.c

📁 avs源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
				{
					best_mpr_tmp[i][j]=img->mpr[i][j];
				}
  }


  //--- coeff, cbp, kac ---
  if (mode || bframe)
  {
    i4p=cofAC; cofAC=img->cofAC; img->cofAC=i4p;
    i3p=cofDC; cofDC=img->cofDC; img->cofDC=i3p;
    cbp     = currMB->cbp;
    cbp_blk = currMB->cbp_blk;
		
		if(1)//input->InterlaceCodingOption == SMB_CODING)
		{
			for(j=0;j<4;j++)
				for(k=0;k<2;k++)
					for(l=0;l<17;l++)
					{
						temp_chroma = chromacofAC4x4[0][j][k][l];
						chromacofAC4x4[0][j][k][l] = img->chromacofAC[0][j][k][l];
						img->chromacofAC[0][j][k][l] = temp_chroma;
						
						temp_chroma = chromacofAC4x4[1][j][k][l];
						chromacofAC4x4[1][j][k][l] = img->chromacofAC[1][j][k][l];
						img->chromacofAC[1][j][k][l] = temp_chroma;
					}
		}
  }
  else
  {
    cbp = cbp_blk = 0;
  }

  for(j=stage_block8x8_pos/2/*lgp*/;j<2;j++)
    for (i=0; i<2; i++)
    {  
      frefframe[j][i] = frefar[(block_y>>1)+j  ][(block_x>>1) +i ];
      if (bframe)
      {
        brefframe[j][i] = brefar[(block_y>>1) +j ][(block_x>>1)+i  ];
      }
    }

}

/*
*************************************************************************
* Function:Set stored macroblock parameters
* Input:
* Output:
* Return: 
* Attention:
*************************************************************************
*/

void set_stored_macroblock_parameters ()
{
  int  i, j, k, ****i4p, ***i3p,l;
  Macroblock  *currMB  = &img->mb_data[img->current_mb_nr];
  int         mode     = best_mode;
  int         bframe   = (img->type==B_IMG);
  int         **frefar = ((img->type==B_IMG)? fw_refFrArr : refFrArr);
  int         **brefar = bw_refFrArr;
  int     **ipredmodes = img->ipredmode;
  int     block_x = img->block_x; 
  int     block_y = img->block_y; 

	int         cp_table[2][6] = {{1,1,1,1,1,1},{0,0,1,1,0,1}};/*lgp*/
	int         stage_block8x8_pos=0;/*lgp*/
	int    temp_chroma;

  //===== reconstruction values =====
  for (j=0; j<16; j++)
    for (i=0; i<16; i++)
    {
      imgY[img->pix_y+j][img->pix_x+i] = rec_mbY[j][i];
    }

  for (j=0; j<8; j++)
    for (i=0; i<8; i++)
    {
      imgUV[0][img->pix_c_y+j][img->pix_c_x+i] = rec_mbU[j][i];
      imgUV[1][img->pix_c_y+j][img->pix_c_x+i] = rec_mbV[j][i];
    }

  //===== coefficients and cbp =====
  i4p=cofAC; cofAC=img->cofAC; img->cofAC=i4p;
  i3p=cofDC; cofDC=img->cofDC; img->cofDC=i3p;
  currMB->cbp      = cbp;
  currMB->cbp_blk = cbp_blk;
  //==== macroblock type ====
  currMB->mb_type = mode;

	// !! shenyanfei 
	img->weighting_prediction = best_weight_flag ;

		for(j=0;j<4;j++)
			for(k=0;k<2;k++)
				for(l=0;l<17;l++)
				{
					temp_chroma = chromacofAC4x4[0][j][k][l];
					chromacofAC4x4[0][j][k][l] = img->chromacofAC[0][j][k][l];
					img->chromacofAC[0][j][k][l] = temp_chroma;

					temp_chroma = chromacofAC4x4[1][j][k][l];
					chromacofAC4x4[1][j][k][l] = img->chromacofAC[1][j][k][l];
					img->chromacofAC[1][j][k][l] = temp_chroma;
				}

  for (i=stage_block8x8_pos; i<4; i++)
  {
    currMB->b8mode[i]   = b8mode[i];
    currMB->b8pdir[i]   = b8pdir[i];
  }

  //==== reference frames =====
  for (j=stage_block8x8_pos/2; j<2; j++)
    for (i=0; i<2; i++)
    {
      frefar[(block_y>>1)+j][(block_x>>1)+i] = frefframe[j][i];
    }

  if (bframe)
  {
    for (j=stage_block8x8_pos/2; j<2; j++)
      for (i=0; i<2; i++)
      {
        brefar[(block_y>>1)+j][(block_x>>1)+i] = brefframe[j][i];
      }
  }

  if(currMB->mb_type == I4MB)    //add by qwang
  {
		for(i=stage_block8x8_pos; i<4; i++)
      currMB->intra_pred_modes[i]=best_intra_pred_modes_tmp[i];
		
    for(j=stage_block8x8_pos/2;j<2;j++)
      for(i=0;i<2;i++)
        img->ipredmode[ 1 + (img->mb_x<<1) + i ][ 1 + (img->mb_y<<1) + j ]=best_ipredmode_tmp[i][j];
			
	  for(j=0;j<16;j++)
			for(i=0;i<16;i++)
			{
				img->mpr[i][j]=best_mpr_tmp[i][j];
			}
  }

  //==== intra prediction modes ====
  currMB->c_ipred_mode = best_c_imode;

  if (mode==P8x8)
  {
    for (j=img->block8_y+stage_block8x8_pos/2+1; j<img->block8_y+3; j++)
      for ( i=img->block8_x+1; i<img->block8_x+3; i++)
      {
				k = 2*(j-img->block8_y-1)+i-img->block8_x-1;
        ipredmodes[i][j] = b8_ipredmode[k];
        currMB->intra_pred_modes[k] = b8_intra_pred_modes[k];
      }
  }
  else if (mode!=I4MB)
  {
    for (j=img->block8_y+stage_block8x8_pos/2+1; j<img->block8_y+3; j++)
      for ( i=img->block8_x+1; i<img->block8_x+3; i++)
      {
				k = 2*(j-img->block8_y-1)+i-img->block8_x-1;
  
//        ipredmodes    [i][j] = DC_PRED;
        currMB->intra_pred_modes[k] = DC_PRED;

		ipredmodes    [i][j] = -1;
    //    currMB->intra_pred_modes[k] = -1;

    
      }
  }

  //==== motion vectors =====
  SetMotionVectorsMB (currMB, bframe);
	storeMotionInfo(stage_block8x8_pos/2);
}

/*
*************************************************************************
* Function:Set reference frames and motion vectors
* Input:
* Output:
* Return: 
* Attention:
*************************************************************************
*/

void SetRefAndMotionVectors (int block, int mode, int ref, int bw_ref,int pdir)/*lgp*13*/
{
  int i, j;
  int     bframe       = (img->type==B_IMG);
  int     pmode        = (mode==1||mode==2||mode==3?mode:4);
  int     j0           = (block/2);
  int     i0           = (block%2);
  int     j1           = j0 + (input->blc_size[pmode][1]>>3);
  int     i1           = i0 + (input->blc_size[pmode][0]>>3);
  int**   frefArr      = (bframe ? fw_refFrArr : refFrArr);
  int**   brefArr      = bw_refFrArr;
  //int***  fmvArr       = (bframe ? tmp_fwMV    : tmp_mv);
  int***  bmvArr       = tmp_bwMV;
  //int***** all_mv_arr  = img->all_mv;
  int***** all_bmv_arr = img->all_bmv;
  int   block_x        = img->block_x>>1;
  int   block_y        = img->block_y>>1; 

  int***  fmvArr  = (bframe ? tmp_fwMV    : tmp_mv);
  int***** all_mv_arr = (pdir==2 && mode != 0 /*&&mode ! =IBLOCK*/)?img->all_omv:img->all_mv; //mode != 0 added by xyji 7.11
	
  if ((pdir==0 || pdir==2) && (mode!=IBLOCK && mode!=0))
  {
    for (j=j0; j<j1; j++)
			for (i=i0; i<i1; i++)
			{
				fmvArr[0][block_y+j][block_x+i+4] = all_mv_arr[i][j][ref][mode][0];
				fmvArr[1][block_y+j][block_x+i+4] = all_mv_arr[i][j][ref][mode][1];
				frefArr  [block_y+j][block_x+i  ] = ref;
			}
  }
  else
  {
    if(!mode&&bframe)
    {
      for (j=j0; j<j0+1; j++)
        for (i=i0; i<i0+1; i++)
        {
			if(img->picture_structure)
					ref = 0;
          if(ref==-1)
          {
            fmvArr[0][block_y+j][block_x+i+4] = 0;
            fmvArr[1][block_y+j][block_x+i+4] = 0;
            frefArr  [block_y+j][block_x+i  ] = -1;
          }
          else
          {
            fmvArr[0][block_y+j][block_x+i+4] = all_mv_arr[i][j][ref][mode][0];
            fmvArr[1][block_y+j][block_x+i+4] = all_mv_arr[i][j][ref][mode][1];
			if(img->picture_structure)
				ref = 0;
            frefArr  [block_y+j][block_x+i  ] = ref;//???????for direct mode with ref;
          }
        }
    }
    else    
      for (j=j0; j<j0+1; j++)
        for (i=i0; i<i0+1; i++)
        {
          fmvArr[0][block_y+j][block_x+i+4] = 0;
          fmvArr[1][block_y+j][block_x+i+4] = 0;
          frefArr  [block_y+j][block_x+i  ] = -1;
        }
  }
  
  if ((pdir==1 || pdir==2) && (mode!=IBLOCK && mode!=0))
  {
    for (j=j0; j<j0+1; j++)
		for (i=i0; i<i0+1; i++)
		{
			if(pdir == 2)
			{
				{
					int delta_P,TRp,DistanceIndexFw,DistanceIndexBw,refframe,delta_PB;	
					refframe = ref;
					delta_P = 2*(img->imgtr_next_P_frm - img->imgtr_last_P_frm);
					if(img->picture_structure)
						TRp = (refframe+1)*delta_P;  //the lates backward reference
					else
					{
						TRp = delta_P;//refframe == 0 ? delta_P-1 : delta_P+1;
					}
					delta_PB = 2*(picture_distance - img->imgtr_last_P_frm);		// Tsinghua  200701
					if(!img->picture_structure)
					{
						if(img->current_mb_nr_fld < img->total_number_mb) //top field
							DistanceIndexFw =  refframe == 0 ? delta_PB-1:delta_PB;
						else
							DistanceIndexFw =  refframe == 0 ? delta_PB:delta_PB+1;
					}
					else
						DistanceIndexFw = delta_PB;
					
					//DistanceIndexBw    = TRp - DistanceIndexFw;			  	 	  
					DistanceIndexBw    = (TRp - DistanceIndexFw+512)%512; // Added by Zhijie Yang, 20070419, Broadcom
							
				bmvArr[0][block_y+j][block_x+i+4] = - ((all_mv_arr[i][j][ref][mode][0]*DistanceIndexBw*(512/DistanceIndexFw)+256)>>9);
				bmvArr[1][block_y+j][block_x+i+4] = - ((all_mv_arr[i][j][ref][mode][1]*DistanceIndexBw*(512/DistanceIndexFw)+256)>>9);
				}				
			}
			else
			{
				bmvArr[0][block_y+j][block_x+i+4] = all_bmv_arr[i][j][bw_ref][mode][0];
				bmvArr[1][block_y+j][block_x+i+4] = all_bmv_arr[i][j][bw_ref][mode][1];
			}
			brefArr  [block_y+j][block_x+i  ] = bw_ref;/*lgp*13*/
		}
  }
  else if (bframe)
  {
	  if(!mode)
	  {
		  for (j=j0; j<j0+1; j++)
			  for (i=i0; i<i0+1; i++)
			  {
				  {
						if(!img->picture_structure)
						{
							if(refFrArr[block_y+j][block_x+i] >= 0)
							{
								bmvArr[0][block_y+j][block_x+i+4] = all_bmv_arr[i][j][bw_ref][mode][0];
								bmvArr[1][block_y+j][block_x+i+4] = all_bmv_arr[i][j][bw_ref][mode][1];
							}
							else//intra prediction
							{
								bmvArr[0][block_y+j][block_x+i+4] = all_bmv_arr[i][j][1][mode][0];
								bmvArr[1][block_y+j][block_x+i+4] = all_bmv_arr[i][j][1][mode][1];
							}							
							
							if(img->current_mb_nr_fld < img->total_number_mb)
								brefArr  [block_y+j][block_x+i  ] = 1;
							else
								brefArr  [block_y+j][block_x+i  ] = 0;
							if(refFrArr[block_y+j][block_x+i] < 0)
								brefArr  [block_y+j][block_x+i  ] = 1;
							
						}
						else
						{
							bmvArr[0][block_y+j][block_x+i+4] = all_bmv_arr[i][j][0][mode][0];
							bmvArr[1][block_y+j][block_x+i+4] = all_bmv_arr[i][j][0][mode][1];
							ref = refFrArr[block_y+j][block_x+i];             
							//sw 11.23
							if(img->picture_structure)
								brefArr  [block_y+j][block_x+i  ] = 0;// min(ref,0); 
							else
								brefArr  [block_y+j][block_x+i  ] = 0;
						}
				  }
			  }   
	  }
	  else
	  {
		  for (j=j0; j<j0+1; j++)
			  for (i=i0; i<i0+1; i++)
			  {
				  bmvArr[0][block_y+j][block_x+i+4] = 0;
				  bmvArr[1][block_y+j][block_x+i+4] = 0;
				  brefArr  [block_y+j][block_x+i  ] = -1;
			  }
	  }
  }
}
/*
*************************************************************************
* Function:Mode Decision for a macroblock
* Input:
* Output:
* Return: 
* Attention:
*************************************************************************
*/

void encode_one_macroblock ()
{
  static const int  b8_mode_table[2]  = {0, 4};         // DO NOT CHANGE ORDER !!!
  static const int  mb_mode_table[7]  = {0, 1, 2, 3, P8x8, I16MB, I4MB}; // DO NOT CHANGE ORDER !!!
	
  int         valid[MAXMODE];
  int         block, index, mode, i0, i1, j0, j1, pdir, ref, i, j, k, ctr16x16, dummy;
  double      qp, lambda_mode, lambda_motion, min_rdcost, rdcost = 0, max_rdcost=1e30;
  int         lambda_motion_factor;
  int         fw_mcost, bw_mcost, bid_mcost, mcost, max_mcost=(1<<30);
  int         curr_cbp_blk, cnt_nonz = 0, best_cnt_nonz = 0, best_fw_ref = 0, best_pdir;
  int         cost, min_cost, cost8x8, cost_direct=0, have_direct=0;
  int         intra       = img->type==INTRA_IMG;
  int         bframe      = img->type==B_IMG;
  int         write_ref   = input->no_multpred>1;
  int         max_ref     = img->nb_references;
  int         adjust_ref;
  Macroblock* currMB      = &img->mb_data[img->current_mb_nr];
  int     **ipredmodes = img->ipredmode;
  int     block_x   = img->block_x;/*lgp*/
  int     block_y   = img->block_y;
  int         best_bw_ref;
  int     ***tmpmvs = tmp_mv;
  int     *****allmvs = img->all_mv;
  int     **refar     = refFrArr;
  int     incr_y=1,off_y=0;/*lgp*/
  int     stage_block8x8_pos=0;/*lgp*/
  int		best_bid_ref = 0;
  int		bid_best_fw_ref = 0, bid_best_bw_ref = 0;
  int		scale_refframe;
  int     min_cost_8x8;
	
	
  adjust_ref  = (img->type==B_IMG? (mref==mref_fld)? 2 : 1 : 0);
  adjust_ref  = min(adjust_ref, max_ref-1);
  
  if(!img->picture_structure)
  {
    max_ref = min (img->nb_references, img->buf_cycle);
    adjust_ref = 0;
		if (max_ref > 2 && img->type == B_IMG)
			max_ref = 2;
    if(img->old_type!=img->type)
			max_ref = 1;
  }else
  {
    max_ref = min (img->nb_references, img->buf_cycle);
    adjust_ref = 0;
		if (max_ref > 1 && img->type == B_IMG)
			max_ref = 1;
  }
	
  //FAST MOTION ESTIMATION. ZHIBO CHEN 2003.3
  //in case the neighboring block is intra block
#ifdef FastME
  decide_intrabk_SAD();

⌨️ 快捷键说明

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