rdopt.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:53k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2. ***********************************************************************
  3. * COPYRIGHT AND WARRANTY INFORMATION
  4. *
  5. * Copyright 2001, International Telecommunications Union, Geneva
  6. *
  7. * DISCLAIMER OF WARRANTY
  8. *
  9. * These software programs are available to the user without any
  10. * license fee or royalty on an "as is" basis. The ITU disclaims
  11. * any and all warranties, whether express, implied, or
  12. * statutory, including any implied warranties of merchantability
  13. * or of fitness for a particular purpose.  In no event shall the
  14. * contributor or the ITU be liable for any incidental, punitive, or
  15. * consequential damages of any kind whatsoever arising from the
  16. * use of these programs.
  17. *
  18. * This disclaimer of warranty extends to the user of these programs
  19. * and user's customers, employees, agents, transferees, successors,
  20. * and assigns.
  21. *
  22. * The ITU does not represent or warrant that the programs furnished
  23. * hereunder are free of infringement of any third-party patents.
  24. * Commercial implementations of ITU-T Recommendations, including
  25. * shareware, may be subject to royalty fees to patent holders.
  26. * Information regarding the ITU-T patent policy is available from
  27. * the ITU Web site at http://www.itu.int.
  28. *
  29. * THIS IS NOT A GRANT OF PATENT RIGHTS - SEE THE ITU-T PATENT POLICY.
  30. ************************************************************************
  31. */
  32. /*!
  33.  ***************************************************************************
  34.  * file rdopt.c
  35.  *
  36.  * brief
  37.  *    Rate-Distortion optimized mode decision
  38.  *
  39.  * author
  40.  *    Heiko Schwarz <hschwarz@hhi.de>
  41.  *
  42.  * date
  43.  *    12. April 2001
  44.  **************************************************************************
  45.  */
  46. #include <stdlib.h>
  47. #include <math.h>
  48. #include <memory.h>
  49. #include "rdopt.h"
  50. #include "refbuf.h"
  51. extern const byte PRED_IPRED[7][7][6];
  52. extern       int  QP2QUANT  [32];
  53. //=== static parameters ===
  54. RDOpt  *rdopt     = NULL;
  55. int    *forward_me_done[9];
  56. int    *tot_for_sad[9];
  57. /*!
  58.  ************************************************************************
  59.  * brief
  60.  *    delete structure for RD-optimized mode decision
  61.  ************************************************************************
  62.  */
  63. void clear_rdopt ()
  64. {
  65.   int i;
  66.   // rd-optimization structure
  67.   if (rdopt != NULL)
  68.   {
  69.     free (rdopt);
  70.     rdopt = NULL;
  71.     for (i=0; i<9; i++)
  72.     {
  73.       free (forward_me_done[i]);
  74.       free (tot_for_sad    [i]);
  75.     }
  76.   }
  77.   // structure for saving the coding state
  78.   clear_coding_state ();
  79. }
  80. /*!
  81.  ************************************************************************
  82.  * brief
  83.  *    create structure for RD-optimized mode decision
  84.  ************************************************************************
  85.  */
  86. void
  87. init_rdopt ()
  88. {
  89.   int i;
  90.   if (!input->rdopt)
  91.     return;
  92.   clear_rdopt ();
  93.   // rd-optimization structure
  94.   if ((rdopt = (RDOpt*) calloc (1, sizeof(RDOpt))) == NULL)
  95.   {
  96.     no_mem_exit ("init_rdopt: rdopt");
  97.   }
  98.   for (i=0; i<9; i++)
  99.   {
  100.     if ((forward_me_done[i] = (int*)malloc (img->buf_cycle*sizeof(int))) == NULL) no_mem_exit ("init_rdopt: forward_me_done");
  101.     if ((tot_for_sad    [i] = (int*)malloc (img->buf_cycle*sizeof(int))) == NULL) no_mem_exit ("init_rdopt: tot_for_sad");
  102.   }
  103.   // structure for saving the coding state
  104.   init_coding_state ();
  105. }
  106. /*!
  107.  ************************************************************************
  108.  * brief
  109.  *    set Rate-Distortion cost of 4x4 Intra modes
  110.  ************************************************************************
  111.  */
  112. void
  113. RDCost_Intra4x4_Block (int block_x,
  114.                        int block_y,
  115.                        int ipmode)
  116. {
  117.   int             dummy, left_ipmode, upper_ipmode, curr_ipmode, x, y;
  118.   int             i            = block_x >> 2;
  119.   int             j            = block_y >> 2;
  120.   int             pic_block_x  = (img->pix_x+block_x) / BLOCK_SIZE;
  121.   int             pic_block_y  = (img->pix_y+block_y) / BLOCK_SIZE;
  122.   int             even_block   = ((i & 1) == 1);
  123.   Slice          *currSlice    =  img->currentSlice;
  124.   Macroblock     *currMB       = &img->mb_data[img->current_mb_nr];
  125.   SyntaxElement  *currSE       = &img->MB_SyntaxElements[currMB->currSEnr];
  126.   int            *partMap      = assignSE2partition[input->partition_mode];
  127.   DataPartition  *dataPart;
  128.   //===== perform DCT, Q, IQ, IDCT =====
  129.   dct_luma (block_x, block_y, &dummy);
  130.   //===== get distortion (SSD) of 4x4 block =====
  131.   for   (y=0; y < BLOCK_SIZE; y++)
  132.     for (x=0; x < BLOCK_SIZE; x++)
  133.     {
  134.       dummy = imgY_org[img->pix_y+block_y+y][img->pix_x+block_x+x] - img->m7[x][y];
  135.       rdopt->distortion_4x4[j][i][ipmode] += img->quad[abs(dummy)];
  136.     }
  137.   rdopt->rdcost_4x4[j][i][ipmode] = (double)rdopt->distortion_4x4[j][i][ipmode];
  138.   if (rdopt->rdcost_4x4[j][i][ipmode] >= rdopt->min_rdcost_4x4[j][i])
  139.     return;
  140.   //===== store the coding state =====
  141.   store_coding_state ();
  142.   //===== get (estimate) rate for intra prediction mode =====
  143.   //--- set or estimate the values of syntax element ---
  144.   if (even_block)
  145.     // EVEN BLOCK: the values the of syntax element can be set correctly
  146.   {
  147.     // value of last block
  148.     upper_ipmode   =  img->ipredmode [pic_block_x  ][pic_block_y  ];
  149.     left_ipmode    =  img->ipredmode [pic_block_x-1][pic_block_y+1];
  150.     curr_ipmode    =  img->ipredmode [pic_block_x  ][pic_block_y+1];
  151.     currSE->value1 =  PRED_IPRED [upper_ipmode+1][left_ipmode+1][curr_ipmode];
  152.     // value of this block
  153.     upper_ipmode   =  img->ipredmode [pic_block_x+1][pic_block_y  ];
  154.     currSE->value2 =  PRED_IPRED [upper_ipmode+1][curr_ipmode+1][ipmode];
  155.   }
  156.   else
  157.   /* ODD BLOCK:  the second value of the syntax element cannot be set, since
  158.    *             it will be known only after the next step. For estimating
  159.    *             the rate the corresponding prediction mode is set to zero
  160.    *             (minimum rate). */
  161.   {
  162.     upper_ipmode   =  img->ipredmode [pic_block_x+1][pic_block_y  ];
  163.     left_ipmode    =  img->ipredmode [pic_block_x  ][pic_block_y+1];
  164.     currSE->value1 =  PRED_IPRED [upper_ipmode+1][left_ipmode+1][ipmode];
  165.     currSE->value2 =  0; // value with maximum probability
  166.   }
  167.   //--- set function pointers for syntax element ---
  168.   if (input->symbol_mode == UVLC)   currSE->mapping = intrapred_linfo;
  169.   else                currSE->writing = writeIntraPredMode2Buffer_CABAC;
  170.   currSE->type = SE_INTRAPREDMODE;
  171.   //--- choose the appropriate data partition ---
  172.   if (img->type != B_IMG)     dataPart = &(currSlice->partArr[partMap[SE_INTRAPREDMODE]]);
  173.   else                        dataPart = &(currSlice->partArr[partMap[SE_BFRAME]]);
  174.   //--- get length of syntax element ---
  175.   dataPart->writeSyntaxElement (currSE, dataPart);
  176.   rdopt->rate_imode_4x4[j][i][ipmode] = currSE->len;
  177.   rdopt->rdcost_4x4[j][i][ipmode] += rdopt->lambda_intra*(double)rdopt->rate_imode_4x4[j][i][ipmode];
  178.   if (rdopt->rdcost_4x4[j][i][ipmode] >= rdopt->min_rdcost_4x4[j][i])
  179.   {
  180.     restore_coding_state ();
  181.     return;
  182.   }
  183.   currSE++;
  184.   currMB->currSEnr++;
  185.   //===== get rate for luminance coefficients =====
  186.   rdopt->rate_luma_4x4[j][i][ipmode] = writeMB_bits_for_4x4_luma (i, j, 0);
  187.   rdopt->rdcost_4x4[j][i][ipmode] += rdopt->lambda_intra*(double)rdopt->rate_luma_4x4[j][i][ipmode];
  188.   //===== restore the saved coding state =====
  189.   restore_coding_state ();
  190.   //===== update best mode =====
  191.   if (rdopt->rdcost_4x4[j][i][ipmode] < rdopt->min_rdcost_4x4[j][i])
  192.   {
  193.     rdopt->best_mode_4x4 [j][i] = ipmode;
  194.     rdopt->min_rdcost_4x4[j][i] = rdopt->rdcost_4x4[j][i][ipmode];
  195.   }
  196. }
  197. /*!
  198.  ************************************************************************
  199.  * brief
  200.  *    Get best 4x4 Intra mode by rate-dist-based decision
  201.  ************************************************************************
  202.  */
  203. int
  204. RD_Intra4x4_Mode_Decision (int block_x,
  205.                            int block_y)
  206. {
  207.   int  ipmode, i, j;
  208.   int  index_y     = block_y >> 2;
  209.   int  index_x     = block_x >> 2;
  210.   int  pic_pix_y   = img->pix_y + block_y;
  211.   int  pic_pix_x   = img->pix_x + block_x;
  212.   int  pic_block_y = pic_pix_y / BLOCK_SIZE;
  213.   int  pic_block_x = pic_pix_x / BLOCK_SIZE;
  214.   typedef int (*WRITE_SE)(SyntaxElement*, struct datapartition*);
  215.   WRITE_SE     *writeSE=0;
  216.   int           symbol_mode;
  217.   /*=== set symbol mode to UVLC (CABAC does not work correctly -> wrong coding order) ===*
  218.    *=== and store the original symbol mode and function pointers                      ===*/
  219.   symbol_mode = input->symbol_mode;
  220.   if (input->symbol_mode != UVLC)
  221.   {
  222.     input->symbol_mode = UVLC;
  223.     if ((writeSE = (WRITE_SE*) calloc (img->currentSlice->max_part_nr, sizeof (WRITE_SE))) == NULL)
  224.     {
  225.       no_mem_exit ("RD_Intra4x4_Mode_Decision: writeSE");
  226.     }
  227.     for (i=0; i<img->currentSlice->max_part_nr; i++)
  228.     {
  229.       writeSE[i] = img->currentSlice->partArr[i].writeSyntaxElement;
  230.       img->currentSlice->partArr[i].writeSyntaxElement = writeSyntaxElement_UVLC;
  231.     }
  232.   }
  233.   //=== LOOP OVER ALL 4x4 INTRA PREDICTION MODES ===
  234.   rdopt->best_mode_4x4 [index_y][index_x] = -1;
  235.   rdopt->min_rdcost_4x4[index_y][index_x] =  1e30;
  236.   for (ipmode=0; ipmode < NO_INTRA_PMODE; ipmode++)
  237.   {
  238.     rdopt->rdcost_4x4    [index_y][index_x][ipmode] = -1;
  239.     rdopt->distortion_4x4[index_y][index_x][ipmode] =  0;
  240.     rdopt->rate_imode_4x4[index_y][index_x][ipmode] =  0;
  241.     rdopt->rate_luma_4x4 [index_y][index_x][ipmode] =  0;
  242.     // Horizontal pred from Y neighbour pix , vertical use X pix, diagonal needs both
  243.     if (ipmode==DC_PRED || ipmode==HOR_PRED || img->ipredmode[pic_block_x+1][pic_block_y] >= 0)
  244.       // DC or vert pred or hor edge
  245.     {
  246.       if (ipmode==DC_PRED || ipmode==VERT_PRED || img->ipredmode[pic_block_x][pic_block_y+1] >= 0)
  247.         // DC or hor pred or vert edge
  248.       {
  249.         // find diff
  250.         for   (j=0; j < BLOCK_SIZE; j++)
  251.           for (i=0; i < BLOCK_SIZE; i++)
  252.             img->m7[i][j] = imgY_org[pic_pix_y+j][pic_pix_x+i] - img->mprr[ipmode][j][i];
  253.           // copy intra prediction block
  254.           for   (j=0; j < BLOCK_SIZE; j++)
  255.             for (i=0; i < BLOCK_SIZE; i++)
  256.               img->mpr[i+block_x][j+block_y] = img->mprr[ipmode][j][i];
  257.           // get lagrangian cost
  258.           RDCost_Intra4x4_Block (block_x, block_y, ipmode);
  259.       }
  260.     }
  261.   }
  262.   //=== restore the original symbol mode and function pointers ===
  263.   if (symbol_mode != UVLC)
  264.   {
  265.     input->symbol_mode = symbol_mode;
  266.     for (i=0; i<img->currentSlice->max_part_nr; i++)
  267.     {
  268.       img->currentSlice->partArr[i].writeSyntaxElement = writeSE[i];
  269.     }
  270.     free (writeSE);
  271.   }
  272.   return rdopt->best_mode_4x4[index_y][index_x];
  273. }
  274. /*!
  275.  ************************************************************************
  276.  * brief
  277.  *    Rate-Distortion opt. mode decision for 4x4 intra blocks
  278.  ************************************************************************
  279.  */
  280. void
  281. Intra4x4_Mode_Decision ()
  282. {
  283.   int i,j;
  284.   int block_x, block_y;
  285.   int best_ipmode;
  286.   int coeff_cost; // not used
  287.   int pic_pix_y,pic_pix_x,pic_block_y,pic_block_x;
  288.   int last_ipred=0;           // keeps last chosen intra prediction mode for 4x4 intra pred
  289.   int nonzero;                          // keep track of nonzero coefficients
  290.   int cbp_mask;
  291.   Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  292.   // start making 4x4 intra prediction
  293.   currMB->cbp=0;
  294.   img->mb_data[img->current_mb_nr].intraOrInter = INTRA_MB_4x4;
  295.   for(block_y = 0 ; block_y < MB_BLOCK_SIZE ; block_y += BLOCK_MULTIPLE)
  296.   {
  297.     pic_pix_y=img->pix_y+block_y;
  298.     pic_block_y=pic_pix_y/BLOCK_SIZE;
  299.     for(block_x = 0 ; block_x < MB_BLOCK_SIZE  ; block_x += BLOCK_MULTIPLE)
  300.     {
  301.       cbp_mask=(1<<(2*(block_y/8)+block_x/8));
  302.       pic_pix_x=img->pix_x+block_x;
  303.       pic_block_x=pic_pix_x/BLOCK_SIZE;
  304.       /*
  305.       intrapred_luma() makes and returns 4x4 blocks with all 5 intra prediction modes.
  306.       Notice that some modes are not possible at frame edges.
  307.       */
  308.       intrapred_luma (pic_pix_x,pic_pix_y);
  309.       //=== rate-constrained mode decision ===
  310.       best_ipmode = RD_Intra4x4_Mode_Decision (block_x, block_y);
  311.       img->ipredmode[pic_block_x+1][pic_block_y+1]=best_ipmode;
  312.       if ((pic_block_x & 1) == 1) // just even blocks, two and two predmodes are sent together
  313.       {
  314.         currMB->intra_pred_modes[block_x/4+block_y]=PRED_IPRED[img->ipredmode[pic_block_x+1][pic_block_y]+1][img->ipredmode[pic_block_x][pic_block_y+1]+1][best_ipmode];
  315.         currMB->intra_pred_modes[block_x/4-1+block_y]=last_ipred;
  316.       }
  317.       last_ipred=PRED_IPRED[img->ipredmode[pic_block_x+1][pic_block_y]+1][img->ipredmode[pic_block_x][pic_block_y+1]+1][best_ipmode];
  318.       //  Make difference from prediction to be transformed
  319.       for (j=0; j < BLOCK_SIZE; j++)
  320.         for (i=0; i < BLOCK_SIZE; i++)
  321.         {
  322.           img->mpr[i+block_x][j+block_y]=img->mprr[best_ipmode][j][i];
  323.           img->m7[i][j] =imgY_org[pic_pix_y+j][pic_pix_x+i] - img->mprr[best_ipmode][j][i];
  324.         }
  325.         nonzero = dct_luma(block_x,block_y,&coeff_cost);
  326.         if (nonzero)
  327.         {
  328.           currMB->cbp |= cbp_mask;// set coded block pattern if there are nonzero coeffs
  329.         }
  330.     }
  331.   }
  332. }
  333. /*!
  334.  ************************************************************************
  335.  * brief
  336.  *    Rate-Distortion cost of a macroblock
  337.  ************************************************************************
  338.  * note
  339.  * the following parameters have to be set before using this function:  n
  340.  * -------------------------------------------------------------------  n
  341.  *   for INTRA4x4  : img->imod,
  342.  *                   img->cof,
  343.  *                   currMB->cbp,
  344.  *                   currMB->intra_pred_modes,
  345.  *                   currMB->intraOrInter
  346.  *                                                                      n
  347.  *   for INTRA16x16: img->imod,
  348.  *                   img->mprr_2
  349.  *                   currMB->intraOrInter
  350.  *                                                                      n
  351.  *   for INTER     : img->imod,
  352.  *                   img->mv,   (predictors)
  353.  *                   tmp_mv,    (motion vectors)
  354.  *                   currMB->intraOrInter
  355.  *                                                                      n
  356.  *   for FORWARD   : img->imod,
  357.  *                   img->p_fwMV,
  358.  *                   tmp_fwMV,
  359.  *                   currMB->intraOrInter
  360.  *                                                                      n
  361.  *   for BACKWARD  : img->imod,
  362.  *                   img->p_bwMV,
  363.  *                   tmp_bwMV,
  364.  *                   currMB->intraOrInter
  365.  *                                                                      n
  366.  *   for BIDIRECT  : img->imod,
  367.  *                   img->p_fwMV,
  368.  *                   img->p_bwMV,
  369.  *                   tmp_fwMV,
  370.  *                   tmp_bwMV,
  371.  *                   currMB->intraOrInter
  372.  *                                                                      n
  373.  *   for DIRECT    : img->imod,
  374.  *                   dfMV,
  375.  *                   dbMV,
  376.  *                   currMB->intraOrInter
  377.  *                                                                      n
  378.  *   for COPY      : currMB->intraOrInter
  379.  *
  380.  ************************************************************************
  381.  */
  382. int
  383. RDCost_Macroblock (RateDistortion  *rd,
  384.                    int              mode,
  385.                    int              ref_or_i16mode,
  386.                    int              blocktype,
  387.                    int              blocktype_back)
  388. {
  389.   Slice          *currSlice =  img->currentSlice;
  390.   Macroblock     *currMB    = &img->mb_data[img->current_mb_nr];
  391.   SyntaxElement  *currSE    = &img->MB_SyntaxElements[currMB->currSEnr];
  392.   int            *partMap   = assignSE2partition[input->partition_mode];
  393.   DataPartition  *dataPart;
  394.   int  i, j, refidx=0, cr_cbp, mb_mode;
  395.   int  bframe       =  (img->type == B_IMG);
  396.   int  copy         =  (mode == MBMODE_COPY);
  397.   int  intra4       =  (mode == MBMODE_INTRA4x4);
  398.   int  intra16      =  (mode == MBMODE_INTRA16x16);
  399.   int  inter        =  (mode >= MBMODE_INTER16x16    && mode <= MBMODE_INTER4x4    && !bframe);
  400.   int  inter_for    =  (mode >= MBMODE_INTER16x16    && mode <= MBMODE_INTER4x4    &&  bframe);
  401.   int  inter_back   =  (mode >= MBMODE_BACKWARD16x16 && mode <= MBMODE_BACKWARD4x4);
  402.   int  inter_bidir  =  (mode == MBMODE_BIDIRECTIONAL);
  403.   int  inter_direct =  (mode == MBMODE_DIRECT);
  404.   int  inter_bframe =  (inter_for || inter_back || inter_bidir || inter_direct);
  405.   //=== init rd-values ===
  406.   rd->rdcost        = 0.0;
  407.   rd->distortion    = 0;
  408.   rd->distortion_UV = 0;
  409.   rd->rate_mode     = 0;
  410.   rd->rate_motion   = 0;
  411.   rd->rate_cbp      = 0;
  412.   rd->rate_luma     = 0;
  413.   rd->rate_chroma   = 0;
  414.   /*======================================================*
  415.    *=====                                            =====*
  416.    *=====   DCT, QUANT, DEQUANT, IDCT OF LUMINANCE   =====*
  417.    *=====                                            =====*
  418.    *======================================================*/
  419.   /*
  420.    * note: - for intra4x4, dct have to be done already
  421.    *       - for copy_mb,  no dct coefficients are needed
  422.    */
  423.   if (intra16)
  424.   {
  425.     //===== INTRA 16x16 MACROBLOCK =====
  426.     dct_luma2 (ref_or_i16mode);
  427.     currMB->cbp = 0;
  428.   }
  429.   else if (inter)
  430.   {
  431.     //===== INTER MACROBLOCK =====
  432.     img->multframe_no = (img->number-ref_or_i16mode-1) % img->buf_cycle;
  433.     LumaResidualCoding_P ();
  434.   }
  435.   else if (inter_bframe)
  436.   {
  437.     //===== INTER MACROBLOCK in B-FRAME =====
  438.     img->fw_multframe_no = (img->number-ref_or_i16mode-1) % img->buf_cycle;
  439.     LumaResidualCoding_B ();
  440.   }
  441.   /*==============================================================*
  442.    *=====   PREDICTION, DCT, QUANT, DEQUANT OF CHROMINANCE   =====*
  443.    *==============================================================*/
  444.   if (!copy)
  445.   {
  446.     if (bframe)  ChromaCoding_B (&cr_cbp);
  447.     else         ChromaCoding_P (&cr_cbp);
  448.   }
  449.   /*=========================================================*
  450.    *=====                                               =====*
  451.    *=====   GET DISTORTION OF LUMINANCE AND INIT COST   =====*
  452.    *=====                                               =====*
  453.    *=========================================================*/
  454.   if (input->rdopt==2)
  455.   {
  456.     int k;
  457.     for (k=0; k < input->NoOfDecoders ;k++)
  458.     {
  459.       decode_one_macroblock(k, mode, ref_or_i16mode);
  460.       for (j=img->pix_y; j<img->pix_y+MB_BLOCK_SIZE; j++)
  461.         for (i=img->pix_x; i<img->pix_x+MB_BLOCK_SIZE; i++)
  462.         {
  463.           rd->distortion += img->quad[abs (imgY_org[j][i] - decY[k][j][i])];
  464.         }
  465.     }
  466.     rd->distortion /= input->NoOfDecoders;
  467.     refidx = (img->number-1) % img->buf_cycle; /* reference frame index */
  468.   }
  469.   else
  470.   {
  471.     if (copy)
  472.     {
  473.       refidx = (img->number-1) % img->buf_cycle; // reference frame index
  474.       for   (j=img->pix_y; j<img->pix_y+MB_BLOCK_SIZE; j++)
  475.         for (i=img->pix_x; i<img->pix_x+MB_BLOCK_SIZE; i++)
  476.           rd->distortion += img->quad [abs (imgY_org[j][i] - FastPelY_14(mref[refidx], j<<2, i<<2))];
  477.     }
  478.     else
  479.     {
  480.       for   (j=img->pix_y; j<img->pix_y+MB_BLOCK_SIZE; j++)
  481.         for (i=img->pix_x; i<img->pix_x+MB_BLOCK_SIZE; i++)
  482.           rd->distortion += img->quad [abs (imgY_org[j][i] - imgY[j][i])];
  483.     }
  484.   }
  485.   //=== init and check rate-distortion cost ===
  486.   rd->rdcost = (double)rd->distortion;
  487.   if (rd->rdcost >= rdopt->min_rdcost)
  488.     return 0;
  489.   /*=============================================================*
  490.    *=====                                                   =====*
  491.    *=====   GET DISTORTION OF CHROMINANCE AND UPDATE COST   =====*
  492.    *=====                                                   =====*
  493.    *=============================================================*/
  494.   if (copy)
  495.   {
  496.     for   (j=img->pix_c_y; j<img->pix_c_y+MB_BLOCK_SIZE/2; j++)
  497.       for (i=img->pix_c_x; i<img->pix_c_x+MB_BLOCK_SIZE/2; i++)
  498.       {
  499.         rd->distortion_UV += img->quad[abs (imgUV_org[0][j][i] - mcef[refidx][0][j][i])];
  500.         rd->distortion_UV += img->quad[abs (imgUV_org[1][j][i] - mcef[refidx][1][j][i])];
  501.       }
  502.   }
  503.   else
  504.   {
  505.     for   (j=img->pix_c_y; j<img->pix_c_y+MB_BLOCK_SIZE/2; j++)
  506.       for (i=img->pix_c_x; i<img->pix_c_x+MB_BLOCK_SIZE/2; i++)
  507.       {
  508.         rd->distortion_UV += img->quad[abs (imgUV_org[0][j][i] - imgUV[0][j][i])];
  509.         rd->distortion_UV += img->quad[abs (imgUV_org[1][j][i] - imgUV[1][j][i])];
  510.       }
  511.   }
  512.   //=== init and check rate-distortion cost ===
  513.   rd->rdcost += (double)rd->distortion_UV;
  514.   if (rd->rdcost >= rdopt->min_rdcost)
  515.     return 0;
  516.   /*================================================*
  517.    *=====                                      =====*
  518.    *=====   GET CODING RATES AND UPDATE COST   =====*
  519.    *=====                                      =====*
  520.    *================================================*/
  521.   //=== store encoding environment ===
  522.   store_coding_state ();
  523.   /*===================================================*
  524.    *=====   GET RATE OF MB-MODE AND UPDATE COST   =====*
  525.    *===================================================*/
  526.   //--- set mode constants ---
  527.   if      (copy || inter_direct)  mb_mode = 0;
  528.   else if (inter)     mb_mode = blocktype;
  529.   else if (intra4)      mb_mode = (img->type<<3);
  530.   else if (intra16)     mb_mode = (img->type<<3) + (cr_cbp<<2) + 12*img->kac + 1 + ref_or_i16mode;
  531.   else if (inter_bidir)     mb_mode = 3;
  532.   else if (inter_for)     mb_mode = (blocktype     ==1 ? blocktype        : (blocktype     <<1));
  533.   else /*  inter_back */    mb_mode = (blocktype_back==1 ? blocktype_back+1 : (blocktype_back<<1)+1);
  534.   currSE->value1 = mb_mode;
  535.   //--- set symbol type and function pointers ---
  536.   if (input->symbol_mode == UVLC)     currSE->mapping = n_linfo2;
  537.   else          currSE->writing = writeMB_typeInfo2Buffer_CABAC;
  538.   currSE->type = SE_MBTYPE;
  539.   //--- choose data partition ---
  540.   if (bframe)   dataPart = &(currSlice->partArr[partMap[SE_MBTYPE]]);
  541.   else          dataPart = &(currSlice->partArr[partMap[SE_BFRAME]]);
  542.   //--- encode and set rate ---
  543.   dataPart->writeSyntaxElement (currSE, dataPart);
  544.   rd->rate_mode = currSE->len;
  545.   currSE++;
  546.   currMB->currSEnr++;
  547.   //=== encode intra prediction modes ===
  548.   if (intra4)
  549.     for (i=0; i < (MB_BLOCK_SIZE>>1); i++)
  550.     {
  551.       currSE->value1 = currMB->intra_pred_modes[ i<<1   ];
  552.       currSE->value2 = currMB->intra_pred_modes[(i<<1)+1];
  553.       //--- set symbol type and function pointers ---
  554.       if (input->symbol_mode == UVLC)   currSE->mapping = intrapred_linfo;
  555.       else                currSE->writing = writeIntraPredMode2Buffer_CABAC;
  556.       currSE->type = SE_INTRAPREDMODE;
  557.       //--- choose data partition ---
  558.       if (bframe)   dataPart = &(currSlice->partArr[partMap[SE_INTRAPREDMODE]]);
  559.       else          dataPart = &(currSlice->partArr[partMap[SE_BFRAME]]);
  560.       //--- encode and update rate ---
  561.       dataPart->writeSyntaxElement (currSE, dataPart);
  562.       rd->rate_mode += currSE->len;
  563.       currSE++;
  564.       currMB->currSEnr++;
  565.     }
  566.     //=== update and check rate-distortion cost ===
  567.     rd->rdcost += rdopt->lambda_mode * (double)rd->rate_mode;
  568.     if (rd->rdcost >= rdopt->min_rdcost)
  569.     {
  570.       restore_coding_state ();
  571.       return 0;
  572.     }
  573.   /*=======================================================*
  574.    *=====   GET RATE OF MOTION INFO AND UPDATE COST   =====*
  575.    *=======================================================*/
  576.   if (inter)
  577.   {
  578.     //=== set some parameters ===
  579.     currMB->ref_frame = ref_or_i16mode;
  580.     currMB->mb_type   = mb_mode;
  581.     img->mb_mode      = mb_mode;
  582.     img->blc_size_h   = input->blc_size[blocktype][0];
  583.     img->blc_size_v   = input->blc_size[blocktype][1];
  584.     //=== get rate ===
  585.     rd->rate_motion = writeMotionInfo2NAL_Pframe ();
  586.     //=== update and check rate-distortion cost ===
  587.     rd->rdcost += rdopt->lambda_mode * (double)rd->rate_motion;
  588.     if (rd->rdcost >= rdopt->min_rdcost)
  589.     {
  590.       restore_coding_state ();
  591.       return 0;
  592.     }
  593.   }
  594.   else if (inter_bframe && !inter_direct)
  595.   {
  596.     //=== set some parameters ===
  597.     currMB->ref_frame  = ref_or_i16mode;
  598.     currMB->mb_type    = mb_mode;
  599.     img->mb_mode       = mb_mode;
  600.     img->fw_blc_size_h = input->blc_size[blocktype     ][0];
  601.     img->fw_blc_size_v = input->blc_size[blocktype     ][1];
  602.     img->bw_blc_size_h = input->blc_size[blocktype_back][0];
  603.     img->bw_blc_size_v = input->blc_size[blocktype_back][1];
  604.     //=== get rate ===
  605.     rd->rate_motion = writeMotionInfo2NAL_Bframe ();
  606.     //=== update and check rate-distortion cost ===
  607.     rd->rdcost += rdopt->lambda_mode * (double)rd->rate_motion;
  608.     if (rd->rdcost >= rdopt->min_rdcost)
  609.     {
  610.       restore_coding_state ();
  611.       return 0;
  612.     }
  613.   }
  614.   //===== GET RATE FOR CBP, LUMA and CHROMA =====
  615.   if (intra16)
  616.   {
  617.   /*========================================================*
  618.    *=====   GET RATE OF LUMA (16x16) AND UPDATE COST   =====*
  619.    *========================================================*/
  620.     rd->rate_luma = writeMB_bits_for_16x16_luma ();
  621.     //=== update and check rate-distortion cost ===
  622.     rd->rdcost += rdopt->lambda_mode * (double)rd->rate_luma;
  623.     if (rd->rdcost >= rdopt->min_rdcost)
  624.     {
  625.       restore_coding_state ();
  626.       return 0;
  627.     }
  628.   }
  629.   else if (!copy)
  630.   {
  631.   /*===============================================*
  632.    *=====   GET RATE OF CBP AND UPDATE COST   =====*
  633.    *===============================================*/
  634.     rd->rate_cbp = writeMB_bits_for_CBP ();
  635.     //=== update and check rate-distortion cost ===
  636.     rd->rdcost += rdopt->lambda_mode * (double)rd->rate_cbp;
  637.     if (rd->rdcost >= rdopt->min_rdcost)
  638.     {
  639.       restore_coding_state ();
  640.       return 0;
  641.     }
  642.     /*=========================================================*
  643.      *=====   GET RATE OF LUMA (16x(4x4)) AND UPDATE COST   =====*
  644.      *=========================================================*/
  645.     rd->rate_luma = writeMB_bits_for_luma (0);
  646.     //=== update and check rate-distortion cost ===
  647.     rd->rdcost += rdopt->lambda_mode * (double)rd->rate_luma;
  648.     if (rd->rdcost >= rdopt->min_rdcost)
  649.     {
  650.       restore_coding_state ();
  651.       return 0;
  652.     }
  653.   }
  654.   if (!copy)
  655.   {
  656.   /*==================================================*
  657.    *=====   GET RATE OF CHROMA AND UPDATE COST   =====*
  658.    *==================================================*/
  659.     rd->rate_chroma  = writeMB_bits_for_DC_chroma (0);
  660.     rd->rate_chroma += writeMB_bits_for_AC_chroma (0);
  661.     //=== update and check rate-distortion cost ===
  662.     rd->rdcost += rdopt->lambda_mode * (double)rd->rate_chroma;
  663.     if (rd->rdcost >= rdopt->min_rdcost)
  664.     {
  665.       restore_coding_state ();
  666.       return 0;
  667.     }
  668.   }
  669.   //=== restore encoding environment ===
  670.   restore_coding_state ();
  671.   /*=================================================*
  672.    *=====                                       =====*
  673.    *=====   STORE PARAMETERS OF NEW BEST MODE   =====*
  674.    *=====                                       =====*
  675.    *=================================================*/
  676.   rdopt->min_rdcost     = rd->rdcost;
  677.   rdopt->best_mode      = mode;
  678.   rdopt->ref_or_i16mode = ref_or_i16mode;
  679.   rdopt->blocktype      = blocktype;
  680.   rdopt->blocktype_back = blocktype_back;
  681.   //=== LUMINANCE OF RECONSTRUCTED MACROBLOCK ===
  682.   if (copy)
  683.     for   (j=0; j<MB_BLOCK_SIZE; j++)
  684.       for (i=0; i<MB_BLOCK_SIZE; i++)
  685.         rdopt->rec_mb_Y[j][i] = FastPelY_14(mref[refidx], (img->pix_y+j)<<2, (img->pix_x+i)<<2);
  686.   else
  687.     for   (j=0; j<MB_BLOCK_SIZE; j++)
  688.       for (i=0; i<MB_BLOCK_SIZE; i++)
  689.         rdopt->rec_mb_Y[j][i] = imgY[img->pix_y+j][img->pix_x+i];
  690.   //=== CHROMINANCE OF RECONSTRUCTED MACROBLOCK ===
  691.   if (copy)
  692.     for   (j=0; j<(BLOCK_SIZE<<1); j++)
  693.       for (i=0; i<(BLOCK_SIZE<<1); i++)
  694.       {
  695.         rdopt->rec_mb_U[j][i] = mcef[refidx][0][img->pix_c_y+j][img->pix_c_x+i];
  696.         rdopt->rec_mb_V[j][i] = mcef[refidx][1][img->pix_c_y+j][img->pix_c_x+i];
  697.       }
  698.   else
  699.     for   (j=0; j<(BLOCK_SIZE<<1); j++)
  700.       for (i=0; i<(BLOCK_SIZE<<1); i++)
  701.       {
  702.         rdopt->rec_mb_U[j][i] = imgUV[0][img->pix_c_y+j][img->pix_c_x+i];
  703.         rdopt->rec_mb_V[j][i] = imgUV[1][img->pix_c_y+j][img->pix_c_x+i];
  704.       }
  705.   //=== CBP, KAC, DCT-COEFFICIENTS ===
  706.   if (!copy)
  707.   {
  708.     rdopt->cbp         = currMB->cbp;
  709.     rdopt->cbp_blk     = currMB->cbp_blk;
  710.     rdopt->kac         = img->kac;
  711.     memcpy (rdopt->cof,  img->cof,  1728*sizeof(int));
  712.     memcpy (rdopt->cofu, img->cofu,   20*sizeof(int));
  713.   }
  714.   else
  715.       rdopt->cbp_blk     = 0 ;
  716.   //=== INTRA PREDICTION MODES ===
  717.   if (intra4)
  718.   {
  719.     memcpy (rdopt->ipredmode, currMB->intra_pred_modes, 16*sizeof(int));
  720.   }
  721.   //=== MOTION VECTORS ===
  722.   if (inter)
  723.     for   (j=0; j<BLOCK_SIZE; j++)
  724.       for (i=0; i<BLOCK_SIZE; i++)
  725.       {
  726.         rdopt->   mv[j][i][0] = tmp_mv  [0][img->block_y+j][img->block_x+4+i];
  727.         rdopt->   mv[j][i][1] = tmp_mv  [1][img->block_y+j][img->block_x+4+i];
  728.       }
  729.   else if (inter_for)
  730.     for   (j=0; j<BLOCK_SIZE; j++)
  731.       for (i=0; i<BLOCK_SIZE; i++)
  732.       {
  733.         rdopt->   mv[j][i][0] = tmp_fwMV[0][img->block_y+j][img->block_x+4+i];
  734.         rdopt->   mv[j][i][1] = tmp_fwMV[1][img->block_y+j][img->block_x+4+i];
  735.       }
  736.   else if (inter_back)
  737.     for   (j=0; j<BLOCK_SIZE; j++)
  738.       for (i=0; i<BLOCK_SIZE; i++)
  739.       {
  740.         rdopt->bw_mv[j][i][0] = tmp_bwMV[0][img->block_y+j][img->block_x+4+i];
  741.         rdopt->bw_mv[j][i][1] = tmp_bwMV[1][img->block_y+j][img->block_x+4+i];
  742.       }
  743.   else if (inter_bidir)
  744.     for   (j=0; j<BLOCK_SIZE; j++)
  745.       for (i=0; i<BLOCK_SIZE; i++)
  746.       {
  747.         rdopt->   mv[j][i][0] = tmp_fwMV[0][img->block_y+j][img->block_x+4+i];
  748.         rdopt->   mv[j][i][1] = tmp_fwMV[1][img->block_y+j][img->block_x+4+i];
  749.         rdopt->bw_mv[j][i][0] = tmp_bwMV[0][img->block_y+j][img->block_x+4+i];
  750.         rdopt->bw_mv[j][i][1] = tmp_bwMV[1][img->block_y+j][img->block_x+4+i];
  751.       }
  752.   if (input->rdopt==2)
  753.   {
  754.     int k;
  755.     for (k=0; k<input->NoOfDecoders; k++)
  756.     {
  757.       for (j=img->pix_y; j<img->pix_y+MB_BLOCK_SIZE; j++)
  758.         for (i=img->pix_x; i<img->pix_x+MB_BLOCK_SIZE; i++)
  759.         {
  760.           /* Keep the decoded values of each MB for updating the ref frames*/
  761.           decY_best[k][j][i] = decY[k][j][i];
  762.         }
  763.     }
  764.   }
  765.   return 1; // new best mode
  766. }
  767. #define PFRAME    0
  768. #define B_FORWARD 1
  769. #define B_BACKWARD  2
  770. /*!
  771.  ************************************************************************
  772.  * brief
  773.  *    Rate-Distortion optimized mode decision
  774.  ************************************************************************
  775.  */
  776. void
  777. RD_Mode_Decision ()
  778. {
  779.   int             i, j, k, k0 = 0, dummy;
  780.   int             mode, intra16mode, refframe, blocktype, blocktype_back;
  781.   int             valid_mode [NO_MAX_MBMODES], valid_intra16mode[4];
  782.   int             bframe, intra_macroblock, any_inter_mode = 0;
  783.   int             tot_inter_sad, min_inter_sad;
  784.   int             backward_me_done[9];
  785.   double          forward_rdcost[9], backward_rdcost[9];
  786.   double          min_rdcost;
  787.   int             max_ref_frame, best_refframe[9];
  788.   RateDistortion  rd;
  789.   int             k1 = 1;
  790.   int             mb_nr           = img->current_mb_nr;
  791.   Macroblock     *currMB          = &img->mb_data[mb_nr];
  792.   /*==============================================*
  793.    *===  INIT PARAMETERS OF RD-OPT. STRUCTURE  ===*
  794.    *==============================================*/
  795.   //--- set lagrange parameters ---
  796.   double qp = (double)img->qp;
  797.   rdopt->lambda_mode = 5.0 * exp (0.1 * qp) * (qp + 5.0) / (34.0 - qp);
  798.   
  799.   if (img->type == B_IMG || img->types == SP_IMG)
  800.     rdopt->lambda_mode *= 4;
  801.   rdopt->lambda_motion = sqrt (rdopt->lambda_mode);
  802.   rdopt->lambda_intra  = rdopt->lambda_mode;
  803.   if (input->rdopt == 2)
  804.   {
  805.     rdopt->lambda_mode=(1.0-input->LossRate/100.0)*rdopt->lambda_mode;
  806.     rdopt->lambda_motion = sqrt (1.0-input->LossRate/100.0) * rdopt->lambda_motion;
  807.   }
  808.   //--- cost values ---
  809.   rdopt->best_mode   = -1;
  810.   rdopt->min_rdcost  =  1e30;
  811.   for (i = 0; i < 9; i++)
  812.   {
  813.     forward_rdcost  [i] = backward_rdcost [i] = -1.0;
  814.     backward_me_done[i] =  0;
  815.     for (j = 0; j < img->buf_cycle; j++)
  816.     {
  817.       forward_me_done[i][j] = 0;
  818.     }
  819.   }
  820.   /*========================*
  821.    *===  SET SOME FLAGS  ===*
  822.    *========================*/
  823.   bframe           = (img->type==B_IMG);
  824.   intra_macroblock = (img->mb_y==img->mb_y_upd && img->mb_y_upd!=img->mb_y_intra) || img->type==INTRA_IMG;
  825.   max_ref_frame    = min (img->number, img->buf_cycle);
  826.   /*========================================*
  827.    *===  MARK POSSIBLE MACROBLOCK MODES  ===*
  828.    *========================================*/
  829.   //--- reset arrays ---
  830.   memset (valid_mode,        0, sizeof(int)*NO_MAX_MBMODES);
  831.   memset (valid_intra16mode, 0, sizeof(int)*4);
  832.   //--- set intra modes ---
  833.   valid_mode [MBMODE_INTRA4x4  ] = 1;
  834.   valid_mode [MBMODE_INTRA16x16] = 1;
  835.   //--- set inter modes ---
  836.   if (!intra_macroblock || bframe)
  837.   {
  838.     for (i=MBMODE_INTER16x16; i <= MBMODE_INTER4x4; i++)
  839.       if (input->blc_size [i][0] > 0)
  840.         any_inter_mode = valid_mode [i] = 1;
  841.       if (bframe)
  842.       {
  843.         memcpy (valid_mode+MBMODE_BACKWARD16x16,
  844.                 valid_mode+MBMODE_INTER16x16,   NO_INTER_MBMODES*sizeof(int));
  845.         valid_mode[MBMODE_BIDIRECTIONAL] = valid_mode[MBMODE_DIRECT] = any_inter_mode;
  846.       }
  847.       else
  848.       {
  849.         valid_mode[MBMODE_COPY] = valid_mode[MBMODE_INTER16x16];
  850.       }
  851.   }
  852.   if (img->type==INTER_IMG && img->types== SP_IMG)
  853.     valid_mode[MBMODE_COPY] =0;
  854.   //===== LOOP OVER ALL MACROBLOCK MODES =====
  855.   for (mode = 0; mode < NO_MAX_MBMODES; mode++)
  856.     if (valid_mode[mode])
  857.     {
  858.     /*==================================================================*
  859.      *===  MOTION ESTIMATION, INTRA PREDICTION and COST CALCULATION  ===*
  860.      *==================================================================*/
  861.        if (mode == MBMODE_INTRA4x4)
  862.        {
  863.        /*======================*
  864.         *=== INTRA 4x4 MODE ===*
  865.         *======================*/
  866.          currMB->intraOrInter = INTRA_MB_4x4;
  867.          img->imod            = INTRA_MB_OLD;
  868.          Intra4x4_Mode_Decision ();   // intra 4x4 prediction, dct, etc.
  869.          RDCost_Macroblock (&rd, mode, 0, 0, 0);
  870.        }
  871.        else if (mode == MBMODE_INTRA16x16)
  872.        {
  873.        /*========================*
  874.         *=== INTRA 16x16 MODE ===*
  875.         *========================*/
  876.          currMB->intraOrInter = INTRA_MB_16x16;
  877.          img->imod            = INTRA_MB_NEW;
  878.          intrapred_luma_2 ();   // make intra pred for all 4 new modes
  879.          find_sad2 (&k);        // get best new intra mode
  880.          RDCost_Macroblock (&rd, mode, k, 0, 0);
  881.        }
  882.        else if (mode == MBMODE_COPY)
  883.        {
  884.        /*=======================*
  885.         *=== COPY MACROBLOCK ===*
  886.         *=======================*/
  887.          currMB->intraOrInter = INTER_MB;
  888.          img->imod            = INTRA_MB_INTER;
  889.          RDCost_Macroblock (&rd, mode, 0, 0, 0);
  890.        }
  891.        else if (!bframe && (mode >= MBMODE_INTER16x16 && mode <= MBMODE_INTER4x4))
  892.        {
  893.        /*===================================*
  894.         *=== INTER MACROBLOCK in P-FRAME ===*
  895.         *===================================*/
  896.          currMB->intraOrInter = INTER_MB;
  897.          img->imod            = INTRA_MB_INTER;
  898.          min_inter_sad = MAX_VALUE;
  899.          for (k=0; k<max_ref_frame; k++)
  900. #ifdef _ADDITIONAL_REFERENCE_FRAME_
  901.            if (k <  input->no_multpred ||
  902.                k == input->add_ref_frame)
  903. #endif
  904.            {
  905.              tot_inter_sad  = (int)floor(rdopt->lambda_motion * (1+2*floor(log(k+1)/log(2)+1e-10)));
  906.              tot_inter_sad += SingleUnifiedMotionSearch (k, mode,
  907.                             refFrArr, tmp_mv, img->mv, PFRAME, img->all_mv,
  908.                             rdopt->lambda_motion);
  909.              if (tot_inter_sad <  min_inter_sad)
  910.              {
  911.                k0 = k;
  912.                min_inter_sad = tot_inter_sad;
  913.              }
  914.            }
  915.          for (  i=0; i < 4; i++)
  916.            for (j=0; j < 4; j++)
  917.            {
  918.              tmp_mv[0][img->block_y+j][img->block_x+i+4]=img->all_mv[i][j][k0][mode][0];
  919.              tmp_mv[1][img->block_y+j][img->block_x+i+4]=img->all_mv[i][j][k0][mode][1];
  920.            }
  921.          RDCost_Macroblock (&rd, mode, k0, mode, 0);
  922.        }
  923.        else if (bframe && (mode >= MBMODE_INTER16x16 && mode <= MBMODE_INTER4x4))
  924.        {
  925.         /*===============================================*
  926.          *=== FORWARD PREDICTED MACROBLOCK in B-FRAME ===*
  927.          *===============================================*/
  928.          if (forward_rdcost[mode] < 0.0)
  929.          {
  930.            currMB->intraOrInter = INTER_MB;
  931.            img->imod            = B_Forward;
  932.            min_inter_sad = MAX_VALUE;
  933.            for (k=0; k<max_ref_frame; k++)
  934. #ifdef _ADDITIONAL_REFERENCE_FRAME_
  935.              if (k <  input->no_multpred ||
  936.                  k == input->add_ref_frame)
  937. #endif
  938.              {
  939.                if (!forward_me_done[mode][k])
  940.                {
  941.                  tot_for_sad[mode][k]  = (int)floor(rdopt->lambda_motion * (1+2*floor(log(k+1)/log(2)+1e-10)));
  942.                  tot_for_sad[mode][k] += SingleUnifiedMotionSearch (k, mode,
  943.                                          fw_refFrArr, tmp_fwMV, img->p_fwMV,
  944.                                          B_FORWARD, img->all_mv,
  945.                                          rdopt->lambda_motion);
  946.                                          forward_me_done[mode][k] = 1;
  947.                }
  948.                if (tot_for_sad[mode][k] < min_inter_sad)
  949.                {
  950.                  k0 = k;
  951.                  min_inter_sad = tot_for_sad[mode][k];
  952.                }
  953.              }
  954.            for (  i=0; i < 4; i++)
  955.              for (j=0; j < 4; j++)
  956.              {
  957.                tmp_fwMV[0][img->block_y+j][img->block_x+i+4]=img->all_mv[i][j][k0][mode][0];
  958.                tmp_fwMV[1][img->block_y+j][img->block_x+i+4]=img->all_mv[i][j][k0][mode][1];
  959.              }
  960.            RDCost_Macroblock (&rd, mode, k0, mode, 0);
  961.            forward_rdcost[mode] = rd.rdcost;
  962.            best_refframe [mode] = k0;
  963.          }
  964.        }
  965.        else if (mode >= MBMODE_BACKWARD16x16 && mode <= MBMODE_BACKWARD4x4)
  966.        {
  967.         /*================================================*
  968.          *=== BACKWARD PREDICTED MACROBLOCK in B-FRAME ===*
  969.          *================================================*/
  970.          if (backward_rdcost [mode-NO_INTER_MBMODES] < 0.0)
  971.          {
  972.            currMB->intraOrInter = INTER_MB;
  973.            img->imod            = B_Backward;
  974.            if (!backward_me_done[mode-NO_INTER_MBMODES])
  975.            {
  976.              SingleUnifiedMotionSearch (0, mode-NO_INTER_MBMODES,
  977.                bw_refFrArr, tmp_bwMV, img->p_bwMV, B_BACKWARD, img->all_bmv,
  978.                rdopt->lambda_motion);
  979.              backward_me_done[mode-NO_INTER_MBMODES]=1;
  980.            }
  981.            else
  982.              for (j = 0; j < 4; j++)
  983.                for (i = 0; i < 4; i++)
  984.                {
  985.                  tmp_bwMV[0][img->block_y+j][img->block_x+i+4]=
  986.                    img->all_bmv[i][j][0][mode-NO_INTER_MBMODES][0];
  987.                  tmp_bwMV[1][img->block_y+j][img->block_x+i+4]=
  988.                    img->all_bmv[i][j][0][mode-NO_INTER_MBMODES][1];
  989.                }
  990.            RDCost_Macroblock (&rd, mode, 0, 0, mode-NO_INTER_MBMODES);
  991.            backward_rdcost[mode-NO_INTER_MBMODES] = rd.rdcost;
  992.          }
  993.        }
  994.        else if (mode == MBMODE_DIRECT)
  995.        {
  996.        /*==============================================*
  997.         *=== DIRECT PREDICTED MACROBLOCK in B-FRAME ===*
  998.         *==============================================*/
  999.          currMB->intraOrInter = INTER_MB;
  1000.          img->imod            = B_Direct;
  1001.          get_dir (&dummy);
  1002.          if (dummy != 100000000 /*MAX_DIR_SAD*/)
  1003.          {
  1004.            RDCost_Macroblock (&rd, mode, 0, 0, 0);
  1005.          }
  1006.        }
  1007.        else
  1008.        {
  1009.         /*=====================================================*
  1010.          *=== BIDIRECTIONAL PREDICTED MACROBLOCK in B-FRAME ===*
  1011.          *=====================================================*/
  1012.         //--- get best backward prediction ---
  1013.          min_rdcost = 1e30;
  1014.          for (blocktype = 1; blocktype < 8; blocktype++)
  1015.            if (valid_mode[blocktype+NO_INTER_MBMODES])
  1016.            {
  1017.              if (backward_rdcost[blocktype] < 0.0)
  1018.              {
  1019.                //--- get rd-cost's ---
  1020.                currMB->intraOrInter = INTER_MB;
  1021.                img->imod            = B_Backward;
  1022.                if (!backward_me_done[blocktype])
  1023.                {
  1024.                  SingleUnifiedMotionSearch (0, blocktype,
  1025.                    bw_refFrArr, tmp_bwMV, img->p_bwMV, B_BACKWARD, img->all_bmv,
  1026.                    rdopt->lambda_motion);
  1027.                  backward_me_done[mode]=1;
  1028.                }
  1029.                else
  1030.                  for (j = 0; j < 4; j++)
  1031.                    for (i = 0; i < 4; i++)
  1032.                    {
  1033.                      tmp_bwMV[0][img->block_y+j][img->block_x+i+4]=
  1034.                        img->all_bmv[i][j][0][blocktype][0];
  1035.                      tmp_bwMV[1][img->block_y+j][img->block_x+i+4]=
  1036.                        img->all_bmv[i][j][0][blocktype][1];
  1037.                    }
  1038.                RDCost_Macroblock (&rd, blocktype+NO_INTER_MBMODES, 0, 0, blocktype);
  1039.                backward_rdcost[blocktype] = rd.rdcost;
  1040.              }
  1041.              if (backward_rdcost[blocktype] < min_rdcost)
  1042.              {
  1043.                min_rdcost = backward_rdcost[blocktype];
  1044.                k0         = blocktype;
  1045.              }
  1046.            }
  1047.          blocktype_back = k0;
  1048.          //--- get best forward prediction ---
  1049.          min_rdcost = 1e30;
  1050.          for (blocktype = 1; blocktype < 8; blocktype++)
  1051.            if (valid_mode[blocktype])
  1052.            {
  1053.              if (forward_rdcost[blocktype] < 0.0)
  1054.              {
  1055.                //--- get rd-cost's ---
  1056.                currMB->intraOrInter = INTER_MB;
  1057.                img->imod            = B_Forward;
  1058.                min_inter_sad        = MAX_VALUE;
  1059.                for (k=0; k<max_ref_frame; k++)
  1060. #ifdef _ADDITIONAL_REFERENCE_FRAME_
  1061.                if (k <  input->no_multpred ||
  1062.                    k == input->add_ref_frame)
  1063. #endif
  1064.                {
  1065.                  if (!forward_me_done[blocktype][k])
  1066.                  {
  1067.                    tot_for_sad[blocktype][k]  = (int)floor(rdopt->lambda_motion * (1+2*floor(log(k+1)/log(2)+1e-10)));
  1068.                    tot_for_sad[blocktype][k] += SingleUnifiedMotionSearch (k, blocktype,
  1069.                      fw_refFrArr, tmp_fwMV, img->p_fwMV,
  1070.                      B_FORWARD, img->all_mv,
  1071.                      rdopt->lambda_motion);
  1072.                    forward_me_done[blocktype][k] = 1;
  1073.                  }
  1074.                  if (tot_for_sad[blocktype][k] < min_inter_sad)
  1075.                  {
  1076.                    k0 = k;
  1077.                    min_inter_sad = tot_for_sad[blocktype][k];
  1078.                  }
  1079.                }
  1080.                for (  i=0; i < 4; i++)
  1081.                  for (j=0; j < 4; j++)
  1082.                  {
  1083.                    tmp_fwMV[0][img->block_y+j][img->block_x+i+4]=
  1084.                      img->all_mv[i][j][k0][blocktype][0];
  1085.                    tmp_fwMV[1][img->block_y+j][img->block_x+i+4]=
  1086.                      img->all_mv[i][j][k0][blocktype][1];
  1087.                  }
  1088.                RDCost_Macroblock (&rd, blocktype, k0, blocktype, 0);
  1089.                forward_rdcost[blocktype] = rd.rdcost;
  1090.                best_refframe [blocktype] = k0;
  1091.              }
  1092.              if (forward_rdcost[blocktype] < min_rdcost)
  1093.              {
  1094.                min_rdcost = forward_rdcost[blocktype];
  1095.                k1         = blocktype;
  1096.              }
  1097.            }
  1098.          blocktype = k1;
  1099.          k0        = best_refframe[blocktype];
  1100.          //===== COST CALCULATION =====
  1101.          for (j = 0; j < 4; j++)
  1102.            for (i = 0; i < 4; i++)
  1103.            {
  1104.              tmp_bwMV[0][img->block_y+j][img->block_x+i+4]=
  1105.                img->all_bmv[i][j][0][blocktype_back][0];
  1106.              tmp_bwMV[1][img->block_y+j][img->block_x+i+4]=
  1107.                img->all_bmv[i][j][0][blocktype_back][1];
  1108.              tmp_fwMV[0][img->block_y+j][img->block_x+i+4]=
  1109.                img->all_mv[i][j][k0][blocktype][0];
  1110.              tmp_fwMV[1][img->block_y+j][img->block_x+i+4]=
  1111.                img->all_mv[i][j][k0][blocktype][1];
  1112.            }
  1113.          img->fw_blc_size_h = input->blc_size[blocktype][0];
  1114.          img->fw_blc_size_v = input->blc_size[blocktype][1];
  1115.          img->bw_blc_size_h = input->blc_size[blocktype_back][0];
  1116.          img->bw_blc_size_v = input->blc_size[blocktype_back][1];
  1117.          currMB->intraOrInter = INTER_MB;
  1118.          img->imod            = B_Bidirect;
  1119.          RDCost_Macroblock (&rd, mode, k0, blocktype, blocktype_back);
  1120.        }
  1121.    }
  1122.   /*======================================*
  1123.    *===  SET PARAMETERS FOR BEST MODE  ===*
  1124.    *======================================*/
  1125.   mode           = rdopt->best_mode;
  1126.   refframe       = rdopt->ref_or_i16mode;
  1127.   intra16mode    = rdopt->ref_or_i16mode;
  1128.   blocktype      = rdopt->blocktype;
  1129.   blocktype_back = rdopt->blocktype_back;
  1130.   //=== RECONSTRUCTED MACROBLOCK ===
  1131.   for   (j=0; j<MB_BLOCK_SIZE; j++)
  1132.     for (i=0; i<MB_BLOCK_SIZE; i++)
  1133.       imgY[img->pix_y+j][img->pix_x+i] = rdopt->rec_mb_Y[j][i];
  1134.   for   (j=0; j<(BLOCK_SIZE<<1); j++)
  1135.     for (i=0; i<(BLOCK_SIZE<<1); i++)
  1136.     {
  1137.       imgUV[0][img->pix_c_y+j][img->pix_c_x+i] = rdopt->rec_mb_U[j][i];
  1138.       imgUV[1][img->pix_c_y+j][img->pix_c_x+i] = rdopt->rec_mb_V[j][i];
  1139.     }
  1140.   //=== INTRAORINTER and IMOD ===
  1141.   if (mode == MBMODE_INTRA4x4)
  1142.   {
  1143.     currMB->intraOrInter = INTRA_MB_4x4;
  1144.     img->imod            = INTRA_MB_OLD;
  1145.   }
  1146.   else if (mode == MBMODE_INTRA16x16)
  1147.   {
  1148.     currMB->intraOrInter = INTRA_MB_16x16;
  1149.     img->imod            = INTRA_MB_NEW;
  1150.   }
  1151.   else if (!bframe && (mode >= MBMODE_COPY && mode <= MBMODE_INTER4x4))
  1152.   {
  1153.     currMB->intraOrInter = INTER_MB;
  1154.     img->imod            = INTRA_MB_INTER;
  1155.   }
  1156.   else if (mode >= MBMODE_INTER16x16 && mode <= MBMODE_INTER4x4)
  1157.   {
  1158.     currMB->intraOrInter = INTER_MB;
  1159.     img->imod            = B_Forward;
  1160.   }
  1161.   else if (mode >= MBMODE_BACKWARD16x16 && mode <= MBMODE_BACKWARD4x4)
  1162.   {
  1163.     currMB->intraOrInter = INTER_MB;
  1164.     img->imod            = B_Backward;
  1165.   }
  1166.   else if (mode == MBMODE_BIDIRECTIONAL)
  1167.   {
  1168.     currMB->intraOrInter = INTER_MB;
  1169.     img->imod            = B_Bidirect;
  1170.   }
  1171.   else // mode == MBMODE_DIRECT
  1172.   {
  1173.     currMB->intraOrInter = INTER_MB;
  1174.     img->imod            = B_Direct;
  1175.   }
  1176.   //=== DCT-COEFFICIENTS, CBP and KAC ===
  1177.   if (mode != MBMODE_COPY)
  1178.   {
  1179.     memcpy (img->cof,  rdopt->cof,  1728*sizeof(int));
  1180.     memcpy (img->cofu, rdopt->cofu,   20*sizeof(int));
  1181.     currMB->cbp     = rdopt->cbp;
  1182.     currMB->cbp_blk = rdopt->cbp_blk;
  1183.     img->kac        = rdopt->kac;
  1184.     if (img->imod==INTRA_MB_NEW)
  1185.       currMB->cbp += 15*img->kac; // correct cbp for new intra modes: needed by CABAC
  1186.   }
  1187.   else
  1188.   {
  1189.     memset (img->cof,  0, 1728*sizeof(int));
  1190.     memset (img->cofu, 0,   20*sizeof(int));
  1191.     currMB->cbp     = 0;
  1192.     currMB->cbp_blk = 0;
  1193.     img->kac        = 0;
  1194.   }
  1195.   //=== INTRA PREDICTION MODES ===
  1196.   if (mode == MBMODE_INTRA4x4)
  1197.     memcpy (currMB->intra_pred_modes, rdopt->ipredmode, 16*sizeof(int));
  1198.   else
  1199.   {
  1200.     for (i=0;i<4;i++)
  1201.       for (j=0;j<4;j++)
  1202.         img->ipredmode[img->block_x+i+1][img->block_y+j+1]=0;
  1203.   }
  1204.   //=== MOTION VECTORS, REFERENCE FRAME and BLOCK DIMENSIONS ===
  1205.   //--- init all motion vectors with (0,0) ---
  1206.   currMB->ref_frame = 0;
  1207.   if (bframe)
  1208.     for   (j=0; j<BLOCK_SIZE; j++)
  1209.       for (i=0; i<BLOCK_SIZE; i++)
  1210.       {
  1211.         tmp_fwMV[0][img->block_y+j][img->block_x+4+i] = 0;
  1212.         tmp_fwMV[1][img->block_y+j][img->block_x+4+i] = 0;
  1213.         tmp_bwMV[0][img->block_y+j][img->block_x+4+i] = 0;
  1214.         tmp_bwMV[1][img->block_y+j][img->block_x+4+i] = 0;
  1215.       }
  1216.   else
  1217.     for   (j=0; j<BLOCK_SIZE; j++)
  1218.       for (i=0; i<BLOCK_SIZE; i++)
  1219.       {
  1220.         tmp_mv  [0][img->block_y+j][img->block_x+4+i] = 0;
  1221.         tmp_mv  [1][img->block_y+j][img->block_x+4+i] = 0;
  1222.       }
  1223.   //--- set used motion vectors ---
  1224.   if (!bframe && (mode >= MBMODE_INTER16x16 && mode <= MBMODE_INTER4x4))
  1225.   {
  1226.     for   (j=0; j<BLOCK_SIZE; j++)
  1227.       for (i=0; i<BLOCK_SIZE; i++)
  1228.       {
  1229.         tmp_mv[0][img->block_y+j][img->block_x+4+i] = rdopt->mv[j][i][0];
  1230.         tmp_mv[1][img->block_y+j][img->block_x+4+i] = rdopt->mv[j][i][1];
  1231.       }
  1232.     currMB->ref_frame = refframe;
  1233.     img->blc_size_h   = input->blc_size[blocktype][0];
  1234.     img->blc_size_v   = input->blc_size[blocktype][1];
  1235.   }
  1236.   else if (mode >= MBMODE_INTER16x16 && mode <= MBMODE_INTER4x4)
  1237.   {
  1238.     for   (j=0; j<BLOCK_SIZE; j++)
  1239.       for (i=0; i<BLOCK_SIZE; i++)
  1240.       {
  1241.         tmp_fwMV[0][img->block_y+j][img->block_x+4+i] = rdopt->mv[j][i][0];
  1242.         tmp_fwMV[1][img->block_y+j][img->block_x+4+i] = rdopt->mv[j][i][1];
  1243.         dfMV    [0][img->block_y+j][img->block_x+4+i] = 0;
  1244.         dfMV    [1][img->block_y+j][img->block_x+4+i] = 0;
  1245.         dbMV    [0][img->block_y+j][img->block_x+4+i] = 0;
  1246.         dbMV    [1][img->block_y+j][img->block_x+4+i] = 0;
  1247.       }
  1248.     currMB->ref_frame  = refframe;
  1249.     img->fw_blc_size_h = input->blc_size[blocktype][0];
  1250.     img->fw_blc_size_v = input->blc_size[blocktype][1];
  1251.   }
  1252.   else if (mode >= MBMODE_BACKWARD16x16 && mode <= MBMODE_BACKWARD4x4)
  1253.   {
  1254.     for   (j=0; j<BLOCK_SIZE; j++)
  1255.       for (i=0; i<BLOCK_SIZE; i++)
  1256.       {
  1257.         tmp_bwMV[0][img->block_y+j][img->block_x+4+i] = rdopt->bw_mv[j][i][0];
  1258.         tmp_bwMV[1][img->block_y+j][img->block_x+4+i] = rdopt->bw_mv[j][i][1];
  1259.         dfMV    [0][img->block_y+j][img->block_x+4+i] = 0;
  1260.         dfMV    [1][img->block_y+j][img->block_x+4+i] = 0;
  1261.         dbMV    [0][img->block_y+j][img->block_x+4+i] = 0;
  1262.         dbMV    [1][img->block_y+j][img->block_x+4+i] = 0;
  1263.       }
  1264.     currMB->ref_frame  = refframe;
  1265.     img->bw_blc_size_h = input->blc_size[blocktype_back][0];
  1266.     img->bw_blc_size_v = input->blc_size[blocktype_back][1];
  1267.   }
  1268.   else if (mode == MBMODE_BIDIRECTIONAL)
  1269.   {
  1270.     for   (j=0; j<BLOCK_SIZE; j++)
  1271.       for (i=0; i<BLOCK_SIZE; i++)
  1272.       {
  1273.         tmp_fwMV[0][img->block_y+j][img->block_x+4+i] = rdopt->   mv[j][i][0];
  1274.         tmp_fwMV[1][img->block_y+j][img->block_x+4+i] = rdopt->   mv[j][i][1];
  1275.         tmp_bwMV[0][img->block_y+j][img->block_x+4+i] = rdopt->bw_mv[j][i][0];
  1276.         tmp_bwMV[1][img->block_y+j][img->block_x+4+i] = rdopt->bw_mv[j][i][1];
  1277.         dfMV    [0][img->block_y+j][img->block_x+4+i] = 0;
  1278.         dfMV    [1][img->block_y+j][img->block_x+4+i] = 0;
  1279.         dbMV    [0][img->block_y+j][img->block_x+4+i] = 0;
  1280.         dbMV    [1][img->block_y+j][img->block_x+4+i] = 0;
  1281.       }
  1282.     currMB->ref_frame  = refframe;
  1283.     img->fw_blc_size_h = input->blc_size[blocktype     ][0];
  1284.     img->fw_blc_size_v = input->blc_size[blocktype     ][1];
  1285.     img->bw_blc_size_h = input->blc_size[blocktype_back][0];
  1286.     img->bw_blc_size_v = input->blc_size[blocktype_back][1];
  1287.   }
  1288.   //=== MACROBLOCK MODE ===
  1289.   if      (mode == MBMODE_COPY || mode == MBMODE_DIRECT)
  1290.     img->mb_mode = 0;
  1291.   else if (mode == MBMODE_INTRA4x4)
  1292.     img->mb_mode = 8*img->type + img->imod;
  1293.   else if (mode == MBMODE_INTRA16x16)
  1294.     img->mb_mode = 8*img->type + img->imod + intra16mode + 12*img->kac + 4*((currMB->cbp&0xF0)>>4);
  1295.   else if (mode == MBMODE_BIDIRECTIONAL)
  1296.     img->mb_mode = 3;
  1297.   else if (mode >= MBMODE_BACKWARD16x16 && mode <= MBMODE_BACKWARD4x4)
  1298.     img->mb_mode = (blocktype_back == 1 ? blocktype_back+1 : 2*blocktype_back+1);
  1299.   else if (mode >= MBMODE_INTER16x16 && mode <= MBMODE_INTER4x4 && bframe)
  1300.     img->mb_mode = (blocktype == 1 ? blocktype : 2*blocktype);
  1301.   else if (blocktype                         == M16x16_MB &&
  1302.      currMB->cbp                             == 0         &&
  1303.      currMB->ref_frame                       == 0         &&
  1304.      tmp_mv[0][img->block_y][img->block_x+4] == 0         &&
  1305.      tmp_mv[1][img->block_y][img->block_x+4] == 0)
  1306.     img->mb_mode = 0;
  1307.   else
  1308.     img->mb_mode = blocktype;
  1309.   currMB->mb_type = img->mb_mode;
  1310.   /*===========================================================*
  1311.    *===  SET LOOP FILTER STRENGTH and REFERENCE FRAME INFO  ===*
  1312.    *===========================================================*/
  1313.   if (!bframe)
  1314.   {
  1315.     // Set reference frame information for motion vector prediction of future MBs
  1316.     SetRefFrameInfo_P();
  1317.   }
  1318.   else
  1319.   {
  1320.     // Set reference frame information for motion vector prediction of future MBs
  1321.     SetRefFrameInfo_B();
  1322.   }
  1323.   currMB->qp       = img->qp ;    // this should (or has to be) done somewere else, but where???
  1324.   DeblockMb(img, imgY, imgUV) ;   // filter this macroblock ( pixels to the right and above the MB are affected )
  1325.   if (input->rdopt == 2)
  1326.   {
  1327.     for (j=0 ; j<input->NoOfDecoders ; j++)
  1328.       DeblockMb(img, decY_best[j],NULL);
  1329.   }
  1330.   if (img->current_mb_nr==0)
  1331.     intras=0;
  1332.   if (img->number && (mode==MBMODE_INTRA4x4 || mode==MBMODE_INTRA16x16))
  1333.     intras++;
  1334. }