mode_decision.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:36k
源码类别:

Audio

开发平台:

Visual C++

  1. /*!
  2.  ***************************************************************************
  3.  * file mode_decision.c
  4.  *
  5.  * brief
  6.  *    Main macroblock mode decision functions and helpers
  7.  *
  8.  **************************************************************************
  9.  */
  10. #include <math.h>
  11. #include <limits.h>
  12. #include <float.h>
  13. #include "global.h"
  14. #include "rdopt_coding_state.h"
  15. #include "mb_access.h"
  16. #include "intrarefresh.h"
  17. #include "image.h"
  18. #include "transform8x8.h"
  19. #include "ratectl.h"
  20. #include "mode_decision.h"
  21. #include "fmo.h"
  22. #include "me_umhex.h"
  23. #include "me_umhexsmp.h"
  24. #include "macroblock.h"
  25. #include "rdoq.h"
  26. #include "errdo.h"
  27. //==== MODULE PARAMETERS ====
  28. const int  b8_mode_table[6]  = {0, 4, 5, 6, 7};         // DO NOT CHANGE ORDER !!!
  29. const int  mb_mode_table[9]  = {0, 1, 2, 3, P8x8, I16MB, I4MB, I8MB, IPCM}; // DO NOT CHANGE ORDER !!!
  30. //double *mb16x16_cost_frame;
  31. /*!
  32. *************************************************************************************
  33. * brief
  34. *    Reset Valid Modes
  35. *************************************************************************************
  36. */
  37. void reset_valid_modes(RD_PARAMS *enc_mb)
  38. {
  39.   memset(enc_mb->valid, 0, MAXMODE * sizeof(short));
  40. }
  41. /*!
  42. *************************************************************************************
  43. * brief
  44. *    Initialize Encoding parameters for Macroblock
  45. *************************************************************************************
  46. */
  47. void init_enc_mb_params(Macroblock* currMB, RD_PARAMS *enc_mb, int intra, int bslice)
  48. {
  49.   int l,k;
  50.   //Setup list offset
  51.   enc_mb->list_offset[LIST_0] = LIST_0 + currMB->list_offset;
  52.   enc_mb->list_offset[LIST_1] = LIST_1 + currMB->list_offset;
  53.   enc_mb->curr_mb_field = ((img->MbaffFrameFlag)&&(currMB->mb_field));
  54.  
  55.   // Set valid modes  
  56.   enc_mb->valid[I8MB]  = (!params->DisableIntraInInter || intra )?   params->Transform8x8Mode : 0;
  57.   enc_mb->valid[I4MB]  = (!params->DisableIntraInInter || intra )? ((params->Transform8x8Mode == 2) ? 0 : 1) : 0;
  58.   enc_mb->valid[I4MB]  = (!params->DisableIntra4x4  ) ? enc_mb->valid[I4MB] : 0;
  59.   enc_mb->valid[I16MB] = (!params->DisableIntraInInter || intra )? 1 : 0;
  60.   enc_mb->valid[I16MB] = (!params->DisableIntra16x16) ? enc_mb->valid[I16MB] : 0;
  61.   enc_mb->valid[IPCM]  = (!params->DisableIntraInInter || intra )? params->EnableIPCM : 0;
  62.   enc_mb->valid[0]     = (!intra && params->InterSearch[bslice][0]);
  63.   enc_mb->valid[1]     = (!intra && params->InterSearch[bslice][1]);
  64.   enc_mb->valid[2]     = (!intra && params->InterSearch[bslice][2]);
  65.   enc_mb->valid[3]     = (!intra && params->InterSearch[bslice][3]);
  66.   enc_mb->valid[4]     = (!intra && params->InterSearch[bslice][4]);
  67.   enc_mb->valid[5]     = (!intra && params->InterSearch[bslice][5] && !(params->Transform8x8Mode==2));
  68.   enc_mb->valid[6]     = (!intra && params->InterSearch[bslice][6] && !(params->Transform8x8Mode==2));
  69.   enc_mb->valid[7]     = (!intra && params->InterSearch[bslice][7] && !(params->Transform8x8Mode==2));
  70.   enc_mb->valid[P8x8]  = (enc_mb->valid[4] || enc_mb->valid[5] || enc_mb->valid[6] || enc_mb->valid[7]);
  71.   enc_mb->valid[12]    = (img->type == SI_SLICE);
  72.   
  73.   if (params->UseRDOQuant && params->RDOQ_CP_Mode && (img->qp != img->masterQP) )  
  74.     RDOQ_update_mode(enc_mb, bslice);
  75.   if(img->type==SP_SLICE)
  76.   {
  77.     if(si_frame_indicator)
  78.     {
  79.       reset_valid_modes(enc_mb);
  80.       if(check_for_SI16())
  81.       {
  82.         enc_mb->valid[I16MB] = 1;
  83.       }
  84.       else
  85.       {
  86.         enc_mb->valid[I4MB]  = 1;
  87.       }
  88.     }
  89.     
  90.     if(sp2_frame_indicator)
  91.     {
  92.       if(check_for_SI16())
  93.       {
  94.         reset_valid_modes(enc_mb);
  95.         enc_mb->valid[I16MB] = 1;
  96.       }
  97.       else
  98.       {
  99.         enc_mb->valid[I8MB]  = 0;
  100.         enc_mb->valid[IPCM]  = 0;
  101.         enc_mb->valid[0]     = 0;
  102.         enc_mb->valid[I16MB] = 0;
  103.       }
  104.     }
  105.   }
  106.   //===== SET LAGRANGE PARAMETERS =====
  107.   // Note that these are now computed at the slice level to reduce
  108.   // computations and cleanup code.
  109.   if (bslice && img->nal_reference_idc)
  110.   {
  111.     enc_mb->lambda_md = img->lambda_md[5][img->masterQP];
  112.     enc_mb->lambda_me[F_PEL] = img->lambda_me[5][img->masterQP][F_PEL];
  113.     enc_mb->lambda_me[H_PEL] = img->lambda_me[5][img->masterQP][H_PEL];
  114.     enc_mb->lambda_me[Q_PEL] = img->lambda_me[5][img->masterQP][Q_PEL];
  115.     enc_mb->lambda_mf[F_PEL] = img->lambda_mf[5][img->masterQP][F_PEL];
  116.     enc_mb->lambda_mf[H_PEL] = img->lambda_mf[5][img->masterQP][H_PEL];
  117.     enc_mb->lambda_mf[Q_PEL] = img->lambda_mf[5][img->masterQP][Q_PEL];
  118.   }
  119.   else
  120.   {
  121.     enc_mb->lambda_md = img->lambda_md[img->type][img->masterQP];
  122.     enc_mb->lambda_me[F_PEL] = img->lambda_me[img->type][img->masterQP][F_PEL];
  123.     enc_mb->lambda_me[H_PEL] = img->lambda_me[img->type][img->masterQP][H_PEL];
  124.     enc_mb->lambda_me[Q_PEL] = img->lambda_me[img->type][img->masterQP][Q_PEL];
  125.     enc_mb->lambda_mf[F_PEL] = img->lambda_mf[img->type][img->masterQP][F_PEL];
  126.     enc_mb->lambda_mf[H_PEL] = img->lambda_mf[img->type][img->masterQP][H_PEL];
  127.     enc_mb->lambda_mf[Q_PEL] = img->lambda_mf[img->type][img->masterQP][Q_PEL];
  128.   }
  129.  
  130.   if (!img->MbaffFrameFlag)
  131.   {
  132.     for (l = LIST_0; l < BI_PRED; l++)
  133.     {
  134.       for(k = 0; k < listXsize[l]; k++)
  135.       {
  136.         if(img->structure != listX[l][k]->structure)
  137.         {
  138.           if (img->structure == TOP_FIELD)
  139.             listX[l][k]->chroma_vector_adjustment = -2;
  140.           else if (img->structure == BOTTOM_FIELD)
  141.             listX[l][k]->chroma_vector_adjustment = 2;
  142.           else
  143.             listX[l][k]->chroma_vector_adjustment= 0;
  144.         }
  145.         else
  146.           listX[l][k]->chroma_vector_adjustment= 0;
  147.       }
  148.     }
  149.   }
  150.   else
  151.   {
  152.     if (enc_mb->curr_mb_field)
  153.     {
  154.       for (l = enc_mb->list_offset[LIST_0]; l <= enc_mb->list_offset[LIST_1]; l++)
  155.       {
  156.         for(k = 0; k < listXsize[l]; k++)
  157.         {
  158.           listX[l][k]->chroma_vector_adjustment= 0;
  159.           if((img->current_mb_nr & 0x01) == 0 && listX[l][k]->structure == BOTTOM_FIELD)
  160.             listX[l][k]->chroma_vector_adjustment = -2;
  161.           if((img->current_mb_nr & 0x01) == 1 && listX[l][k]->structure == TOP_FIELD)
  162.             listX[l][k]->chroma_vector_adjustment = 2;
  163.         }
  164.       }
  165.     }
  166.     else
  167.     {
  168.       for (l = enc_mb->list_offset[LIST_0]; l <= enc_mb->list_offset[LIST_1]; l++)
  169.       {
  170.         for(k = 0; k < listXsize[l]; k++)
  171.           listX[l][k]->chroma_vector_adjustment = 0;
  172.       }
  173.     }
  174.   }
  175. }
  176. /*!
  177. *************************************************************************************
  178. * brief
  179. *    computation of prediction list (including biprediction) cost
  180. *************************************************************************************
  181. */
  182. void list_prediction_cost(Macroblock *currMB, int list, int block, int mode, RD_PARAMS *enc_mb, int bmcost[5], char best_ref[2])
  183. {
  184.   short ref;
  185.   int mcost;
  186.   int cur_list = list < BI_PRED ? enc_mb->list_offset[list] : enc_mb->list_offset[LIST_0];
  187.   //--- get cost and reference frame for forward prediction ---
  188.   if (list < BI_PRED)
  189.   {
  190.     for (ref=0; ref < listXsize[cur_list]; ref++)
  191.     {
  192.       if (!img->checkref || list || ref==0 || (params->RestrictRef && CheckReliabilityOfRef (block, list, ref, mode)))
  193.       {
  194.         // limit the number of reference frames to 1 when switching SP frames are used
  195.         if((!params->sp2_frame_indicator && !params->sp_output_indicator)||
  196.           ((params->sp2_frame_indicator || params->sp_output_indicator) && (img->type != P_SLICE && img->type != SP_SLICE))||
  197.           ((params->sp2_frame_indicator || params->sp_output_indicator) && ((img->type == P_SLICE || img->type == SP_SLICE) &&(ref==0))))
  198.         {
  199.           mcost  = (params->rdopt
  200.             ? REF_COST (enc_mb->lambda_mf[Q_PEL], ref, cur_list)
  201.             : (int) (2 * enc_mb->lambda_me[Q_PEL] * imin(ref, 1)));
  202.           mcost += motion_cost[mode][list][ref][block];
  203.           if (mcost < bmcost[list])
  204.           {
  205.             bmcost[list]   = mcost;
  206.             best_ref[list] = (char)ref;
  207.           }
  208.         }
  209.       }
  210.     }
  211.   }
  212.   else if (list == BI_PRED)
  213.   {
  214.     if (active_pps->weighted_bipred_idc == 1)
  215.     {
  216.       int weight_sum = wbp_weight[0][(int) best_ref[LIST_0]][(int) best_ref[LIST_1]][0] + wbp_weight[1][(int) best_ref[LIST_0]][(int) best_ref[LIST_1]][0];
  217.       
  218.       if (weight_sum < -128 ||  weight_sum > 127)
  219.       {
  220.         bmcost[list] = INT_MAX;
  221.       }
  222.       else
  223.       {
  224.         bmcost[list]  = (params->rdopt
  225.           ? (REF_COST  (enc_mb->lambda_mf[Q_PEL], (short)best_ref[LIST_0], cur_list)
  226.           +  REF_COST  (enc_mb->lambda_mf[Q_PEL], (short)best_ref[LIST_1], cur_list + LIST_1))
  227.           : (int) (2 * (enc_mb->lambda_me[Q_PEL] * (imin((short)best_ref[LIST_0], 1) + imin((short)best_ref[LIST_1], 1)))));
  228.         bmcost[list] += BIDPartitionCost (currMB, mode, block, best_ref, enc_mb->lambda_mf[Q_PEL]);
  229.       }
  230.     }
  231.     else
  232.     {
  233.       bmcost[list]  = (params->rdopt
  234.         ? (REF_COST  (enc_mb->lambda_mf[Q_PEL], (short)best_ref[LIST_0], cur_list)
  235.         +  REF_COST  (enc_mb->lambda_mf[Q_PEL], (short)best_ref[LIST_1], cur_list + LIST_1))
  236.         : (int) (2 * (enc_mb->lambda_me[Q_PEL] * (imin((short)best_ref[LIST_0], 1) + imin((short)best_ref[LIST_1], 1)))));
  237.       bmcost[list] += BIDPartitionCost (currMB, mode, block, best_ref, enc_mb->lambda_mf[Q_PEL]);
  238.     }
  239.   }
  240.   else
  241.   {
  242.     bmcost[list]  = (params->rdopt
  243.       ? (REF_COST (enc_mb->lambda_mf[Q_PEL], 0, cur_list)
  244.       +  REF_COST (enc_mb->lambda_mf[Q_PEL], 0, cur_list + LIST_1))
  245.       : (int) (4 * enc_mb->lambda_me[Q_PEL]));
  246.     bmcost[list] += BPredPartitionCost(currMB, mode, block, 0, 0, enc_mb->lambda_mf[Q_PEL], !(list&1));
  247.   }
  248. }
  249. int compute_ref_cost(RD_PARAMS *enc_mb, int ref, int list)
  250. {
  251.   return WEIGHTED_COST(enc_mb->lambda_mf[Q_PEL],((listXsize[enc_mb->list_offset[list]] <= 1)? 0:refbits[ref]));
  252. }
  253. /*!
  254. *************************************************************************************
  255. * brief
  256. *    Determination of prediction list based on simple distortion computation
  257. *************************************************************************************
  258. */
  259. void determine_prediction_list(int mode, int bmcost[5], char best_ref[2], char *best_pdir, int *cost, short *bipred_me)
  260. {
  261.   int bestlist;  
  262.   
  263.   *cost += iminarray ( bmcost, 5, &bestlist);
  264.   
  265.   if (bestlist <= BI_PRED)  //LIST_0, LIST_1 & BI_DIR
  266.   {
  267.     *best_pdir = bestlist; 
  268.     *bipred_me = 0;
  269.   }
  270.   else                      //BI_PRED_L0 & BI_PRED_L1
  271.   {
  272.     *best_pdir = 2;    
  273.     *bipred_me = bestlist - 2;
  274.     best_ref[LIST_1] = 0;
  275.     best_ref[LIST_0] = 0;
  276.   }
  277. }
  278. /*!
  279. *************************************************************************************
  280. * brief
  281. *    RD decision process
  282. *************************************************************************************
  283. */
  284. void compute_mode_RD_cost(int mode,
  285.                           Macroblock *currMB,
  286.                           RD_PARAMS *enc_mb,
  287.                           double *min_rdcost,
  288.                           double *min_dcost,
  289.                           double *min_rate,
  290.                           int i16mode,
  291.                           short bslice,
  292.                           short *inter_skip,
  293.                           int   is_cavlc)
  294. {
  295.   //--- transform size ---
  296.   currMB->luma_transform_size_8x8_flag = params->Transform8x8Mode==2
  297.     ?  (mode >= 1 && mode <= 3)
  298.     || (mode == 0 && bslice && active_sps->direct_8x8_inference_flag)
  299.     || ((mode == P8x8) && (enc_mb->valid[4]))
  300.     :  0;
  301.   //store_coding_state (currMB, cs_cm); // RD
  302.   SetModesAndRefframeForBlocks (currMB, mode);
  303.   // Encode with coefficients
  304.   img->NoResidueDirect = 0;
  305.   if ((params->FastCrIntraDecision )
  306.     || (currMB->c_ipred_mode == DC_PRED_8 || (IS_INTRA(currMB) )))
  307.   {
  308.     while(1)
  309.     {
  310.       if (RDCost_for_macroblocks (currMB, enc_mb->lambda_md, mode, min_rdcost, min_dcost, min_rate, i16mode, is_cavlc))
  311.       {
  312.         //Rate control
  313.         if (params->RCEnable)
  314.         {
  315.           if(mode == P8x8)
  316.             rc_store_diff(img->opix_x, img->opix_y, currMB->luma_transform_size_8x8_flag == 1 ? tr8x8.mpr8x8 : tr4x4.mpr8x8);
  317.           else
  318.             rc_store_diff(img->opix_x, img->opix_y, pred);
  319.         }
  320.         store_macroblock_parameters (currMB, mode);
  321.         if(params->rdopt == 2 && mode == 0 && params->EarlySkipEnable)
  322.         {
  323.           // check transform quantized coeff.
  324.           if(currMB->cbp == 0)
  325.             *inter_skip = 1;
  326.         }
  327.       }
  328.       // Go through transform modes.
  329.       // Note that if currMB->cbp is 0 one could choose to skip 8x8 mode
  330.       // although this could be due to deadzoning decisions.
  331.       //if (params->Transform8x8Mode==1 && currMB->cbp!=0)
  332.       if (params->Transform8x8Mode==1)
  333.       {
  334.         //=========== try mb_types 1,2,3 with 8x8 transform ===========
  335.         if ((mode >= 1 && mode <= 3) && currMB->luma_transform_size_8x8_flag == 0)
  336.         {
  337.           //try with 8x8 transform size
  338.           currMB->luma_transform_size_8x8_flag = 1;
  339.           continue;
  340.         }
  341.         //=========== try DIRECT-MODE with 8x8 transform ===========
  342.         else if (mode == 0 && bslice && active_sps->direct_8x8_inference_flag && currMB->luma_transform_size_8x8_flag == 0)
  343.         {
  344.           //try with 8x8 transform size
  345.           currMB->luma_transform_size_8x8_flag = 1;
  346.           continue;
  347.         }
  348.         //=========== try mb_type P8x8 for mode 4 with 4x4/8x8 transform ===========
  349.         else if ((mode == P8x8) && (enc_mb->valid[4]) && (currMB->luma_transform_size_8x8_flag == 0))
  350.         {
  351.           currMB->luma_transform_size_8x8_flag = 1; //check 8x8 partition for transform size 8x8
  352.           continue;
  353.         }
  354.         else
  355.         {
  356.           currMB->luma_transform_size_8x8_flag = 0;
  357.           break;
  358.         }
  359.       }
  360.       else
  361.         break;
  362.     }
  363.     // Encode with no coefficients. Currently only for direct. This could be extended to all other modes as in example.
  364.     //if (mode < P8x8 && (*inter_skip == 0) && enc_mb->valid[mode] && currMB->cbp && (currMB->cbp&15) != 15 && !params->nobskip)
  365.     if ( bslice && mode == 0 && (*inter_skip == 0) && enc_mb->valid[mode] 
  366.     && currMB->cbp && (currMB->cbp&15) != 15 && !params->nobskip
  367.     && !(currMB->qp_scaled[0] == 0 && img->lossless_qpprime_flag==1) )
  368.     {
  369.       img->NoResidueDirect = 1;
  370.       if (RDCost_for_macroblocks (currMB, enc_mb->lambda_md, mode, min_rdcost, min_dcost, min_rate, i16mode, is_cavlc))
  371.       {
  372.         //Rate control
  373.         if (params->RCEnable)
  374.           rc_store_diff(img->opix_x,img->opix_y,pred);
  375.         store_macroblock_parameters (currMB, mode);
  376.       }
  377.     }
  378.   }
  379. }
  380. /*!
  381. *************************************************************************************
  382. * brief
  383. *    Mode Decision for an 8x8 sub-macroblock
  384. *************************************************************************************
  385. */
  386. void submacroblock_mode_decision(RD_PARAMS *enc_mb,
  387.                                  RD_8x8DATA *dataTr,
  388.                                  Macroblock *currMB,
  389.                                  int ***cofACtr,
  390.                                  int ***cofACCbCrtr1, 
  391.                                  int ***cofACCbCrtr2,
  392.                                  int *have_direct,
  393.                                  short bslice,
  394.                                  int block,
  395.                                  int *cost_direct,
  396.                                  int *cost,
  397.                                  int *cost8x8_direct,
  398.                                  int transform8x8,
  399.                                  int is_cavlc)
  400. {
  401.   int64 curr_cbp_blk;
  402.   double min_rdcost, rdcost = 0.0;
  403.   int j0, i0, j1, i1;
  404.   int i,j, k;
  405.   int min_cost8x8, index;
  406.   int mode;
  407.   int direct4x4_tmp, direct8x8_tmp;
  408.   int bmcost[5] = {INT_MAX};
  409.   int cnt_nonz = 0;
  410.   int dummy;
  411.   int best_cnt_nonz = 0;
  412.   int maxindex =  (transform8x8) ? 2 : 5;
  413.   int block_x, block_y;
  414.   int lambda_mf[3];
  415.   static int fadjust[16][16], fadjustCr[2][16][16];
  416.   int ***fadjustTransform = transform8x8? img->fadjust8x8 : img->fadjust4x4;
  417.   int ****fadjustTransformCr   = (params->AdaptRndChroma || (img->P444_joined )) 
  418.     ? (transform8x8 ? img->fadjust8x8Cr : img->fadjust4x4Cr): NULL;
  419.   int lumaAdjustIndex   = transform8x8 ? 2 : 3;
  420.   int chromaAdjustIndex = transform8x8 ? 0 : 2;
  421.   short pdir, bipred_me = 0;
  422.   char best_pdir = 0;
  423.   char best_ref[2] = {0, -1};
  424.   imgpel  (*mb_pred)[16] = img->mb_pred[0];
  425. #ifdef BEST_NZ_COEFF
  426.   int best_nz_coeff[2][2];
  427. #endif
  428.   //--- set coordinates ---
  429.   j0 = ((block>>1)<<3);
  430.   j1 = (j0>>2);
  431.   i0 = ((block&0x01)<<3);
  432.   i1 = (i0>>2);
  433. #ifdef BEST_NZ_COEFF
  434.   for(j = 0; j <= 1; j++)
  435.   {
  436.     for(i = 0; i <= 1; i++)
  437.       best_nz_coeff[i][j] = img->nz_coeff[img->current_mb_nr][i1 + i][j1 + j] = 0;
  438.   }
  439. #endif
  440.   if (transform8x8)
  441.     currMB->luma_transform_size_8x8_flag = 1; //switch to transform size 8x8
  442.   //--- store coding state before coding ---
  443.   store_coding_state (currMB, cs_cm);
  444.   //=====  LOOP OVER POSSIBLE CODING MODES FOR 8x8 SUB-PARTITION  =====
  445.   for (min_cost8x8 = INT_MAX, min_rdcost = 1e20, index = (bslice?0:1); index < maxindex; index++)
  446.   {
  447.     mode = b8_mode_table[index];
  448.     *cost = 0;
  449.     if (enc_mb->valid[mode] && (transform8x8 == 0 || mode != 0 || (mode == 0 && active_sps->direct_8x8_inference_flag)))
  450.     {
  451.       curr_cbp_blk = 0;
  452.       if (mode==0)
  453.       {
  454.         //--- Direct Mode ---
  455.         if (!params->rdopt )
  456.         {
  457.           direct4x4_tmp = 0;
  458.           direct8x8_tmp = 0;
  459.           direct4x4_tmp = GetDirectCost8x8 ( currMB, block, &direct8x8_tmp);
  460.           if ((direct4x4_tmp==INT_MAX)||(*cost_direct==INT_MAX))
  461.           {
  462.             *cost_direct = INT_MAX;
  463.             if (transform8x8)
  464.               *cost8x8_direct = INT_MAX;
  465.           }
  466.           else
  467.           {
  468.             *cost_direct += direct4x4_tmp;
  469.             if (transform8x8)
  470.               *cost8x8_direct += direct8x8_tmp;
  471.           }
  472.           (*have_direct) ++;
  473.           if (transform8x8)
  474.           {
  475.             switch(params->Transform8x8Mode)
  476.             {
  477.             case 1: // Mixture of 8x8 & 4x4 transform
  478.               if((direct8x8_tmp < direct4x4_tmp) || !(enc_mb->valid[5] && enc_mb->valid[6] && enc_mb->valid[7]))
  479.                 *cost = direct8x8_tmp;
  480.               else
  481.                 *cost = direct4x4_tmp;
  482.               break;
  483.             case 2: // 8x8 Transform only
  484.               *cost = direct8x8_tmp;
  485.               break;
  486.             default: // 4x4 Transform only
  487.               *cost = direct4x4_tmp;
  488.               break;
  489.             }
  490.             if (params->Transform8x8Mode==2)
  491.               *cost = INT_MAX;
  492.           }
  493.           else
  494.           {
  495.             *cost = direct4x4_tmp;
  496.           }
  497.         }
  498.         block_x = img->block_x + (block & 0x01)*2;
  499.         block_y = img->block_y + (block & 0x02);
  500.         best_ref[LIST_0] = direct_ref_idx[LIST_0][block_y][block_x];
  501.         best_ref[LIST_1] = direct_ref_idx[LIST_1][block_y][block_x];
  502.         best_pdir        = direct_pdir[block_y][block_x];
  503.       } // if (mode==0)
  504.       else
  505.       {
  506.         int64 ref_pic_num;
  507.         char b_ref;
  508.         //======= motion estimation for all reference frames ========
  509.         //-----------------------------------------------------------
  510.         memcpy(lambda_mf, enc_mb->lambda_mf, 3 * sizeof(int));
  511.         if (params->CtxAdptLagrangeMult == 1)
  512.         {
  513.           lambda_mf[F_PEL] = (int)(lambda_mf[F_PEL] * lambda_mf_factor);
  514.           lambda_mf[H_PEL] = (int)(lambda_mf[H_PEL] * lambda_mf_factor);
  515.           lambda_mf[Q_PEL] = (int)(lambda_mf[Q_PEL] * lambda_mf_factor);
  516.         }
  517.         PartitionMotionSearch (currMB, mode, block, lambda_mf);
  518.         //--- get cost and reference frame for LIST 0 prediction ---
  519.         bmcost[LIST_0] = INT_MAX;
  520.         list_prediction_cost(currMB, LIST_0, block, mode, enc_mb, bmcost, best_ref);
  521.         //store LIST 0 reference index for every block
  522.         block_x = img->block_x + (block & 0x01)*2;
  523.         block_y = img->block_y + (block & 0x02);
  524.         b_ref = best_ref[LIST_0];
  525.         ref_pic_num = enc_picture->ref_pic_num[enc_mb->list_offset[LIST_0]][(short) b_ref];
  526.         for (j = block_y; j< block_y + 2; j++)
  527.         {
  528.           memset(&enc_picture->motion.ref_idx [LIST_0][j][block_x], b_ref, 2 * sizeof(char));
  529.         }
  530.         for (j = block_y; j< block_y + 2; j++)
  531.         {
  532.           for (i = block_x; i < block_x + 2; i++)
  533.           {
  534.             enc_picture->motion.ref_pic_id[LIST_0][j][i] = ref_pic_num;
  535.           }
  536.         }
  537.         if (bslice)
  538.         {
  539.           //--- get cost and reference frame for LIST 1 prediction ---
  540.           bmcost[LIST_1] = INT_MAX;
  541.           bmcost[BI_PRED] = INT_MAX;
  542.           list_prediction_cost(currMB, LIST_1, block, mode, enc_mb, bmcost, best_ref);
  543.           // Compute bipredictive cost between best list 0 and best list 1 references
  544.           list_prediction_cost(currMB, BI_PRED, block, mode, enc_mb, bmcost, best_ref);
  545.           
  546.           // currently Bi prediction ME is only supported for modes 1, 2, 3 and only for ref 0 and only for ref 0
  547.           if (is_bipred_enabled(mode))
  548.           {
  549.             list_prediction_cost(currMB, BI_PRED_L0, block, mode, enc_mb, bmcost, 0);
  550.             list_prediction_cost(currMB, BI_PRED_L1, block, mode, enc_mb, bmcost, 0);
  551.           }
  552.           else
  553.           {
  554.             bmcost[BI_PRED_L0] = INT_MAX;
  555.             bmcost[BI_PRED_L1] = INT_MAX;
  556.           }
  557.           //--- get prediction direction ----
  558.           determine_prediction_list(mode, bmcost, best_ref, &best_pdir, cost, &bipred_me);
  559.         
  560.           //store backward reference index for every block
  561.           for (k = LIST_0; k <= LIST_1; k++)
  562.           {
  563.             for (j = block_y; j< block_y + 2; j++)
  564.             {
  565.               memset(&enc_picture->motion.ref_idx[k][j][block_x], best_ref[k], 2 * sizeof(char));
  566.             }
  567.           }
  568.         } // if (bslice)
  569.         else
  570.         {
  571.           best_pdir = 0;
  572.           *cost     = bmcost[LIST_0];
  573.         }
  574.       } // if (mode!=0)
  575.       if (params->rdopt)
  576.       {
  577.         //--- get and check rate-distortion cost ---
  578.         rdcost = RDCost_for_8x8blocks (currMB, &cnt_nonz, &curr_cbp_blk, enc_mb->lambda_md,
  579.           block, mode, best_pdir, best_ref[LIST_0], best_ref[LIST_1], bipred_me, is_cavlc);
  580.       }
  581.       else
  582.       {
  583.         if (*cost!=INT_MAX)
  584.           *cost += (REF_COST (enc_mb->lambda_mf[Q_PEL], B8Mode2Value (mode, best_pdir),
  585.           enc_mb->list_offset[(best_pdir < 1 ? LIST_0 : LIST_1)]) - 1);
  586.       }
  587.       //--- set variables if best mode has changed ---
  588.       if ( ( params->rdopt && rdcost < min_rdcost) || (!params->rdopt && *cost < min_cost8x8))
  589.       {
  590.         min_cost8x8                  = *cost;
  591.         min_rdcost                   = rdcost;
  592.         dataTr->part8x8mode  [block] = mode;
  593.         dataTr->part8x8pdir  [block] = best_pdir;
  594.         dataTr->part8x8l0ref [block] = best_ref[LIST_0];
  595.         dataTr->part8x8l1ref [block] = best_ref[LIST_1];
  596.         dataTr->part8x8bipred[block] = bipred_me;
  597.         currMB->b8mode[block] = mode;
  598. #ifdef BEST_NZ_COEFF
  599.         if (cnt_nonz)
  600.         {
  601.           for(i = 0; i <= 1; i++)
  602.           {
  603.             for(j = 0; j <= 1; j++)  
  604.               best_nz_coeff[i][j]= img->nz_coeff[img->current_mb_nr][i1 + i][j1 + j];
  605.           }
  606.         }
  607.         else
  608.         {
  609.           for(i = 0; i <= 1; i++)
  610.           {
  611.             best_nz_coeff[i][0]= 0;
  612.             best_nz_coeff[i][1]= 0;
  613.           }
  614.         }
  615. #endif
  616.         //--- store number of nonzero coefficients ---
  617.         best_cnt_nonz  = cnt_nonz;
  618.         if (params->rdopt)
  619.         {
  620.           //--- store block cbp ---
  621.           cbp_blk8x8 &= (~(0x33 << (((block>>1)<<3)+((block & 0x01)<<1)))); // delete bits for block
  622.           cbp_blk8x8 |= curr_cbp_blk;
  623.           //--- store coefficients ---
  624.           memcpy(&cofACtr[0][0][0],&img->cofAC[block][0][0][0], 4 * 2 * 65 * sizeof(int));
  625.           if( img->P444_joined ) 
  626.           {
  627.             //--- store coefficients ---
  628.             memcpy(&cofACCbCrtr1[0][0][0],&img->cofAC[block + 4][0][0][0], 4 * 2 * 65 * sizeof(int));
  629.             memcpy(&cofACCbCrtr2[0][0][0],&img->cofAC[block + 8][0][0][0], 4 * 2 * 65 * sizeof(int));
  630.           }
  631.           
  632.           //--- store reconstruction and prediction ---
  633.           for (j=j0; j<j0 + BLOCK_SIZE_8x8; j++)
  634.           {
  635.             memcpy(&dataTr->rec_mbY8x8[j][i0],&enc_picture->imgY[img->pix_y + j][img->pix_x + i0], BLOCK_SIZE_8x8 * sizeof(imgpel));
  636.             memcpy(&dataTr->mpr8x8[j][i0],&mb_pred[j][i0], BLOCK_SIZE_8x8 * sizeof(imgpel));
  637.           }
  638.           if (params->rdopt == 3)
  639.           {
  640.             errdo_store_best_block(img, decs->dec_mbY8x8, enc_picture->p_dec_img[0], i0, j0, BLOCK_SIZE_8x8);  //Store best 8x8 block for each hypothetical decoder
  641.           }
  642.           if(img->type==SP_SLICE && (!si_frame_indicator))
  643.           {
  644.             for (j=j0; j<j0 + BLOCK_SIZE_8x8; j++)
  645.             {
  646.               memcpy(&dataTr->lrec[j][i0],&lrec[img->pix_y + j][img->pix_x + i0], BLOCK_SIZE_8x8 * sizeof(int));
  647.             }
  648.           }
  649.  
  650.           if(img->P444_joined) 
  651.           {
  652.             for (j=j0; j<j0+8; j++)    
  653.             {
  654.               memcpy(&dataTr->rec_mb8x8_cr[0][j][i0],&enc_picture->imgUV[0][img->pix_y + j][img->pix_x + i0], BLOCK_SIZE_8x8 * sizeof(imgpel));
  655.               memcpy(&dataTr->rec_mb8x8_cr[1][j][i0],&enc_picture->imgUV[1][img->pix_y + j][img->pix_x + i0], BLOCK_SIZE_8x8 * sizeof(imgpel));
  656.               memcpy(&dataTr->mpr8x8CbCr[0][j][i0],&img->mb_pred[1][j][i0], BLOCK_SIZE_8x8 * sizeof(imgpel));
  657.               memcpy(&dataTr->mpr8x8CbCr[1][j][i0],&img->mb_pred[2][j][i0], BLOCK_SIZE_8x8 * sizeof(imgpel));
  658.             }
  659.           }
  660.           
  661.         }
  662.         if (img->AdaptiveRounding)
  663.         {
  664.           for (j=j0; j<j0+8; j++)
  665.           {
  666.             memcpy(&fadjust[j][i0], &fadjustTransform[0][j][i0], 8 * sizeof(int));
  667.           }
  668.           if (params->AdaptRndChroma || (img->P444_joined))
  669.           {
  670.             int j0_cr = (j0 * img->mb_cr_size_y) / MB_BLOCK_SIZE;
  671.             int i0_cr = (i0 * img->mb_cr_size_x) / MB_BLOCK_SIZE;
  672.             for (k = 0; k < 2; k++)
  673.             {
  674.               for (j=j0_cr; j < j0_cr + (img->mb_cr_size_y >> 1); j++)
  675.               {
  676.                 memcpy(&fadjustCr[k][j][i0_cr], &fadjustTransformCr[k][0][j][i0_cr], (img->mb_cr_size_x >> 1) * sizeof(int));
  677.               }
  678.             }
  679.           }
  680.         }
  681.         //--- store best 8x8 coding state ---
  682.         if (block < 3)
  683.           store_coding_state (currMB, cs_b8);
  684.       } // if (rdcost <= min_rdcost)
  685.       //--- re-set coding state as it was before coding with current mode was performed ---
  686.       reset_coding_state (currMB, cs_cm);
  687.     } // if ((enc_mb->valid[mode] && (transform8x8 == 0 || mode != 0 || (mode == 0 && active_sps->direct_8x8_inference_flag)))
  688.   } // for (min_rdcost=1e30, index=(bslice?0:1); index<6; index++)
  689. #ifdef BEST_NZ_COEFF
  690.   for(i = 0; i <= 1; i++)  
  691.   {
  692.     for(j = 0; j <= 1; j++)
  693.       img->nz_coeff[img->current_mb_nr][i1 + i][j1 + j] = best_nz_coeff[i][j];
  694.   }
  695. #endif
  696.   if (!transform8x8)
  697.     dataTr->mb_p8x8_cost += min_cost8x8;
  698.   if (!params->rdopt)
  699.   {
  700.     if (transform8x8)
  701.     {
  702.       dataTr->mb_p8x8_cost += min_cost8x8;
  703.       mode = dataTr->part8x8mode[block];
  704.       pdir = dataTr->part8x8pdir[block];
  705.     }
  706.     else
  707.     {
  708.       mode = dataTr->part8x8mode[block];
  709.       pdir = dataTr->part8x8pdir[block];
  710.     }
  711.     curr_cbp_blk  = 0;
  712.     currMB->bipred_me[block] = dataTr->part8x8bipred[block];
  713.     best_cnt_nonz = LumaResidualCoding8x8 (currMB, &dummy, &curr_cbp_blk, block, pdir,
  714.       (pdir == 0 || pdir == 2 ? mode : 0), (pdir == 1 || pdir == 2 ? mode : 0), 
  715.       dataTr->part8x8l0ref[block], dataTr->part8x8l1ref[block], is_cavlc);
  716.     if (img->P444_joined)
  717.       best_cnt_nonz += coeff_cost_cr[1] + coeff_cost_cr[2];
  718.     cbp_blk8x8   &= (~(0x33 << (((block>>1)<<3)+((block & 0x01)<<1)))); // delete bits for block
  719.     cbp_blk8x8   |= curr_cbp_blk;
  720.     //--- store coefficients ---
  721.     memcpy(cofACtr[0][0],img->cofAC[block][0][0],4 * 2 * 65 * sizeof(int));
  722.     if(img->P444_joined) 
  723.     {
  724.       //--- store coefficients ---
  725.       memcpy(cofACCbCrtr1[0][0],img->cofAC[block + 4][0][0], 4 * 2 * 65 * sizeof(int));
  726.       memcpy(cofACCbCrtr2[0][0],img->cofAC[block + 8][0][0], 4 * 2 * 65 * sizeof(int));
  727.     }
  728.     //--- store reconstruction and prediction ---
  729.     for (j = j0; j < j0 + BLOCK_SIZE_8x8; j++)
  730.     {
  731.       memcpy(&dataTr->rec_mbY8x8[j][i0], &enc_picture->imgY[img->pix_y + j][img->pix_x + i0], BLOCK_SIZE_8x8 * sizeof (imgpel));
  732.     }
  733.     for (j = j0; j < j0 + BLOCK_SIZE_8x8; j++)
  734.     {
  735.       memcpy(&dataTr->mpr8x8[j][i0], &mb_pred[j][i0], BLOCK_SIZE_8x8 * sizeof (imgpel));
  736.     }
  737.     //--- store reconstruction and prediction ---
  738.     if(img->type==SP_SLICE &&(!si_frame_indicator))
  739.     {
  740.       for (j=j0; j < j0 + BLOCK_SIZE_8x8; j++)
  741.       {
  742.         memcpy(&dataTr->lrec[j][i0],&lrec[img->pix_y+j][img->pix_x+i0],BLOCK_SIZE_8x8 * sizeof(int)); // store coefficients for primary SP slice
  743.       }
  744.     }
  745.     if(img->P444_joined) 
  746.     {
  747.       for (j=j0; j < j0 + BLOCK_SIZE_8x8; j++)
  748.       {   
  749.         memcpy(&dataTr->rec_mb8x8_cr[0][j][i0], &enc_picture->imgUV[0][img->pix_y + j][img->pix_x + i0], BLOCK_SIZE_8x8 * sizeof (imgpel));
  750.         memcpy(&dataTr->rec_mb8x8_cr[1][j][i0], &enc_picture->imgUV[1][img->pix_y + j][img->pix_x + i0], BLOCK_SIZE_8x8 * sizeof (imgpel));
  751.         memcpy(&dataTr->mpr8x8CbCr[0][j][i0], &img->mb_pred[1][j][i0], BLOCK_SIZE_8x8 * sizeof (imgpel)); 
  752.         memcpy(&dataTr->mpr8x8CbCr[1][j][i0], &img->mb_pred[2][j][i0], BLOCK_SIZE_8x8 * sizeof (imgpel));
  753.       }
  754.     }   
  755.   }
  756.   //----- set cbp and count of nonzero coefficients ---
  757.   if (best_cnt_nonz)
  758.   {
  759.     cbp8x8       |= (1 << block);
  760.     cnt_nonz_8x8 += best_cnt_nonz;
  761.   }
  762.   if (!transform8x8)
  763.   {
  764.     if (block<3)
  765.     {
  766.       //===== re-set reconstructed block =====
  767.       j0   = 8*(block >> 1);
  768.       i0   = 8*(block & 0x01);
  769.       for (j = j0; j < j0 + BLOCK_SIZE_8x8; j++)
  770.       {
  771.         memcpy(&enc_picture->imgY[img->pix_y + j][img->pix_x], dataTr->rec_mbY8x8[j], BLOCK_SIZE_8x8 * sizeof(imgpel));
  772.       }
  773.       if (params->rdopt == 3)
  774.       {
  775.         errdo_get_best_block(img, enc_picture->p_dec_img[0], decs->dec_mbY8x8, j0, BLOCK_SIZE_8x8);
  776.       }
  777.       if(img->type==SP_SLICE &&(!si_frame_indicator))
  778.       {
  779.         for (j = j0; j < j0 + BLOCK_SIZE_8x8; j++)
  780.         {
  781.           memcpy(&lrec[img->pix_y + j][img->pix_x], dataTr->lrec[j],2*BLOCK_SIZE*sizeof(imgpel)); // reset the coefficients for SP slice
  782.         }
  783.       }
  784.       if(img->P444_joined) 
  785.       {
  786.         for (k=0; k<2; k++)
  787.         {
  788.           for (j = j0; j < j0 + BLOCK_SIZE_8x8; j++)
  789.           {
  790.             memcpy(&enc_picture->imgUV[k][img->pix_y + j][img->pix_x], dataTr->rec_mb8x8_cr[k][j], BLOCK_SIZE_8x8 * sizeof(imgpel));
  791.           }
  792.         }
  793.       }
  794.     } // if (block<3)
  795.   }
  796.   else
  797.   {
  798.     //======= save motion data for 8x8 partition for transform size 8x8 ========
  799.     StoreNewMotionVectorsBlock8x8(0, block, dataTr->part8x8mode[block], dataTr->part8x8l0ref[block], dataTr->part8x8l1ref[block], dataTr->part8x8pdir[block], dataTr->part8x8bipred[block], bslice);
  800.   }
  801.   //===== set motion vectors and reference frames (prediction) =====
  802.   SetRefAndMotionVectors (currMB, block, dataTr->part8x8mode[block], dataTr->part8x8pdir[block], dataTr->part8x8l0ref[block], dataTr->part8x8l1ref[block], dataTr->part8x8bipred[block]);
  803.   //===== set the coding state after current block =====
  804.   //if (transform8x8 == 0 || block < 3)
  805.   if (block < 3)
  806.     reset_coding_state (currMB, cs_b8);
  807.   if (img->AdaptiveRounding)
  808.   {
  809.     for (j=j0; j < j0 + BLOCK_SIZE_8x8; j++)
  810.     {
  811.       memcpy(&fadjustTransform  [lumaAdjustIndex][j][i0], &fadjust[j][i0], BLOCK_SIZE_8x8 * sizeof(int));
  812.     }
  813.     if (params->AdaptRndChroma || (img->P444_joined))
  814.     {
  815.       int j0_cr = (j0 * img->mb_cr_size_y) >> MB_BLOCK_SHIFT;
  816.       int i0_cr = (i0 * img->mb_cr_size_x) >> MB_BLOCK_SHIFT;
  817.       for (k = 0; k < 2; k++)
  818.       {
  819.         for (j=j0_cr; j<j0_cr+(img->mb_cr_size_y >> 1); j++)
  820.         {
  821.           memcpy(&fadjustTransformCr[k][chromaAdjustIndex][j][i0_cr], &fadjustCr[k][j][i0_cr], (img->mb_cr_size_x >> 1) * sizeof(int));
  822.         }
  823.       }
  824.     }
  825.   }
  826. }
  827. /*!
  828. *************************************************************************************
  829. * brief
  830. *    Checks whether a primary SP slice macroblock was encoded as I16
  831. *************************************************************************************
  832. */
  833. int check_for_SI16()
  834. {
  835.   int i,j;
  836.   for(i=img->pix_y;i<img->pix_y+MB_BLOCK_SIZE;i++)
  837.   {
  838.     for(j=img->pix_x;j<img->pix_x+MB_BLOCK_SIZE;j++)
  839.       if(lrec[i][j]!=-16)
  840.         return 0;
  841.   }
  842.   return 1;
  843. }
  844. void get_initial_mb16x16_cost(Macroblock* currMB)
  845. {
  846.   if (currMB->mb_available_left && currMB->mb_available_up)
  847.   {
  848.     mb16x16_cost = (mb16x16_cost_frame[img->current_mb_nr - 1] +
  849.       mb16x16_cost_frame[img->current_mb_nr - (img->width>>4)] + 1)/2.0;
  850.   }
  851.   else if (currMB->mb_available_left)
  852.   {
  853.     mb16x16_cost = mb16x16_cost_frame[img->current_mb_nr - 1];
  854.   }
  855.   else if (currMB->mb_available_up)
  856.   {
  857.     mb16x16_cost = mb16x16_cost_frame[img->current_mb_nr - (img->width>>4)];
  858.   }
  859.   else
  860.   {
  861.     mb16x16_cost = CALM_MF_FACTOR_THRESHOLD;
  862.   }
  863.   lambda_mf_factor = mb16x16_cost < CALM_MF_FACTOR_THRESHOLD ? 1.0 : sqrt(mb16x16_cost / (CALM_MF_FACTOR_THRESHOLD * img->lambda_mf_factor[img->type][img->qp]));
  864. }
  865. void adjust_mb16x16_cost(int cost)
  866. {
  867.   mb16x16_cost = (double) cost;
  868.   mb16x16_cost_frame[img->current_mb_nr] = mb16x16_cost;
  869.   lambda_mf_factor = (mb16x16_cost < CALM_MF_FACTOR_THRESHOLD)
  870.   ? 1.0
  871.   : sqrt(mb16x16_cost / (CALM_MF_FACTOR_THRESHOLD * img->lambda_mf_factor[img->type][img->qp]));
  872. }
  873. void update_lambda_costs(RD_PARAMS *enc_mb, int lambda_mf[3])
  874. {
  875.   int MEPos;
  876.   for (MEPos = 0; MEPos < 3; MEPos ++)
  877.   {
  878.     lambda_mf[MEPos] = params->CtxAdptLagrangeMult == 0 ? enc_mb->lambda_mf[MEPos] : (int)(enc_mb->lambda_mf[MEPos] * sqrt(lambda_mf_factor));
  879.   }
  880. }
  881. /*!
  882.  *************************************************************************************
  883.  * brief
  884.  *    Return array's minimum and its index
  885.  *************************************************************************************
  886.  */
  887. int iminarray ( int arr[], int size, int *minind )
  888. {
  889.   int i; 
  890.   int mincand = arr[0];
  891.   *minind = 0;
  892.   for ( i = 1; i < size; i++ )
  893.   {
  894.     if (arr[i] < mincand)
  895.     {
  896.       mincand = arr[i];
  897.       *minind = i;
  898.     }
  899.   }
  900.   return mincand;
  901. /*!
  902.  *************************************************************************************
  903.  * brief
  904.  *    Determines whether bi prediction is enabaled for current mode
  905.  *************************************************************************************
  906.  */
  907. int is_bipred_enabled(int mode) 
  908. {
  909.   int enabled = 0;
  910.   mode = (mode == P8x8) ? 4: mode;
  911.   if (params->BiPredMotionEstimation)
  912.   {
  913.     if (mode > 0 && mode < 5)
  914.     {
  915.       enabled = (params->BiPredSearch[mode - 1]) ? 1: 0;
  916.     }    
  917.     else
  918.     {
  919.       enabled = 0;
  920.     }
  921.   }
  922.   else
  923.   {
  924.     enabled = 0;
  925.   }
  926.   return enabled;
  927. }
  928. /*!
  929.  *************************************************************************************
  930.  * brief
  931.  *    Update prediction direction for mode P16x16 to check all prediction directions
  932.  *************************************************************************************
  933.  */
  934. void update_prediction_for_mode16x16(Block8x8Info *b8x8info, int ctr16x16, int *index)
  935. {
  936.   char pdir = 0;
  937.   short i, bipred_me = 0;
  938.   switch (ctr16x16)
  939.   {
  940.     case 0:
  941.       *index = *index - 1;
  942.       break;
  943.     case 1:
  944.       pdir = 1;
  945.       *index = *index - 1;
  946.       break;
  947.     case 2:
  948.       pdir = 2;
  949.       if (params->BiPredMotionEstimation)
  950.       {
  951.         *index = *index - 1;
  952.       }
  953.       break;
  954.     case 3:
  955.       pdir = 2;
  956.       bipred_me = 1;
  957.       *index = *index - 1;
  958.       break;
  959.     case 4:
  960.       pdir = 2;
  961.       bipred_me = 2;
  962.       break;
  963.     default:
  964.       error("invalid 'ctr16x16' value", -1);
  965.       break;
  966.   }
  967.   for (i = 0; i< 4; i++)
  968.   {
  969.     b8x8info->bipred8x8me[1][i] = bipred_me;
  970.     b8x8info->best8x8pdir[1][i] = pdir;
  971.   }
  972. }