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

📄 rdopt.c

📁 包含了从MPEG4的视频解码到H.264的视频编码部分的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
  frefframe[1] = frefar[block_y  ][img->block_x+2];
  frefframe[2] = frefar[block_y+2][img->block_x  ];
  frefframe[3] = frefar[block_y+2][img->block_x+2];
  if (bframe)
  {
    brefframe[0] = brefar[block_y  ][img->block_x  ]; 
    brefframe[1] = brefar[block_y  ][img->block_x+2];
    brefframe[2] = brefar[block_y+2][img->block_x  ];
    brefframe[3] = brefar[block_y+2][img->block_x+2];
  }
  */
}


/*! 
 *************************************************************************************
 * \brief
 *    Set stored macroblock parameters
 *************************************************************************************
 */
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 || img->type==BS_IMG);
  int         **frefar = ((img->type==B_IMG || img->type==BS_IMG)? fw_refFrArr : refFrArr);
  int         **abp_type_arr = abp_type_FrArr;
  int         **brefar = bw_refFrArr;
  int     **ipredmodes = img->ipredmode;
  int     block_y = img->block_y; 

  if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive && img->field_mode)
  {
    block_y = img->field_block_y;
    if(img->top_field)
    {
      ipredmodes = img->ipredmode_top;
      frefar = (img->type==B_IMG || img->type==BS_IMG) ? fw_refFrArr_top : refFrArr_top;
      abp_type_arr = abp_type_FrArr_top;
      brefar = bw_refFrArr_top;
    }
    else
    {
      ipredmodes = img->ipredmode_bot;
      frefar = (img->type==B_IMG || img->type==BS_IMG) ? fw_refFrArr_bot : refFrArr_bot;
      abp_type_arr = abp_type_FrArr_bot;
      brefar = bw_refFrArr_bot;

    }
  }

  //===== 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];
    if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive)
      rdopt->rec_mbY[j][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];
    if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive)
    {
      rdopt->rec_mbU[j][i]           = rec_mbU[j][i];   
      rdopt->rec_mbV[j][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;
  if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive)
  {
    rdopt->mode = mode;
    rdopt->i16offset = img->i16offset;  // For MBINTLC  -Rajeev
    rdopt->cbp = cbp;
    rdopt->cbp_blk = cbp_blk;
    rdopt->mb_type  = mode;


    for(i=0;i<6;i++)
      for(j=0;j<4;j++)
        for(k=0;k<2;k++)
          for(l=0;l<18;l++)
            rdopt->cofAC[i][j][k][l] = img->cofAC[i][j][k][l];

    for(i=0;i<3;i++)
        for(k=0;k<2;k++)
          for(l=0;l<18;l++)
            rdopt->cofDC[i][k][l] = img->cofDC[i][k][l];
  }


  for (i=0; i<4; i++)
  {
    currMB->b8mode[i]   = b8mode[i];
    currMB->b8pdir[i]   = b8pdir[i];
    if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive)
    {
      rdopt->b8mode[i]  = b8mode[i];                  
      rdopt->b8pdir[i]  = b8pdir[i];                  
    }
  }
  if (input->rdopt==2 && img->type!=B_IMG)
  {
    //! save the MB Mode of every macroblock
    decs->dec_mb_mode[img->mb_x][img->mb_y] = mode;
  }

  //==== reference frames =====
  for (j=0; j<4; j++)
  for (i=0; i<4; i++)
  {
    frefar[block_y+j][img->block_x+i] = frefframe[j][i];
//    frefar[block_y+j][img->block_x+i] = frefframe[2*(j/2) + (i/2)];
    if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive)
      rdopt->frefar[j][i]            = frefar[block_y+j][img->block_x+i];
  }
  if (bframe)
  {
    for (j=0; j<4; j++)
    for (i=0; i<4; i++)
    {
//      brefar[block_y+j][img->block_x+i] = brefframe[2*(j/2) + (i/2)];
      brefar[block_y+j][img->block_x+i] = brefframe[j][i];
      if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive)
        rdopt->brefar[j][i]            = brefar[block_y+j][img->block_x+i];
      if (img->type==BS_IMG)
      {
        refFrArr [block_y+j][img->block_x+i] = frefar[block_y+j][img->block_x+i];
        abp_type_arr[block_y+j][img->block_x+i] = abp_typeframe[j][i];
      }

    }
  }

  //==== intra prediction modes ====
  currMB->c_ipred_mode = best_c_imode;
  img->i16offset = best_i16offset;
  if (mode==P8x8)
  {
    for (k=0, j=block_y+1; j<block_y+5; j++)
    for (     i=img->block_x+1; i<img->block_x+5; i++, k++)
    {
      ipredmodes    [i][j] = b8_ipredmode       [k];
      currMB->intra_pred_modes[k] = b8_intra_pred_modes[k];
    }
  }
  else if (mode!=I4MB)
  {
    for (k=0, j=block_y+1; j<block_y+5; j++)
      for (     i=img->block_x+1; i<img->block_x+5; i++, k++)
      {
        ipredmodes    [i][j] = DC_PRED;
        currMB->intra_pred_modes[k] = DC_PRED;
      }
  }

  if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive)
  {
    for (k=0, j=block_y+1; j<block_y+5; j++)
      for (     i=img->block_x+1; i<img->block_x+5; i++, k++)
      {
        rdopt->ipredmode[i][j] = ipredmodes[i][j];
        rdopt->intra_pred_modes[k] = currMB->intra_pred_modes[k];
      }
    rdopt->c_ipred_mode = currMB->c_ipred_mode;
    rdopt->i16offset = img->i16offset;  // DH
  }

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



/*! 
 *************************************************************************************
 * \brief
 *    Set reference frames and motion vectors
 *************************************************************************************
 */
void SetRefAndMotionVectors (int block, int mode, int ref, int pdir, int abp_type)
{
  int i, j;
  int     bframe  = (img->type==B_IMG || img->type==BS_IMG);
  int**   abp_type_arr = abp_type_FrArr;
  int     pmode   = (mode==1||mode==2||mode==3?mode:4);
  int     j0      = ((block/2)<<1);
  int     i0      = ((block%2)<<1);
  int     j1      = j0 + (input->blc_size[pmode][1]>>2);
  int     i1      = i0 + (input->blc_size[pmode][0]>>2);
  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_y = img->block_y;

  if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive && img->field_mode)
  {
    block_y = img->field_block_y;
    if(img->top_field)
    {
      frefArr = (bframe ? fw_refFrArr_top : refFrArr_top);
      brefArr = bw_refFrArr_top;
      fmvArr  = (bframe ? tmp_fwMV_top  : tmp_mv_top);
      bmvArr  = tmp_bwMV_top;
      all_mv_arr = img->all_mv_top;
      all_bmv_arr= img->all_bmv_top;
      abp_type_arr = abp_type_FrArr_top;
    }
    else
    {
      frefArr = (bframe ? fw_refFrArr_bot : refFrArr_bot);
      brefArr = bw_refFrArr_bot;
      fmvArr  = (bframe ? tmp_fwMV_bot  : tmp_mv_bot);
      bmvArr  = tmp_bwMV_bot;
      all_mv_arr = img->all_mv_bot;
      all_bmv_arr= img->all_bmv_bot;
      abp_type_arr = abp_type_FrArr_bot;
    }
  }   
  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][img->block_x+i+4] = all_mv_arr[i][j][ref][mode][0];
      fmvArr[1][block_y+j][img->block_x+i+4] = all_mv_arr[i][j][ref][mode][1];
      frefArr  [block_y+j][img->block_x+i  ] = ref;
    }
  }
  else
  {
    if(!mode&&bframe)
    {
      for (j=j0; j<j0+2; j++)
        for (i=i0; i<i0+2; i++)
        {
          if (input->direct_type)
            ref = fwdir_refFrArr[block_y+j][img->block_x+i];        
          else
          {
            ref = refFrArr[block_y+j][img->block_x+i];             
            if(input->InterlaceCodingOption >= MB_CODING && mb_adaptive && img->field_mode)
              ref = img->top_field ? refFrArr_top[block_y+j][img->block_x+i]:refFrArr_bot[block_y+j][img->block_x+i];
          }
          abp_type_arr[block_y+j][img->block_x+i] = abp_type;
          if(ref==-1)
          {
            fmvArr[0][block_y+j][img->block_x+i+4] = 0;
            fmvArr[1][block_y+j][img->block_x+i+4] = 0;
            frefArr  [block_y+j][img->block_x+i  ] = -1;
          }
          else
          {
            fmvArr[0][block_y+j][img->block_x+i+4] = all_mv_arr[i][j][ref][mode][0];
            fmvArr[1][block_y+j][img->block_x+i+4] = all_mv_arr[i][j][ref][mode][1];
            frefArr  [block_y+j][img->block_x+i  ] = ref;
          }
        }
    }
    else    
      for (j=j0; j<j0+2; j++)
        for (i=i0; i<i0+2; i++)
        {
          fmvArr[0][block_y+j][img->block_x+i+4] = 0;
          fmvArr[1][block_y+j][img->block_x+i+4] = 0;
          frefArr  [block_y+j][img->block_x+i  ] = -1;
          abp_type_arr[block_y+j][img->block_x+i] = abp_type;
        }
  }
  if ((pdir==1 || pdir==2) && (mode!=IBLOCK && mode!=0))
  {
    for (j=j0; j<j0+2; j++)
    for (i=i0; i<i0+2; i++)
    {
      if (abp_type==1 && img->type==BS_IMG)
      {
        bmvArr[0][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][0][mode][0];
        bmvArr[1][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][0][mode][1];
        brefArr  [block_y+j][img->block_x+i  ] = 0;
        abp_type_arr[block_y+j][img->block_x+i] = 1;
      }
      else if (abp_type==2 && img->type==BS_IMG)
      {
        bmvArr[0][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][1][mode][0];
        bmvArr[1][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][1][mode][1];
        brefArr  [block_y+j][img->block_x+i  ] = 1;
        abp_type_arr[block_y+j][img->block_x+i] = 2;
      }
      else
      {
        bmvArr[0][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][0][mode][0];
        bmvArr[1][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][0][mode][1];
        brefArr  [block_y+j][img->block_x+i  ] = 0;
        abp_type_arr[block_y+j][img->block_x+i] = 0;
      }
    }
  }
  else if (bframe)
  {
    if(!mode)
      for (j=j0; j<j0+2; j++)
      for (i=i0; i<i0+2; i++)
      {
        if(img->type==BS_IMG)
        {
          if (bwdir_refFrArr[block_y+j][img->block_x+i]==-1)
          {
            bmvArr[0][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][1][mode][0];
            bmvArr[1][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][1][mode][1];
          }
          else
          {
            bmvArr[0][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][bwdir_refFrArr[block_y+j][img->block_x+i]][mode][0];
            bmvArr[1][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][bwdir_refFrArr[block_y+j][img->block_x+i]][mode][1];
          }
          brefArr  [block_y+j][img->block_x+i  ] = bwdir_refFrArr[block_y+j][img->block_x+i];
        }
        else
        {
          bmvArr[0][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][0][mode][0];
          bmvArr[1][block_y+j][img->block_x+i+4] = all_bmv_arr[i][j][0][mode][1];
          if (input->direct_type)
            brefArr  [block_y+j][img->block_x+i  ] = bwdir_refFrArr[block_y+j][img->block_x+i];
          else
            brefArr  [block_y+j][img->block_x+i  ] = min(ref,0); 
        }
        abp_type_arr[block_y+j][img->block_x+i] = abp_type;
      }   
    else
      for (j=j0; j<j0+2; j++)
      for (i=i0; i<i0+2; i++)
      {
        bmvArr[0][block_y+j][img->block_x+i+4] = 0;
        bmvArr[1][block_y+j][img->block_x+i+4] = 0;
        brefArr  [block_y+j][img->block_x+i  ] = -1;
        abp_type_arr[block_y+j][img->block_x+i] = abp_type;
      }
  }
}




/*! 
 *************************************************************************************
 * \brief
 *    Mode Decision for a macroblock
 *************************************************************************************
 */
void encode_one_macroblock ()
{
  static const int  b8_mode_table[6]  = {0, 4, 5, 6, 7};         // 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         rerun, 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, i16mode;
  int         intra1;

  int         intra       = ((img->type==INTER_IMG && img->mb_y==img->mb_y_upd && img->mb_y_upd!=img->mb_y_intra) || img->type==INTRA_IMG);
  int         spframe     = (img->type==INTER_IMG && img->types==SP_IMG);
  int         siframe     = (img->type==INTRA_IMG && img->types==SP_IMG);
  int         bframe      = (img->type==B_IMG || img->type==BS_IMG);
  int         write_ref   = (input->no_multpred>1 || input->add_ref_frame>0);
  int         runs        = (input->RestrictRef==1 && input->rdopt==2 && (img->type==INTER_IMG || img->type==BS_IMG) ? 2 : 1);
  int         max_ref     = img->nb_references;
  // Tian Dong. PLUS1. Add the following line:
  int         adjust_ref;
  int         checkref    = (input->rdopt && input->RestrictRef && img->type==INTER_IMG);
  Macroblock* currMB      = &img->mb_data[img->current_mb_nr];

  int     **ipredmodes = img->ipredmode;
  int     block_y   = img->block_y;
  int         best_bw_ref;
  int         best_abp_type;
  int     ***tmpmvs = tmp_mv;
  int     *****allmvs = img->all_mv;
  int     **refar     = refFrArr;

#ifdef ABIPRED
  int tmp_fw_ref, tmp_bw_ref;
#endif
  
  intra |= RandomIntra (img->current_mb_nr);    // Forced Pseudo-Random 

⌨️ 快捷键说明

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