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

Audio

开发平台:

Visual C++

  1. /*!
  2.  ***************************************************************************
  3.  * file transform8x8.c
  4.  *
  5.  * brief
  6.  *    8x8 transform functions
  7.  *
  8.  * author
  9.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10.  *    - Yuri Vatis
  11.  *    - Jan Muenster
  12.  *    - Lowell Winger                   <lwinger@lsil.com>
  13.  * date
  14.  *    12. October 2003
  15.  **************************************************************************
  16.  */
  17. #include <math.h>
  18. #include <limits.h>
  19. #include "global.h"
  20. #include "image.h"
  21. #include "mb_access.h"
  22. #include "elements.h"
  23. #include "cabac.h"
  24. #include "vlc.h"
  25. #include "transform8x8.h"
  26. #include "transform.h"
  27. #include "macroblock.h"
  28. #include "symbol.h"
  29. #include "mc_prediction.h"
  30. #include "quant8x8.h"
  31. #include "rdoq.h"
  32. #include "q_matrix.h"
  33. #include "q_offsets.h"
  34. int   cofAC8x8_chroma[2][4][2][18];
  35. static int diff64[64];
  36. //! single scan pattern
  37. //static const byte SNGL_SCAN8x8[64][2] = {
  38. const byte SNGL_SCAN8x8[64][2] = {
  39.   {0,0}, {1,0}, {0,1}, {0,2}, {1,1}, {2,0}, {3,0}, {2,1},
  40.   {1,2}, {0,3}, {0,4}, {1,3}, {2,2}, {3,1}, {4,0}, {5,0},
  41.   {4,1}, {3,2}, {2,3}, {1,4}, {0,5}, {0,6}, {1,5}, {2,4},
  42.   {3,3}, {4,2}, {5,1}, {6,0}, {7,0}, {6,1}, {5,2}, {4,3},
  43.   {3,4}, {2,5}, {1,6}, {0,7}, {1,7}, {2,6}, {3,5}, {4,4},
  44.   {5,3}, {6,2}, {7,1}, {7,2}, {6,3}, {5,4}, {4,5}, {3,6},
  45.   {2,7}, {3,7}, {4,6}, {5,5}, {6,4}, {7,3}, {7,4}, {6,5},
  46.   {5,6}, {4,7}, {5,7}, {6,6}, {7,5}, {7,6}, {6,7}, {7,7}
  47. };
  48. //! field scan pattern
  49. //static const byte FIELD_SCAN8x8[64][2] = {   // 8x8
  50. const byte FIELD_SCAN8x8[64][2] = {   // 8x8
  51.   {0,0}, {0,1}, {0,2}, {1,0}, {1,1}, {0,3}, {0,4}, {1,2},
  52.   {2,0}, {1,3}, {0,5}, {0,6}, {0,7}, {1,4}, {2,1}, {3,0},
  53.   {2,2}, {1,5}, {1,6}, {1,7}, {2,3}, {3,1}, {4,0}, {3,2},
  54.   {2,4}, {2,5}, {2,6}, {2,7}, {3,3}, {4,1}, {5,0}, {4,2},
  55.   {3,4}, {3,5}, {3,6}, {3,7}, {4,3}, {5,1}, {6,0}, {5,2},
  56.   {4,4}, {4,5}, {4,6}, {4,7}, {5,3}, {6,1}, {6,2}, {5,4},
  57.   {5,5}, {5,6}, {5,7}, {6,3}, {7,0}, {7,1}, {6,4}, {6,5},
  58.   {6,6}, {6,7}, {7,2}, {7,3}, {7,4}, {7,5}, {7,6}, {7,7}
  59. };
  60. //! array used to find expensive coefficients
  61. static const byte COEFF_COST8x8[2][64] =
  62. {
  63.   {3,3,3,3,2,2,2,2,2,2,2,2,1,1,1,1,
  64.    1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
  65.    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  66.    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  67.   {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
  68.    9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
  69.    9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
  70.    9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9}
  71. };
  72. static int **levelscale = NULL, **leveloffset = NULL;
  73. static int **invlevelscale = NULL;
  74. static int **fadjust8x8 = NULL;
  75. /*!
  76. ************************************************************************
  77. * brief
  78. *    Residual DPCM for Intra lossless coding
  79. *
  80. * par Input:
  81. *    block_x,block_y: Block position inside a macro block (0,8).
  82. ************************************************************************
  83. */
  84. //For residual DPCM
  85. int Residual_DPCM_8x8(int ipmode, int ores[16][16], int rres[16][16],int block_y, int block_x)
  86. {
  87.   int i,j;
  88.   int temp[8][8];
  89.   if(ipmode==VERT_PRED)
  90.   { 
  91.     for (j=0; j<8; j++)
  92.      temp[0][j] = ores[block_y][block_x+j];
  93.     for (i=1; i<8; i++) 
  94.       for (j=0; j<8; j++)
  95.         temp[i][j] =  ores[block_y+i][block_x+j] - ores[block_y+i-1][block_x+j];
  96.     for (i = 0; i < 8; i++)
  97.       for (j = 0; j < 8; j++)
  98.         rres[block_y+i][block_x+j] = temp[i][j];
  99.   }
  100.   else  //HOR_PRED
  101.   {
  102.     for (i=0; i<8; i++)
  103.      temp[i][0] = ores[block_y + i][block_x];
  104.     for (i=0; i<8; i++)
  105.       for (j=1; j<8; j++)
  106.         temp[i][j] = ores[block_y+i][block_x+j] - ores[block_y+i][block_x+j-1];
  107.     for (i=0; i<8; i++)
  108.       for (j=0; j<8; j++)
  109.         rres[block_y+i][block_x+j] = temp[i][j];
  110.   }
  111.   return 0;
  112. }
  113. /*!
  114. ************************************************************************
  115. * brief
  116. *    Inverse residual DPCM for Intra lossless coding
  117. *
  118. * par Input:
  119. *    block_x,block_y: Block position inside a macro block (0,8).
  120. ************************************************************************
  121. */
  122. //For residual DPCM
  123. int Inv_Residual_DPCM_8x8(int m7[16][16], int block_y, int block_x)  
  124. {
  125.   int i;
  126.   int temp[8][8];
  127.   if(ipmode_DPCM==VERT_PRED)
  128.   {
  129.     for(i=0; i<8; i++)
  130.     {
  131.       temp[0][i] = m7[block_y+0][block_x+i];
  132.       temp[1][i] = temp[0][i] + m7[block_y+1][block_x+i];
  133.       temp[2][i] = temp[1][i] + m7[block_y+2][block_x+i];
  134.       temp[3][i] = temp[2][i] + m7[block_y+3][block_x+i];
  135.       temp[4][i] = temp[3][i] + m7[block_y+4][block_x+i];
  136.       temp[5][i] = temp[4][i] + m7[block_y+5][block_x+i];
  137.       temp[6][i] = temp[5][i] + m7[block_y+6][block_x+i];
  138.       temp[7][i] = temp[6][i] + m7[block_y+7][block_x+i];
  139.     }
  140.     for(i=0; i<8; i++)
  141.     {
  142.       m7[block_y+1][block_x+i] = temp[1][i];
  143.       m7[block_y+2][block_x+i] = temp[2][i];
  144.       m7[block_y+3][block_x+i] = temp[3][i];
  145.       m7[block_y+4][block_x+i] = temp[4][i];
  146.       m7[block_y+5][block_x+i] = temp[5][i];
  147.       m7[block_y+6][block_x+i] = temp[6][i];
  148.       m7[block_y+7][block_x+i] = temp[7][i];
  149.     }
  150.   }
  151.   else //HOR_PRED
  152.   {
  153.     for(i=0; i<8; i++)
  154.     {
  155.       temp[i][0] = m7[block_y+i][block_x+0];
  156.       temp[i][1] = temp[i][0] + m7[block_y+i][block_x+1];
  157.       temp[i][2] = temp[i][1] + m7[block_y+i][block_x+2];
  158.       temp[i][3] = temp[i][2] + m7[block_y+i][block_x+3];
  159.       temp[i][4] = temp[i][3] + m7[block_y+i][block_x+4];
  160.       temp[i][5] = temp[i][4] + m7[block_y+i][block_x+5];
  161.       temp[i][6] = temp[i][5] + m7[block_y+i][block_x+6];
  162.       temp[i][7] = temp[i][6] + m7[block_y+i][block_x+7];
  163.     }
  164.     for(i=0; i<8; i++)
  165.     {
  166.       m7[block_y+i][block_x+1] = temp[i][1];
  167.       m7[block_y+i][block_x+2] = temp[i][2];
  168.       m7[block_y+i][block_x+3] = temp[i][3];
  169.       m7[block_y+i][block_x+4] = temp[i][4];
  170.       m7[block_y+i][block_x+5] = temp[i][5];
  171.       m7[block_y+i][block_x+6] = temp[i][6];
  172.       m7[block_y+i][block_x+7] = temp[i][7];
  173.     }
  174.   }
  175.   return 0;
  176. }
  177. /*!
  178.  *************************************************************************************
  179.  * brief
  180.  *    8x8 Intra mode decision for a macroblock
  181.  *************************************************************************************
  182.  */
  183. int Mode_Decision_for_new_Intra8x8Macroblock (Macroblock *currMB, double lambda, double *min_cost)
  184. {
  185.   int cur_cbp = 0, b8;
  186.   double cost8x8;
  187.   int cr_cbp[3] = { 0, 0, 0}; 
  188.   *min_cost = (int)floor(6.0 * lambda + 0.4999);
  189.   cmp_cbp[1] = cmp_cbp[2] = 0;
  190.   if (params->rdopt == 0)
  191.     Mode_Decision_for_new_8x8IntraBlocks = Mode_Decision_for_new_8x8IntraBlocks_JM_Low;
  192.   else
  193.     Mode_Decision_for_new_8x8IntraBlocks = Mode_Decision_for_new_8x8IntraBlocks_JM_High;
  194.   for (b8=0; b8<4; b8++)
  195.   {
  196.     if (Mode_Decision_for_new_8x8IntraBlocks (currMB, b8, lambda, &cost8x8, cr_cbp))
  197.     {
  198.       cur_cbp |= (1<<b8);
  199.     }
  200.     *min_cost += cost8x8;
  201.     if (img->P444_joined)
  202.     {
  203.       int k;
  204.       for (k = 1; k < 3; k++)
  205.       {
  206.         if (cr_cbp[k])
  207.         {
  208.           cmp_cbp[k] |= (1<<b8);
  209.           cur_cbp |= cmp_cbp[k];
  210.           cmp_cbp[k] = cur_cbp;
  211.         }
  212.       }
  213.     }
  214.   }
  215.   return cur_cbp;
  216. }
  217. /*!
  218.  *************************************************************************************
  219.  * brief
  220.  *    8x8 Intra mode decision for a macroblock - Low complexity
  221.  *************************************************************************************
  222.  */
  223. int Mode_Decision_for_new_8x8IntraBlocks_JM_Low (Macroblock *currMB, int b8, double lambda, double *min_cost, int cr_cbp[3])
  224. {
  225.   int     ipmode, best_ipmode = 0, i, j, dummy;
  226.   double  cost;
  227.   int     nonzero = 0;
  228.   int     block_x     = (b8 & 0x01) << 3;
  229.   int     block_y     = (b8 >> 1) << 3;
  230.   int     pic_pix_x   = img->pix_x + block_x;
  231.   int     pic_pix_y   = img->pix_y + block_y;
  232.   int     pic_opix_x   = img->opix_x + block_x;
  233.   int     pic_opix_y   = img->opix_y + block_y;
  234.   int     pic_block_x = pic_pix_x >> 2;
  235.   int     pic_block_y = pic_pix_y >> 2;
  236.   imgpel    *img_org, *img_prd;
  237.   int       *residual;
  238.   int left_available, up_available, all_available;
  239.   int    (*mb_ores)[16] = img->mb_ores[0]; 
  240.   imgpel (*mb_pred)[16] = img->mb_pred[0];
  241.   int *mb_size = img->mb_size[IS_LUMA];
  242.   char   upMode;
  243.   char   leftMode;
  244.   int    mostProbableMode;
  245.   PixelPos left_block;
  246.   PixelPos top_block;
  247.   get4x4Neighbour(currMB, block_x - 1, block_y    , mb_size, &left_block);
  248.   get4x4Neighbour(currMB, block_x,     block_y - 1, mb_size, &top_block );
  249.   if (params->UseConstrainedIntraPred)
  250.   {
  251.     top_block.available  = top_block.available ? img->intra_block [top_block.mb_addr] : 0;
  252.     left_block.available = left_block.available ? img->intra_block [left_block.mb_addr] : 0;
  253.   }
  254.   if(b8 >> 1)
  255.     upMode    =  top_block.available ? img->ipredmode8x8[top_block.pos_y ][top_block.pos_x ] : -1;
  256.   else
  257.     upMode    =  top_block.available ? img->ipredmode   [top_block.pos_y ][top_block.pos_x ] : -1;
  258.   if(b8 & 0x01)
  259.     leftMode  = left_block.available ? img->ipredmode8x8[left_block.pos_y][left_block.pos_x] : -1;
  260.   else
  261.     leftMode  = left_block.available ? img->ipredmode[left_block.pos_y][left_block.pos_x] : -1;
  262.   mostProbableMode  = (upMode < 0 || leftMode < 0) ? DC_PRED : upMode < leftMode ? upMode : leftMode;
  263.   *min_cost = INT_MAX;
  264.   ipmode_DPCM = NO_INTRA_PMODE; //For residual DPCM
  265.   //===== INTRA PREDICTION FOR 8x8 BLOCK =====
  266.   intrapred_8x8 (currMB, PLANE_Y, pic_pix_x, pic_pix_y, &left_available, &up_available, &all_available);
  267.   if(img->P444_joined)
  268.   { 
  269.     select_plane(PLANE_U);
  270.     intrapred_8x8(currMB, PLANE_U, pic_pix_x, pic_pix_y, &left_available, &up_available, &all_available);
  271.     select_plane(PLANE_V);
  272.     intrapred_8x8(currMB, PLANE_V, pic_pix_x, pic_pix_y, &left_available, &up_available, &all_available);
  273.     select_plane(PLANE_Y);
  274.   }
  275.   //===== LOOP OVER ALL 8x8 INTRA PREDICTION MODES =====
  276.   for (ipmode = 0; ipmode < NO_INTRA_PMODE; ipmode++)
  277.   {
  278.     if( (ipmode==DC_PRED) ||
  279.       ((ipmode==VERT_PRED||ipmode==VERT_LEFT_PRED||ipmode==DIAG_DOWN_LEFT_PRED) && up_available ) ||
  280.       ((ipmode==HOR_PRED||ipmode==HOR_UP_PRED) && left_available ) ||
  281.       (all_available) )
  282.     {
  283.       cost  = (ipmode == mostProbableMode) ? 0 : (int)floor(4 * lambda );
  284.       compute_comp_cost8x8(&pImgOrg[0][pic_opix_y], img->mpr_8x8[0][ipmode], pic_opix_x, &cost);
  285.      
  286.       if(img->P444_joined)
  287.       {
  288.         int m;
  289.         for (m = PLANE_U; m <= PLANE_V; m++)
  290.         compute_comp_cost8x8(&pImgOrg[m][pic_opix_y], img->mpr_8x8[m][ipmode], pic_opix_x, &cost);
  291.       }
  292.       if (cost < *min_cost)
  293.       {
  294.         best_ipmode = ipmode;
  295.         *min_cost   = cost;
  296.       }
  297.     }
  298.   }
  299.   //===== set intra mode prediction =====
  300.   img->ipredmode8x8[pic_block_y][pic_block_x] = (char) best_ipmode;
  301.   ipmode_DPCM = best_ipmode; //For residual DPCM
  302.   if(img->P444_joined)
  303.   {
  304.     ColorPlane k;
  305.     CbCr_predmode_8x8[b8] = best_ipmode; 
  306.     for (k = PLANE_U; k <= PLANE_V; k++)
  307.     {
  308.       cr_cbp[k] = 0; 
  309.       select_plane(k);
  310.       for (j=0; j<8; j++)
  311.       {
  312.         for (i=0; i<8; i++)
  313.         {
  314.           img->mb_pred[k][block_y+j][block_x+i]  = img->mpr_8x8[k][best_ipmode][j][i]; 
  315.           img->mb_ores[k][block_y+j][block_x+i]   = pImgOrg[k][img->pix_y+block_y+j][img->pix_x+block_x+i] - img->mpr_8x8[k][best_ipmode][j][i];
  316.         }
  317.       }
  318.       ipmode_DPCM=best_ipmode; 
  319.       if (pDCT_8x8(currMB, k, b8, &dummy, 1))
  320.         cr_cbp[k] = 1;
  321.     }
  322.     select_plane(PLANE_Y);
  323.   }
  324.   currMB->intra_pred_modes8x8[4*b8] = (mostProbableMode == best_ipmode)
  325.     ? -1
  326.     : (best_ipmode < mostProbableMode ? best_ipmode : best_ipmode-1);
  327.   for(j = img->mb_y*4+(b8 >> 1)*2; j < img->mb_y*4+(b8 >> 1)*2 + 2; j++)   //loop 4x4s in the subblock for 8x8 prediction setting
  328.     memset(&img->ipredmode8x8[j][img->mb_x*4+(b8 & 0x01)*2], best_ipmode, 2 * sizeof(char));
  329.   // get prediction and prediction error
  330.   for (j = block_y; j < block_y + 8; j++)
  331.   {
  332.     memcpy(&mb_pred[j][block_x],img->mpr_8x8[0][best_ipmode][j - block_y], 8 * sizeof(imgpel));
  333.     img_org  = &pCurImg[img->opix_y+j][pic_opix_x];
  334.     img_prd  = &mb_pred[j][block_x];
  335.     residual = &mb_ores[j][block_x];
  336.     for (i=0; i<8; i++)
  337.     {
  338.       *residual++ = *img_org++ - *img_prd++;
  339.     }
  340.   }
  341.   ipmode_DPCM = best_ipmode;
  342.   nonzero = pDCT_8x8 (currMB, PLANE_Y, b8, &dummy, 1);    
  343.   return nonzero;
  344. }
  345. /*!
  346. *************************************************************************************
  347. * brief
  348. *    8x8 Intra mode decision for a macroblock - High complexity
  349. *************************************************************************************
  350. */
  351. int Mode_Decision_for_new_8x8IntraBlocks_JM_High (Macroblock *currMB, int b8, double lambda, double *min_cost, int cr_cbp[3])
  352. {
  353.   int     ipmode, best_ipmode = 0, i, j, k, y, dummy;
  354.   int     c_nz, nonzero = 0;
  355.   static  imgpel  rec8x8[3][8][8];
  356.   double  rdcost = 0.0;
  357.   int     block_x     = (b8 & 0x01) << 3;
  358.   int     block_y     = (b8 >> 1) << 3;
  359.   int     pic_pix_x   = img->pix_x + block_x;
  360.   int     pic_pix_y   = img->pix_y + block_y;
  361.   int     pic_opix_x   = img->opix_x + block_x;
  362.   int     pic_opix_y   = img->opix_y + block_y;
  363.   int     pic_block_x = pic_pix_x >> 2;
  364.   int     pic_block_y = pic_pix_y >> 2;
  365.   double  min_rdcost  = 1e30;
  366.   imgpel    *img_org, *img_prd;
  367.   int       *residual;
  368.   extern  int ****cofAC8x8;
  369.   static int fadjust8x8[2][16][16];
  370.   static int fadjust8x8Cr[2][2][16][16];
  371.   extern  int ****cofAC8x8CbCr[2];
  372.   int uv, c_nzCbCr[3];
  373.   int left_available, up_available, all_available;
  374.   int    (*mb_ores)[16] = img->mb_ores[0]; 
  375.   imgpel (*mb_pred)[16] = img->mb_pred[0];
  376.   int *mb_size = img->mb_size[IS_LUMA];
  377.   char   upMode;
  378.   char   leftMode;
  379.   int    mostProbableMode;
  380.   PixelPos left_block;
  381.   PixelPos top_block;
  382.   get4x4Neighbour(currMB, block_x - 1, block_y    , mb_size, &left_block);
  383.   get4x4Neighbour(currMB, block_x,     block_y - 1, mb_size, &top_block );
  384.   if (params->UseConstrainedIntraPred)
  385.   {
  386.     top_block.available  = top_block.available ? img->intra_block [top_block.mb_addr] : 0;
  387.     left_block.available = left_block.available ? img->intra_block [left_block.mb_addr] : 0;
  388.   }
  389.   if(b8 >> 1)
  390.     upMode    =  top_block.available ? img->ipredmode8x8[top_block.pos_y ][top_block.pos_x ] : -1;
  391.   else
  392.     upMode    =  top_block.available ? img->ipredmode   [top_block.pos_y ][top_block.pos_x ] : -1;
  393.   if(b8 & 0x01)
  394.     leftMode  = left_block.available ? img->ipredmode8x8[left_block.pos_y][left_block.pos_x] : -1;
  395.   else
  396.     leftMode  = left_block.available ? img->ipredmode[left_block.pos_y][left_block.pos_x] : -1;
  397.   mostProbableMode  = (upMode < 0 || leftMode < 0) ? DC_PRED : upMode < leftMode ? upMode : leftMode;
  398.   *min_cost = INT_MAX;
  399.   ipmode_DPCM = NO_INTRA_PMODE; //For residual DPCM
  400.   //===== INTRA PREDICTION FOR 8x8 BLOCK =====
  401.   intrapred_8x8 (currMB, PLANE_Y, pic_pix_x, pic_pix_y, &left_available, &up_available, &all_available);
  402.   if(img->P444_joined)
  403.   { 
  404.     select_plane(PLANE_U);
  405.     intrapred_8x8(currMB, PLANE_U, pic_pix_x, pic_pix_y, &left_available, &up_available, &all_available);
  406.     select_plane(PLANE_V);
  407.     intrapred_8x8(currMB, PLANE_V, pic_pix_x, pic_pix_y, &left_available, &up_available, &all_available);
  408.     select_plane(PLANE_Y);
  409.   }
  410.   //===== LOOP OVER ALL 8x8 INTRA PREDICTION MODES =====
  411.   for (ipmode = 0; ipmode < NO_INTRA_PMODE; ipmode++)
  412.   {
  413.     if( (ipmode==DC_PRED) ||
  414.       ((ipmode==VERT_PRED||ipmode==VERT_LEFT_PRED||ipmode==DIAG_DOWN_LEFT_PRED) && up_available ) ||
  415.       ((ipmode==HOR_PRED||ipmode==HOR_UP_PRED) && left_available ) ||
  416.       (all_available) )
  417.     {
  418.       // get prediction and prediction error
  419.       for (j=block_y; j < block_y  + 8; j++)
  420.       {
  421.         memcpy(&mb_pred[j][block_x],img->mpr_8x8[0][ipmode][j - block_y], 8 * sizeof(imgpel));
  422.         img_org  = &pCurImg[img->opix_y+j][pic_opix_x];
  423.         img_prd  = &mb_pred[j][block_x];
  424.         residual = &mb_ores[j][block_x];
  425.         for (i=0; i<8; i++)
  426.         {
  427.           *residual++ = *img_org++ - *img_prd++;
  428.         }
  429.       }
  430.       if(img->P444_joined) 
  431.       {
  432.         for (k = PLANE_U; k <= PLANE_V; k++)
  433.         {
  434.           for (j=0; j<8; j++)
  435.           {
  436.             memcpy(&img->mb_pred[k][block_y+j][block_x],img->mpr_8x8[k][ipmode][j], 8 * sizeof(imgpel));
  437.             for (i=0; i<8; i++)
  438.             {
  439.               img->mb_ores[k][block_y+j][block_x+i] = (int) (pImgOrg[k][pic_opix_y+j][pic_opix_x+i] - img->mpr_8x8[k][ipmode][j][i]);
  440.               img->mb_ores[k][block_y+j][block_x+i] = img->mb_ores[k][block_y+j][block_x+i]; // line is temporary until we fix code to use img->mb_ores
  441.             }
  442.           }
  443.         }
  444.       }
  445.       ipmode_DPCM=ipmode;
  446.       //===== store the coding state =====
  447.       // store_coding_state_cs_cm(currMB);
  448.       // get and check rate-distortion cost
  449.       if ((rdcost = RDCost_for_8x8IntraBlocks (currMB, &c_nz, b8, ipmode, lambda, min_rdcost, mostProbableMode, c_nzCbCr)) < min_rdcost)
  450.       {
  451.         //--- set coefficients ---
  452.        memcpy(cofAC8x8[b8][0][0],img->cofAC[b8][0][0], 4 * 2 * 65 * sizeof(int));
  453.         //--- set reconstruction ---
  454.         for (y=0; y<8; y++)
  455.         {
  456.           memcpy(rec8x8[0][y],&enc_picture->imgY[pic_pix_y+y][pic_pix_x], 8 * sizeof(imgpel));
  457.         }
  458.         if (img->AdaptiveRounding)
  459.         {
  460.           for (j=block_y; j<block_y + 8; j++)
  461.             memcpy(&fadjust8x8[1][j][block_x],&img->fadjust8x8[1][j][block_x], 8 * sizeof(int));
  462.           if (img->P444_joined)
  463.           {
  464.             for (j=block_y; j<block_y + 8; j++)
  465.             {
  466.               memcpy(&fadjust8x8Cr[0][1][j][block_x],&img->fadjust8x8Cr[0][1][j][block_x], 8 * sizeof(int));
  467.               memcpy(&fadjust8x8Cr[1][1][j][block_x],&img->fadjust8x8Cr[1][1][j][block_x], 8 * sizeof(int));
  468.             }
  469.           }            
  470.         }
  471.         if (img->P444_joined) 
  472.         { 
  473.           //--- set coefficients ---
  474.           for (uv=0; uv < 2; uv++)
  475.           {
  476.             memcpy(cofAC8x8CbCr[uv][b8][0][0],img->cofAC[4+b8+4*uv][0][0], 2 * 4 * 65 * sizeof(int));
  477.             cr_cbp[uv + 1] = c_nzCbCr[uv + 1];
  478.             //--- set reconstruction ---
  479.             for (y=0; y<8; y++)
  480.             {
  481.               memcpy(rec8x8[uv + 1][y],&enc_picture->imgUV[uv][pic_pix_y+y][pic_pix_x], 8 * sizeof(imgpel));
  482.             }
  483.           }
  484.         }
  485.         //--- flag if dct-coefficients must be coded ---
  486.         nonzero = c_nz;
  487.         //--- set best mode update minimum cost ---
  488.         *min_cost   = rdcost;
  489.         min_rdcost  = rdcost;
  490.         best_ipmode = ipmode;
  491.       }
  492.       reset_coding_state_cs_cm(currMB);
  493.     }
  494.   }
  495.   //===== set intra mode prediction =====
  496.   img->ipredmode8x8[pic_block_y][pic_block_x] = (char) best_ipmode;
  497.   ipmode_DPCM = best_ipmode; //For residual DPCM
  498.   if(img->P444_joined)
  499.   {
  500.     ColorPlane k;
  501.     CbCr_predmode_8x8[b8] = best_ipmode; 
  502.     for (k = PLANE_U; k <= PLANE_V; k++)
  503.     {
  504.       cr_cbp[k] = 0; 
  505.       select_plane(k);
  506.       for (j=0; j<8; j++)
  507.       {
  508.         for (i=0; i<8; i++)
  509.         {
  510.           img->mb_pred[k][block_y+j][block_x+i] = img->mpr_8x8[k][best_ipmode][j][i]; 
  511.           img->mb_ores[k][block_y+j][block_x+i] = pImgOrg[k][img->pix_y+block_y+j][img->pix_x+block_x+i] - img->mpr_8x8[k][best_ipmode][j][i];
  512.         }
  513.       }
  514.       ipmode_DPCM = best_ipmode; 
  515.       if (pDCT_8x8(currMB, k, b8, &dummy, 1))
  516.         cr_cbp[k] = 1;
  517.     }
  518.     select_plane(PLANE_Y);
  519.   }
  520.   currMB->intra_pred_modes8x8[4*b8] = (mostProbableMode == best_ipmode)
  521.     ? -1
  522.     : (best_ipmode < mostProbableMode ? best_ipmode : best_ipmode-1);
  523.   for(j = img->mb_y*4+(b8 >> 1)*2; j < img->mb_y*4+(b8 >> 1)*2 + 2; j++)   //loop 4x4s in the subblock for 8x8 prediction setting
  524.     memset(&img->ipredmode8x8[j][img->mb_x*4+(b8 & 0x01)*2], best_ipmode, 2 * sizeof(char));
  525.   //===== restore coefficients =====
  526.   memcpy(img->cofAC[b8][0][0],cofAC8x8[b8][0][0], 4 * 2 * 65 * sizeof(int));
  527.   if (img->AdaptiveRounding)
  528.   {
  529.     for (j=block_y; j< block_y + 8; j++)
  530.       memcpy(&img->fadjust8x8[1][j][block_x], &fadjust8x8[1][j][block_x], 8 * sizeof(int));
  531.     if (img->P444_joined)
  532.     {
  533.       for (j=0; j<8; j++)
  534.       {
  535.         memcpy(&img->fadjust8x8Cr[0][1][block_y+j][block_x], &fadjust8x8Cr[0][1][block_y+j][block_x], 8 * sizeof(int));
  536.         memcpy(&img->fadjust8x8Cr[1][1][block_y+j][block_x], &fadjust8x8Cr[1][1][block_y+j][block_x], 8 * sizeof(int));
  537.       }
  538.     }
  539.   }
  540.   //===== restore reconstruction and prediction (needed if single coeffs are removed) =====
  541.   for (y=0; y<8; y++)
  542.   {
  543.     memcpy(&enc_picture->imgY[pic_pix_y + y][pic_pix_x], rec8x8[0][y], 8 * sizeof(imgpel));
  544.     memcpy(&mb_pred[block_y + y][block_x], img->mpr_8x8[0][best_ipmode][y], 8 * sizeof(imgpel));
  545.   }
  546.   if (img->P444_joined)
  547.   {
  548.     //===== restore coefficients =====
  549.     memcpy(img->cofAC[4+b8+4*0][0][0], cofAC8x8CbCr[0][b8][0][0], 4 * 2 * 65 * sizeof(int));
  550.     memcpy(img->cofAC[4+b8+4*1][0][0], cofAC8x8CbCr[1][b8][0][0], 4 * 2 * 65 * sizeof(int));
  551.         //===== restore reconstruction and prediction (needed if single coeffs are removed) =====
  552.     for (y=0; y<8; y++) 
  553.     {
  554.       memcpy(&enc_picture->imgUV[0][pic_pix_y+y][pic_pix_x], rec8x8[1][y], 8 * sizeof(imgpel));
  555.       memcpy(&enc_picture->imgUV[1][pic_pix_y+y][pic_pix_x], rec8x8[2][y], 8 * sizeof(imgpel));
  556.       memcpy(&img->mb_pred[1][block_y+y][block_x], img->mpr_8x8[1][best_ipmode][y], 8 * sizeof(imgpel));
  557.       memcpy(&img->mb_pred[2][block_y+y][block_x], img->mpr_8x8[2][best_ipmode][y], 8 * sizeof(imgpel));
  558.     }
  559.   }
  560.   return nonzero;
  561. }
  562. // Notation for comments regarding prediction and predictors.
  563. // The pels of the 4x4 block are labelled a..p. The predictor pels above
  564. // are labelled A..H, from the left I..P, and from above left X, as follows:
  565. //
  566. //  Z  A  B  C  D  E  F  G  H  I  J  K  L  M   N  O  P
  567. //  Q  a1 b1 c1 d1 e1 f1 g1 h1
  568. //  R  a2 b2 c2 d2 e2 f2 g2 h2
  569. //  S  a3 b3 c3 d3 e3 f3 g3 h3
  570. //  T  a4 b4 c4 d4 e4 f4 g4 h4
  571. //  U  a5 b5 c5 d5 e5 f5 g5 h5
  572. //  V  a6 b6 c6 d6 e6 f6 g6 h6
  573. //  W  a7 b7 c7 d7 e7 f7 g7 h7
  574. //  X  a8 b8 c8 d8 e8 f8 g8 h8
  575. // Predictor array index definitions
  576. #define P_Z (PredPel[0])
  577. #define P_A (PredPel[1])
  578. #define P_B (PredPel[2])
  579. #define P_C (PredPel[3])
  580. #define P_D (PredPel[4])
  581. #define P_E (PredPel[5])
  582. #define P_F (PredPel[6])
  583. #define P_G (PredPel[7])
  584. #define P_H (PredPel[8])
  585. #define P_I (PredPel[9])
  586. #define P_J (PredPel[10])
  587. #define P_K (PredPel[11])
  588. #define P_L (PredPel[12])
  589. #define P_M (PredPel[13])
  590. #define P_N (PredPel[14])
  591. #define P_O (PredPel[15])
  592. #define P_P (PredPel[16])
  593. #define P_Q (PredPel[17])
  594. #define P_R (PredPel[18])
  595. #define P_S (PredPel[19])
  596. #define P_T (PredPel[20])
  597. #define P_U (PredPel[21])
  598. #define P_V (PredPel[22])
  599. #define P_W (PredPel[23])
  600. #define P_X (PredPel[24])
  601. /*!
  602.  ************************************************************************
  603.  * brief
  604.  *    Make intra 8x8 prediction according to all 9 prediction modes.
  605.  *    The routine uses left and upper neighbouring points from
  606.  *    previous coded blocks to do this (if available). Notice that
  607.  *    inaccessible neighbouring points are signalled with a negative
  608.  *    value in the predmode array .
  609.  *
  610.  *  par Input:
  611.  *     Starting point of current 8x8 block image posision
  612.  *
  613.  *  par Output:
  614.  *      none
  615.  ************************************************************************
  616.  */
  617. void intrapred_8x8(Macroblock *currMB, ColorPlane pl, int img_x,int img_y, int *left_available, int *up_available, int *all_available)
  618. {
  619.   int i,j;
  620.   int s0;
  621.   static imgpel PredPel[25];  // array of predictor pels
  622.   imgpel **img_enc = enc_picture->p_curr_img;
  623.   imgpel *img_pel;
  624.   static imgpel (*cur_pred)[16];
  625.   imgpel (*curr_mpr_8x8)[16][16]  = img->mpr_8x8[pl];
  626.   unsigned int dc_pred_value = img->dc_pred_value;
  627.   int *mb_size = img->mb_size[IS_LUMA];
  628.   int ioff = (img_x & 15);
  629.   int joff = (img_y & 15);
  630.   PixelPos pix_a[8];
  631.   PixelPos pix_b, pix_c, pix_d;
  632.   int block_available_up;
  633.   int block_available_left;
  634.   int block_available_up_left;
  635.   int block_available_up_right;
  636.   for (i=0;i<8;i++)
  637.   {
  638.     getNeighbour(currMB, ioff - 1, joff + i , mb_size, &pix_a[i]);
  639.   }
  640.   getNeighbour(currMB, ioff    , joff - 1, mb_size, &pix_b);
  641.   getNeighbour(currMB, ioff + 8, joff - 1, mb_size, &pix_c);
  642.   getNeighbour(currMB, ioff - 1, joff - 1, mb_size, &pix_d);
  643.   pix_c.available = pix_c.available &&!(ioff == 8 && joff == 8);
  644.   if (params->UseConstrainedIntraPred)
  645.   {
  646.     for (i=0, block_available_left=1; i<8;i++)
  647.       block_available_left  &= pix_a[i].available ? img->intra_block[pix_a[i].mb_addr]: 0;
  648.     block_available_up       = pix_b.available ? img->intra_block [pix_b.mb_addr] : 0;
  649.     block_available_up_right = pix_c.available ? img->intra_block [pix_c.mb_addr] : 0;
  650.     block_available_up_left  = pix_d.available ? img->intra_block [pix_d.mb_addr] : 0;
  651.   }
  652.   else
  653.   {
  654.     block_available_left     = pix_a[0].available;
  655.     block_available_up       = pix_b.available;
  656.     block_available_up_right = pix_c.available;
  657.     block_available_up_left  = pix_d.available;
  658.   }
  659.   *left_available = block_available_left;
  660.   *up_available   = block_available_up;
  661.   *all_available  = block_available_up && block_available_left && block_available_up_left;
  662.   i = (img_x & 15);
  663.   j = (img_y & 15);
  664.   // form predictor pels
  665.   // form predictor pels
  666.   if (block_available_up)
  667.   {
  668.     img_pel = &img_enc[pix_b.pos_y][pix_b.pos_x];
  669.     P_A = *(img_pel++);
  670.     P_B = *(img_pel++);
  671.     P_C = *(img_pel++);
  672.     P_D = *(img_pel++);
  673.     P_E = *(img_pel++);
  674.     P_F = *(img_pel++);
  675.     P_G = *(img_pel++);
  676.     P_H = *(img_pel);
  677.   }
  678.   else
  679.   {
  680.     P_A = P_B = P_C = P_D = P_E = P_F = P_G = P_H = dc_pred_value;
  681.   }
  682.   if (block_available_up_right)
  683.   {
  684.     img_pel = &img_enc[pix_c.pos_y][pix_c.pos_x];
  685.     P_I = *(img_pel++);
  686.     P_J = *(img_pel++);
  687.     P_K = *(img_pel++);
  688.     P_L = *(img_pel++);
  689.     P_M = *(img_pel++);
  690.     P_N = *(img_pel++);
  691.     P_O = *(img_pel++);
  692.     P_P = *(img_pel);
  693.   }
  694.   else
  695.   {
  696.     P_I = P_J = P_K = P_L = P_M = P_N = P_O = P_P = P_H;
  697.   }
  698.   if (block_available_left)
  699.   {
  700.     P_Q = img_enc[pix_a[0].pos_y][pix_a[0].pos_x];
  701.     P_R = img_enc[pix_a[1].pos_y][pix_a[1].pos_x];
  702.     P_S = img_enc[pix_a[2].pos_y][pix_a[2].pos_x];
  703.     P_T = img_enc[pix_a[3].pos_y][pix_a[3].pos_x];
  704.     P_U = img_enc[pix_a[4].pos_y][pix_a[4].pos_x];
  705.     P_V = img_enc[pix_a[5].pos_y][pix_a[5].pos_x];
  706.     P_W = img_enc[pix_a[6].pos_y][pix_a[6].pos_x];
  707.     P_X = img_enc[pix_a[7].pos_y][pix_a[7].pos_x];
  708.   }
  709.   else
  710.   {
  711.     P_Q = P_R = P_S = P_T = P_U = P_V = P_W = P_X = dc_pred_value;
  712.   }
  713.   if (block_available_up_left)
  714.   {
  715.     P_Z = img_enc[pix_d.pos_y][pix_d.pos_x];
  716.   }
  717.   else
  718.   {
  719.     P_Z = dc_pred_value;
  720.   }
  721.   for(i=0;i<9;i++)
  722.     curr_mpr_8x8[i][0][0]=-1;
  723.   LowPassForIntra8x8Pred(&(P_Z), block_available_up_left, block_available_up, block_available_left);
  724.   ///////////////////////////////
  725.   // make DC prediction
  726.   ///////////////////////////////
  727.   s0 = 0;
  728.   if (block_available_up && block_available_left)
  729.   {
  730.     // no edge
  731.     s0 = rshift_rnd_sf((P_A + P_B + P_C + P_D + P_E + P_F + P_G + P_H + P_Q + P_R + P_S + P_T + P_U + P_V + P_W + P_X), 4);
  732.   }
  733.   else if (!block_available_up && block_available_left)
  734.   {
  735.     // upper edge
  736.     s0 = rshift_rnd_sf((P_Q + P_R + P_S + P_T + P_U + P_V + P_W + P_X), 3);
  737.   }
  738.   else if (block_available_up && !block_available_left)
  739.   {
  740.     // left edge
  741.     s0 = rshift_rnd_sf((P_A + P_B + P_C + P_D + P_E + P_F + P_G + P_H), 3);
  742.   }
  743.   else //if (!block_available_up && !block_available_left)
  744.   {
  745.     // top left corner, nothing to predict from
  746.     s0 = dc_pred_value;
  747.   }
  748.   // store DC prediction
  749.   cur_pred = curr_mpr_8x8[DC_PRED];
  750.   for (j=0; j < BLOCK_SIZE_8x8; j++)
  751.   {
  752.     for (i=0; i < BLOCK_SIZE_8x8; i++)
  753.     {
  754.       cur_pred[j][i] = (imgpel) s0;
  755.     }
  756.   }
  757.   ///////////////////////////////
  758.   // make horiz and vert prediction
  759.   ///////////////////////////////
  760.   cur_pred = curr_mpr_8x8[VERT_PRED];
  761.   for (i=0; i < BLOCK_SIZE_8x8; i++)
  762.   {
  763.     cur_pred[0][i] =
  764.     cur_pred[1][i] =
  765.     cur_pred[2][i] =
  766.     cur_pred[3][i] =
  767.     cur_pred[4][i] =
  768.     cur_pred[5][i] =
  769.     cur_pred[6][i] =
  770.     cur_pred[7][i] = (imgpel)(&P_A)[i];
  771.   }
  772.   if(!block_available_up)
  773.     cur_pred[0][0]=-1;
  774.   cur_pred = curr_mpr_8x8[HOR_PRED];
  775.   for (i=0; i < BLOCK_SIZE_8x8; i++)
  776.   {
  777.     cur_pred[i][0]  =
  778.     cur_pred[i][1]  =
  779.     cur_pred[i][2]  =
  780.     cur_pred[i][3]  =
  781.     cur_pred[i][4]  =
  782.     cur_pred[i][5]  =
  783.     cur_pred[i][6]  =
  784.     cur_pred[i][7]  = (imgpel) (&P_Q)[i];
  785.   }
  786.   if(!block_available_left)
  787.     cur_pred[0][0]=-1;
  788.   ///////////////////////////////////
  789.   // make diagonal down left prediction
  790.   ///////////////////////////////////
  791.   if (block_available_up)
  792.   {
  793.     // Mode DIAG_DOWN_LEFT_PRED
  794.     cur_pred = curr_mpr_8x8[DIAG_DOWN_LEFT_PRED];
  795.     cur_pred[0][0] = (imgpel) ((P_A + P_C + 2*(P_B) + 2) >> 2);
  796.     cur_pred[0][1] =
  797.     cur_pred[1][0] = (imgpel) ((P_B + P_D + 2*(P_C) + 2) >> 2);
  798.     cur_pred[0][2] =
  799.     cur_pred[1][1] =
  800.     cur_pred[2][0] = (imgpel) ((P_C + P_E + 2*(P_D) + 2) >> 2);
  801.     cur_pred[0][3] =
  802.     cur_pred[1][2] =
  803.     cur_pred[2][1] =
  804.     cur_pred[3][0] = (imgpel) ((P_D + P_F + 2*(P_E) + 2) >> 2);
  805.     cur_pred[0][4] =
  806.     cur_pred[1][3] =
  807.     cur_pred[2][2] =
  808.     cur_pred[3][1] =
  809.     cur_pred[4][0] = (imgpel) ((P_E + P_G + 2*(P_F) + 2) >> 2);
  810.     cur_pred[0][5] =
  811.     cur_pred[1][4] =
  812.     cur_pred[2][3] =
  813.     cur_pred[3][2] =
  814.     cur_pred[4][1] =
  815.     cur_pred[5][0] = (imgpel) ((P_F + P_H + 2*(P_G) + 2) >> 2);
  816.     cur_pred[0][6] =
  817.     cur_pred[1][5] =
  818.     cur_pred[2][4] =
  819.     cur_pred[3][3] =
  820.     cur_pred[4][2] =
  821.     cur_pred[5][1] =
  822.     cur_pred[6][0] = (imgpel) ((P_G + P_I + 2*(P_H) + 2) >> 2);
  823.     cur_pred[0][7] =
  824.     cur_pred[1][6] =
  825.     cur_pred[2][5] =
  826.     cur_pred[3][4] =
  827.     cur_pred[4][3] =
  828.     cur_pred[5][2] =
  829.     cur_pred[6][1] =
  830.     cur_pred[7][0] = (imgpel) ((P_H + P_J + 2*(P_I) + 2) >> 2);
  831.     cur_pred[1][7] =
  832.     cur_pred[2][6] =
  833.     cur_pred[3][5] =
  834.     cur_pred[4][4] =
  835.     cur_pred[5][3] =
  836.     cur_pred[6][2] =
  837.     cur_pred[7][1] = (imgpel) ((P_I + P_K + 2*(P_J) + 2) >> 2);
  838.     cur_pred[2][7] =
  839.     cur_pred[3][6] =
  840.     cur_pred[4][5] =
  841.     cur_pred[5][4] =
  842.     cur_pred[6][3] =
  843.     cur_pred[7][2] = (imgpel) ((P_J + P_L + 2*(P_K) + 2) >> 2);
  844.     cur_pred[3][7] =
  845.     cur_pred[4][6] =
  846.     cur_pred[5][5] =
  847.     cur_pred[6][4] =
  848.     cur_pred[7][3] = (imgpel) ((P_K + P_M + 2*(P_L) + 2) >> 2);
  849.     cur_pred[4][7] =
  850.     cur_pred[5][6] =
  851.     cur_pred[6][5] =
  852.     cur_pred[7][4] = (imgpel) ((P_L + P_N + 2*(P_M) + 2) >> 2);
  853.     cur_pred[5][7] =
  854.     cur_pred[6][6] =
  855.     cur_pred[7][5] = (imgpel) ((P_M + P_O + 2*(P_N) + 2) >> 2);
  856.     cur_pred[6][7] =
  857.     cur_pred[7][6] = (imgpel) ((P_N + P_P + 2*(P_O) + 2) >> 2);
  858.     cur_pred[7][7] = (imgpel) ((P_O + 3*(P_P) + 2) >> 2);
  859.     ///////////////////////////////////
  860.     // make vertical left prediction
  861.     ///////////////////////////////////
  862.     cur_pred = curr_mpr_8x8[VERT_LEFT_PRED];
  863.     cur_pred[0][0] = (imgpel) ((P_A + P_B + 1) >> 1);
  864.     cur_pred[0][1] =
  865.     cur_pred[2][0] = (imgpel) ((P_B + P_C + 1) >> 1);
  866.     cur_pred[0][2] =
  867.     cur_pred[2][1] =
  868.     cur_pred[4][0] = (imgpel) ((P_C + P_D + 1) >> 1);
  869.     cur_pred[0][3] =
  870.     cur_pred[2][2] =
  871.     cur_pred[4][1] =
  872.     cur_pred[6][0] = (imgpel) ((P_D + P_E + 1) >> 1);
  873.     cur_pred[0][4] =
  874.     cur_pred[2][3] =
  875.     cur_pred[4][2] =
  876.     cur_pred[6][1] = (imgpel) ((P_E + P_F + 1) >> 1);
  877.     cur_pred[0][5] =
  878.     cur_pred[2][4] =
  879.     cur_pred[4][3] =
  880.     cur_pred[6][2] = (imgpel) ((P_F + P_G + 1) >> 1);
  881.     cur_pred[0][6] =
  882.     cur_pred[2][5] =
  883.     cur_pred[4][4] =
  884.     cur_pred[6][3] = (imgpel) ((P_G + P_H + 1) >> 1);
  885.     cur_pred[0][7] =
  886.     cur_pred[2][6] =
  887.     cur_pred[4][5] =
  888.     cur_pred[6][4] = (imgpel) ((P_H + P_I + 1) >> 1);
  889.     cur_pred[2][7] =
  890.     cur_pred[4][6] =
  891.     cur_pred[6][5] = (imgpel) ((P_I + P_J + 1) >> 1);
  892.     cur_pred[4][7] =
  893.     cur_pred[6][6] = (imgpel) ((P_J + P_K + 1) >> 1);
  894.     cur_pred[6][7] = (imgpel) ((P_K + P_L + 1) >> 1);
  895.     cur_pred[1][0] = (imgpel) ((P_A + P_C + 2*P_B + 2) >> 2);
  896.     cur_pred[1][1] =
  897.     cur_pred[3][0] = (imgpel) ((P_B + P_D + 2*P_C + 2) >> 2);
  898.     cur_pred[1][2] =
  899.     cur_pred[3][1] =
  900.     cur_pred[5][0] = (imgpel) ((P_C + P_E + 2*P_D + 2) >> 2);
  901.     cur_pred[1][3] =
  902.     cur_pred[3][2] =
  903.     cur_pred[5][1] =
  904.     cur_pred[7][0] = (imgpel) ((P_D + P_F + 2*P_E + 2) >> 2);
  905.     cur_pred[1][4] =
  906.     cur_pred[3][3] =
  907.     cur_pred[5][2] =
  908.     cur_pred[7][1] = (imgpel) ((P_E + P_G + 2*P_F + 2) >> 2);
  909.     cur_pred[1][5] =
  910.     cur_pred[3][4] =
  911.     cur_pred[5][3] =
  912.     cur_pred[7][2] = (imgpel) ((P_F + P_H + 2*P_G + 2) >> 2);
  913.     cur_pred[1][6] =
  914.     cur_pred[3][5] =
  915.     cur_pred[5][4] =
  916.     cur_pred[7][3] = (imgpel) ((P_G + P_I + 2*P_H + 2) >> 2);
  917.     cur_pred[1][7] =
  918.     cur_pred[3][6] =
  919.     cur_pred[5][5] =
  920.     cur_pred[7][4] = (imgpel) ((P_H + P_J + 2*P_I + 2) >> 2);
  921.     cur_pred[3][7] =
  922.     cur_pred[5][6] =
  923.     cur_pred[7][5] = (imgpel) ((P_I + P_K + 2*P_J + 2) >> 2);
  924.     cur_pred[5][7] =
  925.     cur_pred[7][6] = (imgpel) ((P_J + P_L + 2*P_K + 2) >> 2);
  926.     cur_pred[7][7] = (imgpel) ((P_K + P_M + 2*P_L + 2) >> 2);
  927.   }
  928.   ///////////////////////////////////
  929.   // make diagonal down right prediction
  930.   ///////////////////////////////////
  931.   if (block_available_up && block_available_left && block_available_up_left)
  932.   {
  933.     // Mode DIAG_DOWN_RIGHT_PRED
  934.     cur_pred = curr_mpr_8x8[DIAG_DOWN_RIGHT_PRED];
  935.     cur_pred[7][0] = (imgpel) ((P_X + P_V + 2*(P_W) + 2) >> 2);
  936.     cur_pred[6][0] =
  937.     cur_pred[7][1] = (imgpel) ((P_W + P_U + 2*(P_V) + 2) >> 2);
  938.     cur_pred[5][0] =
  939.     cur_pred[6][1] =
  940.     cur_pred[7][2] = (imgpel) ((P_V + P_T + 2*(P_U) + 2) >> 2);
  941.     cur_pred[4][0] =
  942.     cur_pred[5][1] =
  943.     cur_pred[6][2] =
  944.     cur_pred[7][3] = (imgpel) ((P_U + P_S + 2*(P_T) + 2) >> 2);
  945.     cur_pred[3][0] =
  946.     cur_pred[4][1] =
  947.     cur_pred[5][2] =
  948.     cur_pred[6][3] =
  949.     cur_pred[7][4] = (imgpel) ((P_T + P_R + 2*(P_S) + 2) >> 2);
  950.     cur_pred[2][0] =
  951.     cur_pred[3][1] =
  952.     cur_pred[4][2] =
  953.     cur_pred[5][3] =
  954.     cur_pred[6][4] =
  955.     cur_pred[7][5] = (imgpel) ((P_S + P_Q + 2*(P_R) + 2) >> 2);
  956.     cur_pred[1][0] =
  957.     cur_pred[2][1] =
  958.     cur_pred[3][2] =
  959.     cur_pred[4][3] =
  960.     cur_pred[5][4] =
  961.     cur_pred[6][5] =
  962.     cur_pred[7][6] = (imgpel) ((P_R + P_Z + 2*(P_Q) + 2) >> 2);
  963.     cur_pred[0][0] =
  964.     cur_pred[1][1] =
  965.     cur_pred[2][2] =
  966.     cur_pred[3][3] =
  967.     cur_pred[4][4] =
  968.     cur_pred[5][5] =
  969.     cur_pred[6][6] =
  970.     cur_pred[7][7] = (imgpel) ((P_Q + P_A + 2*(P_Z) + 2) >> 2);
  971.     cur_pred[0][1] =
  972.     cur_pred[1][2] =
  973.     cur_pred[2][3] =
  974.     cur_pred[3][4] =
  975.     cur_pred[4][5] =
  976.     cur_pred[5][6] =
  977.     cur_pred[6][7] = (imgpel) ((P_Z + P_B + 2*(P_A) + 2) >> 2);
  978.     cur_pred[0][2] =
  979.     cur_pred[1][3] =
  980.     cur_pred[2][4] =
  981.     cur_pred[3][5] =
  982.     cur_pred[4][6] =
  983.     cur_pred[5][7] = (imgpel) ((P_A + P_C + 2*(P_B) + 2) >> 2);
  984.     cur_pred[0][3] =
  985.     cur_pred[1][4] =
  986.     cur_pred[2][5] =
  987.     cur_pred[3][6] =
  988.     cur_pred[4][7] = (imgpel) ((P_B + P_D + 2*(P_C) + 2) >> 2);
  989.     cur_pred[0][4] =
  990.     cur_pred[1][5] =
  991.     cur_pred[2][6] =
  992.     cur_pred[3][7] = (imgpel) ((P_C + P_E + 2*(P_D) + 2) >> 2);
  993.     cur_pred[0][5] =
  994.     cur_pred[1][6] =
  995.     cur_pred[2][7] = (imgpel) ((P_D + P_F + 2*(P_E) + 2) >> 2);
  996.     cur_pred[0][6] =
  997.     cur_pred[1][7] = (imgpel) ((P_E + P_G + 2*(P_F) + 2) >> 2);
  998.     cur_pred[0][7] = (imgpel) ((P_F + P_H + 2*(P_G) + 2) >> 2);
  999.     ///////////////////////////////////
  1000.     // make vertical right prediction
  1001.     ///////////////////////////////////
  1002.     cur_pred = curr_mpr_8x8[VERT_RIGHT_PRED];
  1003.     cur_pred[0][0] =
  1004.     cur_pred[2][1] =
  1005.     cur_pred[4][2] =
  1006.     cur_pred[6][3] = (imgpel) ((P_Z + P_A + 1) >> 1);
  1007.     cur_pred[0][1] =
  1008.     cur_pred[2][2] =
  1009.     cur_pred[4][3] =
  1010.     cur_pred[6][4] = (imgpel) ((P_A + P_B + 1) >> 1);
  1011.     cur_pred[0][2] =
  1012.     cur_pred[2][3] =
  1013.     cur_pred[4][4] =
  1014.     cur_pred[6][5] = (imgpel) ((P_B + P_C + 1) >> 1);
  1015.     cur_pred[0][3] =
  1016.     cur_pred[2][4] =
  1017.     cur_pred[4][5] =
  1018.     cur_pred[6][6] = (imgpel) ((P_C + P_D + 1) >> 1);
  1019.     cur_pred[0][4] =
  1020.     cur_pred[2][5] =
  1021.     cur_pred[4][6] =
  1022.     cur_pred[6][7] = (imgpel) ((P_D + P_E + 1) >> 1);
  1023.     cur_pred[0][5] =
  1024.     cur_pred[2][6] =
  1025.     cur_pred[4][7] = (imgpel) ((P_E + P_F + 1) >> 1);
  1026.     cur_pred[0][6] =
  1027.     cur_pred[2][7] = (imgpel) ((P_F + P_G + 1) >> 1);
  1028.     cur_pred[0][7] = (imgpel) ((P_G + P_H + 1) >> 1);
  1029.     cur_pred[1][0] =
  1030.     cur_pred[3][1] =
  1031.     cur_pred[5][2] =
  1032.     cur_pred[7][3] = (imgpel) ((P_Q + P_A + 2*P_Z + 2) >> 2);
  1033.     cur_pred[1][1] =
  1034.     cur_pred[3][2] =
  1035.     cur_pred[5][3] =
  1036.     cur_pred[7][4] = (imgpel) ((P_Z + P_B + 2*P_A + 2) >> 2);
  1037.     cur_pred[1][2] =
  1038.     cur_pred[3][3] =
  1039.     cur_pred[5][4] =
  1040.     cur_pred[7][5] = (imgpel) ((P_A + P_C + 2*P_B + 2) >> 2);
  1041.     cur_pred[1][3] =
  1042.     cur_pred[3][4] =
  1043.     cur_pred[5][5] =
  1044.     cur_pred[7][6] = (imgpel) ((P_B + P_D + 2*P_C + 2) >> 2);
  1045.     cur_pred[1][4] =
  1046.     cur_pred[3][5] =
  1047.     cur_pred[5][6] =
  1048.     cur_pred[7][7] = (imgpel) ((P_C + P_E + 2*P_D + 2) >> 2);
  1049.     cur_pred[1][5] =
  1050.     cur_pred[3][6] =
  1051.     cur_pred[5][7] = (imgpel) ((P_D + P_F + 2*P_E + 2) >> 2);
  1052.     cur_pred[1][6] =
  1053.     cur_pred[3][7] = (imgpel) ((P_E + P_G + 2*P_F + 2) >> 2);
  1054.     cur_pred[1][7] = (imgpel) ((P_F + P_H + 2*P_G + 2) >> 2);
  1055.     cur_pred[2][0] =
  1056.     cur_pred[4][1] =
  1057.     cur_pred[6][2] = (imgpel) ((P_R + P_Z + 2*P_Q + 2) >> 2);
  1058.     cur_pred[3][0] =
  1059.     cur_pred[5][1] =
  1060.     cur_pred[7][2] = (imgpel) ((P_S + P_Q + 2*P_R + 2) >> 2);
  1061.     cur_pred[4][0] =
  1062.     cur_pred[6][1] = (imgpel) ((P_T + P_R + 2*P_S + 2) >> 2);
  1063.     cur_pred[5][0] =
  1064.     cur_pred[7][1] = (imgpel) ((P_U + P_S + 2*P_T + 2) >> 2);
  1065.     cur_pred[6][0] = (imgpel) ((P_V + P_T + 2*P_U + 2) >> 2);
  1066.     cur_pred[7][0] = (imgpel) ((P_W + P_U + 2*P_V + 2) >> 2);
  1067.     ///////////////////////////////////
  1068.     // make horizontal down prediction
  1069.     ///////////////////////////////////
  1070.     cur_pred = img->mpr_8x8[0][HOR_DOWN_PRED];
  1071.     cur_pred[0][0] =
  1072.     cur_pred[1][2] =
  1073.     cur_pred[2][4] =
  1074.     cur_pred[3][6] = (imgpel) ((P_Q + P_Z + 1) >> 1);
  1075.     cur_pred[1][0] =
  1076.     cur_pred[2][2] =
  1077.     cur_pred[3][4] =
  1078.     cur_pred[4][6] = (imgpel) ((P_R + P_Q + 1) >> 1);
  1079.     cur_pred[2][0] =
  1080.     cur_pred[3][2] =
  1081.     cur_pred[4][4] =
  1082.     cur_pred[5][6] = (imgpel) ((P_S + P_R + 1) >> 1);
  1083.     cur_pred[3][0] =
  1084.     cur_pred[4][2] =
  1085.     cur_pred[5][4] =
  1086.     cur_pred[6][6] = (imgpel) ((P_T + P_S + 1) >> 1);
  1087.     cur_pred[4][0] =
  1088.     cur_pred[5][2] =
  1089.     cur_pred[6][4] =
  1090.     cur_pred[7][6] = (imgpel) ((P_U + P_T + 1) >> 1);
  1091.     cur_pred[5][0] =
  1092.     cur_pred[6][2] =
  1093.     cur_pred[7][4] = (imgpel) ((P_V + P_U + 1) >> 1);
  1094.     cur_pred[6][0] =
  1095.     cur_pred[7][2] = (imgpel) ((P_W + P_V + 1) >> 1);
  1096.     cur_pred[7][0] = (imgpel) ((P_X + P_W + 1) >> 1);
  1097.     cur_pred[0][1] =
  1098.     cur_pred[1][3] =
  1099.     cur_pred[2][5] =
  1100.     cur_pred[3][7] = (imgpel) ((P_Q + P_A + 2*P_Z + 2) >> 2);
  1101.     cur_pred[1][1] =
  1102.     cur_pred[2][3] =
  1103.     cur_pred[3][5] =
  1104.     cur_pred[4][7] = (imgpel) ((P_Z + P_R + 2*P_Q + 2) >> 2);
  1105.     cur_pred[2][1] =
  1106.     cur_pred[3][3] =
  1107.     cur_pred[4][5] =
  1108.     cur_pred[5][7] = (imgpel) ((P_Q + P_S + 2*P_R + 2) >> 2);
  1109.     cur_pred[3][1] =
  1110.     cur_pred[4][3] =
  1111.     cur_pred[5][5] =
  1112.     cur_pred[6][7] = (imgpel) ((P_R + P_T + 2*P_S + 2) >> 2);
  1113.     cur_pred[4][1] =
  1114.     cur_pred[5][3] =
  1115.     cur_pred[6][5] =
  1116.     cur_pred[7][7] = (imgpel) ((P_S + P_U + 2*P_T + 2) >> 2);
  1117.     cur_pred[5][1] =
  1118.     cur_pred[6][3] =
  1119.     cur_pred[7][5] = (imgpel) ((P_T + P_V + 2*P_U + 2) >> 2);
  1120.     cur_pred[6][1] =
  1121.     cur_pred[7][3] = (imgpel) ((P_U + P_W + 2*P_V + 2) >> 2);
  1122.     cur_pred[7][1] = (imgpel) ((P_V + P_X + 2*P_W + 2) >> 2);
  1123.     cur_pred[0][2] =
  1124.     cur_pred[1][4] =
  1125.     cur_pred[2][6] = (imgpel) ((P_Z + P_B + 2*P_A + 2) >> 2);
  1126.     cur_pred[0][3] =
  1127.     cur_pred[1][5] =
  1128.     cur_pred[2][7] = (imgpel) ((P_A + P_C + 2*P_B + 2) >> 2);
  1129.     cur_pred[0][4] =
  1130.     cur_pred[1][6] = (imgpel) ((P_B + P_D + 2*P_C + 2) >> 2);
  1131.     cur_pred[0][5] =
  1132.     cur_pred[1][7] = (imgpel) ((P_C + P_E + 2*P_D + 2) >> 2);
  1133.     cur_pred[0][6] = (imgpel) ((P_D + P_F + 2*P_E + 2) >> 2);
  1134.     cur_pred[0][7] = (imgpel) ((P_E + P_G + 2*P_F + 2) >> 2);
  1135.   }
  1136.   ///////////////////////////////////
  1137.   // make horizontal up prediction
  1138.   ///////////////////////////////////
  1139.   if (block_available_left)
  1140.   {
  1141.     cur_pred = curr_mpr_8x8[HOR_UP_PRED];
  1142.     cur_pred[0][0] = (imgpel) ((P_Q + P_R + 1) >> 1);
  1143.     cur_pred[1][0] =
  1144.     cur_pred[0][2] = (imgpel) ((P_R + P_S + 1) >> 1);
  1145.     cur_pred[2][0] =
  1146.     cur_pred[1][2] =
  1147.     cur_pred[0][4] = (imgpel) ((P_S + P_T + 1) >> 1);
  1148.     cur_pred[3][0] =
  1149.     cur_pred[2][2] =
  1150.     cur_pred[1][4] =
  1151.     cur_pred[0][6] = (imgpel) ((P_T + P_U + 1) >> 1);
  1152.     cur_pred[4][0] =
  1153.     cur_pred[3][2] =
  1154.     cur_pred[2][4] =
  1155.     cur_pred[1][6] = (imgpel) ((P_U + P_V + 1) >> 1);
  1156.     cur_pred[5][0] =
  1157.     cur_pred[4][2] =
  1158.     cur_pred[3][4] =
  1159.     cur_pred[2][6] = (imgpel) ((P_V + P_W + 1) >> 1);
  1160.     cur_pred[6][0] =
  1161.     cur_pred[5][2] =
  1162.     cur_pred[4][4] =
  1163.     cur_pred[3][6] = (imgpel) ((P_W + P_X + 1) >> 1);
  1164.     cur_pred[4][6] =
  1165.     cur_pred[4][7] =
  1166.     cur_pred[5][4] =
  1167.     cur_pred[5][5] =
  1168.     cur_pred[5][6] =
  1169.     cur_pred[5][7] =
  1170.     cur_pred[6][2] =
  1171.     cur_pred[6][3] =
  1172.     cur_pred[6][4] =
  1173.     cur_pred[6][5] =
  1174.     cur_pred[6][6] =
  1175.     cur_pred[6][7] =
  1176.     cur_pred[7][0] =
  1177.     cur_pred[7][1] =
  1178.     cur_pred[7][2] =
  1179.     cur_pred[7][3] =
  1180.     cur_pred[7][4] =
  1181.     cur_pred[7][5] =
  1182.     cur_pred[7][6] =
  1183.     cur_pred[7][7] = (imgpel) P_X;
  1184.     cur_pred[6][1] =
  1185.     cur_pred[5][3] =
  1186.     cur_pred[4][5] =
  1187.     cur_pred[3][7] = (imgpel) ((P_W + 3*P_X + 2) >> 2);
  1188.     cur_pred[5][1] =
  1189.     cur_pred[4][3] =
  1190.     cur_pred[3][5] =
  1191.     cur_pred[2][7] = (imgpel) ((P_X + P_V + 2*P_W + 2) >> 2);
  1192.     cur_pred[4][1] =
  1193.     cur_pred[3][3] =
  1194.     cur_pred[2][5] =
  1195.     cur_pred[1][7] = (imgpel) ((P_W + P_U + 2*P_V + 2) >> 2);
  1196.     cur_pred[3][1] =
  1197.     cur_pred[2][3] =
  1198.     cur_pred[1][5] =
  1199.     cur_pred[0][7] = (imgpel) ((P_V + P_T + 2*P_U + 2) >> 2);
  1200.     cur_pred[2][1] =
  1201.     cur_pred[1][3] =
  1202.     cur_pred[0][5] = (imgpel) ((P_U + P_S + 2*P_T + 2) >> 2);
  1203.     cur_pred[1][1] =
  1204.     cur_pred[0][3] = (imgpel) ((P_T + P_R + 2*P_S + 2) >> 2);
  1205.     cur_pred[0][1] = (imgpel) ((P_S + P_Q + 2*P_R + 2) >> 2);
  1206.   }
  1207. }
  1208. /*!
  1209.  *************************************************************************************
  1210.  * brief
  1211.  *    Prefiltering for Intra8x8 prediction
  1212.  *************************************************************************************
  1213.  */
  1214. void LowPassForIntra8x8Pred(imgpel *PredPel, int block_up_left, int block_up, int block_left)
  1215. {
  1216.   int i;
  1217.   static imgpel LoopArray[25];
  1218.   memcpy(LoopArray,PredPel, 25 * sizeof(imgpel));
  1219.   if(block_up)
  1220.   {
  1221.     if(block_up_left)
  1222.     {
  1223.       LoopArray[1] = ((PredPel[0] + (PredPel[1]<<1) + PredPel[2] + 2)>>2);
  1224.     }
  1225.     else
  1226.       LoopArray[1] = ((PredPel[1] + (PredPel[1]<<1) + PredPel[2] + 2)>>2);
  1227.     for(i = 2; i <16; i++)
  1228.     {
  1229.       LoopArray[i] = ((PredPel[i-1] + (PredPel[i]<<1) + PredPel[i+1] + 2)>>2);
  1230.     }
  1231.     LoopArray[16] = ((P_P + (P_P<<1) + P_O + 2)>>2);
  1232.   }
  1233.   if(block_up_left)
  1234.   {
  1235.     if(block_up && block_left)
  1236.     {
  1237.       LoopArray[0] = ((P_Q + (P_Z<<1) + P_A +2)>>2);
  1238.     }
  1239.     else
  1240.     {
  1241.       if(block_up)
  1242.         LoopArray[0] = ((P_Z + (P_Z<<1) + P_A +2)>>2);
  1243.       else
  1244.         if(block_left)
  1245.           LoopArray[0] = ((P_Z + (P_Z<<1) + P_Q +2)>>2);
  1246.     }
  1247.   }
  1248.   if(block_left)
  1249.   {
  1250.     if(block_up_left)
  1251.       LoopArray[17] = ((P_Z + (P_Q<<1) + P_R + 2)>>2);
  1252.     else
  1253.       LoopArray[17] = ((P_Q + (P_Q<<1) + P_R + 2)>>2);
  1254.     for(i = 18; i <24; i++)
  1255.     {
  1256.       LoopArray[i] = ((PredPel[i-1] + (PredPel[i]<<1) + PredPel[i+1] + 2)>>2);
  1257.     }
  1258.     LoopArray[24] = ((P_W + (P_X<<1) + P_X + 2) >> 2);
  1259.   }
  1260.   memcpy(PredPel, LoopArray, 25 * sizeof(imgpel));
  1261. }
  1262. /*!
  1263.  *************************************************************************************
  1264.  * brief
  1265.  *    R-D Cost for an 8x8 Intra block
  1266.  *************************************************************************************
  1267.  */
  1268. double RDCost_for_8x8IntraBlocks(Macroblock *currMB, int *nonzero, int b8, int ipmode, double lambda, double min_rdcost, int mostProbableMode, int c_nzCbCr[3])
  1269. {
  1270.   double  rdcost = 0.0;
  1271.   int     dummy;
  1272.   int     rate;
  1273.   int64   distortion  = 0;
  1274.   int     block_x     = (b8 & 0x01) << 3;
  1275.   int     block_y     = (b8 >> 1) << 3;
  1276.   int     pic_pix_x   = img->pix_x + block_x;
  1277.   int     pic_pix_y   = img->pix_y + block_y;
  1278.   int     pic_opix_y  = img->opix_y + block_y;
  1279.   Slice          *currSlice =  img->currentSlice;
  1280.   SyntaxElement  se;
  1281.   const int      *partMap   = assignSE2partition[params->partition_mode];
  1282.   DataPartition  *dataPart;
  1283.   //===== perform DCT, Q, IQ, IDCT, Reconstruction =====
  1284.   dummy = 0;
  1285.   *nonzero = pDCT_8x8 (currMB, PLANE_Y, b8, &dummy, 1);
  1286.   //===== get distortion (SSD) of 8x8 block =====
  1287.   distortion += compute_SSE(&pCurImg[pic_opix_y], &enc_picture->imgY[pic_pix_y], pic_pix_x, pic_pix_x, 8, 8);
  1288.   if(img->P444_joined) 
  1289.   {
  1290.     ColorPlane k;
  1291.     for (k = PLANE_U; k <= PLANE_V; k++)
  1292.     {
  1293.       select_plane(k);
  1294.       /*    for (j=0; j<8; j++)   //KHHan, I think these line are not necessary
  1295.       {
  1296.       for (i=0; i<8; i++)
  1297.       {         
  1298.       img->mb_pred[k][block_y+j][block_x+i]  = img->mpr_8x8[k][ipmode][j][i];
  1299.       img->mb_ores[k][j][i] = pImgOrg[k][img->pix_y+block_y+j][img->pix_x+block_x+i] - img->mpr_8x8[k][ipmode][j][i];
  1300.       }
  1301.       }*/
  1302.       c_nzCbCr[k ]= pDCT_8x8(currMB, k, b8, &dummy,1);
  1303.       distortion += compute_SSE(&pImgOrg[k][pic_opix_y], &enc_picture->p_curr_img[pic_pix_y], pic_pix_x, pic_pix_x, 8, 8);
  1304.     }
  1305.   ipmode_DPCM = NO_INTRA_PMODE;
  1306.     select_plane(PLANE_Y);
  1307.   }
  1308.   else if( img->yuv_format==YUV444 && IS_INDEPENDENT(params) )  //For residual DPCM
  1309.   {
  1310.     ipmode_DPCM = NO_INTRA_PMODE;  
  1311.   }
  1312.   //===== RATE for INTRA PREDICTION MODE  (SYMBOL MODE MUST BE SET TO CAVLC) =====
  1313.   se.value1 = (mostProbableMode == ipmode) ? -1 : ipmode < mostProbableMode ? ipmode : ipmode-1;
  1314.   //--- set position and type ---
  1315.   se.context = b8;
  1316.   se.type    = SE_INTRAPREDMODE;
  1317.   //--- choose data partition ---
  1318.   if (img->type!=B_SLICE)
  1319.     dataPart = &(currSlice->partArr[partMap[SE_INTRAPREDMODE]]);
  1320.   else
  1321.     dataPart = &(currSlice->partArr[partMap[SE_BFRAME]]);
  1322.   //--- encode and update rate ---
  1323.   writeIntraPredMode (&se, dataPart);
  1324.   rate = se.len;
  1325.   //===== RATE for LUMINANCE COEFFICIENTS =====
  1326.   if (currSlice->symbol_mode == CAVLC)
  1327.   {      
  1328.     if (img->P444_joined)
  1329.     {
  1330.       int b4;
  1331.       for(b4=0; b4<4; b4++)
  1332.       {
  1333.         rate  += writeCoeff4x4_CAVLC (currMB, LUMA, b8, b4, 0);
  1334.         rate  += writeCoeff4x4_CAVLC (currMB, CB, b8, b4, 0);
  1335.         rate  += writeCoeff4x4_CAVLC (currMB, CR, b8, b4, 0);
  1336.       }
  1337.     }
  1338.     else
  1339.     {
  1340.       rate  += writeCoeff4x4_CAVLC (currMB, LUMA, b8, 0, 0);
  1341.       rate  += writeCoeff4x4_CAVLC (currMB, LUMA, b8, 1, 0);
  1342.       rate  += writeCoeff4x4_CAVLC (currMB, LUMA, b8, 2, 0);
  1343.       rate  += writeCoeff4x4_CAVLC (currMB, LUMA, b8, 3, 0);
  1344.     }
  1345.   }
  1346.   else
  1347.   {
  1348.     rate  += writeCoeff8x8_CABAC (currMB, PLANE_Y, b8, 1);
  1349.     if(img->P444_joined)
  1350.     {
  1351.       rate  += writeCoeff8x8_CABAC (currMB, PLANE_U, b8, 1);
  1352.       rate  += writeCoeff8x8_CABAC (currMB, PLANE_V, b8, 1);
  1353.     }
  1354.   }
  1355.   rdcost = (double)distortion + lambda*(double)rate;
  1356.   return rdcost;
  1357. }
  1358. /*!
  1359.  ************************************************************************
  1360.  * brief
  1361.  *    The routine performs transform,quantization,inverse transform, adds the diff.
  1362.  *    to the prediction and writes the result to the decoded luma frame. Includes the
  1363.  *    RD constrained quantization also.
  1364.  *
  1365.  * par Input:
  1366.  *    b8: Block position inside a macro block (0,1,2,3).
  1367.  *
  1368.  * par Output:
  1369.  *    nonzero: 0 if no levels are nonzero.  1 if there are nonzero levels.
  1370.  *    coeff_cost: Counter for nonzero coefficients, used to discard expensive levels.
  1371.  ************************************************************************
  1372.  */
  1373. int dct_8x8(Macroblock *currMB, ColorPlane pl, int b8, int *coeff_cost, int intra)
  1374. {
  1375.   int j;
  1376.   int nonzero = FALSE; 
  1377.   int block_x = 8*(b8 & 0x01);
  1378.   int block_y = 8*(b8 >> 1);
  1379.   int pl_off = b8+ (pl<<2);
  1380.   int*  ACLevel = img->cofAC[pl_off][0][0];
  1381.   int*  ACRun   = img->cofAC[pl_off][0][1];  
  1382.   imgpel **img_enc       = enc_picture->p_curr_img;
  1383.   imgpel (*mb_pred)[MB_BLOCK_SIZE] = img->mb_pred[pl];
  1384.   int    (*mb_ores)[MB_BLOCK_SIZE] = img->mb_ores[pl];
  1385.   int    (*mb_rres)[MB_BLOCK_SIZE] = img->mb_rres[pl];
  1386.   int max_imgpel_value   = img->max_imgpel_value;
  1387.   int qp = currMB->qp_scaled[pl];
  1388.   const byte (*pos_scan)[2] = currMB->is_field_mode ? FIELD_SCAN8x8 : SNGL_SCAN8x8;
  1389.   int qp_rem = qp_rem_matrix[qp];
  1390.   levelscale    = LevelScale8x8Comp   [pl][intra][qp_rem];
  1391.   invlevelscale = InvLevelScale8x8Comp[pl][intra][qp_rem];
  1392.   leveloffset   = LevelOffset8x8Comp  [pl][intra][qp];
  1393.   fadjust8x8 = img->AdaptiveRounding ? (pl ? &img->fadjust8x8Cr[pl-1][intra][block_y] : &img->fadjust8x8[intra][block_y]) :NULL;
  1394.   // Forward 8x8 transform
  1395.   forward8x8(mb_ores, mb_rres, block_y, block_x);
  1396.   // Quantization process
  1397.   nonzero = quant_8x8(&mb_rres[block_y], block_y, block_x, qp, ACLevel, ACRun, fadjust8x8, 
  1398.     levelscale, invlevelscale, leveloffset, coeff_cost, pos_scan, COEFF_COST8x8[params->disthres]);
  1399.   if (nonzero)
  1400.   {
  1401.     // Inverse 8x8 transform
  1402.     inverse8x8(mb_rres, mb_rres, block_y, block_x);
  1403.     // generate final block
  1404.     SampleReconstruct (img_enc, mb_pred, mb_rres, block_y, block_x, img->pix_y, img->pix_x + block_x, BLOCK_SIZE_8x8, BLOCK_SIZE_8x8, max_imgpel_value, DQ_BITS_8);
  1405.   }
  1406.   else // if (nonzero) => No transformed residual. Just use prediction.
  1407.   {      
  1408.     for( j=block_y; j< block_y + BLOCK_SIZE_8x8; j++)
  1409.     {
  1410.       memcpy(&(img_enc[img->pix_y + j][img->pix_x + block_x]),&(mb_pred[j][block_x]), BLOCK_SIZE_8x8 * sizeof(imgpel));
  1411.     }
  1412.   }  
  1413.   //  Decoded block moved to frame memory
  1414.   return nonzero;
  1415. }
  1416. /*!
  1417.  ************************************************************************
  1418.  * brief
  1419.  *    The routine performs transform,quantization,inverse transform, adds the diff.
  1420.  *    to the prediction and writes the result to the decoded luma frame. Includes the
  1421.  *    RD constrained quantization also. Used for CAVLC.
  1422.  *
  1423.  * par Input:
  1424.  *    b8: Block position inside a macro block (0,1,2,3).
  1425.  *
  1426.  * par Output:
  1427.  *    nonzero: 0 if no levels are nonzero.  1 if there are nonzero levels.
  1428.  *    coeff_cost: Counter for nonzero coefficients, used to discard expensive levels.
  1429.  ************************************************************************
  1430.  */
  1431. int dct_8x8_cavlc(Macroblock *currMB, ColorPlane pl, int b8, int *coeff_cost, int intra)
  1432. {
  1433.   int j;
  1434.   int nonzero = FALSE; 
  1435.   int block_x = 8*(b8 & 0x01);
  1436.   int block_y = 8*(b8 >> 1);
  1437.   int pl_off = b8+ (pl<<2);
  1438.   imgpel **img_enc = enc_picture->p_curr_img;
  1439.   imgpel (*mb_pred)[MB_BLOCK_SIZE] = img->mb_pred[pl];  
  1440.   int    (*mb_ores)[MB_BLOCK_SIZE] = img->mb_ores[pl];   
  1441.   int    (*mb_rres)[MB_BLOCK_SIZE] = img->mb_rres[pl];   
  1442.   int max_imgpel_value   = img->max_imgpel_value;
  1443.   int qp = currMB->qp_scaled[pl];
  1444.   const byte (*pos_scan)[2] = currMB->is_field_mode ? FIELD_SCAN8x8 : SNGL_SCAN8x8;
  1445.   int qp_rem = qp_rem_matrix[qp];
  1446.   levelscale    = LevelScale8x8Comp   [pl][intra][qp_rem];
  1447.   invlevelscale = InvLevelScale8x8Comp[pl][intra][qp_rem];
  1448.   leveloffset   = LevelOffset8x8Comp  [pl][intra][qp];
  1449.   fadjust8x8 = img->AdaptiveRounding ? (pl ? &img->fadjust8x8Cr[pl-1][intra][block_y] : &img->fadjust8x8[intra][block_y]) :NULL;
  1450.   // Forward 8x8 transform
  1451.   forward8x8(mb_ores, mb_rres, block_y, block_x);
  1452.   // Quantization process
  1453.   nonzero = quant_8x8cavlc(&mb_rres[block_y], block_y, block_x, qp, img->cofAC[pl_off], fadjust8x8, 
  1454.     levelscale, invlevelscale, leveloffset, coeff_cost, pos_scan, COEFF_COST8x8[params->disthres]);
  1455.   if (nonzero)
  1456.   {
  1457.     // Inverse 8x8 transform
  1458.     inverse8x8(mb_rres, mb_rres, block_y, block_x);
  1459.     // generate final block
  1460.     SampleReconstruct (img_enc, mb_pred, mb_rres, block_y, block_x, img->pix_y, img->pix_x + block_x, BLOCK_SIZE_8x8, BLOCK_SIZE_8x8, max_imgpel_value, DQ_BITS_8);
  1461.   }
  1462.   else // if (nonzero) => No transformed residual. Just use prediction.
  1463.   {      
  1464.     for( j=block_y; j< block_y + BLOCK_SIZE_8x8; j++)
  1465.     {
  1466.       memcpy(&(img_enc[img->pix_y + j][img->pix_x + block_x]),&(mb_pred[j][block_x]), BLOCK_SIZE_8x8 * sizeof(imgpel));
  1467.     }
  1468.   }  
  1469.   //  Decoded block moved to frame memory
  1470.   return nonzero;
  1471. }
  1472. int dct_8x8_ls(Macroblock *currMB, ColorPlane pl, int b8, int *coeff_cost, int intra)
  1473. {
  1474.   int i,j,coeff_ctr;
  1475.   int scan_pos = 0,run = -1;
  1476.   int nonzero = FALSE;  
  1477.   int block_x = 8*(b8 & 0x01);
  1478.   int block_y = 8*(b8 >> 1);
  1479.   int pl_off = b8 + (pl<<2);
  1480.   int*  ACLevel = img->cofAC[pl_off][0][0];
  1481.   int*  ACRun   = img->cofAC[pl_off][0][1];  
  1482.   imgpel **img_enc       = enc_picture->p_curr_img;
  1483.   imgpel (*mb_pred)[MB_BLOCK_SIZE] = img->mb_pred[pl];
  1484.   int    (*mb_ores)[MB_BLOCK_SIZE] = img->mb_ores[pl];
  1485.   int    (*mb_rres)[MB_BLOCK_SIZE] = img->mb_rres[pl];
  1486.   int scan_poss[4] = { 0 }, runs[4] = { -1, -1, -1, -1 };
  1487.   int MCcoeff = 0;
  1488.   int *m7;
  1489.   int is_cavlc = (img->currentSlice->symbol_mode == CAVLC);
  1490.   const byte (*pos_scan)[2] = currMB->is_field_mode ? FIELD_SCAN8x8 : SNGL_SCAN8x8;
  1491.   int **fadjust8x8 = img->AdaptiveRounding ? (pl ? &img->fadjust8x8Cr[pl-1][intra][block_y] : &img->fadjust8x8[intra][block_y]) :NULL;
  1492.   runs[0]=runs[1]=runs[2]=runs[3]=-1;
  1493.   scan_poss[0] = scan_poss[1] = scan_poss[2] = scan_poss[3] = 0;
  1494.   if( (ipmode_DPCM < 2)&&(intra))
  1495.   {
  1496.     Residual_DPCM_8x8(ipmode_DPCM, mb_ores, mb_rres, block_y, block_x);
  1497.   }
  1498.   for (coeff_ctr=0; coeff_ctr < 64; coeff_ctr++)
  1499.   {
  1500.     i=pos_scan[coeff_ctr][0];
  1501.     j=pos_scan[coeff_ctr][1];
  1502.     run++;
  1503.     if (currMB->luma_transform_size_8x8_flag && is_cavlc)
  1504.     {
  1505.       MCcoeff = (coeff_ctr & 3);
  1506.       runs[MCcoeff]++;
  1507.     }
  1508.     m7 = &mb_rres[block_y + j][block_x + i];
  1509.     if (img->AdaptiveRounding)
  1510.     {
  1511.       fadjust8x8[j][block_x+i] = 0;
  1512.     }
  1513.     if (*m7 != 0)
  1514.     {
  1515.       nonzero = TRUE;
  1516.       if (currMB->luma_transform_size_8x8_flag && is_cavlc)
  1517.       {
  1518.         *m7 = iClip3(-CAVLC_LEVEL_LIMIT, CAVLC_LEVEL_LIMIT, *m7);
  1519.         *coeff_cost += MAX_VALUE;
  1520.         img->cofAC[pl_off][MCcoeff][0][scan_poss[MCcoeff]  ] = *m7;
  1521.         img->cofAC[pl_off][MCcoeff][1][scan_poss[MCcoeff]++] = runs[MCcoeff];
  1522.         ++scan_pos;
  1523.         runs[MCcoeff]=-1;
  1524.       }
  1525.       else
  1526.       {
  1527.         *coeff_cost += MAX_VALUE;
  1528.         ACLevel[scan_pos  ] = *m7;
  1529.         ACRun  [scan_pos++] = run;
  1530.         run=-1;                     // reset zero level counter
  1531.       }
  1532.     }
  1533.   }
  1534.   if (!currMB->luma_transform_size_8x8_flag || !is_cavlc)
  1535.     ACLevel[scan_pos] = 0;
  1536.   else
  1537.   {
  1538.     for(i=0; i<4; i++)
  1539.       img->cofAC[pl_off][i][0][scan_poss[i]] = 0;
  1540.   }
  1541.   if( (ipmode_DPCM < 2) && (intra))
  1542.   {
  1543.     Inv_Residual_DPCM_8x8(mb_rres, block_y, block_x);
  1544.   }
  1545.   for( j=block_y; j<block_y + BLOCK_SIZE_8x8; j++)
  1546.   {            
  1547.     for( i=block_x; i< block_x + BLOCK_SIZE_8x8; i++)
  1548.     {
  1549.       mb_rres[j][i] += mb_pred[j][i];
  1550.       img_enc[img->pix_y + j][img->pix_x + i]= (imgpel) mb_rres[j][i];
  1551.     }
  1552.   }  
  1553.   //  Decoded block moved to frame memory
  1554.   return nonzero;
  1555. }
  1556. /*static inline void compute_diff(int *diff, imgpel *cimg, imgpel *cmpr, int width)
  1557. {
  1558.   int i;
  1559.   for (i = 0; i < width; i++)
  1560.   {
  1561.     *(diff++) = *(cimg++) - *(cmpr++);
  1562.   }
  1563. }*/
  1564. /*!
  1565. *************************************************************************************
  1566. * brief
  1567. *     distortion for an 8x8 Intra block 
  1568. *************************************************************************************
  1569. */
  1570. void compute_comp_cost8x8(imgpel **cur_img, imgpel mpr8x8[16][16], int pic_opix_x, double *cost)
  1571. {
  1572.   int i, j;
  1573.   int *diff = &diff64[0];
  1574.   imgpel *cimg, *cmpr;
  1575.   for (j=0; j<8; j++)
  1576.   {
  1577.   //  compute_diff(diff, &cur_img[j][pic_opix_x], &mpr8x8[j][0], BLOCK_SIZE_8x8);
  1578.     cimg = &cur_img[j][pic_opix_x];
  1579.     cmpr = &mpr8x8[j][0];
  1580.     for (i=0; i<8; i++)
  1581.     {
  1582.       *diff++ = *cimg++ - *cmpr++;
  1583.     }
  1584.   }
  1585.   *cost += distortion8x8 (diff64);
  1586. }