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

📄 rdopt.c

📁 网络MPEG4IP流媒体开发源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
           RDCost_Macroblock (&rd, mode, 0, 0, mode-NO_INTER_MBMODES);           backward_rdcost[mode-NO_INTER_MBMODES] = rd.rdcost;         }       }       else if (mode == MBMODE_DIRECT)       {       /*==============================================*        *=== 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;    currMB->cbp_blk = rdopt->cbp_blk;    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;    currMB->cbp_blk = 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 reference frame information for motion vector prediction of future MBs    SetRefFrameInfo_P();  }  else  {    // Set reference frame information for motion vector prediction of future MBs    SetRefFrameInfo_B();  }  currMB->qp       = img->qp ;    // this should (or has to be) done somewere else, but where???  DeblockMb(img, imgY, imgUV) ;   // filter this macroblock ( pixels to the right and above the MB are affected )  if (input->rdopt == 2)  {    for (j=0 ; j<input->NoOfDecoders ; j++)      DeblockMb(img, decY_best[j],NULL);  }  if (img->current_mb_nr==0)    intras=0;  if (img->number && (mode==MBMODE_INTRA4x4 || mode==MBMODE_INTRA16x16))    intras++;}

⌨️ 快捷键说明

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