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

Audio

开发平台:

Visual C++

  1. /*!
  2.  ***************************************************************************
  3.  * file rdopt.c
  4.  *
  5.  * brief
  6.  *    Rate-Distortion optimized mode decision
  7.  *
  8.  * author
  9.  *    - Heiko Schwarz              <hschwarz@hhi.de>
  10.  *    - Valeri George              <george@hhi.de>
  11.  *    - Lowell Winger              <lwinger@lsil.com>
  12.  *    - Alexis Michael Tourapis    <alexismt@ieee.org>
  13.  * date
  14.  *    12. April 2001
  15.  **************************************************************************
  16.  */
  17. #include <math.h>
  18. #include <limits.h>
  19. #include "global.h"
  20. #include "rdopt.h"
  21. #include "q_around.h"
  22. #include "rdopt_coding_state.h"
  23. #include "memalloc.h"
  24. #include "mb_access.h"
  25. #include "elements.h"
  26. #include "intrarefresh.h"
  27. #include "image.h"
  28. #include "transform8x8.h"
  29. #include "cabac.h"
  30. #include "vlc.h"
  31. #include "me_umhex.h"
  32. #include "ratectl.h"            // head file for rate control
  33. #include "mode_decision.h"
  34. #include "rd_intra_jm.h"
  35. #include "fmo.h"
  36. #include "macroblock.h"
  37. #include "symbol.h"
  38. #include "q_offsets.h"
  39. #include "conformance.h"
  40. #include "errdo.h"
  41. imgpel pred[16][16];
  42. #define FASTMODE 1
  43. //#define RESET_STATE
  44. imgpel   rec_mbY[16][16], rec_mb_cr[2][16][16];    // reconstruction values
  45. int lrec_rec[MB_BLOCK_SIZE][MB_BLOCK_SIZE],lrec_rec_uv[2][MB_BLOCK_SIZE][MB_BLOCK_SIZE]; // store the transf. and quantized coefficients for SP frames
  46. static int diff[16];
  47. static int diff4x4[64];
  48. static int diff8x8[64];
  49. RD_8x8DATA tr4x4, tr8x8;
  50. int   ****cofAC=NULL, ****cofAC8x8=NULL;        // [8x8block][4x4block][level/run][scan_pos]
  51. int   ***cofDC=NULL;                       // [yuv][level/run][scan_pos]
  52. int   **cofAC4x4=NULL, ****cofAC4x4intern=NULL; // [level/run][scan_pos]
  53. int   cbp, cbp8x8, cnt_nonz_8x8;
  54. int   cbp_blk8x8;
  55. char  l0_refframe[4][4], l1_refframe[4][4];
  56. short b8mode[4], b8pdir[4], b8bipred_me[4];
  57. CSptr cs_mb=NULL, cs_b8=NULL, cs_cm=NULL, cs_ib8=NULL, cs_ib4=NULL;
  58. int   best_c_imode;
  59. int   best_i16offset;
  60. short best_mode;
  61. //mixed transform sizes definitions
  62. int   luma_transform_size_8x8_flag;
  63. short all_mv8x8[2][2][4][4][2];       //[8x8_data/temp_data][LIST][block_x][block_y][MVx/MVy]
  64. short pred_mv8x8[2][2][4][4][2];
  65. int   ****cofAC8x8ts[3] = {NULL, NULL, NULL};        // [plane][8x8block][4x4block][level/run][scan_pos]
  66. int   ****cofAC8x8CbCr[2];
  67. int   **cofAC4x4CbCr[2];
  68. int   ****cofAC4x4CbCrintern[2];
  69. int64    cbp_blk8_8x8ts;
  70. int      cbp8_8x8ts;
  71. int      cost8_8x8ts;
  72. int      cnt_nonz8_8x8ts;
  73. // adaptive langrangian parameters
  74. double mb16x16_cost;
  75. double lambda_mf_factor;
  76. void StoreMV8x8(int dir);
  77. void RestoreMV8x8(int dir);
  78. // end of mixed transform sizes definitions
  79. char  b4_ipredmode[16], b4_intra_pred_modes[16];
  80. /*!
  81.  ************************************************************************
  82.  * brief
  83.  *    delete structure for RD-optimized mode decision
  84.  ************************************************************************
  85.  */
  86. void clear_rdopt (InputParameters *params)
  87. {
  88.   free_mem_DCcoeff (cofDC);
  89.   free_mem_ACcoeff (cofAC);
  90.   free_mem_ACcoeff (cofAC8x8);
  91.   free_mem_ACcoeff (cofAC4x4intern);
  92.   if (params->Transform8x8Mode)
  93.   {
  94.     free_mem_ACcoeff (cofAC8x8ts[0]);
  95.     //if (img->P444_joined)
  96.     {
  97.       free_mem_ACcoeff (cofAC8x8ts[1]);
  98.       free_mem_ACcoeff (cofAC8x8ts[2]);
  99.     }
  100.   }
  101.   //if (img->P444_joined)
  102.   {
  103.     free_mem_ACcoeff (cofAC8x8CbCr[0]);
  104.     free_mem_ACcoeff (cofAC8x8CbCr[1]);
  105.     free_mem_ACcoeff (cofAC4x4CbCrintern[0]);
  106.     free_mem_ACcoeff (cofAC4x4CbCrintern[1]);
  107.   }
  108.   if (params->AdaptiveRounding)
  109.   {
  110.     clear_adaptive_rounding (params);
  111.   }
  112.   // structure for saving the coding state
  113.   delete_coding_state (cs_mb);
  114.   delete_coding_state (cs_b8);
  115.   delete_coding_state (cs_cm);
  116.   delete_coding_state (cs_ib8);
  117.   delete_coding_state (cs_ib4);
  118. }
  119. /*!
  120.  ************************************************************************
  121.  * brief
  122.  *    create structure for RD-optimized mode decision
  123.  ************************************************************************
  124.  */
  125. void init_rdopt (InputParameters *params)
  126. {
  127.   rdopt = NULL;
  128.   get_mem_DCcoeff (&cofDC);
  129.   get_mem_ACcoeff (&cofAC);
  130.   get_mem_ACcoeff (&cofAC8x8);
  131.   get_mem_ACcoeff (&cofAC4x4intern);
  132.   cofAC4x4 = cofAC4x4intern[0][0];
  133.   if (params->Transform8x8Mode)
  134.   {
  135.     get_mem_ACcoeff (&cofAC8x8ts[0]);
  136.     //if (img->P444_joined)
  137.     {
  138.       get_mem_ACcoeff (&cofAC8x8ts[1]);
  139.       get_mem_ACcoeff (&cofAC8x8ts[2]);
  140.     }
  141.   }
  142.   //if (img->P444_joined)
  143.   {
  144.     get_mem_ACcoeff (&cofAC8x8CbCr[0]);
  145.     get_mem_ACcoeff (&cofAC8x8CbCr[1]);
  146.     get_mem_ACcoeff (&cofAC4x4CbCrintern[0]);
  147.     get_mem_ACcoeff (&cofAC4x4CbCrintern[1]);
  148.     cofAC4x4CbCr[0] = cofAC4x4CbCrintern[0][0][0];
  149.     cofAC4x4CbCr[1] = cofAC4x4CbCrintern[1][0][0];    
  150.   }
  151.   SetLagrangianMultipliers = params->rdopt == 0 ? SetLagrangianMultipliersOff : SetLagrangianMultipliersOn;
  152.   switch (params->rdopt)
  153.   {
  154.   case 0:
  155.     encode_one_macroblock = encode_one_macroblock_low;
  156.     break;
  157.   case 1:
  158.   default:
  159.     encode_one_macroblock = encode_one_macroblock_high;
  160.     break;
  161.   case 2:
  162.     encode_one_macroblock = encode_one_macroblock_highfast;
  163.     break;
  164.   case 3:
  165.     encode_one_macroblock = encode_one_macroblock_highloss;
  166.     break;
  167.   }
  168.   if (params->AdaptiveRounding)
  169.   {
  170.     setup_adaptive_rounding (params);
  171.   }
  172.   // structure for saving the coding state
  173.   cs_mb  = create_coding_state ();
  174.   cs_b8  = create_coding_state ();
  175.   cs_cm  = create_coding_state ();
  176.   cs_ib8 = create_coding_state ();
  177.   cs_ib4 = create_coding_state ();
  178.   if (params->CtxAdptLagrangeMult == 1)
  179.   {
  180.     mb16x16_cost = CALM_MF_FACTOR_THRESHOLD;
  181.     lambda_mf_factor = 1.0;
  182.   }
  183.   getDistortion = distortionSSE;
  184. }
  185. /*!
  186.  *************************************************************************************
  187.  * brief
  188.  *    Updates the pixel map that shows, which reference frames are reliable for
  189.  *    each MB-area of the picture.
  190.  *
  191.  * note
  192.  *    The new values of the pixel_map are taken from the temporary buffer refresh_map
  193.  *
  194.  *************************************************************************************
  195.  */
  196. void UpdatePixelMap()
  197. {
  198.   int mx,my,y,x,i,j;
  199.   if (img->type==I_SLICE)
  200.   {
  201.     memset(pixel_map, 1, img->height * img->width * sizeof(byte));
  202.   }
  203.   else
  204.   {
  205.     for (my=0; my<img->height >> 3; my++)
  206.       for (mx=0; mx<img->width >> 3;  mx++)
  207.       {
  208.         j = my*8 + 8;
  209.         i = mx*8 + 8;
  210.         if (refresh_map[my][mx])
  211.         {
  212.           for (y=my*8; y<j; y++)
  213.             memset(&pixel_map[y][mx*8], 1, 8 * sizeof(byte));
  214.         }
  215.         else
  216.         {
  217.           for (y=my*8; y<j; y++)
  218.             for (x=mx*8; x<i; x++)
  219.             {
  220.               pixel_map[y][x] = imin(pixel_map[y][x] + 1, params->num_ref_frames+1);
  221.             }
  222.         }
  223.       }
  224.   }
  225. }
  226. /*!
  227.  *************************************************************************************
  228.  * brief
  229.  *    Checks if a given reference frame is reliable for the current
  230.  *    macroblock, given the motion vectors that the motion search has
  231.  *    returned.
  232.  *
  233.  * return
  234.  *    If the return value is 1, the reference frame is reliable. If it
  235.  *    is 0, then it is not reliable.
  236.  *
  237.  * note
  238.  *    A specific area in each reference frame is assumed to be unreliable
  239.  *    if the same area has been intra-refreshed in a subsequent frame.
  240.  *    The information about intra-refreshed areas is kept in the pixel_map.
  241.  *
  242.  *************************************************************************************
  243.  */
  244. int CheckReliabilityOfRef (int block, int list_idx, int ref, int mode)
  245. {
  246.   int y,x, block_y, block_x, dy, dx, y_pos, x_pos, yy, xx, pres_x, pres_y;
  247.   int maxold_x  = img->width-1;
  248.   int maxold_y  = img->height-1;
  249.   int ref_frame = ref + 1;
  250.   int by0 = (mode>=4?2*(block >> 1):mode==2?2*block:0);
  251.   int by1 = by0 + (mode>=4||mode==2?2:4);
  252.   int bx0 = (mode>=4?2*(block & 0x01):mode==3?2*block:0);
  253.   int bx1 = bx0 + (mode>=4||mode==3?2:4);
  254.   for (block_y=by0; block_y<by1; block_y++)
  255.   {
  256.     for (block_x=bx0; block_x<bx1; block_x++)
  257.     {
  258.       y_pos  = img->all_mv[list_idx][ref][mode][block_y][block_x][1];
  259.       y_pos += (img->block_y + block_y) * BLOCK_SIZE * 4;
  260.       x_pos  = img->all_mv[list_idx][ref][mode][block_y][block_x][0];
  261.       x_pos += (img->block_x + block_x) * BLOCK_SIZE * 4;
  262.       /* Here we specify which pixels of the reference frame influence
  263.       the reference values and check their reliability. This is
  264.       based on the function Get_Reference_Pixel */
  265.       dy = y_pos & 3;
  266.       dx = x_pos & 3;
  267.       y_pos = (y_pos - dy) >> 2;
  268.       x_pos = (x_pos - dx) >> 2;
  269.       if (dy==0 && dx==0) //full-pel
  270.       {
  271.         for (y=y_pos ; y < y_pos + BLOCK_SIZE ; y++)
  272.           for (x=x_pos ; x < x_pos + BLOCK_SIZE ; x++)
  273.             if (pixel_map[iClip3(0,maxold_y,y)][iClip3(0,maxold_x,x)] < ref_frame)
  274.               return 0;
  275.       }
  276.       else  /* other positions */
  277.       {
  278.         if (dy == 0)
  279.         {
  280.           for (y = y_pos ; y < y_pos + BLOCK_SIZE ; y++)
  281.           {
  282.             pres_y = iClip3(0, maxold_y, y);
  283.             for (x = x_pos ; x < x_pos + BLOCK_SIZE ; x++)
  284.             {
  285.               for(xx = -2 ; xx < 4 ; xx++) 
  286.               {
  287.                 pres_x = iClip3(0, maxold_x, x + xx);
  288.                 if (pixel_map[pres_y][pres_x] < ref_frame)
  289.                   return 0;
  290.               }
  291.             }
  292.           }
  293.         }
  294.         else if (dx == 0)
  295.         {
  296.           for (y = y_pos ; y < y_pos + BLOCK_SIZE ; y++)
  297.             for (x=x_pos ; x < x_pos + BLOCK_SIZE ; x++)
  298.             {
  299.               pres_x = iClip3(0,maxold_x,x);
  300.               for(yy=-2;yy<4;yy++) 
  301.               {
  302.                 pres_y = iClip3(0,maxold_y, yy + y);
  303.                 if (pixel_map[pres_y][pres_x] < ref_frame)
  304.                   return 0;
  305.               }
  306.             }
  307.         }
  308.         else if (dx == 2)
  309.         {
  310.           for (y = y_pos ; y < y_pos + BLOCK_SIZE ; y++)
  311.             for (x = x_pos ; x < x_pos + BLOCK_SIZE ; x++)
  312.             {
  313.               for(yy=-2;yy<4;yy++) 
  314.               {
  315.                 pres_y = iClip3(0,maxold_y, yy + y);
  316.                 for(xx=-2;xx<4;xx++) 
  317.                 {
  318.                   pres_x = iClip3(0,maxold_x, xx + x);
  319.                   if (pixel_map[pres_y][pres_x] < ref_frame)
  320.                     return 0;
  321.                 }
  322.               }
  323.             }
  324.         }
  325.         else if (dy == 2)
  326.         {
  327.           for (y = y_pos ; y < y_pos + BLOCK_SIZE ; y++)
  328.             for (x = x_pos ; x < x_pos + BLOCK_SIZE ; x++)
  329.             {
  330.               for(xx=-2;xx<4;xx++) 
  331.               {
  332.                 pres_x = iClip3(0,maxold_x, xx + x);
  333.                 for(yy=-2;yy<4;yy++) 
  334.                 {
  335.                   pres_y = iClip3(0,maxold_y, yy + y);
  336.                   if (pixel_map[pres_y][pres_x] < ref_frame)
  337.                     return 0;
  338.                 }
  339.               }
  340.             }
  341.         }
  342.         else
  343.         {
  344.           for (y = y_pos ; y < y_pos + BLOCK_SIZE ; y++)
  345.           {
  346.             for (x = x_pos ; x < x_pos + BLOCK_SIZE ; x++)
  347.             {
  348.               pres_y = dy == 1 ? y : y + 1;
  349.               pres_y = iClip3(0,maxold_y,pres_y);
  350.               for(xx=-2;xx<4;xx++)
  351.               {
  352.                 pres_x = iClip3(0,maxold_x,xx + x);
  353.                 if (pixel_map[pres_y][pres_x] < ref_frame)
  354.                   return 0;
  355.               }
  356.               pres_x = dx == 1 ? x : x + 1;
  357.               pres_x = iClip3(0,maxold_x,pres_x);
  358.               for(yy=-2;yy<4;yy++)
  359.               {
  360.                 pres_y = iClip3(0,maxold_y, yy + y);
  361.                 if (pixel_map[pres_y][pres_x] < ref_frame)
  362.                   return 0;
  363.               }
  364.             }
  365.           }
  366.         }
  367.       }
  368.     }
  369.   }
  370.   return 1;
  371. }
  372. /*!
  373.  *************************************************************************************
  374.  * brief
  375.  *    R-D Cost for an 4x4 Intra block
  376.  *************************************************************************************
  377.  */
  378. double RDCost_for_4x4IntraBlocks (Macroblock    *currMB,
  379.                                   int*    nonzero,
  380.                                   int     b8,
  381.                                   int     b4,
  382.                                   int     ipmode,
  383.                                   double  lambda,
  384.                                   int     mostProbableMode,
  385.                                   int     c_nzCbCr[3],
  386.                                   int     is_cavlc)
  387. {
  388.   double  rdcost;
  389.   int     dummy = 0, rate;
  390.   int64   distortion  = 0;
  391.   int     block_x     = ((b8 & 0x01) << 3) + ((b4 & 0x01) << 2);
  392.   int     block_y     = ((b8 >> 1) << 3) + ((b4 >> 1) << 2);
  393.   int     pic_pix_x   = img->pix_x  + block_x;
  394.   int     pic_pix_y   = img->pix_y  + block_y;
  395.   int     pic_opix_y  = img->opix_y + block_y;
  396.   Slice          *currSlice = img->currentSlice;
  397.   SyntaxElement  se;
  398.   const int      *partMap   = assignSE2partition[params->partition_mode];
  399.   DataPartition  *dataPart;
  400.   //===== perform DCT, Q, IQ, IDCT, Reconstruction =====
  401.   //select_dct(img, currMB);
  402.   *nonzero = pDCT_4x4 (currMB, PLANE_Y, block_x, block_y, &dummy, 1, is_cavlc);
  403.   //===== get distortion (SSD) of 4x4 block =====
  404.   distortion += compute_SSE(&pCurImg[pic_opix_y], &enc_picture->imgY[pic_pix_y], pic_pix_x, pic_pix_x, 4, 4);
  405.   if(img->P444_joined)
  406.   {
  407.     ColorPlane k;
  408.     for (k = PLANE_U; k <= PLANE_V; k++)
  409.     {
  410.       select_plane(k);
  411.       c_nzCbCr[k] = pDCT_4x4(currMB, k, block_x, block_y, &dummy, 1, is_cavlc);
  412.       distortion += compute_SSE(&pCurImg[pic_opix_y], &enc_picture->p_curr_img[pic_pix_y], pic_pix_x, pic_pix_x, 4, 4);
  413.     }
  414.     select_plane(PLANE_Y);
  415.   }
  416.   ipmode_DPCM=NO_INTRA_PMODE;
  417.   //===== RATE for INTRA PREDICTION MODE  (SYMBOL MODE MUST BE SET TO CAVLC) =====
  418.   se.value1 = (mostProbableMode == ipmode) ? -1 : ipmode < mostProbableMode ? ipmode : ipmode - 1;
  419.   //--- set position and type ---
  420.   se.context = (b8 << 2) + b4;
  421.   se.type    = SE_INTRAPREDMODE;
  422.   //--- choose data partition ---
  423.   dataPart = &(currSlice->partArr[partMap[SE_INTRAPREDMODE]]);
  424.   //--- encode and update rate ---
  425.   writeIntraPredMode (&se, dataPart);
  426.   rate = se.len;
  427.   //===== RATE for LUMINANCE COEFFICIENTS =====
  428.   if (is_cavlc)
  429.   {
  430.     rate  += writeCoeff4x4_CAVLC (currMB, LUMA, b8, b4, 0);
  431.     if(img->P444_joined) 
  432.     {
  433.       rate  += writeCoeff4x4_CAVLC (currMB, CB, b8, b4, 0);
  434.       rate  += writeCoeff4x4_CAVLC (currMB, CR, b8, b4, 0);
  435.     }
  436.   }
  437.   else
  438.   {
  439.     rate  += writeCoeff4x4_CABAC (currMB, PLANE_Y, b8, b4, 1);
  440.     if(img->P444_joined) 
  441.     {
  442.       rate  += writeCoeff4x4_CABAC (currMB, PLANE_U, b8, b4, 1);
  443.       rate  += writeCoeff4x4_CABAC (currMB, PLANE_V, b8, b4, 1);
  444.     }
  445.   }
  446.   //reset_coding_state (currMB, cs_cm);
  447.   rdcost = (double)distortion + lambda * (double) rate;
  448.   return rdcost;
  449. }
  450. /*!
  451. *************************************************************************************
  452. * brief
  453. *    R-D Cost for an 8x8 Partition
  454. *************************************************************************************
  455. */
  456. double RDCost_for_8x8blocks (Macroblock *currMB, // --> Current macroblock to code
  457.                              int*    cnt_nonz,   // --> number of nonzero coefficients
  458.                              int64*  cbp_blk,    // --> cbp blk
  459.                              double  lambda,     // <-- lagrange multiplier
  460.                              int     block,      // <-- 8x8 block number
  461.                              int     mode,       // <-- partitioning mode
  462.                              short   pdir,       // <-- prediction direction
  463.                              short   l0_ref,     // <-- L0 reference picture
  464.                              short   l1_ref,     // <-- L1 reference picture
  465.                              short   bipred_me,  // <-- bi prediction mode
  466.                              int     is_cavlc
  467.                              )     
  468. {
  469.   int  k;
  470.   int  rate=0;
  471.   int64 distortion=0;
  472.   int  dummy = 0, mrate;
  473.   int  fw_mode, bw_mode;
  474.   int  cbp     = 0;
  475.   int  pax     = 8*(block & 0x01);
  476.   int  pay     = 8*(block >> 1);
  477.   int  i0      = pax >> 2;
  478.   int  j0      = pay >> 2;
  479.   int  bframe  = (img->type==B_SLICE);
  480.   int  direct  = (bframe && mode==0);
  481.   int  b8value = B8Mode2Value (mode, pdir);
  482.   SyntaxElement se;
  483.   Slice         *currSlice = img->currentSlice;
  484.   DataPartition *dataPart;
  485.   const int     *partMap   = assignSE2partition[params->partition_mode];
  486.   EncodingEnvironmentPtr eep_dp;
  487.   //=====
  488.   //=====  GET COEFFICIENTS, RECONSTRUCTIONS, CBP
  489.   //=====
  490.   currMB->bipred_me[block] = bipred_me;
  491.   
  492.   if (direct)
  493.   {
  494.     if (direct_pdir[img->block_y+j0][img->block_x+i0]<0) // mode not allowed
  495.       return (1e20);
  496.     else
  497.       *cnt_nonz = LumaResidualCoding8x8 (currMB, &cbp, cbp_blk, block, direct_pdir[img->block_y+j0][img->block_x+i0], 0, 0,
  498.       (short)imax(0,direct_ref_idx[LIST_0][img->block_y+j0][img->block_x+i0]),
  499.       direct_ref_idx[LIST_1][img->block_y+j0][img->block_x+i0], is_cavlc);
  500.   }
  501.   else
  502.   {
  503.     if (pdir == 2 && active_pps->weighted_bipred_idc == 1)
  504.     {
  505.       int weight_sum = (active_pps->weighted_bipred_idc == 1)? wbp_weight[0][l0_ref][l1_ref][0] + wbp_weight[1][l0_ref][l1_ref][0] : 0;
  506.       if (weight_sum < -128 ||  weight_sum > 127)
  507.       {
  508.         return (1e20);
  509.       }
  510.     }
  511.     fw_mode   = (pdir==0||pdir==2 ? mode : 0);
  512.     bw_mode   = (pdir==1||pdir==2 ? mode : 0);
  513.     *cnt_nonz = LumaResidualCoding8x8 (currMB, &cbp, cbp_blk, block, pdir, fw_mode, bw_mode, l0_ref, l1_ref, is_cavlc);
  514.   }
  515.   if(img->P444_joined) 
  516.   {
  517.     *cnt_nonz += ( coeff_cost_cr[1] + coeff_cost_cr[2] );
  518.   }
  519.   // RDOPT with losses
  520.   if (params->rdopt==3 && img->type!=B_SLICE)
  521.   {
  522.     //===== get residue =====
  523.     // We need the reconstructed prediction residue for the simulated decoders.
  524.     //compute_residue_b8block (img, &enc_picture->p_img[0][img->pix_y], decs->res_img[0], block, -1);
  525.     compute_residue_block (img, &enc_picture->p_img[0][img->pix_y], decs->res_img[0], img->mb_pred[0], block, 8);
  526.     //=====
  527.     //=====   GET DISTORTION
  528.     //=====
  529.     for (k=0; k<params->NoOfDecoders ;k++)
  530.     {
  531.       decode_one_b8block (img, enc_picture, k, P8x8, block, mode, l0_ref);
  532.       distortion += compute_SSE(&pCurImg[img->opix_y+pay], &enc_picture->p_dec_img[0][k][img->opix_y+pay], img->opix_x+pax, img->opix_x+pax, 8, 8);
  533.     }
  534.     distortion /= params->NoOfDecoders;
  535.   }
  536.   else
  537.   {    
  538.     distortion += compute_SSE(&pCurImg[img->opix_y + pay], &enc_picture->imgY[img->pix_y + pay], img->opix_x + pax, img->pix_x + pax, 8, 8);
  539.     if (img->P444_joined)
  540.     {
  541.       distortion += compute_SSE(&pImgOrg[1][img->opix_y + pay], &enc_picture->imgUV[0][img->pix_y + pay], img->opix_x + pax, img->pix_x + pax, 8, 8);
  542.       distortion += compute_SSE(&pImgOrg[2][img->opix_y + pay], &enc_picture->imgUV[1][img->pix_y + pay], img->opix_x + pax, img->pix_x + pax, 8, 8);
  543.     }    
  544.   }
  545.   if(img->P444_joined) 
  546.   {   
  547.     cbp |= cmp_cbp[1];
  548.     cbp |= cmp_cbp[2];
  549.     cmp_cbp[1] = cbp;
  550.     cmp_cbp[2] = cbp;
  551.   }
  552.   //=====
  553.   //=====   GET RATE
  554.   //=====
  555.   //----- block 8x8 mode -----
  556.   if (is_cavlc)
  557.   {
  558.     ue_linfo (b8value, dummy, &mrate, &dummy);
  559.     rate += mrate;
  560.   }
  561.   else
  562.   {
  563.     se.value1 = b8value;
  564.     se.type   = SE_MBTYPE;
  565.     dataPart  = &(currSlice->partArr[partMap[se.type]]);
  566.     writeB8_typeInfo(&se, dataPart);
  567.     rate += se.len;
  568.   }
  569.   //----- motion information -----
  570.   if (!direct)
  571.   {
  572.     if ((img->num_ref_idx_l0_active > 1 ) && (pdir==0 || pdir==2))
  573.       rate  += writeReferenceFrame (currMB, mode, i0, j0, 1, l0_ref);
  574.     if ((img->num_ref_idx_l1_active > 1 && img->type== B_SLICE ) && (pdir==1 || pdir==2))
  575.     {
  576.       rate  += writeReferenceFrame (currMB, mode, i0, j0, 0, l1_ref);
  577.     }
  578.     if (pdir==0 || pdir==2)
  579.     {
  580.       rate  += writeMotionVector8x8 (currMB, i0, j0, i0 + 2, j0 + 2, l0_ref, LIST_0, mode, currMB->bipred_me[block]);
  581.     }
  582.     if (pdir==1 || pdir==2)
  583.     {
  584.       rate  += writeMotionVector8x8 (currMB, i0, j0, i0 + 2, j0 + 2, l1_ref, LIST_1, mode, currMB->bipred_me[block]);
  585.     }
  586.   }
  587.   //----- coded block pattern (for CABAC only) -----
  588.   if (!is_cavlc)
  589.   {
  590.     dataPart = &(currSlice->partArr[partMap[SE_CBP]]);
  591.     eep_dp   = &(dataPart->ee_cabac);
  592.     mrate    = arienco_bits_written (eep_dp);
  593.     writeCBP_BIT_CABAC (currMB, block, ((*cnt_nonz>0)?1:0), cbp8x8, 1, eep_dp, img->currentSlice->tex_ctx);
  594.     mrate    = arienco_bits_written (eep_dp) - mrate;
  595.     rate    += mrate;
  596.   }
  597.   //----- luminance coefficients -----
  598.   if (*cnt_nonz)
  599.   {
  600.     rate += writeCoeff8x8 (currMB, PLANE_Y, block, mode, currMB->luma_transform_size_8x8_flag);
  601.   }
  602.   if(img->P444_joined)
  603.   {
  604.     rate += writeCoeff8x8( currMB, PLANE_U, block, mode, currMB->luma_transform_size_8x8_flag );
  605.     rate += writeCoeff8x8( currMB, PLANE_V, block, mode, currMB->luma_transform_size_8x8_flag );
  606.   }
  607.   return (double)distortion + lambda * (double)rate;
  608. }
  609. /*!
  610.  *************************************************************************************
  611.  * brief
  612.  *    Gets mode offset for intra16x16 mode
  613.  *************************************************************************************
  614.  */
  615. int I16Offset (int cbp, int i16mode)
  616. {
  617.   return (cbp&15?13:1) + i16mode + ((cbp&0x30)>>2);
  618. }
  619. /*!
  620.  *************************************************************************************
  621.  * brief
  622.  *    Sets modes and reference frames for a macroblock
  623.  *************************************************************************************
  624.  */
  625. void SetModesAndRefframeForBlocks (Macroblock *currMB, int mode)
  626. {
  627.   int i,j,k,l; 
  628.   int  bframe  = (img->type==B_SLICE);
  629.   int  block_x, block_y, block8x8, block4x4;
  630.   int  cur_ref;
  631.   int  clist;
  632.   char cref[2], curref, bestref;
  633.   Block8x8Info *b8x8info = img->b8x8info;
  634.   //--- macroblock type ---
  635.   currMB->mb_type = mode;
  636.   
  637.    for( i = 0; i < 4; i++) 
  638.    {
  639.      currMB->bipred_me[i] = b8x8info->bipred8x8me[mode][i];
  640.    }
  641.   //--- block 8x8 mode and prediction direction ---
  642.   switch (mode)
  643.   {
  644.   case 0:
  645.     memset(currMB->b8mode, 0, 4 * sizeof(short));
  646.     if (bframe)
  647.     {      
  648.       for(i=0;i<4;i++)
  649.       {
  650.         currMB->b8pdir[i] = direct_pdir[img->block_y + ((i >> 1)<<1)][img->block_x + ((i & 0x01)<<1)];
  651.       }
  652.     }
  653.     else
  654.     {
  655.       memset(currMB->b8pdir, 0, 4 * sizeof(short));
  656.     }
  657.     break;
  658.   case 1:
  659.   case 2:
  660.   case 3:
  661.     for(i=0;i<4;i++)
  662.     {
  663.       currMB->b8mode[i] = mode;
  664.       currMB->b8pdir[i] = b8x8info->best8x8pdir[mode][i];
  665.     }
  666.     break;
  667.   case P8x8:
  668.     memcpy(currMB->b8mode, b8x8info->best8x8mode, 4 * sizeof(short));
  669.     for(i=0;i<4;i++)
  670.     {
  671.       currMB->b8pdir[i]   = b8x8info->best8x8pdir[mode][i];
  672.     }
  673.     break;
  674.   case I4MB:
  675.     for(i=0;i<4;i++)
  676.     {
  677.       currMB->b8mode[i] = IBLOCK;
  678.       currMB->b8pdir[i] = -1;
  679.     }
  680.     break;
  681.   case I16MB:
  682.     memset(currMB->b8mode, 0, 4 * sizeof(short));
  683.     for(i=0;i<4;i++)
  684.     {
  685.       currMB->b8pdir[i] = -1;
  686.     }
  687.     break;
  688.   case I8MB:
  689.     for(i=0;i<4;i++)
  690.     {
  691.       currMB->b8mode[i] = I8MB;
  692.       currMB->b8pdir[i] = -1;
  693.     }
  694.     //switch to 8x8 transform
  695.     currMB->luma_transform_size_8x8_flag = 1;
  696.     break;
  697.   case IPCM:
  698.     for(i=0;i<4;i++)
  699.     {
  700.       currMB->b8mode[i] = IPCM;
  701.       currMB->b8pdir[i] = -1;
  702.     }
  703.     currMB->luma_transform_size_8x8_flag = 0;
  704.     break;
  705.   default:
  706.     printf ("Unsupported mode in SetModesAndRefframeForBlocks!n");
  707.     exit (1);
  708.   }
  709. #define IS_FW ((b8x8info->best8x8pdir[mode][k]==0 || b8x8info->best8x8pdir[mode][k]==2) && (mode!=P8x8 || b8x8info->best8x8mode[k]!=0 || !bframe))
  710. #define IS_BW ((b8x8info->best8x8pdir[mode][k]==1 || b8x8info->best8x8pdir[mode][k]==2) && (mode!=P8x8 || b8x8info->best8x8mode[k]!=0))
  711.   
  712.   //--- reference frame arrays ---
  713.   if (mode==0 || mode==I4MB || mode==I16MB || mode==I8MB)
  714.   {
  715.     if (bframe)
  716.     {
  717.       if (!mode) // Direct
  718.       {
  719.         for (clist = LIST_0; clist <= LIST_1; clist++)
  720.         {
  721.           for (j = img->block_y; j < img->block_y + 4; j++)
  722.           {
  723.             memcpy(&enc_picture->motion.ref_idx[clist][j][img->block_x], &direct_ref_idx[clist][j][img->block_x], 4 * sizeof(char));
  724.           }
  725.         }
  726.       }
  727.       else // Intra
  728.       {
  729.         for (clist = LIST_0; clist <= LIST_1; clist++)
  730.         {
  731.           for (j = img->block_y; j < img->block_y + 4; j++)
  732.           {
  733.             memset(&enc_picture->motion.ref_idx[clist][j][img->block_x],-1, 4 * sizeof(char));
  734.           }
  735.         }
  736.       }
  737.     }
  738.     else
  739.     {
  740.       if (!mode) // Skip
  741.       {
  742.         for (j = img->block_y; j < img->block_y + 4; j++)
  743.           memset(&enc_picture->motion.ref_idx[LIST_0][j][img->block_x],0, 4 * sizeof(char));
  744.       }
  745.       else // Intra
  746.       {
  747.         for (j = img->block_y; j < img->block_y + 4; j++)
  748.           memset(&enc_picture->motion.ref_idx[LIST_0][j][img->block_x],-1, 4 * sizeof(char));
  749.       }
  750.     }
  751.   }
  752.   else
  753.   {
  754.     if (bframe)
  755.     {
  756.       if (mode == 1 || mode == 2 || mode == 3) 
  757.       {
  758.         for (block8x8 = 0; block8x8 < 4; block8x8++)
  759.         {
  760.           for (clist = LIST_0; clist <= LIST_1; clist++)
  761.           {
  762.             bestref = (clist == LIST_0) ? b8x8info->best8x8l0ref[mode][block8x8] :  b8x8info->best8x8l1ref[mode][block8x8];
  763.             if ( b8x8info->best8x8pdir[mode][block8x8] == 2)
  764.             {
  765.               if (b8x8info->bipred8x8me[mode][block8x8])
  766.                 curref = 0;
  767.               else  
  768.                 curref = bestref;
  769.             }
  770.             else
  771.             {
  772.               curref = (clist == b8x8info->best8x8pdir[mode][block8x8]) ? bestref : -1;
  773.             }
  774.             for (block4x4 = 0; block4x4 < 4; block4x4++)
  775.             {
  776.               block_x = img->block_x + 2 * (block8x8 & 0x01) + (block4x4 & 0x01);
  777.               block_y = img->block_y + 2 * (block8x8 >> 1) + (block4x4 >> 1);
  778.               enc_picture->motion.ref_idx[clist][block_y][block_x] = curref;
  779.             }
  780.           }
  781.         }
  782.       }
  783.       else
  784.       {
  785.         for (j=0;j<4;j++)
  786.         {
  787.           block_y = img->block_y + j;
  788.           for (i=0;i<4;i++)
  789.           {
  790.             block_x = img->block_x + i;
  791.             k = 2*(j >> 1) + (i >> 1);
  792.             l = 2*(j & 0x01) + (i & 0x01);
  793.             if(mode == P8x8 && b8x8info->best8x8mode[k]==0)
  794.             {
  795.               enc_picture->motion.ref_idx[LIST_0][block_y][block_x] = direct_ref_idx[LIST_0][block_y][block_x];
  796.               enc_picture->motion.ref_idx[LIST_1][block_y][block_x] = direct_ref_idx[LIST_1][block_y][block_x];
  797.             }
  798.             else
  799.             {
  800.               enc_picture->motion.ref_idx[LIST_0][block_y][block_x] = (IS_FW ? b8x8info->best8x8l0ref[mode][k] : -1);
  801.               enc_picture->motion.ref_idx[LIST_1][block_y][block_x] = (IS_BW ? b8x8info->best8x8l1ref[mode][k] : -1);
  802.             }
  803.           }        
  804.         }
  805.       }
  806.     }
  807.     else
  808.     {
  809.       if (mode == 1)
  810.       {
  811.         cref[0] = b8x8info->best8x8pdir[mode][0] == 0 ? b8x8info->best8x8l0ref[mode][0] : -1;
  812.         j = img->block_y;
  813.         memset(&enc_picture->motion.ref_idx[LIST_0][j++][img->block_x], cref[0], 4 * sizeof(char));
  814.         memset(&enc_picture->motion.ref_idx[LIST_0][j++][img->block_x], cref[0], 4 * sizeof(char));
  815.         memset(&enc_picture->motion.ref_idx[LIST_0][j++][img->block_x], cref[0], 4 * sizeof(char));
  816.         memset(&enc_picture->motion.ref_idx[LIST_0][j  ][img->block_x], cref[0], 4 * sizeof(char));
  817.       }
  818.       else if (mode == 2)
  819.       {
  820.         cref[0] = b8x8info->best8x8pdir[mode][0] == 0 ? b8x8info->best8x8l0ref[mode][0] : -1;
  821.         j = img->block_y;
  822.         memset(&enc_picture->motion.ref_idx[LIST_0][j++][img->block_x], cref[0], 4 * sizeof(char));
  823.         memset(&enc_picture->motion.ref_idx[LIST_0][j++][img->block_x], cref[0], 4 * sizeof(char));
  824.         cref[0] = b8x8info->best8x8pdir[mode][2] == 0 ? b8x8info->best8x8l0ref[mode][2] : -1;
  825.         memset(&enc_picture->motion.ref_idx[LIST_0][j++][img->block_x], cref[0], 4 * sizeof(char));
  826.         memset(&enc_picture->motion.ref_idx[LIST_0][j  ][img->block_x], cref[0], 4 * sizeof(char));
  827.       }      
  828.       else if (mode == 3)
  829.       {
  830.         j = img->block_y;
  831.         i = img->block_x;
  832.         cref[0] = (b8x8info->best8x8pdir[mode][0] == 0) ? b8x8info->best8x8l0ref[mode][0] : -1;
  833.         enc_picture->motion.ref_idx[LIST_0][j  ][i++] = cref[0];
  834.         enc_picture->motion.ref_idx[LIST_0][j  ][i++] = cref[0];
  835.         cref[0] = (b8x8info->best8x8pdir[mode][1] == 0) ? b8x8info->best8x8l0ref[mode][1] : -1;
  836.         enc_picture->motion.ref_idx[LIST_0][j  ][i++] = cref[0];
  837.         enc_picture->motion.ref_idx[LIST_0][j++][i  ] = cref[0];
  838.         memcpy(&enc_picture->motion.ref_idx[LIST_0][j++][img->block_x], &enc_picture->motion.ref_idx[LIST_0][img->block_y][img->block_x], 4 * sizeof(char));
  839.         memcpy(&enc_picture->motion.ref_idx[LIST_0][j++][img->block_x], &enc_picture->motion.ref_idx[LIST_0][img->block_y][img->block_x], 4 * sizeof(char));
  840.         memcpy(&enc_picture->motion.ref_idx[LIST_0][j  ][img->block_x], &enc_picture->motion.ref_idx[LIST_0][img->block_y][img->block_x], 4 * sizeof(char));
  841.       }      
  842.       else
  843.       {
  844.         for (j=0;j<4;j++)
  845.         {
  846.           block_y = img->block_y + j;
  847.           for (i=0;i<4;i++)
  848.           {
  849.             block_x = img->block_x + i;
  850.             k = 2*(j >> 1) + (i >> 1);
  851.             l = 2*(j & 0x01) + (i & 0x01);
  852.             enc_picture->motion.ref_idx[LIST_0][block_y][block_x] = (IS_FW ? b8x8info->best8x8l0ref[mode][k] : -1);
  853.           }
  854.         }
  855.       }
  856.     }
  857.   }
  858.   if (bframe)
  859.   {
  860.     for (clist = LIST_0; clist <= LIST_1; clist++)
  861.     {
  862.       for (j = img->block_y; j < img->block_y + 4; j++)
  863.         for (i = img->block_x; i < img->block_x + 4;i++)
  864.         {
  865.           cur_ref = (int) enc_picture->motion.ref_idx[clist][j][i];
  866.           enc_picture->motion.ref_pic_id [clist][j][i] = (cur_ref>=0
  867.             ? enc_picture->ref_pic_num[clist + currMB->list_offset][cur_ref]
  868.             : -1);
  869.         }
  870.     }
  871.   }
  872.   else
  873.   {
  874.     for (j = img->block_y; j < img->block_y + 4; j++)
  875.       for (i = img->block_x; i < img->block_x + 4;i++)
  876.       {
  877.         cur_ref = (int) enc_picture->motion.ref_idx[LIST_0][j][i];
  878.         enc_picture->motion.ref_pic_id [LIST_0][j][i] = (cur_ref>=0
  879.           ? enc_picture->ref_pic_num[LIST_0 + currMB->list_offset][cur_ref]
  880.           : -1);
  881.       }
  882.   }
  883. #undef IS_FW
  884. #undef IS_BW
  885. }
  886. /*!
  887.  *************************************************************************************
  888.  * brief
  889.  *    Sets Coefficients and reconstruction for an 8x8 block
  890.  *************************************************************************************
  891.  */
  892. void SetCoeffAndReconstruction8x8 (Macroblock* currMB)
  893. {
  894.   int block, k, j, i, uv;
  895.   int cur_ref;
  896.   //============= MIXED TRANSFORM SIZES FOR 8x8 PARTITION ==============
  897.   //--------------------------------------------------------------------
  898.   int l;
  899.   int bframe = img->type==B_SLICE;
  900.   if (currMB->luma_transform_size_8x8_flag)
  901.   {
  902.     //============= set mode and ref. frames ==============
  903.     for(i = 0;i<4;i++)
  904.     {
  905.       currMB->b8mode[i]    = tr8x8.part8x8mode[i];
  906.       currMB->b8pdir[i]    = tr8x8.part8x8pdir[i];
  907.       currMB->bipred_me[i] = tr8x8.part8x8bipred[i];
  908.      }
  909.     if (bframe)
  910.     {
  911.       for (j = 0;j<4;j++)
  912.       {
  913.         for (i = 0;i<4;i++)
  914.         {
  915.           k = 2*(j >> 1)+(i >> 1);
  916.           l = 2*(j & 0x01)+(i & 0x01);
  917.           enc_picture->motion.ref_idx[LIST_0][img->block_y+j][img->block_x+i] = ((currMB->b8pdir[k] & 0x01) == 0) ? tr8x8.part8x8l0ref[k] : - 1;
  918.           enc_picture->motion.ref_idx[LIST_1][img->block_y+j][img->block_x+i] =  (currMB->b8pdir[k] > 0)          ? tr8x8.part8x8l1ref[k] : - 1;
  919.         }
  920.       }
  921.     }
  922.     else
  923.     {
  924.       for (j = 0;j<4;j++)
  925.       {
  926.         for (i = 0;i<4;i++)
  927.         {
  928.           k = 2*(j >> 1)+(i >> 1);
  929.           l = 2*(j & 0x01)+(i & 0x01);
  930.           enc_picture->motion.ref_idx[LIST_0][img->block_y+j][img->block_x+i] = tr8x8.part8x8l0ref[k];
  931.         }
  932.       }
  933.     }
  934.     for (j = img->block_y;j<img->block_y + BLOCK_MULTIPLE;j++)
  935.     {
  936.       for (i = img->block_x;i<img->block_x + BLOCK_MULTIPLE;i++)
  937.       {
  938.         cur_ref = (int) enc_picture->motion.ref_idx[LIST_0][j][i];
  939.         enc_picture->motion.ref_pic_id [LIST_0][j][i] =(cur_ref>=0
  940.           ? enc_picture->ref_pic_num[LIST_0 + currMB->list_offset][cur_ref]
  941.           : -1);
  942.       }
  943.     }
  944.     if (bframe)
  945.     {
  946.       for (j = img->block_y; j < img->block_y + BLOCK_MULTIPLE; j++)
  947.       {
  948.         for (i = img->block_x;i<img->block_x + BLOCK_MULTIPLE;i++)
  949.         {
  950.           cur_ref = (int) enc_picture->motion.ref_idx[LIST_1][j][i];
  951.           enc_picture->motion.ref_pic_id [LIST_1][j][i] = (cur_ref>=0
  952.             ? enc_picture->ref_pic_num[LIST_1 + currMB->list_offset][cur_ref]
  953.             : -1);
  954.         }
  955.       }
  956.     }
  957.     //====== set the mv's for 8x8 partition with transform size 8x8 ======
  958.     //save the mv data for 4x4 transform
  959.     StoreMV8x8(1);
  960.     //set new mv data for 8x8 transform
  961.     RestoreMV8x8(0);
  962.     //============= get pre-calculated data ==============
  963.     //restore coefficients from 8x8 transform
  964.     memcpy (img->cofAC[0][0][0],cofAC8x8ts[0][0][0][0], 4 * 4 * 2 * 65 * sizeof(int));
  965.     if (img->P444_joined)
  966.     {
  967.       for (uv=0; uv<2; uv++)
  968.       {
  969.         for (block = 0; block<4; block++)
  970.         {
  971.           memcpy (img->cofAC[4+block+uv*4][0][0],cofAC8x8ts[uv + 1][block][0][0], 4 * 2 * 65 * sizeof(int));
  972.         }
  973.       }
  974.     }
  975.     //restore reconstruction
  976.     if (cnt_nonz8_8x8ts <= _LUMA_8x8_COEFF_COST_ &&
  977.       ((currMB->qp_scaled[0])!=0 || img->lossless_qpprime_flag==0) &&
  978.       (img->type!=SP_SLICE))// modif ES added last condition (we probably never go there so is the next modification useful ? check)
  979.     {
  980.       currMB->cbp     = 0;
  981.       currMB->cbp_blk = 0;
  982.       for (j = 0; j < MB_BLOCK_SIZE; j++)
  983.       {
  984.         memcpy(&enc_picture->imgY[img->pix_y+j][img->pix_x], tr8x8.mpr8x8[j], MB_BLOCK_SIZE * sizeof(imgpel));
  985.       }
  986.       if(img->type==SP_SLICE &&(!si_frame_indicator && !sp2_frame_indicator ))
  987.       {
  988.         for (j = 0; j < MB_BLOCK_SIZE; j++)
  989.         {
  990.           memcpy(&lrec[img->pix_y+j][img->pix_x],tr8x8.lrec[j], MB_BLOCK_SIZE * sizeof(int));
  991.         }
  992.       }
  993.       memset( img->cofAC[0][0][0], 0, 4 * 4 * 2 * 65 * sizeof(int));
  994.       if(img->P444_joined)
  995.       {
  996.         for (j = 0; j < MB_BLOCK_SIZE; j++)
  997.         {
  998.           memcpy(&enc_picture->imgUV[0][img->pix_y+j][img->pix_x], tr8x8.mpr8x8CbCr[0][j], MB_BLOCK_SIZE * sizeof(imgpel));
  999.           memcpy(&enc_picture->imgUV[1][img->pix_y+j][img->pix_x], tr8x8.mpr8x8CbCr[1][j], MB_BLOCK_SIZE * sizeof(imgpel));
  1000.         }
  1001.         for (uv=0; uv<2; uv++)
  1002.         {
  1003.           for (block = 0; block<4; block++)
  1004.           {
  1005.              memset( img->cofAC[4+block+uv*4][0][0], 0, 4 * 2 * 65 * sizeof(int));
  1006.           }
  1007.         }
  1008.       }
  1009.     }
  1010.     else
  1011.     {
  1012.       currMB->cbp     = cbp8_8x8ts;
  1013.       currMB->cbp_blk = cbp_blk8_8x8ts;
  1014.       for (j = 0; j < MB_BLOCK_SIZE; j++)
  1015.       {
  1016.         memcpy (&enc_picture->imgY[img->pix_y+j][img->pix_x],tr8x8.rec_mbY8x8[j], MB_BLOCK_SIZE * sizeof(imgpel));
  1017.       }
  1018.       if(img->type==SP_SLICE &&(!si_frame_indicator && !sp2_frame_indicator))
  1019.       {
  1020.         for (j = 0; j < MB_BLOCK_SIZE; j++)
  1021.         {
  1022.           memcpy (&lrec[img->pix_y+j][img->pix_x],tr8x8.lrec[j], MB_BLOCK_SIZE * sizeof(int));
  1023.         }
  1024.       }
  1025.       if (img->P444_joined) 
  1026.       {
  1027.         cmp_cbp[1] = cmp_cbp[2] = cbp8_8x8ts;
  1028.         for (j = 0; j < MB_BLOCK_SIZE; j++)
  1029.         {
  1030.           memcpy (&enc_picture->imgUV[0][img->pix_y+j][img->pix_x],tr8x8.rec_mb8x8_cr[0][j], MB_BLOCK_SIZE * sizeof(imgpel)); 
  1031.           memcpy (&enc_picture->imgUV[1][img->pix_y+j][img->pix_x],tr8x8.rec_mb8x8_cr[1][j], MB_BLOCK_SIZE * sizeof(imgpel)); 
  1032.         }
  1033.       }
  1034.     }
  1035.   }
  1036.   else
  1037.   {
  1038.     //============= get pre-calculated data ==============
  1039.     //---------------------------------------------------
  1040.     //--- restore coefficients ---
  1041.     memcpy (img->cofAC[0][0][0],cofAC8x8[0][0][0], (4+img->num_blk8x8_uv) * 4 * 2 * 65 * sizeof(int));
  1042.     if (img->P444_joined) 
  1043.     {
  1044.       for (block = 0; block<4; block++)
  1045.       {
  1046.         memcpy (img->cofAC[block+4][0][0],cofAC8x8CbCr[0][block][0][0], 4 * 2 * 65 * sizeof(int));     
  1047.         memcpy (img->cofAC[block+8][0][0],cofAC8x8CbCr[1][block][0][0], 4 * 2 * 65 * sizeof(int));   
  1048.       }
  1049.     }
  1050.     if (cnt_nonz_8x8<=5 && img->type!=SP_SLICE &&
  1051.       ((currMB->qp_scaled[0])!=0 || img->lossless_qpprime_flag==0))
  1052.     {
  1053.       currMB->cbp     = 0;
  1054.       currMB->cbp_blk = 0;
  1055.       for (j = 0; j < MB_BLOCK_SIZE; j++)
  1056.       {
  1057.         memcpy (&enc_picture->imgY[img->pix_y+j][img->pix_x],tr4x4.mpr8x8[j], MB_BLOCK_SIZE * sizeof(imgpel));
  1058.       }
  1059.       if(img->type ==SP_SLICE &&(!si_frame_indicator && !sp2_frame_indicator))
  1060.       {
  1061.         for (j = 0; j < MB_BLOCK_SIZE; j++)
  1062.         {
  1063.           memcpy (&lrec[img->pix_y+j][img->pix_x],tr4x4.lrec[j], MB_BLOCK_SIZE * sizeof(int)); // restore coeff. SP frame
  1064.         }
  1065.       }
  1066.       memset( img->cofAC[0][0][0], 0, 4 * 4 * 2 * 65 * sizeof(int));
  1067.       if (img->P444_joined)
  1068.       {
  1069.         for (j = 0; j < MB_BLOCK_SIZE; j++)
  1070.         {
  1071.           memcpy (&enc_picture->imgUV[0][img->pix_y+j][img->pix_x],tr4x4.mpr8x8CbCr[0][j], MB_BLOCK_SIZE * sizeof(imgpel));    
  1072.           memcpy (&enc_picture->imgUV[1][img->pix_y+j][img->pix_x],tr4x4.mpr8x8CbCr[1][j], MB_BLOCK_SIZE * sizeof(imgpel));  
  1073.         }
  1074.         for (uv=0; uv<2; uv++)
  1075.         {
  1076.           for (block = 0; block<4; block++)
  1077.           {
  1078.             memset( img->cofAC[4+block+uv*4][0][0], 0, 4 * 2 * 65 * sizeof(int));
  1079.           }
  1080.         }
  1081.       }
  1082.     }
  1083.     else
  1084.     {
  1085.       currMB->cbp     = cbp8x8;
  1086.       currMB->cbp_blk = cbp_blk8x8;
  1087.       for (j = 0; j < MB_BLOCK_SIZE; j++)
  1088.       {
  1089.         memcpy (&enc_picture->imgY[img->pix_y+j][img->pix_x],tr4x4.rec_mbY8x8[j], MB_BLOCK_SIZE * sizeof(imgpel));
  1090.       }
  1091.       if (params->rdopt == 3)
  1092.       {
  1093.         errdo_get_best_block(img, enc_picture->p_dec_img[0], decs->dec_mbY8x8, 0, MB_BLOCK_SIZE);
  1094.       }
  1095.       if(img->type==SP_SLICE &&(!si_frame_indicator && !sp2_frame_indicator))
  1096.       {
  1097.         for (j = 0; j < MB_BLOCK_SIZE; j++)
  1098.         {
  1099.           memcpy (&lrec[img->pix_y+j][img->pix_x],tr4x4.lrec[j], MB_BLOCK_SIZE * sizeof(int));
  1100.         }
  1101.       }
  1102.       if (img->P444_joined)
  1103.       {
  1104.         cmp_cbp[1] = cmp_cbp[2] = cbp8x8;
  1105.         for (j = 0; j < MB_BLOCK_SIZE; j++)
  1106.         {
  1107.           memcpy (&enc_picture->imgUV[0][img->pix_y+j][img->pix_x],tr4x4.rec_mb8x8_cr[0][j], MB_BLOCK_SIZE * sizeof(imgpel));
  1108.           memcpy (&enc_picture->imgUV[1][img->pix_y+j][img->pix_x],tr4x4.rec_mb8x8_cr[1][j], MB_BLOCK_SIZE * sizeof(imgpel));
  1109.         }
  1110.       }
  1111.     }
  1112.   }
  1113. }
  1114. /*!
  1115.  *************************************************************************************
  1116.  * brief
  1117.  *    Sets motion vectors for a macroblock
  1118.  *************************************************************************************
  1119.  */
  1120. void SetMotionVectorsMB (Macroblock* currMB, int bframe)
  1121. {
  1122.   int i, j, k, l, mode8, pdir8, ref, by, bx;
  1123.   short ******all_mv  = img->all_mv;
  1124.   short ******pred_mv = img->pred_mv;
  1125.   short bipred_me8;
  1126.   int  l1_ref;
  1127.   int jdiv, jmod;
  1128.   // copy all the motion vectors into rdopt structure
  1129.   // Can simplify this by copying the MV's of the best mode (TBD)
  1130.   // Should maybe add code to check for Intra only profiles
  1131.   if (img->MbaffFrameFlag || (params->UseRDOQuant && params->RDOQ_QP_Num > 1))
  1132.   {
  1133.     memcpy(&rdopt->pred_mv [0][0][0][0][0][0], &pred_mv [0][0][0][0][0][0], 2 * img->max_num_references * 9 * 4 * 4 * 2 * sizeof(short));
  1134.     memcpy(&rdopt->all_mv  [0][0][0][0][0][0], &all_mv  [0][0][0][0][0][0], 2 * img->max_num_references * 9 * 4 * 4 * 2 * sizeof(short));
  1135.   }
  1136.   if (!bframe)
  1137.   {
  1138.     for (j = 0; j<4; j++)
  1139.     {
  1140.       jmod = j & 0x01;
  1141.       jdiv = j >>   1;
  1142.       by    = img->block_y+j;
  1143.       for (i = 0; i<4; i++)
  1144.       {
  1145.         mode8 = currMB->b8mode[k=2*jdiv+(i>>1)];
  1146.         l     = 2*jmod + (i & 0x01);
  1147.         bx   = img->block_x+i;
  1148.         pdir8 = currMB->b8pdir[k];
  1149.         ref    = enc_picture->motion.ref_idx[LIST_0][by][bx];
  1150.         if (pdir8>=0)
  1151.         {
  1152.           enc_picture->motion.mv[LIST_0][by][bx][0] = all_mv [LIST_0][ ref][mode8][j][i][0];
  1153.           enc_picture->motion.mv[LIST_0][by][bx][1] = all_mv [LIST_0][ ref][mode8][j][i][1];
  1154.         }
  1155.         else
  1156.         {
  1157.           enc_picture->motion.mv[LIST_0][by][bx][0] = 0;
  1158.           enc_picture->motion.mv[LIST_0][by][bx][1] = 0;
  1159.         }
  1160.       }
  1161.     }
  1162.   }
  1163.   else
  1164.   {
  1165.     for (j = 0; j<4; j++)
  1166.     {
  1167.       jmod = j & 0x01;
  1168.       jdiv = j >>   1;
  1169.       by    = img->block_y+j;
  1170.       for (i = 0; i<4; i++)
  1171.       {
  1172.         mode8 = currMB->b8mode[k=2*jdiv+(i>>1)];
  1173.         bipred_me8  = currMB->bipred_me[k]; 
  1174.         l     = 2*jmod + (i & 0x01);
  1175.         bx    = img->block_x+i;
  1176.         pdir8 = currMB->b8pdir[k];
  1177.         ref    = enc_picture->motion.ref_idx[LIST_0][by][bx];
  1178.         l1_ref = enc_picture->motion.ref_idx[LIST_1][by][bx];
  1179.         if ( bipred_me8 && (pdir8 == 2) && is_bipred_enabled(currMB->mb_type))
  1180.         {
  1181.           all_mv  = img->bipred_mv[bipred_me8 - 1]; 
  1182.           ref = 0;
  1183.           l1_ref = 0;
  1184.         }
  1185.         else
  1186.         {
  1187.           all_mv  = img->all_mv;
  1188.         }
  1189.         if (pdir8==-1) // intra
  1190.         {
  1191.           enc_picture->motion.mv[LIST_0][by][bx][0] = 0;
  1192.           enc_picture->motion.mv[LIST_0][by][bx][1] = 0;
  1193.           enc_picture->motion.mv[LIST_1][by][bx][0] = 0;
  1194.           enc_picture->motion.mv[LIST_1][by][bx][1] = 0;
  1195.         }
  1196.         else if (pdir8==0) // list 0
  1197.         {
  1198.           enc_picture->motion.mv[LIST_0][by][bx][0]   = all_mv [LIST_0][ ref][mode8][j][i][0];
  1199.           enc_picture->motion.mv[LIST_0][by][bx][1]   = all_mv [LIST_0][ ref][mode8][j][i][1];
  1200.           enc_picture->motion.mv[LIST_1][by][bx][0]   = 0;
  1201.           enc_picture->motion.mv[LIST_1][by][bx][1]   = 0;
  1202.           enc_picture->motion.ref_idx[LIST_1][by][bx] = -1;
  1203.         }
  1204.         else if (pdir8==1) // list 1
  1205.         {
  1206.           enc_picture->motion.mv[LIST_0][by][bx][0]   = 0;
  1207.           enc_picture->motion.mv[LIST_0][by][bx][1]   = 0;
  1208.           enc_picture->motion.ref_idx[LIST_0][by][bx] = -1;
  1209.           enc_picture->motion.mv[LIST_1][by][bx][0]   = all_mv [LIST_1][l1_ref][mode8][j][i][0];
  1210.           enc_picture->motion.mv[LIST_1][by][bx][1]   = all_mv [LIST_1][l1_ref][mode8][j][i][1];
  1211.         }
  1212.         else if (pdir8==2) // bipredictive
  1213.         {
  1214.           enc_picture->motion.mv[LIST_0][by][bx][0] = all_mv [LIST_0][   ref][mode8][j][i][0];
  1215.           enc_picture->motion.mv[LIST_0][by][bx][1] = all_mv [LIST_0][   ref][mode8][j][i][1];
  1216.           enc_picture->motion.mv[LIST_1][by][bx][0] = all_mv [LIST_1][l1_ref][mode8][j][i][0];
  1217.           enc_picture->motion.mv[LIST_1][by][bx][1] = all_mv [LIST_1][l1_ref][mode8][j][i][1];
  1218.           // copy all the motion vectors into rdopt structure
  1219.           // Can simplify this by copying the MV's of the best mode (TBD)
  1220.           // Should maybe add code to check for Intra only profiles
  1221.           if (img->MbaffFrameFlag || (params->UseRDOQuant && params->RDOQ_QP_Num > 1))
  1222.           {
  1223.             rdopt->all_mv [LIST_0][   ref][mode8][j][i][0] = all_mv [LIST_0][   ref][mode8][j][i][0];
  1224.             rdopt->all_mv [LIST_0][   ref][mode8][j][i][1] = all_mv [LIST_0][   ref][mode8][j][i][1];
  1225.             rdopt->all_mv [LIST_1][l1_ref][mode8][j][i][0] = all_mv [LIST_1][l1_ref][mode8][j][i][0];
  1226.             rdopt->all_mv [LIST_1][l1_ref][mode8][j][i][1] = all_mv [LIST_1][l1_ref][mode8][j][i][1];
  1227.           }
  1228.         }
  1229.         else
  1230.         {
  1231.           error("invalid direction mode", 255);
  1232.         }
  1233.       }
  1234.     }
  1235.   }
  1236. }
  1237. /*!
  1238.  *************************************************************************************
  1239.  * brief
  1240.  *    R-D Cost for a macroblock
  1241.  *************************************************************************************
  1242.  */
  1243. int RDCost_for_macroblocks (Macroblock  *currMB,   // <-- Current Macroblock to code
  1244.                             double   lambda,       // <-- lagrange multiplier
  1245.                             int      mode,         // <-- modus (0-COPY/DIRECT, 1-16x16, 2-16x8, 3-8x16, 4-8x8(+), 5-Intra4x4, 6-Intra16x16)
  1246.                             double*  min_rdcost,   // <-> minimum rate-distortion cost
  1247.                             double*  min_dcost,   // <-> distortion of mode which has minimum rate-distortion cost.
  1248.                             double*  min_rate,     // --> bitrate of mode which has minimum rate-distortion cost.
  1249.                             int i16mode,
  1250.                             int is_cavlc)
  1251. {
  1252.   int         i, j, k; //, k, ****ip4;
  1253.   int         j1, j2;
  1254.   int         rate = 0, coeff_rate = 0;
  1255.   int64       distortion = 0;
  1256.   double      rdcost;
  1257.   int         prev_mb_nr  = FmoGetPreviousMBNr(img->current_mb_nr);  
  1258.   Macroblock  *prevMB   = (prev_mb_nr >= 0) ? &img->mb_data[prev_mb_nr] : NULL;
  1259.   int         bframe    = (img->type==B_SLICE);
  1260.   int         tmp_cc;
  1261.   int         use_of_cc =  (img->type!=I_SLICE &&  is_cavlc);
  1262.   int         cc_rate, dummy;
  1263.   double      dummy_d;
  1264.   imgpel     (*mb_pred)[16] = img->mb_pred[0];
  1265.   imgpel     (*curr_mpr_16x16)[16][16] = img->mpr_16x16[0];
  1266.   //=====
  1267.   //=====  SET REFERENCE FRAMES AND BLOCK MODES
  1268.   //=====
  1269.   SetModesAndRefframeForBlocks (currMB, mode);
  1270.   
  1271.   //=====
  1272.   //=====  GET COEFFICIENTS, RECONSTRUCTIONS, CBP
  1273.   //=====
  1274.   if (bframe && mode==0)
  1275.   {
  1276.     int block_x = (img->pix_x >> 2);
  1277.     int block_y = (img->pix_y >> 2);
  1278.     for (j = block_y; j < block_y + 4;j++)
  1279.       for (i = block_x; i < block_x + 4;i++)
  1280.         if (direct_pdir[j][i] < 0)
  1281.           return 0;
  1282.   }
  1283.   // Test MV limits for Skip Mode. This could be necessary for MBAFF case Frame MBs.
  1284.   if ((img->MbaffFrameFlag) && (!currMB->mb_field) && (img->type==P_SLICE) && (mode==0) )
  1285.   {
  1286.     if (out_of_bounds_mvs(img, img->all_mv[0][0][0][0][0], Q_PEL))
  1287.       return 0;
  1288.   }
  1289.   if (img->AdaptiveRounding)
  1290.   {
  1291.     memset(&(img->fadjust4x4[0][0][0]), 0, MB_PIXELS * sizeof(int));
  1292.     memset(&(img->fadjust8x8[0][0][0]), 0, MB_PIXELS * sizeof(int));
  1293.     if (img->yuv_format != 0)
  1294.     {
  1295.       memset(&(img->fadjust4x4Cr[0][0][0][0]), 0, img->mb_cr_size_y * img->mb_cr_size_x * sizeof(int));
  1296.       memset(&(img->fadjust4x4Cr[1][0][0][0]), 0, img->mb_cr_size_y * img->mb_cr_size_x  * sizeof(int));
  1297.       memset(&(img->fadjust8x8Cr[0][0][0][0]), 0, img->mb_cr_size_y * img->mb_cr_size_x  * sizeof(int));
  1298.       memset(&(img->fadjust8x8Cr[1][0][0][0]), 0, img->mb_cr_size_y * img->mb_cr_size_x  * sizeof(int));
  1299.     }
  1300.   }
  1301.   if (mode<P8x8)
  1302.   {
  1303.     LumaResidualCoding (currMB, is_cavlc);
  1304.     // This code seems unnecessary 
  1305.     if(mode==0 && currMB->cbp!=0 && (img->type != B_SLICE || img->NoResidueDirect==1))
  1306.       return 0;
  1307.     if (img->P444_joined)      
  1308.     {
  1309.       if(mode==0 && (currMB->cbp==0 && cmp_cbp[1] == 0 && cmp_cbp[2] == 0)&& currMB->luma_transform_size_8x8_flag == 1) //for B_skip, luma_transform_size_8x8_flag=0 only
  1310.         return 0;
  1311.     }
  1312.     else
  1313.     {
  1314.       if(mode==0 && currMB->cbp==0 && currMB->luma_transform_size_8x8_flag == 1) //for B_skip, luma_transform_size_8x8_flag=0 only        
  1315.         return 0;
  1316.     }
  1317.   }
  1318.   else if (mode==P8x8)
  1319.   {
  1320.     SetCoeffAndReconstruction8x8 (currMB);
  1321.   }
  1322.   else if (mode==I4MB)
  1323.   {
  1324.     currMB->cbp = Mode_Decision_for_Intra4x4Macroblock (currMB, lambda, &dummy_d, is_cavlc);
  1325.   }
  1326.   else if (mode==I16MB)
  1327.   {
  1328.     Intra16x16_Mode_Decision  (currMB, &i16mode, is_cavlc);
  1329.   }
  1330.   else if(mode==I8MB)
  1331.   {
  1332.     currMB->cbp = Mode_Decision_for_new_Intra8x8Macroblock(currMB, lambda, &dummy_d);
  1333.   }
  1334.   else if(mode==IPCM)
  1335.   {
  1336.     for (j = 0; j < MB_BLOCK_SIZE; j++)
  1337.     {
  1338.       memcpy(&enc_picture->imgY[j + img->pix_y][img->opix_x], &pCurImg[j + img->opix_y][img->opix_x], MB_BLOCK_SIZE * sizeof(imgpel));
  1339.     }
  1340.     if ((img->yuv_format != YUV400) && !IS_INDEPENDENT(params))
  1341.     {
  1342.       // CHROMA
  1343.       for (j = 0; j<img->mb_cr_size_y; j++)
  1344.       {
  1345.         j1 = j + img->opix_c_y;
  1346.         j2 = j + img->pix_c_y;
  1347.         memcpy(&enc_picture->imgUV[0][j2][img->opix_c_x], &pImgOrg[1][j1][img->opix_c_x], img->mb_cr_size_x * sizeof(imgpel));
  1348.         memcpy(&enc_picture->imgUV[1][j2][img->opix_c_x], &pImgOrg[2][j1][img->opix_c_x], img->mb_cr_size_x * sizeof(imgpel));
  1349.       }
  1350.     }
  1351.     for (j=0;j<4;j++)
  1352.       for (i=0; i<(4+img->num_blk8x8_uv); i++)
  1353.         img->nz_coeff[img->current_mb_nr][j][i] = 16;
  1354.   }
  1355.   if (params->rdopt==3 && img->type!=B_SLICE)
  1356.   {
  1357.     // We need the reconstructed prediction residue for the simulated decoders.
  1358.     // Should we be handing imgY here or p_curr_img instead of p_img[0]? This could make it more generic
  1359.     ////compute_residue_mb (img, &enc_picture->p_img[0][img->pix_y], decs->res_img[0], mode == I16MB ? i16mode : -1);
  1360.     compute_residue_block (img, &enc_picture->p_curr_img[img->pix_y], decs->res_img[0], mode == I16MB ? img->mpr_16x16[0][i16mode] : img->mb_pred[0], 0, 16);
  1361.   }
  1362.   //Rate control
  1363.   if (params->RCEnable)
  1364.   {
  1365.     if (mode == I16MB)
  1366.       memcpy(pred, curr_mpr_16x16[i16mode], MB_PIXELS * sizeof(imgpel));
  1367.     else
  1368.       memcpy(pred, mb_pred, MB_PIXELS * sizeof(imgpel));
  1369.   }
  1370.   img->i16offset = 0;
  1371.   dummy = 0;
  1372.   if (((img->yuv_format!=YUV400) && (active_sps->chroma_format_idc != YUV444)) && (mode != IPCM))
  1373.     ChromaResidualCoding (currMB, is_cavlc);
  1374.   if (mode==I16MB)
  1375.     img->i16offset = I16Offset  (currMB->cbp, i16mode);
  1376.   //=====
  1377.   //=====   GET DISTORTION
  1378.   //=====
  1379.   // LUMA
  1380.   if (params->rdopt == 3 && img->type!=B_SLICE)
  1381.   {
  1382.     if (mode != P8x8)
  1383.     {
  1384.       for (k = 0; k<params->NoOfDecoders ;k++)
  1385.       {
  1386.         decode_one_mb (img, enc_picture, k, currMB);
  1387.         distortion += compute_SSE(&pCurImg[img->opix_y], &enc_picture->p_dec_img[0][k][img->opix_y], img->opix_x, img->opix_x, MB_BLOCK_SIZE, MB_BLOCK_SIZE);
  1388.       }
  1389.     }
  1390.     else
  1391.     {
  1392.       for (k = 0; k<params->NoOfDecoders ;k++)
  1393.       {
  1394.         distortion += compute_SSE(&pCurImg[img->opix_y], &enc_picture->p_dec_img[0][k][img->opix_y], img->opix_x, img->opix_x, MB_BLOCK_SIZE, MB_BLOCK_SIZE);
  1395.       }
  1396.     }
  1397.     distortion /= params->NoOfDecoders;
  1398.     if ((img->yuv_format != YUV400) && (active_sps->chroma_format_idc != YUV444))
  1399.     {
  1400.       // CHROMA
  1401.       distortion += compute_SSE(&pImgOrg[1][img->opix_c_y], &enc_picture->imgUV[0][img->pix_c_y], img->opix_c_x, img->pix_c_x, img->mb_cr_size_y, img->mb_cr_size_x);
  1402.       distortion += compute_SSE(&pImgOrg[2][img->opix_c_y], &enc_picture->imgUV[1][img->pix_c_y], img->opix_c_x, img->pix_c_x, img->mb_cr_size_y, img->mb_cr_size_x);
  1403.     }
  1404.   }
  1405.   else
  1406.   {
  1407.     distortion = getDistortion(currMB);
  1408.   }
  1409.   //=====   S T O R E   C O D I N G   S T A T E   =====
  1410.   //---------------------------------------------------
  1411.   store_coding_state (currMB, cs_cm);
  1412.   //=====
  1413.   //=====   GET RATE
  1414.   //=====
  1415.   //----- macroblock header -----
  1416.   if (use_of_cc)
  1417.   {
  1418.     if (currMB->mb_type!=0 || (bframe && currMB->cbp!=0))
  1419.     {
  1420.       // cod counter and macroblock mode are written ==> do not consider code counter
  1421.       tmp_cc = img->cod_counter;
  1422.       rate   = writeMBLayer (currMB, 1, &coeff_rate);
  1423.       ue_linfo (tmp_cc, dummy, &cc_rate, &dummy);
  1424.       rate  -= cc_rate;
  1425.       img->cod_counter = tmp_cc;
  1426.     }
  1427.     else
  1428.     {
  1429.       // cod counter is just increased  ==> get additional rate
  1430.       ue_linfo (img->cod_counter + 1, dummy, &rate,    &dummy);
  1431.       ue_linfo (img->cod_counter    , dummy, &cc_rate, &dummy);
  1432.       rate -= cc_rate;
  1433.     }
  1434.   }
  1435.   else
  1436.   {
  1437.     rate = writeMBLayer (currMB, 1, &coeff_rate);
  1438.   }
  1439.   //=====   R E S T O R E   C O D I N G   S T A T E   =====
  1440.   //-------------------------------------------------------
  1441.   reset_coding_state (currMB, cs_cm);
  1442.   rdcost = (double)distortion + lambda * dmax(0.5,(double)rate);
  1443.   if (rdcost >= *min_rdcost ||
  1444.     ((currMB->qp_scaled[0]) == 0 && img->lossless_qpprime_flag == 1 && distortion != 0))
  1445.   {
  1446. #if FASTMODE
  1447.     // Reordering RDCost comparison order of mode 0 and mode 1 in P_SLICE
  1448.     // if RDcost of mode 0 and mode 1 is same, we choose best_mode is 0
  1449.     // This might not always be good since mode 0 is more biased towards rate than quality.
  1450.     if((img->type!=P_SLICE || mode != 0 || rdcost != *min_rdcost) || IS_FREXT_PROFILE(params->ProfileIDC))
  1451. #endif
  1452.       return 0;
  1453.   }
  1454.   if ((img->MbaffFrameFlag) && (mode ? 0: ((img->type == B_SLICE) ? !currMB->cbp:1)))  // AFF and current is skip
  1455.   {
  1456.     if (img->current_mb_nr & 0x01) //bottom
  1457.     {
  1458.       if (prevMB->mb_type ? 0:((img->type == B_SLICE) ? !prevMB->cbp:1)) //top is skip
  1459.       {
  1460.         if (!(field_flag_inference(currMB) == currMB->mb_field)) //skip only allowed when correct inference
  1461.           return 0;
  1462.       }
  1463.     }
  1464.   }
  1465.   //=====   U P D A T E   M I N I M U M   C O S T   =====
  1466.   //-----------------------------------------------------
  1467.   *min_rdcost = rdcost;
  1468.   *min_dcost = (double) distortion;
  1469.   *min_rate = lambda * (double)coeff_rate;
  1470. #ifdef BEST_NZ_COEFF
  1471.   for (j=0;j<4;j++)
  1472.     memcpy(&gaaiMBAFF_NZCoeff[j][0], &img->nz_coeff[img->current_mb_nr][j][0], (4 + img->num_blk8x8_uv) * sizeof(int));
  1473. #endif
  1474.   return 1;
  1475. }
  1476. /*!
  1477.  *************************************************************************************
  1478.  * brief
  1479.  *    Store macroblock parameters
  1480.  *************************************************************************************
  1481.  */
  1482. void store_macroblock_parameters (Macroblock *currMB, int mode)
  1483. {
  1484.   int  j, ****i4p, ***i3p;
  1485.   int  bframe   = (img->type==B_SLICE);
  1486.   //--- store best mode ---
  1487.   best_mode = mode;
  1488.   best_c_imode = currMB->c_ipred_mode;
  1489.   best_i16offset = img->i16offset;
  1490.   
  1491.   memcpy(b8mode, currMB->b8mode, BLOCK_MULTIPLE * sizeof(short));
  1492.   memcpy(b8bipred_me, currMB->bipred_me, BLOCK_MULTIPLE * sizeof(short));
  1493.   memcpy(b8pdir, currMB->b8pdir, BLOCK_MULTIPLE * sizeof(short));
  1494.   memcpy(b4_intra_pred_modes,   currMB->intra_pred_modes, MB_BLOCK_PARTITIONS * sizeof(char));
  1495.   memcpy(b8_intra_pred_modes8x8,currMB->intra_pred_modes8x8, MB_BLOCK_PARTITIONS * sizeof(char));
  1496.   for (j = 0 ; j < BLOCK_MULTIPLE; j++)
  1497.   {
  1498.     memcpy(&b4_ipredmode[j * BLOCK_MULTIPLE],&img->ipredmode   [img->block_y + j][img->block_x],BLOCK_MULTIPLE * sizeof(char));
  1499.     memcpy(b8_ipredmode8x8[j],               &img->ipredmode8x8[img->block_y + j][img->block_x],BLOCK_MULTIPLE * sizeof(char));
  1500.   }
  1501.   //--- reconstructed blocks ----
  1502.   for (j = 0; j < MB_BLOCK_SIZE; j++)
  1503.   {
  1504.     memcpy(rec_mbY[j], &enc_picture->imgY[img->pix_y+j][img->pix_x], MB_BLOCK_SIZE * sizeof(imgpel));
  1505.   }
  1506.   if((img->type==SP_SLICE) && (si_frame_indicator==0 && sp2_frame_indicator==0))
  1507.   {
  1508.     for (j = 0; j < MB_BLOCK_SIZE; j++)
  1509.     {
  1510.       memcpy(lrec_rec[j], &lrec[img->pix_y+j][img->pix_x], MB_BLOCK_SIZE * sizeof(int));//store coefficients SP frame
  1511.     }
  1512.   }
  1513.   if (img->AdaptiveRounding)
  1514.     store_adaptive_rounding_parameters (currMB, mode);
  1515.   if (img->yuv_format != YUV400)
  1516.   {
  1517.     int k;
  1518.     for (k = 0; k < 2; k++)
  1519.     {
  1520.       for (j = 0; j<img->mb_cr_size_y; j++)
  1521.       {
  1522.         memcpy(rec_mb_cr[k][j], &enc_picture->imgUV[k][img->pix_c_y+j][img->pix_c_x], img->mb_cr_size_x * sizeof(imgpel));
  1523.       }
  1524.     }
  1525.     if((img->type==SP_SLICE) && (si_frame_indicator==0 && sp2_frame_indicator==0))
  1526.     {
  1527.       //store uv coefficients SP frame
  1528.       for (k = 0; k < 2; k++)
  1529.       {
  1530.         for (j = 0; j<img->mb_cr_size_y; j++)
  1531.         {
  1532.           memcpy(lrec_rec_uv[k][j],&lrec_uv[k][img->pix_c_y+j][img->pix_c_x], img->mb_cr_size_x * sizeof(int));
  1533.         }
  1534.       }
  1535.     }
  1536.   }
  1537.   //--- store results of decoders ---
  1538.   if (params->rdopt == 3 && img->type!=B_SLICE)
  1539.   {
  1540.     errdo_store_best_block(img, decs->dec_mbY, enc_picture->p_dec_img[0], 0, 0, MB_BLOCK_SIZE);
  1541.   }
  1542.   //--- coeff, cbp, kac ---
  1543.   if (mode || bframe)
  1544.   {
  1545.     i4p=cofAC; cofAC=img->cofAC; img->cofAC=i4p;
  1546.     i3p=cofDC; cofDC=img->cofDC; img->cofDC=i3p;
  1547.     cbp     = currMB->cbp;
  1548.     curr_cbp[0] = cmp_cbp[1];  
  1549.     curr_cbp[1] = cmp_cbp[2]; 
  1550.     cur_cbp_blk[0] = currMB->cbp_blk;
  1551.   }
  1552.   else
  1553.   {
  1554.     cur_cbp_blk[0] = cbp = 0;
  1555.     cmp_cbp[1] = cmp_cbp[2] = 0; 
  1556.   }
  1557.   //--- store transform size ---
  1558.   luma_transform_size_8x8_flag = currMB->luma_transform_size_8x8_flag;
  1559.   for (j = 0; j<4; j++)
  1560.     memcpy(l0_refframe[j],&enc_picture->motion.ref_idx[LIST_0][img->block_y+j][img->block_x], BLOCK_MULTIPLE * sizeof(char));
  1561.   if (bframe)
  1562.   {
  1563.     for (j = 0; j<4; j++)
  1564.       memcpy(l1_refframe[j],&enc_picture->motion.ref_idx[LIST_1][img->block_y+j][img->block_x], BLOCK_MULTIPLE * sizeof(char));
  1565.   }
  1566. }
  1567. /*!
  1568.  *************************************************************************************
  1569.  * brief
  1570.  *    Set stored macroblock parameters
  1571.  *************************************************************************************
  1572.  */
  1573. void set_stored_macroblock_parameters (Macroblock *currMB)
  1574. {
  1575.   imgpel     **imgY  = enc_picture->imgY;
  1576.   imgpel    ***imgUV = enc_picture->imgUV;
  1577.   int         mode   = best_mode;
  1578.   int         bframe = (img->type==B_SLICE);
  1579.   int         i, j, k, ****i4p, ***i3p;
  1580.   int         block_x, block_y;
  1581.   char    **ipredmodes = img->ipredmode;
  1582.   short   *cur_mv, total_bipred_me;
  1583.   //===== reconstruction values =====
  1584.   // Luma
  1585.   for (j = 0; j < MB_BLOCK_SIZE; j++)
  1586.   {
  1587.     memcpy(&imgY[img->pix_y+j][img->pix_x],rec_mbY[j], MB_BLOCK_SIZE * sizeof(imgpel));
  1588.   }
  1589.   if (img->MbaffFrameFlag || (params->UseRDOQuant && params->RDOQ_QP_Num > 1))
  1590.   {
  1591.     for (j = 0; j < MB_BLOCK_SIZE; j++)
  1592.       memcpy(rdopt->rec_mbY[j],rec_mbY[j], MB_BLOCK_SIZE * sizeof(imgpel));
  1593.   }
  1594.   if((img->type==SP_SLICE) &&(si_frame_indicator==0 && sp2_frame_indicator==0 ))
  1595.   {
  1596.     for (j = 0; j < MB_BLOCK_SIZE; j++)
  1597.       memcpy(&lrec[img->pix_y+j][img->pix_x],lrec_rec[j], MB_BLOCK_SIZE * sizeof(int)); //restore coeff SP frame
  1598.   }
  1599.   if (img->AdaptiveRounding)
  1600.   {
  1601.     update_offset_params(currMB, mode,luma_transform_size_8x8_flag);
  1602.   }
  1603.   if (img->yuv_format != YUV400)
  1604.   {
  1605.     int k;
  1606.     for (k = 0; k < 2; k++)
  1607.     {
  1608.       for (j = 0; j<img->mb_cr_size_y; j++)
  1609.       {
  1610.         memcpy(&imgUV[k][img->pix_c_y+j][img->pix_c_x], rec_mb_cr[k][j], img->mb_cr_size_x * sizeof(imgpel));
  1611.       }
  1612.     }
  1613.     if (img->MbaffFrameFlag || (params->UseRDOQuant && params->RDOQ_QP_Num > 1))
  1614.     {
  1615.       for (k = 0; k < 2; k++)
  1616.       {
  1617.         for (j = 0; j<img->mb_cr_size_y; j++)
  1618.         {
  1619.           memcpy(rdopt->rec_mb_cr[k][j],rec_mb_cr[k][j], img->mb_cr_size_x * sizeof(imgpel));
  1620.         }
  1621.       }
  1622.     }
  1623.     if((img->type==SP_SLICE) &&(!si_frame_indicator && !sp2_frame_indicator))
  1624.     {
  1625.       for (k = 0; k < 2; k++)
  1626.       {
  1627.         for (j = 0; j<img->mb_cr_size_y; j++)
  1628.         {
  1629.           memcpy(&lrec_uv[k][img->pix_c_y+j][img->pix_c_x],lrec_rec_uv[k][j], img->mb_cr_size_x * sizeof(int));
  1630.         }
  1631.       }
  1632.     }
  1633.   }
  1634.   //===== coefficients and cbp =====
  1635.   i4p=cofAC; cofAC=img->cofAC; img->cofAC=i4p;
  1636.   i3p=cofDC; cofDC=img->cofDC; img->cofDC=i3p;
  1637.   currMB->cbp      = cbp;
  1638.   currMB->cbp_blk = cur_cbp_blk[0];
  1639.   cmp_cbp[1] = curr_cbp[0]; 
  1640.   cmp_cbp[2] = curr_cbp[1]; 
  1641.   currMB->cbp |= cmp_cbp[1];
  1642.   currMB->cbp |= cmp_cbp[2];
  1643.   cmp_cbp[1] = currMB->cbp; 
  1644.   cmp_cbp[2] = currMB->cbp;
  1645.   //==== macroblock type ====
  1646.   currMB->mb_type = mode;
  1647.   memcpy(currMB->b8mode, b8mode, BLOCK_MULTIPLE * sizeof(short));
  1648.   memcpy(currMB->b8pdir, b8pdir, BLOCK_MULTIPLE * sizeof(short));
  1649.   memcpy(currMB->bipred_me, b8bipred_me, BLOCK_MULTIPLE * sizeof(short));
  1650.   if (img->MbaffFrameFlag || (params->UseRDOQuant && params->RDOQ_QP_Num > 1))
  1651.   {
  1652.     rdopt->mode = mode;
  1653.     rdopt->i16offset = img->i16offset;
  1654.     rdopt->cbp = cbp;
  1655.     rdopt->cbp_blk = cur_cbp_blk[0];
  1656.     rdopt->mb_type  = mode;
  1657.     rdopt->prev_qp  = currMB->prev_qp;
  1658.     rdopt->prev_dqp = currMB->prev_dqp;
  1659.     rdopt->delta_qp = currMB->delta_qp;
  1660.     rdopt->qp       = currMB->qp;
  1661.     rdopt->prev_cbp = currMB->prev_cbp;
  1662.     memcpy(rdopt->cofAC[0][0][0], img->cofAC[0][0][0], (4+img->num_blk8x8_uv) * 4 * 2 * 65 * sizeof(int));
  1663.     memcpy(rdopt->cofDC[0][0], img->cofDC[0][0], 3 * 2 * 18 * sizeof(int));
  1664.     memcpy(rdopt->b8mode,b8mode, BLOCK_MULTIPLE * sizeof(short));
  1665.     memcpy(rdopt->b8pdir,b8pdir, BLOCK_MULTIPLE * sizeof(short));
  1666.   }
  1667.   //if P8x8 mode and transform size 4x4 choosen, restore motion vector data for this transform size
  1668.   if (mode == P8x8 && !luma_transform_size_8x8_flag && params->Transform8x8Mode)
  1669.     RestoreMV8x8(1);
  1670.   //==== transform size flag ====
  1671.   if (img->P444_joined)
  1672.   {
  1673.     if (((currMB->cbp == 0) && cmp_cbp[1] == 0 && cmp_cbp[2] == 0) && !(IS_OLDINTRA(currMB) || currMB->mb_type == I8MB))
  1674.       currMB->luma_transform_size_8x8_flag = 0;
  1675.     else
  1676.       currMB->luma_transform_size_8x8_flag = luma_transform_size_8x8_flag;
  1677.   }
  1678.   else
  1679.   {
  1680.     if (((currMB->cbp & 15) == 0) && !(IS_OLDINTRA(currMB) || currMB->mb_type == I8MB))
  1681.       currMB->luma_transform_size_8x8_flag = 0;
  1682.     else
  1683.       currMB->luma_transform_size_8x8_flag = luma_transform_size_8x8_flag;
  1684.   }
  1685.   rdopt->luma_transform_size_8x8_flag  = currMB->luma_transform_size_8x8_flag;
  1686.   if (params->rdopt == 3 && img->type!=B_SLICE)  
  1687.   {
  1688.     errdo_get_best_block(img, enc_picture->p_dec_img[0], decs->dec_mbY, 0, MB_BLOCK_SIZE);
  1689.   }
  1690.   //==== reference frames =====
  1691.   for (j = 0; j < 4; j++)
  1692.   {
  1693.     block_y = img->block_y + j;
  1694.     for (i = 0; i < 4; i++)
  1695.     {
  1696.       block_x = img->block_x + i;
  1697.       k = 2*(j >> 1)+(i >> 1);
  1698.       // backward prediction or intra
  1699.       if ((currMB->b8pdir[k] == 1) || IS_INTRA(currMB))
  1700.       {
  1701.         enc_picture->motion.ref_idx    [LIST_0][block_y][block_x]    = -1;
  1702.         enc_picture->motion.ref_pic_id [LIST_0][block_y][block_x]    = -1;
  1703.         enc_picture->motion.mv         [LIST_0][block_y][block_x][0] = 0;
  1704.         enc_picture->motion.mv         [LIST_0][block_y][block_x][1] = 0;
  1705.         if (img->MbaffFrameFlag || (params->UseRDOQuant && params->RDOQ_QP_Num > 1))
  1706.           rdopt->refar[LIST_0][j][i] = -1;
  1707.       }
  1708.       else
  1709.       {
  1710.         if (currMB->bipred_me[k] && (currMB->b8pdir[k] == 2) && is_bipred_enabled(currMB->mb_type))
  1711.         {
  1712.           cur_mv = img->bipred_mv[currMB->bipred_me[k] - 1][LIST_0][0][currMB->b8mode[k]][j][i]; 
  1713.           enc_picture->motion.ref_idx    [LIST_0][block_y][block_x] = 0;
  1714.           enc_picture->motion.ref_pic_id [LIST_0][block_y][block_x] = enc_picture->ref_pic_num[LIST_0 + currMB->list_offset][0];
  1715.           enc_picture->motion.mv         [LIST_0][block_y][block_x][0] = cur_mv[0];
  1716.           enc_picture->motion.mv         [LIST_0][block_y][block_x][1] = cur_mv[1];
  1717.           if (img->MbaffFrameFlag || (params->UseRDOQuant && params->RDOQ_QP_Num > 1))
  1718.             rdopt->refar[LIST_0][j][i] = 0;
  1719.         }
  1720.         else
  1721.         {
  1722.           char cur_ref = l0_refframe[j][i];
  1723.           enc_picture->motion.ref_idx    [LIST_0][block_y][block_x] = cur_ref;
  1724.           enc_picture->motion.ref_pic_id [LIST_0][block_y][block_x] = enc_picture->ref_pic_num[LIST_0 + currMB->list_offset][(short)cur_ref];
  1725.           memcpy(enc_picture->motion.mv  [LIST_0][block_y][block_x], img->all_mv[LIST_0][(short)cur_ref][currMB->b8mode[k]][j][i], 2 * sizeof(short));
  1726.           if (img->MbaffFrameFlag || (params->UseRDOQuant && params->RDOQ_QP_Num > 1))
  1727.             rdopt->refar[LIST_0][j][i] = cur_ref;
  1728.         }
  1729.       }
  1730.       // forward prediction or intra
  1731.       if ((currMB->b8pdir[k] == 0) || IS_INTRA(currMB))
  1732.       {
  1733.         enc_picture->motion.ref_idx    [LIST_1][block_y][block_x]    = -1;
  1734.         enc_picture->motion.ref_pic_id [LIST_1][block_y][block_x]    = -1;
  1735.         enc_picture->motion.mv         [LIST_1][block_y][block_x][0] = 0;
  1736.         enc_picture->motion.mv         [LIST_1][block_y][block_x][1] = 0;
  1737.         if (img->MbaffFrameFlag || (params->UseRDOQuant && params->RDOQ_QP_Num > 1))
  1738.           rdopt->refar[LIST_1][j][i] = -1;
  1739.       }
  1740.     }
  1741.   }
  1742.   if (bframe)
  1743.   {
  1744.     for (j=0; j<4; j++)
  1745.     {
  1746.       block_y = img->block_y + j;
  1747.       for (i=0; i<4; i++)
  1748.       {
  1749.         block_x = img->block_x + i;
  1750.         k = 2*(j >> 1)+(i >> 1);
  1751.         // forward
  1752.         if (IS_INTRA(currMB)||(currMB->b8pdir[k] == 0))
  1753.         {
  1754.           enc_picture->motion.ref_idx    [LIST_1][block_y][block_x]    = -1;
  1755.           enc_picture->motion.ref_pic_id [LIST_1][block_y][block_x]    = -1;
  1756.           enc_picture->motion.mv         [LIST_1][block_y][block_x][0] = 0;
  1757.           enc_picture->motion.mv         [LIST_1][block_y][block_x][1] = 0;
  1758.           if (img->MbaffFrameFlag || (params->UseRDOQuant && params->RDOQ_QP_Num > 1))
  1759.             rdopt->refar[LIST_1][j][i] = -1;
  1760.         }
  1761.         else
  1762.         {
  1763.           if (currMB->bipred_me[k] && (currMB->b8pdir[k] == 2) && is_bipred_enabled(currMB->mb_type))
  1764.           {
  1765.             cur_mv = img->bipred_mv[currMB->bipred_me[k] - 1][LIST_1][0][currMB->b8mode[k]][j][i]; 
  1766.             enc_picture->motion.ref_idx    [LIST_1][block_y][block_x] = 0;
  1767.             enc_picture->motion.ref_pic_id [LIST_1][block_y][block_x] = enc_picture->ref_pic_num[LIST_1 + currMB->list_offset][0];
  1768.             enc_picture->motion.mv         [LIST_1][block_y][block_x][0] = cur_mv[0];
  1769.             enc_picture->motion.mv         [LIST_1][block_y][block_x][1] = cur_mv[1];
  1770.             if (img->MbaffFrameFlag || (params->UseRDOQuant && params->RDOQ_QP_Num > 1))
  1771.               rdopt->refar[LIST_1][j][i] = 0;
  1772.           }
  1773.           else
  1774.           {
  1775.             enc_picture->motion.ref_idx    [LIST_1][block_y][block_x] = l1_refframe[j][i];
  1776.             enc_picture->motion.ref_pic_id [LIST_1][block_y][block_x] = enc_picture->ref_pic_num[LIST_1 + currMB->list_offset][(short)l1_refframe[j][i]];
  1777.             memcpy(enc_picture->motion.mv  [LIST_1][block_y][block_x], img->all_mv[LIST_1][(short)l1_refframe[j][i]][currMB->b8mode[k]][j][i], 2 * sizeof(short));
  1778.             if (img->MbaffFrameFlag || (params->UseRDOQuant && params->RDOQ_QP_Num > 1))
  1779.               rdopt->refar[LIST_1][j][i] = l1_refframe[j][i];
  1780.           }
  1781.         }
  1782.       }
  1783.     }
  1784.   }
  1785.   //==== intra prediction modes ====
  1786.   currMB->c_ipred_mode = best_c_imode;
  1787.   img->i16offset = best_i16offset;
  1788.   if(currMB->mb_type == I8MB)
  1789.   {
  1790.     memcpy(currMB->intra_pred_modes8x8,b8_intra_pred_modes8x8, MB_BLOCK_PARTITIONS * sizeof(char));
  1791.     memcpy(currMB->intra_pred_modes,b8_intra_pred_modes8x8, MB_BLOCK_PARTITIONS * sizeof(char));
  1792.     for(j = 0; j < BLOCK_MULTIPLE; j++)
  1793.     {
  1794.       memcpy(&img->ipredmode[img->block_y+j][img->block_x],    b8_ipredmode8x8[j], BLOCK_MULTIPLE * sizeof(char));
  1795.       memcpy(&img->ipredmode8x8[img->block_y+j][img->block_x], b8_ipredmode8x8[j], BLOCK_MULTIPLE * sizeof(char));
  1796.     }
  1797.   }
  1798.   else if (mode!=I4MB && mode!=I8MB)
  1799.   {
  1800.     memset(currMB->intra_pred_modes,DC_PRED, MB_BLOCK_PARTITIONS * sizeof(char));
  1801.     for(j = img->block_y; j < img->block_y + BLOCK_MULTIPLE; j++)
  1802.       memset(&img->ipredmode[j][img->block_x], DC_PRED, BLOCK_MULTIPLE * sizeof(char));
  1803.   }
  1804.   // Residue Color Transform
  1805.   else if (mode == I4MB)
  1806.   {
  1807.     memcpy(currMB->intra_pred_modes,b4_intra_pred_modes, MB_BLOCK_PARTITIONS * sizeof(char));
  1808.     for(j = 0; j < BLOCK_MULTIPLE; j++)
  1809.       memcpy(&img->ipredmode[img->block_y + j][img->block_x],&b4_ipredmode[BLOCK_MULTIPLE * j], BLOCK_MULTIPLE * sizeof(char));
  1810.   }
  1811.   if (img->MbaffFrameFlag || (params->UseRDOQuant && params->RDOQ_QP_Num > 1))
  1812.   {
  1813.     rdopt->c_ipred_mode = currMB->c_ipred_mode;
  1814.     rdopt->i16offset = img->i16offset;
  1815.     memcpy(rdopt->intra_pred_modes,currMB->intra_pred_modes, MB_BLOCK_PARTITIONS * sizeof(char));
  1816.     memcpy(rdopt->intra_pred_modes8x8,currMB->intra_pred_modes8x8, MB_BLOCK_PARTITIONS * sizeof(char));
  1817.     for(j = img->block_y; j < img->block_y +BLOCK_MULTIPLE; j++)
  1818.       memcpy(&rdopt->ipredmode[j][img->block_x],&ipredmodes[j][img->block_x], BLOCK_MULTIPLE * sizeof(char));
  1819.   }
  1820.   //==== motion vectors =====
  1821.   SetMotionVectorsMB (currMB, bframe);
  1822.   total_bipred_me  = 0;
  1823.  
  1824.   for (i = 0; i < 4; i++)
  1825.   {
  1826.     total_bipred_me += currMB->bipred_me[i];
  1827.   }
  1828.   if (total_bipred_me && currMB->mb_type > 1 && currMB->mb_type < 4)
  1829.   {
  1830.      UpdateMotionVectorPredictor(currMB, currMB->mb_type);
  1831.   }
  1832. }
  1833. /*!
  1834.  *************************************************************************************
  1835.  * brief
  1836.  *    Update motion vector predictors if biprediction mode is selected (B_SLICE only)
  1837.  *************************************************************************************
  1838.  */
  1839. void UpdateMotionVectorPredictor(Macroblock* currMB, int mb_type) 
  1840. {
  1841.   int v = 0, h = 0, block_x, block_y, list, i, ref;
  1842.   short * pred_mv;
  1843.   int   parttype  = (mb_type<4?mb_type:4);
  1844.   int   bsx       = params->blc_size[parttype][0];
  1845.   int   bsy       = params->blc_size[parttype][1];
  1846.   int   step_h    = (params->part_size[parttype][0]);
  1847.   int   step_v    = (params->part_size[parttype][1]);
  1848.   for (i = 0; i < 4; i++)
  1849.   {
  1850.     if (currMB->bipred_me[i])
  1851.     {
  1852.       v = i >> 1;
  1853.       h = i & 0x01;
  1854.       break;
  1855.     }
  1856.   }
  1857.   while(1)
  1858.   {
  1859.     block_x = img->block_x + h;
  1860.     block_y = img->block_y + v;
  1861.     for (list = 0; list < 2; list++)
  1862.     {
  1863.       ref = enc_picture->motion.ref_idx[list][block_y][block_x];
  1864.       ref = (ref < 0 )? 0 : ref;
  1865.       pred_mv = img->pred_mv[list][ref][parttype][v][h];
  1866.       SetMotionVectorPredictor (currMB, pred_mv, enc_picture->motion.ref_idx[list], enc_picture->motion.mv[list], ref, list, h << 2, v << 2, bsx, bsy);
  1867.     }
  1868.     v += step_v;
  1869.     h += step_h;
  1870.     if (v >= 4 && h >= 4)
  1871.       break;
  1872.     if (v >= 4)
  1873.       v = 0;
  1874.     if (h >= 4)
  1875.       h = 0;
  1876.   }
  1877. }
  1878.  
  1879. /*!
  1880.  *************************************************************************************
  1881.  * brief
  1882.  *    Set reference frames and motion vectors
  1883.  *************************************************************************************
  1884.  */
  1885. void SetRefAndMotionVectors (Macroblock *currMB, int block, int mode, int pdir, int fwref, int bwref, short bipred_me)
  1886. {
  1887.   int     k, i, j=0;
  1888.   int     bslice  = (img->type==B_SLICE);
  1889.   int     pmode   = (mode==1||mode==2||mode==3?mode:4);
  1890.   int     j0      = ((block >> 1)<<1);
  1891.   int     i0      = ((block & 0x01)<<1);
  1892.   int     j1      = j0 + (params->part_size[pmode][1]);
  1893.   int     i1      = i0 + (params->part_size[pmode][0]);
  1894.   int     block_x, block_y;
  1895.   short   *cur_mv;
  1896.   int64 ref_pic_num;
  1897.   char *ref_idx;
  1898.   if (pdir < 0)
  1899.   {
  1900.     for (k = LIST_0; k <= LIST_1; k++)
  1901.     {
  1902.       for (j = img->block_y + j0; j < img->block_y + j1; j++)
  1903.       {
  1904.         for (i=img->block_x + i0; i<img->block_x +i1; i++)
  1905.           enc_picture->motion.ref_pic_id[k][j][i] = -1;
  1906.         memset(&enc_picture->motion.ref_idx[k][j][img->block_x + i0], -1, (params->part_size[pmode][0]) * sizeof(char));
  1907.         memset(enc_picture->motion.mv      [k][j][img->block_x + i0], 0, 2*(params->part_size[pmode][0]) * sizeof(short));
  1908.       }
  1909.     }
  1910.     return;
  1911.   }
  1912.   if (!bslice)
  1913.   {
  1914.     int64 ref_pic_num = enc_picture->ref_pic_num[LIST_0+currMB->list_offset][fwref];
  1915.     for (j = j0; j < j1; j++)
  1916.     {
  1917.       block_y = img->block_y + j;
  1918.       for (block_x = img->block_x + i0; block_x < img->block_x + i1; block_x++)
  1919.         enc_picture->motion.ref_pic_id[LIST_0][block_y][block_x] = ref_pic_num;
  1920.       memset(&enc_picture->motion.ref_idx[LIST_0][block_y][img->block_x + i0], fwref, (params->part_size[pmode][0]) * sizeof(char));
  1921.       memcpy(enc_picture->motion.mv      [LIST_0][block_y][img->block_x + i0], img->all_mv[LIST_0][fwref][mode][j][i0], 2 * (i1 - i0) * sizeof(short));
  1922.     }
  1923.     return;
  1924.   }
  1925.   else //bslice
  1926.   {
  1927.     if ((pdir == 0 || pdir == 2))
  1928.     {
  1929.       if (bipred_me && (pdir == 2) && is_bipred_enabled(mode))
  1930.       {
  1931.         for (j=j0; j<j1; j++)
  1932.         {
  1933.           block_y = img->block_y + j;
  1934.           for (i=i0; i<i1; i++)
  1935.           {
  1936.             block_x = img->block_x + i;
  1937.             cur_mv = img->bipred_mv[bipred_me - 1][LIST_0][0][mode][j][i]; 
  1938.             enc_picture->motion.mv        [LIST_0][block_y][block_x][0] = cur_mv[0];
  1939.             enc_picture->motion.mv        [LIST_0][block_y][block_x][1] = cur_mv[1];
  1940.             enc_picture->motion.ref_idx   [LIST_0][block_y][block_x]    = 0;
  1941.             enc_picture->motion.ref_pic_id[LIST_0][block_y][block_x]    = enc_picture->ref_pic_num[LIST_0+currMB->list_offset][0];
  1942.           }
  1943.         }
  1944.       }
  1945.       else
  1946.       {
  1947.         if (mode==0)
  1948.         {
  1949.           for (j=j0; j<j1; j++)
  1950.           {
  1951.             block_y = img->block_y + j;
  1952.             ref_idx = enc_picture->motion.ref_idx[LIST_0][block_y];
  1953.             memcpy(&ref_idx[img->block_x + i0], &direct_ref_idx[LIST_0][block_y][img->block_x + i0], (i1 - i0) * sizeof(char));
  1954.             memcpy(&enc_picture->motion.mv[LIST_0][block_y][img->block_x + i0][0], img->all_mv[LIST_0][fwref][mode][j][i0], 2 * (i1 - i0) * sizeof(short));
  1955.             for (block_x = img->block_x + i0; block_x < img->block_x + i1; block_x++)
  1956.             {              
  1957.               enc_picture->motion.ref_pic_id[LIST_0][block_y][block_x] = 
  1958.                 enc_picture->ref_pic_num[LIST_0+currMB->list_offset][(short)ref_idx[block_x]];
  1959.             }            
  1960.           }
  1961.         }
  1962.         else
  1963.         {
  1964.           for (j=j0; j<j1; j++)
  1965.           {
  1966.             block_y = img->block_y + j;
  1967.             ref_pic_num = enc_picture->ref_pic_num[LIST_0+currMB->list_offset][fwref];
  1968.             memcpy(&enc_picture->motion.mv[LIST_0][block_y][img->block_x + i0][0], img->all_mv[LIST_0][fwref][mode][j][i0], 2 * (i1 - i0) * sizeof(short));
  1969.             memset(&enc_picture->motion.ref_idx[LIST_0][block_y][img->block_x + i0], fwref, (i1 - i0) * sizeof(char));
  1970.             for (block_x = img->block_x + i0; block_x < img->block_x + i1; block_x++)
  1971.             {              
  1972.               enc_picture->motion.ref_pic_id[LIST_0][block_y][block_x] = ref_pic_num ;
  1973.             }
  1974.           }
  1975.         }
  1976.       }  
  1977.     }
  1978.     else
  1979.     {
  1980.       for (j=j0; j<j1; j++)
  1981.       {
  1982.         block_y = img->block_y + j;
  1983.         for (i=img->block_x + i0; i<img->block_x +i1; i++)
  1984.           enc_picture->motion.ref_pic_id[LIST_0][block_y][i] = -1;
  1985.         memset(&enc_picture->motion.ref_idx[LIST_0][block_y][img->block_x + i0], -1, (i1 - i0) * sizeof(char));
  1986.         memset(enc_picture->motion.mv[LIST_0][block_y][img->block_x + i0], 0, 2 * (i1 - i0) * sizeof(short));
  1987.       }
  1988.     }
  1989.     if ((pdir==1 || pdir==2))
  1990.     {
  1991.       if (bipred_me && (pdir == 2) && is_bipred_enabled(mode))
  1992.       {
  1993.         for (j=j0; j<j1; j++)
  1994.         {
  1995.           block_y = img->block_y + j;
  1996.           for (i=i0; i<i1; i++)
  1997.           {
  1998.             block_x = img->block_x + i;
  1999.             cur_mv = img->bipred_mv[bipred_me - 1][LIST_1][0][mode][j][i]; 
  2000.             enc_picture->motion.mv        [LIST_1][block_y][block_x][0] = cur_mv[0];
  2001.             enc_picture->motion.mv        [LIST_1][block_y][block_x][1] = cur_mv[1];
  2002.             enc_picture->motion.ref_idx   [LIST_1][block_y][block_x]    = 0;
  2003.             enc_picture->motion.ref_pic_id[LIST_1][block_y][block_x]    = enc_picture->ref_pic_num[LIST_1+currMB->list_offset][0];
  2004.           }
  2005.         }        
  2006.       }
  2007.       else
  2008.       {
  2009.         if (mode==0)
  2010.         {
  2011.           for (j=j0; j<j1; j++)
  2012.           {
  2013.             block_y = img->block_y + j;
  2014.             ref_idx = enc_picture->motion.ref_idx[LIST_1][block_y];
  2015.             memcpy(&ref_idx[img->block_x + i0], &direct_ref_idx[LIST_1][block_y][img->block_x + i0], (i1 - i0) * sizeof(char));            
  2016.             memcpy(&enc_picture->motion.mv[LIST_1][block_y][img->block_x + i0][0], img->all_mv[LIST_1][(int) ref_idx[img->block_x + i0]][mode][j][i0], 2 * (i1 - i0) * sizeof(short));
  2017.             for (i=i0; i<i1; i++)
  2018.             {
  2019.               block_x = img->block_x + i;
  2020.               enc_picture->motion.ref_pic_id[LIST_1][block_y][block_x] = enc_picture->ref_pic_num[LIST_1+currMB->list_offset][(short)ref_idx[block_x]];
  2021.             }            
  2022.           }
  2023.         }
  2024.         else
  2025.         {
  2026.           for (j=j0; j<j1; j++)
  2027.           {
  2028.             block_y = img->block_y + j;
  2029.             ref_pic_num = enc_picture->ref_pic_num[LIST_1+currMB->list_offset][bwref];
  2030.             memcpy(&enc_picture->motion.mv[LIST_1][block_y][img->block_x + i0][0], img->all_mv[LIST_1][bwref][mode][j][i0], 2 * (i1 - i0) * sizeof(short));
  2031.             memset(&enc_picture->motion.ref_idx[LIST_1][block_y][img->block_x + i0], bwref, (i1 - i0) * sizeof(char));
  2032.             for (block_x = img->block_x + i0; block_x < img->block_x + i1; block_x++)
  2033.             {
  2034.               enc_picture->motion.ref_pic_id[LIST_1][block_y][block_x] = ref_pic_num ;
  2035.             }
  2036.           }
  2037.         }
  2038.       }  
  2039.     }
  2040.     else
  2041.     {
  2042.       for (j=j0; j<j1; j++)
  2043.       {
  2044.         block_y = img->block_y + j;
  2045.         memset(enc_picture->motion.mv[LIST_1][block_y][img->block_x + i0], 0, 2 * (i1 - i0) * sizeof(short));
  2046.         memset(&enc_picture->motion.ref_idx[LIST_1][block_y][img->block_x + i0], -1, (i1 - i0)  * sizeof(char));
  2047.         for (block_x = img->block_x + i0; block_x < img->block_x + i1; block_x++)
  2048.         {
  2049.           enc_picture->motion.ref_pic_id[LIST_1][block_y][block_x]    = -1;
  2050.         }
  2051.       }
  2052.     }
  2053.   }
  2054. }
  2055. /*!
  2056.  *************************************************************************************
  2057.  * brief
  2058.  *    skip macroblock field inference
  2059.  * return
  2060.  *    inferred field flag
  2061.  *************************************************************************************
  2062.  */
  2063. byte field_flag_inference(Macroblock *currMB)
  2064. {
  2065.   byte mb_field;
  2066.   if (currMB->mbAvailA)
  2067.   {
  2068.     mb_field = img->mb_data[currMB->mbAddrA].mb_field;
  2069.   }
  2070.   else
  2071.   {
  2072.     // check top macroblock pair
  2073.     if (currMB->mbAvailB)
  2074.       mb_field = img->mb_data[currMB->mbAddrB].mb_field;
  2075.     else
  2076.       mb_field = 0;
  2077.   }
  2078.   return mb_field;
  2079. }
  2080. /*!
  2081.  *************************************************************************************
  2082.  * brief
  2083.  *    Store motion vectors for 8x8 partition
  2084.  *************************************************************************************
  2085.  */
  2086. void StoreMVBlock8x8(int dir, int block8x8, int mode, int l0_ref, int l1_ref, int pdir8, int bipred_me, int bframe)
  2087. {
  2088.   int j, i0, j0, ii, jj;
  2089.   short ******all_mv  = img->all_mv;
  2090.   short ******pred_mv = img->pred_mv;
  2091.   short (*lc_l0_mv8x8)[4][2] = all_mv8x8[dir][LIST_0];
  2092.   short (*lc_l1_mv8x8)[4][2] = all_mv8x8[dir][LIST_1];
  2093.   short (*lc_pr_mv8x8)[4][2] = NULL;
  2094.   if (bframe && bipred_me)
  2095.   {
  2096.     all_mv = img->bipred_mv[bipred_me - 1];
  2097.   }
  2098.   i0 = (block8x8 & 0x01) << 1;
  2099.   j0 = (block8x8 >> 1) << 1;
  2100.   ii = i0+2;
  2101.   jj = j0+2;
  2102.   if (!bframe)
  2103.   {
  2104.     if (pdir8>=0) //(mode8!=IBLOCK)&&(mode8!=I16MB))  // && ref != -1)
  2105.     {
  2106.       lc_pr_mv8x8 = pred_mv8x8[dir][LIST_0];
  2107.       for (j=j0; j<jj; j++)
  2108.       {
  2109.         memcpy(&lc_l0_mv8x8[j][i0][0], &all_mv[LIST_0][l0_ref][4][j][i0][0],  (ii - i0) * 2 * sizeof(short));
  2110.         memcpy(&lc_pr_mv8x8[j][i0][0], &pred_mv[LIST_0][l0_ref][4][j][i0][0], (ii - i0) * 2 * sizeof(short));
  2111.       }
  2112.     }
  2113.   }
  2114.   else
  2115.   {
  2116.     if (pdir8 == 0) // list0
  2117.     {
  2118.       lc_pr_mv8x8 = pred_mv8x8[dir][LIST_0];
  2119.       for (j=j0; j<jj; j++)
  2120.       {
  2121.         memcpy(&lc_l0_mv8x8[j][i0][0], &all_mv[LIST_0][l0_ref][mode][j][i0][0],  (ii - i0) * 2 * sizeof(short));
  2122.         memcpy(&lc_pr_mv8x8[j][i0][0], &pred_mv[LIST_0][l0_ref][mode][j][i0][0], (ii - i0) * 2 * sizeof(short));
  2123.       }
  2124.     }
  2125.     else if (pdir8 == 1) // list1
  2126.     {
  2127.       lc_pr_mv8x8 = pred_mv8x8[dir][LIST_1];
  2128.       for (j=j0; j<jj; j++)
  2129.       {
  2130.         memcpy(&lc_l1_mv8x8[j][i0][0], &all_mv[LIST_1][l1_ref][mode][j][i0][0],  (ii - i0) * 2 * sizeof(short));
  2131.         memcpy(&lc_pr_mv8x8[j][i0][0], &pred_mv[LIST_1][l1_ref][mode][j][i0][0], (ii - i0) * 2 * sizeof(short));
  2132.       }
  2133.     }
  2134.     else if (pdir8==2) // bipred
  2135.     {
  2136.       lc_pr_mv8x8 = pred_mv8x8[dir][LIST_0];
  2137.       for (j=j0; j<jj; j++)
  2138.       {
  2139.         memcpy(&lc_l0_mv8x8[j][i0][0], &all_mv[LIST_0][l0_ref][mode][j][i0][0],  (ii - i0) * 2 * sizeof(short));
  2140.         memcpy(&lc_pr_mv8x8[j][i0][0], &pred_mv[LIST_0][l0_ref][mode][j][i0][0], (ii - i0) * 2 * sizeof(short));
  2141.       }
  2142.       lc_pr_mv8x8 = pred_mv8x8[dir][LIST_1];
  2143.       for (j=j0; j<jj; j++)
  2144.       {        
  2145.         memcpy(&lc_l1_mv8x8[j][i0][0], &all_mv[LIST_1][l1_ref][mode][j][i0][0],  (ii - i0) * 2 * sizeof(short));
  2146.         memcpy(&lc_pr_mv8x8[j][i0][0], &pred_mv[LIST_1][l1_ref][mode][j][i0][0], (ii - i0) * 2 * sizeof(short));
  2147.       }
  2148.     }
  2149.     else
  2150.     {
  2151.       error("invalid direction mode", 255);
  2152.     }
  2153.   }
  2154. }
  2155. /*!
  2156.  *************************************************************************************
  2157.  * brief
  2158.  *    Store motion vectors of 8x8 partitions of one macroblock
  2159.  *************************************************************************************
  2160.  */
  2161. void StoreMV8x8(int dir)
  2162. {
  2163.   int block8x8;
  2164.   int bframe = (img->type == B_SLICE);
  2165.   for (block8x8=0; block8x8<4; block8x8++)
  2166.     StoreMVBlock8x8(dir, block8x8, tr8x8.part8x8mode[block8x8], tr8x8.part8x8l0ref[block8x8],
  2167.     tr8x8.part8x8l1ref[block8x8], tr8x8.part8x8pdir[block8x8], tr8x8.part8x8bipred[block8x8], bframe);
  2168. }
  2169. /*!
  2170. *************************************************************************************
  2171. * brief
  2172. *    Restore motion vectors for 8x8 partition
  2173. *************************************************************************************
  2174. */
  2175. void RestoreMVBlock8x8(int dir, int block8x8, RD_8x8DATA tr, int bframe)
  2176. {
  2177.   int j, i0, j0, ii, jj;
  2178.   short ******all_mv  = img->all_mv;
  2179.   short ******pred_mv = img->pred_mv;
  2180.   short (*lc_l0_mv8x8)[4][2] = all_mv8x8[dir][LIST_0];
  2181.   short (*lc_l1_mv8x8)[4][2] = all_mv8x8[dir][LIST_1];
  2182.   short (*lc_pr_mv8x8)[4][2] = NULL;
  2183.   short pdir8     = tr.part8x8pdir [block8x8];
  2184.   short mode      = tr.part8x8mode [block8x8];
  2185.   short l0_ref    = tr.part8x8l0ref[block8x8];
  2186.   short l1_ref    = tr.part8x8l1ref[block8x8];
  2187.   short bipred_me = tr.part8x8bipred[block8x8];
  2188.   if(bframe && bipred_me)
  2189.   {
  2190.     all_mv = img->bipred_mv[bipred_me - 1];
  2191.   }
  2192.   i0 = (block8x8 & 0x01) << 1;
  2193.   j0 = (block8x8 >> 1) << 1;
  2194.   ii = i0+2;
  2195.   jj = j0+2;
  2196.   if (!bframe)
  2197.   {
  2198.     if (pdir8>=0) //(mode8!=IBLOCK)&&(mode8!=I16MB))  // && ref != -1)
  2199.     {
  2200.       lc_pr_mv8x8 = pred_mv8x8[dir][LIST_0];
  2201.       for (j=j0; j<jj; j++)
  2202.       {
  2203.         memcpy(&all_mv[LIST_0][l0_ref][4][j][i0][0],  &lc_l0_mv8x8[j][i0][0], 2 * 2 * sizeof(short));
  2204.         memcpy(&pred_mv[LIST_0][l0_ref][4][j][i0][0], &lc_pr_mv8x8[j][i0][0], 2 * 2 * sizeof(short));
  2205.       }
  2206.     }
  2207.   }
  2208.   else
  2209.   {
  2210.     if (pdir8==0) // forward
  2211.     {
  2212.       lc_pr_mv8x8 = pred_mv8x8[dir][LIST_0];
  2213.       for (j=j0; j<jj; j++)
  2214.       {
  2215.         memcpy(&all_mv[LIST_0][l0_ref][mode][j][i0][0],  &lc_l0_mv8x8[j][i0][0], 2 * 2 * sizeof(short));
  2216.         memcpy(&pred_mv[LIST_0][l0_ref][mode][j][i0][0], &lc_pr_mv8x8[j][i0][0], 2 * 2 * sizeof(short));
  2217.       }
  2218.     }
  2219.     else if (pdir8==1) // backward
  2220.     {
  2221.       lc_pr_mv8x8 = pred_mv8x8[dir][LIST_1];
  2222.       for (j=j0; j<jj; j++)
  2223.       {
  2224.         memcpy(&all_mv[LIST_1][l1_ref][mode][j][i0][0],  &lc_l1_mv8x8[j][i0][0], 2 * 2 * sizeof(short));
  2225.         memcpy(&pred_mv[LIST_1][l1_ref][mode][j][i0][0], &lc_pr_mv8x8[j][i0][0], 2 * 2 * sizeof(short));
  2226.       }
  2227.     }
  2228.     else if (pdir8==2) // bidir
  2229.     {
  2230.       lc_pr_mv8x8 = pred_mv8x8[dir][LIST_0];
  2231.       for (j=j0; j<jj; j++)
  2232.       {
  2233.         memcpy(&all_mv[LIST_0][l0_ref][mode][j][i0][0],  &lc_l0_mv8x8[j][i0][0], (ii - i0) * 2 * sizeof(short));
  2234.         memcpy(&pred_mv[LIST_0][l0_ref][mode][j][i0][0], &lc_pr_mv8x8[j][i0][0], (ii - i0) * 2 * sizeof(short));
  2235.       }
  2236.       
  2237.       lc_pr_mv8x8 = pred_mv8x8[dir][LIST_1];
  2238.       for (j=j0; j<jj; j++)
  2239.       {        
  2240.         memcpy(&all_mv[LIST_1][l1_ref][mode][j][i0][0],  &lc_l1_mv8x8[j][i0][0], (ii - i0) * 2 * sizeof(short));
  2241.         memcpy(&pred_mv[LIST_1][l1_ref][mode][j][i0][0], &lc_pr_mv8x8[j][i0][0], (ii - i0) * 2 * sizeof(short));
  2242.       }
  2243.     }
  2244.     else
  2245.     {
  2246.       error("invalid direction mode", 255);
  2247.     }
  2248.   }
  2249. }
  2250. /*!
  2251.  *************************************************************************************
  2252.  * brief
  2253.  *    Restore motion vectors of 8x8 partitions of one macroblock
  2254.  *************************************************************************************
  2255.  */
  2256. void RestoreMV8x8(int dir)
  2257. {
  2258.   int block8x8;
  2259.   int bframe = (img->type == B_SLICE);
  2260.   for (block8x8=0; block8x8<4; block8x8++)
  2261.     RestoreMVBlock8x8(dir, block8x8, tr8x8, bframe);
  2262. }
  2263. /*!
  2264.  *************************************************************************************
  2265.  * brief
  2266.  *    Store predictors for 8x8 partition
  2267.  *************************************************************************************
  2268.  */
  2269. void StoreNewMotionVectorsBlock8x8(int dir, int block8x8, int mode, int l0_ref, int l1_ref, int pdir8, int bipred_me, int bframe)
  2270. {
  2271.   int j, i0, j0, ii, jj;
  2272.   short ******all_mv  = img->all_mv;
  2273.   short ******pred_mv = img->pred_mv;
  2274.   short (*lc_l0_mv8x8)[4][2] = all_mv8x8[dir][LIST_0];
  2275.   short (*lc_l1_mv8x8)[4][2] = all_mv8x8[dir][LIST_1];
  2276.   short (*lc_pr_mv8x8)[4][2] = NULL;
  2277.   
  2278.   if (bframe && bipred_me)
  2279.   {
  2280.     all_mv  = img->bipred_mv[bipred_me - 1];
  2281.   }
  2282.   i0 = (block8x8 & 0x01) << 1;
  2283.   j0 = (block8x8 >> 1) << 1;
  2284.   ii = i0+2;
  2285.   jj = j0+2;
  2286.   if (pdir8<0)
  2287.   {
  2288.     for (j=j0; j<jj; j++)
  2289.     {
  2290.       memset(&lc_l0_mv8x8[j][i0], 0, 4 * sizeof(short));
  2291.     }
  2292.     for (j=j0; j<jj; j++)
  2293.     {
  2294.       memset(&lc_l1_mv8x8[j][i0], 0, 4 * sizeof(short));
  2295.     }
  2296.     return;
  2297.   }
  2298.   if (!bframe)
  2299.   {
  2300.     lc_pr_mv8x8 = pred_mv8x8[dir][LIST_0];
  2301.     for (j=j0; j<jj; j++)
  2302.     {
  2303.       memcpy(&lc_l0_mv8x8[j][i0][0], &all_mv [LIST_0][l0_ref][4][j][i0][0], 4 * sizeof(short));
  2304.       memcpy(&lc_pr_mv8x8[j][i0][0], &pred_mv[LIST_0][l0_ref][4][j][i0][0], 4 * sizeof(short));
  2305.     }
  2306.     
  2307.     for (j=j0; j<jj; j++)
  2308.     {
  2309.       memset(&lc_l1_mv8x8[j][i0], 0, 4 * sizeof(short));
  2310.     }
  2311.     return;
  2312.   }
  2313.   else
  2314.   {
  2315.     if ((pdir8==0 || pdir8==2))
  2316.     {
  2317.       lc_pr_mv8x8 = pred_mv8x8[dir][LIST_0];
  2318.       for (j=j0; j<jj; j++)
  2319.       {
  2320.         memcpy(&lc_l0_mv8x8[j][i0][0], &all_mv[LIST_0][l0_ref][mode][j][i0][0],  4 * sizeof(short));
  2321.         memcpy(&lc_pr_mv8x8[j][i0][0], &pred_mv[LIST_0][l0_ref][mode][j][i0][0], 4 * sizeof(short));
  2322.       }
  2323.     }
  2324.     else
  2325.     {
  2326.       for (j=j0; j<jj; j++)
  2327.         memset(&lc_l0_mv8x8[j][i0], 0, 4 * sizeof(short));
  2328.     }
  2329.     if ((pdir8==1 || pdir8==2))
  2330.     {
  2331.       lc_pr_mv8x8 = pred_mv8x8[dir][LIST_1];
  2332.       for (j=j0; j<jj; j++)
  2333.       {
  2334.         memcpy(&lc_l1_mv8x8[j][i0][0], &all_mv[LIST_1][l1_ref][mode][j][i0][0],  4 * sizeof(short));
  2335.         memcpy(&lc_pr_mv8x8[j][i0][0], &pred_mv[LIST_1][l1_ref][mode][j][i0][0], 4 * sizeof(short));
  2336.       }
  2337.     }
  2338.     else
  2339.     {
  2340.       for (j=j0; j<jj; j++)
  2341.         memset(&lc_l1_mv8x8[j][i0], 0, 4 * sizeof(short));
  2342.     }
  2343.   }
  2344. }
  2345. /*!
  2346.  ************************************************************************
  2347.  * brief
  2348.  *    Makes the decision if 8x8 tranform will be used (for RD-off)
  2349.  ************************************************************************
  2350.  */
  2351. int GetBestTransformP8x8()
  2352. {
  2353.   int    block_y, block_x, pic_pix_y, pic_pix_x, i, j, k;
  2354.   int    mb_y, mb_x, block8x8;
  2355.   int    cost8x8=0, cost4x4=0;
  2356.   int    *diff_ptr;
  2357.   if(params->Transform8x8Mode==2) //always allow 8x8 transform
  2358.     return 1;
  2359.   for (block8x8=0; block8x8<4; block8x8++)
  2360.   {
  2361.     mb_y = (block8x8 >>   1) << 3;
  2362.     mb_x = (block8x8 & 0x01) << 3;
  2363.     //===== loop over 4x4 blocks =====
  2364.     k=0;
  2365.     for (block_y = mb_y; block_y < mb_y + 8; block_y += 4)
  2366.     {
  2367.       pic_pix_y = img->opix_y + block_y;
  2368.       //get cost for transform size 4x4
  2369.       for (block_x = mb_x; block_x<mb_x + 8; block_x += 4)
  2370.       {
  2371.         pic_pix_x = img->opix_x + block_x;
  2372.         //===== get displaced frame difference ======
  2373.         diff_ptr=&diff4x4[k];
  2374.         for (j=0; j<4; j++)
  2375.         {
  2376.           for (i=0; i<4; i++, k++)
  2377.           {
  2378.             //4x4 transform size
  2379.             diff4x4[k] = pCurImg[pic_pix_y+j][pic_pix_x+i] - tr4x4.mpr8x8[j+block_y][i+block_x];
  2380.             //8x8 transform size
  2381.             diff8x8[k] = pCurImg[pic_pix_y+j][pic_pix_x+i] - tr8x8.mpr8x8[j+block_y][i+block_x];
  2382.           }
  2383.         }
  2384.         cost4x4 += distortion4x4 (diff_ptr);
  2385.       }
  2386.     }
  2387.     cost8x8 += distortion8x8 (diff8x8);
  2388.   }
  2389.   return (cost8x8 < cost4x4);
  2390. }
  2391. /*!
  2392. ************************************************************************
  2393. * brief
  2394. *    Sets MBAFF RD parameters
  2395. ************************************************************************
  2396. */
  2397. void set_mbaff_parameters(Macroblock  *currMB)
  2398. {
  2399.   int  j;
  2400.   int  mode         = best_mode;
  2401.   int  bframe       = (img->type==B_SLICE);
  2402.   char **ipredmodes = img->ipredmode;
  2403.   //===== reconstruction values =====
  2404.   for (j=0; j < MB_BLOCK_SIZE; j++)
  2405.     memcpy(rdopt->rec_mbY[j],&enc_picture->imgY[img->pix_y + j][img->pix_x], MB_BLOCK_SIZE * sizeof(imgpel));
  2406.   if (img->yuv_format != YUV400)
  2407.   {
  2408.     for (j=0; j<img->mb_cr_size_y; j++)
  2409.     {
  2410.       memcpy(rdopt->rec_mb_cr[0][j], &enc_picture->imgUV[0][img->pix_c_y + j][img->pix_c_x], img->mb_cr_size_x * sizeof(imgpel));
  2411.       memcpy(rdopt->rec_mb_cr[1][j], &enc_picture->imgUV[1][img->pix_c_y + j][img->pix_c_x], img->mb_cr_size_x * sizeof(imgpel));
  2412.     }
  2413.   }
  2414.   //===== coefficients and cbp =====
  2415.   rdopt->mode      = mode;
  2416.   rdopt->i16offset = img->i16offset;
  2417.   rdopt->cbp       = currMB->cbp;
  2418.   rdopt->cbp_blk   = currMB->cbp_blk;
  2419.   rdopt->mb_type   = currMB->mb_type;
  2420.   rdopt->luma_transform_size_8x8_flag = currMB->luma_transform_size_8x8_flag;
  2421.   if(rdopt->mb_type == 0 && mode != 0)
  2422.   {
  2423.     mode=0;
  2424.     rdopt->mode=0;
  2425.   }
  2426.   memcpy(rdopt->cofAC[0][0][0], img->cofAC[0][0][0], (4+img->num_blk8x8_uv) * 4 * 2 * 65 * sizeof(int));
  2427.   memcpy(rdopt->cofDC[0][0], img->cofDC[0][0], 3 * 2 * 18 * sizeof(int));
  2428.   memcpy(rdopt->b8mode, currMB->b8mode, BLOCK_MULTIPLE * sizeof(short));
  2429.   memcpy(rdopt->b8pdir, currMB->b8pdir, BLOCK_MULTIPLE * sizeof(short));
  2430.   //==== reference frames =====
  2431.   if (bframe)
  2432.   {
  2433.     if (params->BiPredMERefinements == 1)
  2434.     {      
  2435.       int i, j, k;
  2436.       for (j = 0; j < BLOCK_MULTIPLE; j++)
  2437.       {
  2438.         for (i = 0; i < BLOCK_MULTIPLE; i++)
  2439.         {
  2440.           k = 2*(j >> 1)+(i >> 1);
  2441.           if (currMB->bipred_me[k] == 0)
  2442.           {
  2443.             rdopt->refar[LIST_0][j][i] = enc_picture->motion.ref_idx[LIST_0][img->block_y + j][img->block_x + i];
  2444.             rdopt->refar[LIST_1][j][i] = enc_picture->motion.ref_idx[LIST_1][img->block_y + j][img->block_x + i];
  2445.           }
  2446.           else
  2447.           {
  2448.             rdopt->refar[LIST_0][j][i] = 0;
  2449.             rdopt->refar[LIST_1][j][i] = 0;
  2450.           }
  2451.         }
  2452.       }
  2453.     }
  2454.     else
  2455.     {
  2456.       for (j = 0; j < BLOCK_MULTIPLE; j++)
  2457.       {
  2458.         memcpy(rdopt->refar[LIST_0][j],&enc_picture->motion.ref_idx[LIST_0][img->block_y + j][img->block_x] , BLOCK_MULTIPLE * sizeof(char));
  2459.         memcpy(rdopt->refar[LIST_1][j],&enc_picture->motion.ref_idx[LIST_1][img->block_y + j][img->block_x] , BLOCK_MULTIPLE * sizeof(char));
  2460.       }
  2461.     }
  2462.   }
  2463.   else
  2464.   {
  2465.     for (j = 0; j < BLOCK_MULTIPLE; j++)
  2466.       memcpy(rdopt->refar[LIST_0][j],&enc_picture->motion.ref_idx[LIST_0][img->block_y + j][img->block_x] , BLOCK_MULTIPLE * sizeof(char));
  2467.   }
  2468.   memcpy(rdopt->intra_pred_modes,currMB->intra_pred_modes, MB_BLOCK_PARTITIONS * sizeof(char));
  2469.   memcpy(rdopt->intra_pred_modes8x8,currMB->intra_pred_modes8x8, MB_BLOCK_PARTITIONS * sizeof(char));
  2470.   for (j = img->block_y; j < img->block_y + 4; j++)
  2471.   {
  2472.     memcpy(&rdopt->ipredmode[j][img->block_x],&ipredmodes[j][img->block_x], BLOCK_MULTIPLE * sizeof(char));
  2473.   }
  2474. }
  2475. /*!
  2476. ************************************************************************
  2477. * brief
  2478. *    store coding state (for rd-optimized mode decision), used for 8x8 transformation
  2479. ************************************************************************
  2480. */
  2481. void store_coding_state_cs_cm(Macroblock *currMB)
  2482. {
  2483.   store_coding_state(currMB, cs_cm);
  2484. }
  2485. /*!
  2486. ************************************************************************
  2487. * brief
  2488. *    restore coding state (for rd-optimized mode decision), used for 8x8 transformation
  2489. ************************************************************************
  2490. */
  2491. void reset_coding_state_cs_cm(Macroblock *currMB)
  2492. {
  2493.   reset_coding_state(currMB, cs_cm);
  2494. }
  2495. void assign_enc_picture_params(int mode, char best_pdir, int block, int list_offset, int best_l0_ref, int best_l1_ref, int bframe, short bipred_me)
  2496. {
  2497.   int i,j;
  2498.   int block_x, block_y;
  2499.   int list, maxlist, bestref;
  2500.   short ***curr_mv = NULL;
  2501.   int64 curr_ref_idx = 0;
  2502.  
  2503.   int start_x = 0, start_y = 0, end_x = BLOCK_MULTIPLE, end_y = BLOCK_MULTIPLE; 
  2504.   switch (mode)
  2505.   {
  2506.     case 1:
  2507.       start_x = 0;
  2508.       start_y = 0;
  2509.       end_x   = BLOCK_MULTIPLE;
  2510.       end_y   = BLOCK_MULTIPLE;
  2511.       break;
  2512.     case 2:
  2513.       start_x = 0;
  2514.       start_y = block * 2;
  2515.       end_x   = BLOCK_MULTIPLE;
  2516.       end_y   = (block + 1) * 2;
  2517.       break;
  2518.     case 3:
  2519.       start_x = block * 2;
  2520.       start_y = 0;
  2521.       end_x   = (block + 1) * 2;
  2522.       end_y   = BLOCK_MULTIPLE;
  2523.       break;
  2524.     default:
  2525.       break;
  2526.   }
  2527.   maxlist  = bframe ? 1: 0;
  2528.   for (list = 0; list <= maxlist; list++)
  2529.   {
  2530.     bestref = (list == 0) ? best_l0_ref : best_l1_ref;
  2531.     switch (bipred_me)
  2532.     {
  2533.       case 0:
  2534.         curr_mv = img->all_mv[list][bestref][mode];
  2535.         curr_ref_idx = enc_picture->ref_pic_num[list + list_offset][bestref];
  2536.         break;
  2537.       case 1:
  2538.         curr_mv = img->bipred_mv[0][list][0][mode] ; //best_l0_ref has to be zero in this case
  2539.         curr_ref_idx = enc_picture->ref_pic_num[list + list_offset][0];
  2540.         break;
  2541.       case 2:
  2542.         curr_mv = img->bipred_mv[1][list][0][mode] ; //best_l0_ref has to be zero in this case
  2543.         curr_ref_idx = enc_picture->ref_pic_num[list + list_offset][0];
  2544.         break;
  2545.       default:
  2546.         break;
  2547.     }
  2548.     for (j = start_y; j < end_y; j++)
  2549.     {
  2550.       block_y = img->block_y + j;
  2551.       for (i = start_x; i < end_x; i++)
  2552.       {
  2553.         block_x = img->block_x + i;
  2554.         if ((best_pdir != 2) && (best_pdir != list))
  2555.         {
  2556.             enc_picture->motion.ref_idx    [list][block_y][block_x]    = -1;
  2557.             enc_picture->motion.ref_pic_id [list][block_y][block_x]    = -1;
  2558.             enc_picture->motion.mv         [list][block_y][block_x][0] = 0;
  2559.             enc_picture->motion.mv         [list][block_y][block_x][1] = 0;
  2560.         }
  2561.         else
  2562.       {
  2563.           enc_picture->motion.ref_pic_id [list][block_y][block_x]    = curr_ref_idx;
  2564.           enc_picture->motion.mv         [list][block_y][block_x][0] = curr_mv[j][i][0];
  2565.           enc_picture->motion.mv         [list][block_y][block_x][1] = curr_mv[j][i][1];
  2566.         }
  2567.       }
  2568.     }
  2569.   }
  2570. }
  2571. /*!
  2572.  *************************************************************************************
  2573.  * brief
  2574.  *    Set block 8x8 mode information
  2575.  *************************************************************************************
  2576.  */
  2577. void set_block8x8_info(Block8x8Info *b8x8info, int mode, int block,  char best_ref[2], char best_pdir, short bipred_me)
  2578. {
  2579.   int i;
  2580.   //----- set reference frame and direction parameters -----
  2581.   if (mode==3)
  2582.   {
  2583.     b8x8info->best8x8l0ref [3][block  ] = b8x8info->best8x8l0ref [3][  block+2] = best_ref[LIST_0];
  2584.     b8x8info->best8x8pdir  [3][block  ] = b8x8info->best8x8pdir  [3][  block+2] = best_pdir;
  2585.     b8x8info->best8x8l1ref [3][block  ] = b8x8info->best8x8l1ref [3][  block+2] = best_ref[LIST_1];
  2586.     b8x8info->bipred8x8me  [3][block  ] = b8x8info->bipred8x8me  [3][  block+2] = bipred_me;
  2587.   }
  2588.   else if (mode==2)
  2589.   {
  2590.     b8x8info->best8x8l0ref [2][2*block] = b8x8info->best8x8l0ref [2][2*block+1] = best_ref[LIST_0];
  2591.     b8x8info->best8x8pdir  [2][2*block] = b8x8info->best8x8pdir  [2][2*block+1] = best_pdir;
  2592.     b8x8info->best8x8l1ref [2][2*block] = b8x8info->best8x8l1ref [2][2*block+1] = best_ref[LIST_1];
  2593.     b8x8info->bipred8x8me  [2][2*block] = b8x8info->bipred8x8me  [2][2*block+1] = bipred_me;
  2594.   }
  2595.   else
  2596.   {
  2597.     memset(&b8x8info->best8x8l0ref [1][0], best_ref[LIST_0], 4 * sizeof(char));
  2598.     memset(&b8x8info->best8x8l1ref [1][0], best_ref[LIST_1], 4 * sizeof(char));
  2599.     memset(&b8x8info->best8x8pdir  [1][0], best_pdir, 4 * sizeof(char));
  2600.     for (i = 0; i< 4; i++)
  2601.       b8x8info->bipred8x8me  [1][i] =  bipred_me;
  2602.   }
  2603. }
  2604. /*!
  2605.  *************************************************************************************
  2606.  * brief
  2607.  *    Set block 8x8 mode information for P8x8 mode
  2608.  *************************************************************************************
  2609.  */
  2610. void set_subblock8x8_info(Block8x8Info *b8x8info,int mode, int block, RD_8x8DATA *tr)
  2611. {          
  2612.   b8x8info->best8x8mode         [block] = tr->part8x8mode  [block];
  2613.   b8x8info->best8x8pdir   [mode][block] = tr->part8x8pdir  [block];
  2614.   b8x8info->best8x8l0ref  [mode][block] = tr->part8x8l0ref [block];
  2615.   b8x8info->best8x8l1ref  [mode][block] = tr->part8x8l1ref [block];
  2616.   b8x8info->bipred8x8me   [mode][block] = tr->part8x8bipred[block];
  2617. }
  2618. void update_refresh_map(int intra, int intra1, Macroblock *currMB)
  2619. {
  2620.   if (params->RestrictRef==1)
  2621.   {
  2622.     // Modified for Fast Mode Decision. Inchoon Choi, SungKyunKwan Univ.
  2623.     if (params->rdopt<2)
  2624.     {
  2625.       refresh_map[2*img->mb_y  ][2*img->mb_x  ] = (intra ? 1 : 0);
  2626.       refresh_map[2*img->mb_y  ][2*img->mb_x+1] = (intra ? 1 : 0);
  2627.       refresh_map[2*img->mb_y+1][2*img->mb_x  ] = (intra ? 1 : 0);
  2628.       refresh_map[2*img->mb_y+1][2*img->mb_x+1] = (intra ? 1 : 0);
  2629.     }
  2630.     else if (params->rdopt == 3)
  2631.     {
  2632.       refresh_map[2*img->mb_y  ][2*img->mb_x  ] = (intra1==0 && (currMB->mb_type==I16MB || currMB->mb_type==I4MB) ? 1 : 0);
  2633.       refresh_map[2*img->mb_y  ][2*img->mb_x+1] = (intra1==0 && (currMB->mb_type==I16MB || currMB->mb_type==I4MB) ? 1 : 0);
  2634.       refresh_map[2*img->mb_y+1][2*img->mb_x  ] = (intra1==0 && (currMB->mb_type==I16MB || currMB->mb_type==I4MB) ? 1 : 0);
  2635.       refresh_map[2*img->mb_y+1][2*img->mb_x+1] = (intra1==0 && (currMB->mb_type==I16MB || currMB->mb_type==I4MB) ? 1 : 0);
  2636.     }
  2637.   }
  2638.   else if (params->RestrictRef==2)
  2639.   {
  2640.     refresh_map[2*img->mb_y  ][2*img->mb_x  ] = (currMB->mb_type==I16MB || currMB->mb_type==I4MB ? 1 : 0);
  2641.     refresh_map[2*img->mb_y  ][2*img->mb_x+1] = (currMB->mb_type==I16MB || currMB->mb_type==I4MB ? 1 : 0);
  2642.     refresh_map[2*img->mb_y+1][2*img->mb_x  ] = (currMB->mb_type==I16MB || currMB->mb_type==I4MB ? 1 : 0);
  2643.     refresh_map[2*img->mb_y+1][2*img->mb_x+1] = (currMB->mb_type==I16MB || currMB->mb_type==I4MB ? 1 : 0);
  2644.   }
  2645. }
  2646. int valid_intra_mode(int ipmode)
  2647. {
  2648.   if (params->IntraDisableInterOnly==0 || img->type != I_SLICE)
  2649.   {
  2650.     if (params->Intra4x4ParDisable && (ipmode==VERT_PRED||ipmode==HOR_PRED))
  2651.       return 0;
  2652.     if (params->Intra4x4DiagDisable && (ipmode==DIAG_DOWN_LEFT_PRED||ipmode==DIAG_DOWN_RIGHT_PRED))
  2653.       return 0;
  2654.     if (params->Intra4x4DirDisable && ipmode>=VERT_RIGHT_PRED)
  2655.       return 0;
  2656.   }
  2657.   return 1;
  2658. }
  2659. void compute_comp_cost(imgpel **cur_img, imgpel prd_img[16][16], int pic_opix_x, int *cost)
  2660. {
  2661.   int j, i, *d;
  2662.   imgpel *cur_line, *prd_line;
  2663.   d = &diff[0];
  2664.   for (j = 0; j < BLOCK_SIZE; j++)
  2665.   {
  2666.     cur_line = &cur_img[j][pic_opix_x];
  2667.     prd_line = prd_img[j];
  2668.     for (i = 0; i < BLOCK_SIZE; i++)
  2669.     {
  2670.       *d++ = *cur_line++ - *prd_line++;
  2671.     }
  2672.   }      
  2673.   *cost += distortion4x4 (diff);
  2674. }
  2675. void generate_pred_error(imgpel **cur_img, imgpel prd_img[16][16], imgpel cur_prd[16][16], 
  2676.                          int m7[16][16], int pic_opix_x, int block_x)
  2677. {
  2678.   int j, i, *m7_line;
  2679.   imgpel *cur_line, *prd_line;
  2680.   for (j = 0; j < BLOCK_SIZE; j++)
  2681.   {
  2682.     m7_line = &m7[j][block_x];
  2683.     cur_line = &cur_img[j][pic_opix_x];
  2684.     prd_line = prd_img[j];
  2685.     memcpy(&cur_prd[j][block_x], prd_line, BLOCK_SIZE * sizeof(imgpel));
  2686.     for (i = 0; i < BLOCK_SIZE; i++)
  2687.     {
  2688.       *m7_line++ = (int) (*cur_line++ - *prd_line++);
  2689.     }
  2690.   }        
  2691. }