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

📄 b_frame.c

📁 MPEG-4编解码的实现(包括MPEG4视音频编解码)
💻 C
📖 第 1 页 / 共 4 页
字号:
    code_num=5;
  else        // 4x4 : blocktype 7
    code_num=6;
  *bid_sad += QP2QUANT[img->qp]*img->blk_bituse[code_num];

  // consider bits of mvdfw
  step_h=img->fw_blc_size_h/BLOCK_SIZE;  // horizontal stepsize
  step_v=img->fw_blc_size_v/BLOCK_SIZE;  // vertical stepsize

  for (j=0; j < BLOCK_SIZE; j += step_v)
  {
    for (i=0;i < BLOCK_SIZE; i += step_h)
    {
      if(img->fw_blc_size_h==16 && img->fw_blc_size_v==16)
      {      // 16x16 : blocktype 1
        mvd_x=tmp_fwMV[0][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][1][0];
        mvd_y=tmp_fwMV[1][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][1][1];
      }
      else if(img->fw_blc_size_h==16 && img->fw_blc_size_v==8)
      {  // 16x8 : blocktype 2
        mvd_x=tmp_fwMV[0][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][2][0];
        mvd_y=tmp_fwMV[1][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][2][1];
      }
      else if(img->fw_blc_size_h==8 && img->fw_blc_size_v==16)
      { // 8x16 : blocktype 3
        mvd_x=tmp_fwMV[0][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][3][0];
        mvd_y=tmp_fwMV[1][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][3][1];
      }
      else if(img->fw_blc_size_h==8 && img->fw_blc_size_v==8)
      { // 8x8 : blocktype 4
        mvd_x=tmp_fwMV[0][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][4][0];
        mvd_y=tmp_fwMV[1][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][4][1];
      }
      else if(img->fw_blc_size_h==8 && img->fw_blc_size_v==4)
      {  // 8x4 : blocktype 5
        mvd_x=tmp_fwMV[0][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][5][0];
        mvd_y=tmp_fwMV[1][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][5][1];
      }
      else if(img->fw_blc_size_h==4 && img->fw_blc_size_v==8)
      {  // 4x8 : blocktype 6
        mvd_x=tmp_fwMV[0][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][6][0];
        mvd_y=tmp_fwMV[1][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][6][1];
      }
      else
      {                                                      // 4x4 : blocktype 7
        mvd_x=tmp_fwMV[0][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][7][0];
        mvd_y=tmp_fwMV[1][img->block_y+j][img->block_x+i+4]-img->p_fwMV[i][j][fw_predframe_no][7][1];
      }
      *bid_sad += QP2QUANT[img->qp]*(img->mv_bituse[absm(mvd_x)]+img->mv_bituse[absm(mvd_y)]);
    }
  }

  // consider bits of mvdbw
  step_h=img->bw_blc_size_h/BLOCK_SIZE;  // horizontal stepsize
  step_v=img->bw_blc_size_v/BLOCK_SIZE;  // vertical stepsize

  for (j=0; j < BLOCK_SIZE; j += step_v)
  {
    for (i=0;i < BLOCK_SIZE; i += step_h)
    {
      if(img->bw_blc_size_h==16 && img->bw_blc_size_v==16)
      {      // 16x16 : blocktype 1
        mvd_x=tmp_bwMV[0][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][1][0];
        mvd_y=tmp_bwMV[1][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][1][1];
      }
      else if(img->bw_blc_size_h==16 && img->bw_blc_size_v==8)
      {  // 16x8 : blocktype 2
        mvd_x=tmp_bwMV[0][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][2][0];
        mvd_y=tmp_bwMV[1][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][2][1];
      }
      else if(img->bw_blc_size_h==8 && img->bw_blc_size_v==16)
      { // 8x16 : blocktype 3
        mvd_x=tmp_bwMV[0][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][3][0];
        mvd_y=tmp_bwMV[1][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][3][1];
      }
      else if(img->bw_blc_size_h==8 && img->bw_blc_size_v==8)
      { // 8x8 : blocktype 4
        mvd_x=tmp_bwMV[0][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][4][0];
        mvd_y=tmp_bwMV[1][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][4][1];
      }
      else if(img->bw_blc_size_h==8 && img->bw_blc_size_v==4)
      {  // 8x4 : blocktype 5
        mvd_x=tmp_bwMV[0][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][5][0];
        mvd_y=tmp_bwMV[1][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][5][1];
      }
      else if(img->bw_blc_size_h==4 && img->bw_blc_size_v==8)
      {  // 4x8 : blocktype 6
        mvd_x=tmp_bwMV[0][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][6][0];
        mvd_y=tmp_bwMV[1][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][6][1];
      }
      else
      {                                                      // 4x4 : blocktype 7
        mvd_x=tmp_bwMV[0][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][7][0];
        mvd_y=tmp_bwMV[1][img->block_y+j][img->block_x+i+4]-img->p_bwMV[i][j][0][7][1];
      }
      *bid_sad += QP2QUANT[img->qp]*(img->mv_bituse[absm(mvd_x)]+img->mv_bituse[absm(mvd_y)]);
    }
  }

  for (mb_y=0; mb_y < MB_BLOCK_SIZE; mb_y += BLOCK_SIZE*2)
  {
    for (mb_x=0; mb_x < MB_BLOCK_SIZE; mb_x += BLOCK_SIZE*2)
    {
      for (block_y=mb_y; block_y < mb_y+BLOCK_SIZE*2; block_y += BLOCK_SIZE)
      {
        pic_pix_y=img->pix_y+block_y;
        pic_block_y=pic_pix_y/BLOCK_SIZE;

        for (block_x=mb_x; block_x < mb_x+BLOCK_SIZE*2; block_x += BLOCK_SIZE)
        {
          pic_pix_x=img->pix_x+block_x;
          pic_block_x=pic_pix_x/BLOCK_SIZE;

          if(input->mv_res)
          {
            ii4=(img->pix_x+block_x)*8+tmp_fwMV[0][pic_block_y][pic_block_x+4];
            jj4=(img->pix_y+block_y)*8+tmp_fwMV[1][pic_block_y][pic_block_x+4];
            iii4=(img->pix_x+block_x)*8+tmp_bwMV[0][pic_block_y][pic_block_x+4];
            jjj4=(img->pix_y+block_y)*8+tmp_bwMV[1][pic_block_y][pic_block_x+4];


            for (j=0;j<4;j++)
            {
              j2=j*8;
              for (i=0;i<4;i++)
              {
                i2=i*8;
                fw_pred = UMVPelY_18 (mref[img->fw_multframe_no],jj4+j2,ii4+i2);
                bw_pred = UMVPelY_18 (mref_P, jjj4+j2, iii4+i2);

                bid_pred[i][j]=(int)((fw_pred+bw_pred)/2.0+0.5);
              }
            }
          }
          else
          {
            ii4=(img->pix_x+block_x)*4+tmp_fwMV[0][pic_block_y][pic_block_x+4];
            jj4=(img->pix_y+block_y)*4+tmp_fwMV[1][pic_block_y][pic_block_x+4];
            iii4=(img->pix_x+block_x)*4+tmp_bwMV[0][pic_block_y][pic_block_x+4];
            jjj4=(img->pix_y+block_y)*4+tmp_bwMV[1][pic_block_y][pic_block_x+4];

            for (j=0;j<4;j++)
            {
              j2=j*4;
              for (i=0;i<4;i++)
              {
                i2=i*4;
                fw_pred=UMVPelY_14 (mref[img->fw_multframe_no], jj4+j2, ii4+i2);
                bw_pred=UMVPelY_14 (mref_P, jjj4+j2, iii4+i2);

                bid_pred[i][j]=(int)((fw_pred+bw_pred)/2.0+0.5);
              }
            }
          }

          for (j=0; j < BLOCK_SIZE; j++)
          {
            for (i=0; i < BLOCK_SIZE; i++)
            {
              img->m7[i][j]=imgY_org[img->pix_y+block_y+j][img->pix_x+block_x+i]-bid_pred[i][j];
            }
          }
          *bid_sad += find_sad(input->hadamard, img->m7);
        }
      }
    }
  }
}

void get_dir(int *dir_sad)
{
  int mb_y,mb_x, block_y, block_x, pic_pix_y, pic_pix_x, pic_block_y, pic_block_x;
  int i, j, ii4, jj4, iii4, jjj4, i2, j2, hv;
  int ref_inx, df_pred, db_pred, dir_pred[4][4];
  int refP_tr, TRb, TRp;

  // initialize with bias value
  *dir_sad=-QP2QUANT[img->qp] * 16;

  // create dfMV, dbMV
  for (mb_y=0; mb_y < MB_BLOCK_SIZE; mb_y += BLOCK_SIZE*2)
  {
    for (mb_x=0; mb_x < MB_BLOCK_SIZE; mb_x += BLOCK_SIZE*2)
    {
      for (block_y=mb_y; block_y < mb_y+BLOCK_SIZE*2; block_y += BLOCK_SIZE)
      {
        pic_pix_y=img->pix_y+block_y;
        pic_block_y=pic_pix_y/BLOCK_SIZE;

        for (block_x=mb_x; block_x < mb_x+BLOCK_SIZE*2; block_x += BLOCK_SIZE)
        {
          pic_pix_x=img->pix_x+block_x;
          pic_block_x=pic_pix_x/BLOCK_SIZE;

          // next P is intra mode
          if(refFrArr[pic_block_y][pic_block_x]==-1)
          {
            for(hv=0; hv<2; hv++)
            {
              dfMV[hv][pic_block_y][pic_block_x+4]=dbMV[hv][pic_block_y][pic_block_x+4]=0;
            }
          }
          // next P is skip or inter mode
          else
          {
#ifdef _ADAPT_LAST_GROUP_
            refP_tr=last_P_no [refFrArr[pic_block_y][pic_block_x]];
#else
            refP_tr=nextP_tr - ((refFrArr[pic_block_y][pic_block_x]+1)*img->p_interval);
#endif
            TRb=img->tr-refP_tr;
            TRp=nextP_tr-refP_tr;
            for(hv=0; hv<2; hv++)
            {
              dfMV[hv][pic_block_y][pic_block_x+4]=TRb*tmp_mv[hv][pic_block_y][pic_block_x+4]/TRp;
              dbMV[hv][pic_block_y][pic_block_x+4]=(TRb-TRp)*tmp_mv[hv][pic_block_y][pic_block_x+4]/TRp;
            }
          }
        }
      }
    }
  }

  // prediction
  for (mb_y=0; mb_y < MB_BLOCK_SIZE; mb_y += BLOCK_SIZE*2)
  {
    for (mb_x=0; mb_x < MB_BLOCK_SIZE; mb_x += BLOCK_SIZE*2)
    {
      for (block_y=mb_y; block_y < mb_y+BLOCK_SIZE*2; block_y += BLOCK_SIZE)
      {
        pic_pix_y=img->pix_y+block_y;
        pic_block_y=pic_pix_y/BLOCK_SIZE;

        for (block_x=mb_x; block_x < mb_x+BLOCK_SIZE*2; block_x += BLOCK_SIZE)
        {
          pic_pix_x=img->pix_x+block_x;
          pic_block_x=pic_pix_x/BLOCK_SIZE;

          if(input->mv_res)
          {
            ii4=(img->pix_x+block_x)*8+dfMV[0][pic_block_y][pic_block_x+4];
            jj4=(img->pix_y+block_y)*8+dfMV[1][pic_block_y][pic_block_x+4];
            iii4=(img->pix_x+block_x)*8+dbMV[0][pic_block_y][pic_block_x+4];
            jjj4=(img->pix_y+block_y)*8+dbMV[1][pic_block_y][pic_block_x+4];

            {
              // next P is intra mode
              if(refFrArr[pic_block_y][pic_block_x]==-1)
                ref_inx=(img->number-1)%img->buf_cycle;
              // next P is skip or inter mode
              else
                ref_inx=(img->number-refFrArr[pic_block_y][pic_block_x]-1)%img->buf_cycle;

              for (j=0;j<4;j++)
              {
                j2=j*8;
                for (i=0;i<4;i++)
                {
                  i2=i*8;
                  df_pred = UMVPelY_18 (mref[ref_inx], jj4 +j2,  ii4+i2);
                  db_pred = UMVPelY_18 (mref_P,        jjj4+j2, iii4+i2);

                  dir_pred[i][j]=(int)((df_pred+db_pred)/2.0+0.5);
                }
              }

              for (j=0; j < BLOCK_SIZE; j++)
              {
                for (i=0; i < BLOCK_SIZE; i++)
                {
                  img->m7[i][j]=imgY_org[img->pix_y+block_y+j][img->pix_x+block_x+i]-dir_pred[i][j];
                }
              }
              *dir_sad += find_sad(input->hadamard, img->m7);
            }
          }
          else
          {
            ii4=(img->pix_x+block_x)*4+dfMV[0][pic_block_y][pic_block_x+4];
            jj4=(img->pix_y+block_y)*4+dfMV[1][pic_block_y][pic_block_x+4];
            iii4=(img->pix_x+block_x)*4+dbMV[0][pic_block_y][pic_block_x+4];
            jjj4=(img->pix_y+block_y)*4+dbMV[1][pic_block_y][pic_block_x+4];

            {
              // next P is intra mode
              if(refFrArr[pic_block_y][pic_block_x]==-1)
                ref_inx=(img->number-1)%img->buf_cycle;
              // next P is skip or inter mode
              else
                ref_inx=(img->number-refFrArr[pic_block_y][pic_block_x]-1)%img->buf_cycle;

              for (j=0;j<4;j++)
              {
                j2=j*4;
                for (i=0;i<4;i++)
                {
                  i2=i*4;
                  df_pred=UMVPelY_14 (mref[ref_inx], jj4+j2, ii4+i2);
                  db_pred=UMVPelY_14 (mref_P, jjj4+j2, iii4+i2);

                  dir_pred[i][j]=(int)((df_pred+db_pred)/2.0+0.5);
                }
              }

              for (j=0; j < BLOCK_SIZE; j++)
              {
                for (i=0; i < BLOCK_SIZE; i++)
                {
                  img->m7[i][j]=imgY_org[img->pix_y+block_y+j][img->pix_x+block_x+i]-dir_pred[i][j];
                }
              }
              *dir_sad += find_sad(input->hadamard, img->m7);
            } // else
          } // else

        } // block_x
      } // block_y
    } // mb_x
  } // mb_y
}

void compare_sad(int tot_intra_sad, int fw_sad, int bw_sad, int bid_sad, int dir_sad)
{
  int hv, i, j;
  int InterIntraSave ;

  InterIntraSave = img->mb_data[img->current_mb_nr].intraOrInter ;
  img->mb_data[img->current_mb_nr].intraOrInter = INTER_MB ;

  // LG : dfMV, dbMV reset
  if( (dir_sad<=tot_intra_sad) && (dir_sad<=fw_sad) && (dir_sad<=bw_sad) && (dir_sad<=bid_sad) )
  {
    img->imod = B_Direct;
    img->mb_mode = 0;
    for(hv=0; hv<2; hv++)
      for(i=0; i<4; i++)
        for(j=0; j<4; j++)
          tmp_fwMV[hv][img->block_y+j][img->block_x+i+4]=
          tmp_bwMV[hv][img->block_y+j][img->block_x+i+4]=0;
  }
  else if( (bw_sad<=tot_intra_sad) && (bw_sad<=fw_sad) && (bw_sad<=bid_sad) && (bw_sad<=dir_sad) )
  {
    img->imod = B_Backward;
    img->mb_mode = img->bw_mb_mode;
    for(hv=0; hv<2; hv++)
      for(i=0; i<4; i++)
        for(j=0; j<4; j++)
          tmp_fwMV[hv][img->block_y+j][img->block_x+i+4]=
          dfMV[hv][img->block_y+j][img->block_x+i+4]=
          dbMV[hv][img->block_y+j][img->block_x+i+4]=0;
  }
  else if( (fw_sad<=tot_intra_sad) && (fw_sad<=bw_sad) && (fw_sad<=bid_sad) && (fw_sad<=dir_sad) )
  {
    img->imod = B_Forward;
    img->mb_mode = img->fw_mb_mode;
    for(hv=0; hv<2; hv++)
      for(i=0; i<4; i++)
        for(j=0; j<4; j++)
          tmp_bwMV[hv][img->block_y+j][img->block_x+i+4]=
          dfMV[hv][img->block_y+j][img->block_x+i+4]=
          dbMV[hv][img->block_y+j][img->block_x+i+4]=0;
  }
  else if( (bid_sad<=tot_intra_sad) && (bid_sad<=fw_sad) && (bid_sad<=bw_sad) && (bid_sad<=dir_sad) )
  {
    img->imod = B_Bidirect;
    img->mb_mode = 3;
    for(hv=0; hv<2; hv++)
      for(i=0; i<4; i++)
        for(j=0; j<4; j++)
          dfMV[hv][img->block_y+j][img->block_x+i+4]=
          dbMV[hv][img->block_y+j][img->block_x+i+4]=0;
  }
  else if( (tot_intra_sad<=dir_sad) && (tot_intra_sad<=bw_sad) && (tot_intra_sad<=fw_sad) && (tot_intra_sad<=bid_sad) )
  {
    img->mb_mode=img->imod+8*img->type; // img->type=2
    img->mb_data[img->current_mb_nr].intraOrInter  =  InterIntraSave;

    for(hv=0; hv<2; hv++)
      for(i=0; i<4; i++)
        for(j=0; j<4; j++)
          tmp_fwMV[hv][img->block_y+j][img->block_x+i+4]=
          tmp_bwMV[hv][img->block_y+j][img->block_x+i+4]=
          dfMV[hv][img->block_y+j][img->block_x+i+4]=
          dbMV[hv][img->block_y+j][img->block_x+i+4]=0;
  }
}

⌨️ 快捷键说明

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