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

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file block.c
  4.  *
  5.  * brief
  6.  *    Process one block
  7.  *
  8.  * author
  9.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10.  *    - Inge Lille-Langoy               <inge.lille-langoy@telenor.com>
  11.  *    - Rickard Sjoberg                 <rickard.sjoberg@era.ericsson.se>
  12.  *    - Stephan Wenger                  <stewe@cs.tu-berlin.de>
  13.  *    - Jani Lainema                    <jani.lainema@nokia.com>
  14.  *    - Detlev Marpe                    <marpe@hhi.de>
  15.  *    - Thomas Wedi                     <wedi@tnt.uni-hannover.de>
  16.  *    - Ragip Kurceren                  <ragip.kurceren@nokia.com>
  17.  *    - Greg Conklin                    <gregc@real.com>
  18.  *************************************************************************************
  19.  */
  20. #include "contributors.h"
  21. #include <math.h>
  22. #include "global.h"
  23. #include "enc_statistics.h"
  24. #include "image.h"
  25. #include "mb_access.h"
  26. #include "block.h"
  27. #include "vlc.h"
  28. #include "transform.h"
  29. #include "mc_prediction.h"
  30. #include "q_offsets.h"
  31. #include "q_matrix.h"
  32. #include "quant4x4.h"
  33. #include "quantChroma.h"
  34. // Notation for comments regarding prediction and predictors.
  35. // The pels of the 4x4 block are labelled a..p. The predictor pels above
  36. // are labelled A..H, from the left I..P, and from above left X, as follows:
  37. //
  38. //  X A B C D E F G H
  39. //  I a b c d
  40. //  J e f g h
  41. //  K i j k l
  42. //  L m n o p
  43. //
  44. // Predictor array index definitions
  45. #define P_X (PredPel[0])
  46. #define P_A (PredPel[1])
  47. #define P_B (PredPel[2])
  48. #define P_C (PredPel[3])
  49. #define P_D (PredPel[4])
  50. #define P_E (PredPel[5])
  51. #define P_F (PredPel[6])
  52. #define P_G (PredPel[7])
  53. #define P_H (PredPel[8])
  54. #define P_I (PredPel[9])
  55. #define P_J (PredPel[10])
  56. #define P_K (PredPel[11])
  57. #define P_L (PredPel[12])
  58. extern const unsigned char subblk_offset_y[3][8][4];
  59. extern const unsigned char subblk_offset_x[3][8][4];
  60. // global pointers for 4x4 quantization parameters
  61. extern int ****ptLevelOffset4x4;
  62. static int **levelscale = NULL, **leveloffset = NULL;
  63. static int **invlevelscale = NULL;
  64. static int **levelscale_sp = NULL, **leveloffset_sp = NULL;
  65. static int **invlevelscale_sp = NULL;
  66. static int **fadjust4x4 = NULL;
  67. static int **fadjust2x2 = NULL;
  68. static int **fadjust4x2 = NULL; // note that this is in fact 2x4 but the coefficients have been transposed for better memory access
  69. static int **levelscaleDC = NULL, **leveloffsetDC = NULL;
  70. static int **invlevelscaleDC = NULL;
  71. static int M1[MB_BLOCK_SIZE][MB_BLOCK_SIZE];
  72. static int M4[4][4];
  73. //For residual DPCM
  74. static int Residual_DPCM_4x4_for_Intra16x16(int mb_ores[4][4], int ipmode);
  75. static int Inv_Residual_DPCM_4x4_for_Intra16x16(int m7[4][4], int ipmode);
  76. static int Residual_DPCM_4x4(int ipmode, int mb_ores[16][16], int mb_rres[16][16], int block_y, int block_x);  
  77. static int Inv_Residual_DPCM_4x4(int m7[16][16], int block_y, int block_x);
  78. /*!
  79.  ************************************************************************
  80.  * brief
  81.  *    Make intra 4x4 prediction according to all 9 prediction modes.
  82.  *    The routine uses left and upper neighbouring points from
  83.  *    previous coded blocks to do this (if available). Notice that
  84.  *    inaccessible neighbouring points are signalled with a negative
  85.  *    value in the predmode array .
  86.  *
  87.  *  par Input:
  88.  *     Starting point of current 4x4 block image posision
  89.  *
  90.  *  par Output:
  91.  *      none
  92.  ************************************************************************
  93.  */
  94. void intrapred_4x4(Macroblock *currMB, ColorPlane pl, int img_x,int img_y, int *left_available, int *up_available, int *all_available)
  95. {
  96.   int i,j;
  97.   int s0;
  98.   imgpel  PredPel[13];  // array of predictor pels
  99.   imgpel  **img_enc = enc_picture->p_curr_img;
  100.   imgpel  *img_pel;  
  101.   imgpel (*cur_pred)[MB_BLOCK_SIZE];
  102.   imgpel (*curr_mpr_4x4)[MB_BLOCK_SIZE][MB_BLOCK_SIZE]  = img->mpr_4x4[pl];
  103.   unsigned int dc_pred_value = img->dc_pred_value;
  104.   int ioff = (img_x & 15);
  105.   int joff = (img_y & 15);
  106.   PixelPos pix_a[4];
  107.   PixelPos pix_b, pix_c, pix_d;
  108.   int block_available_up;
  109.   int block_available_left;
  110.   int block_available_up_left;
  111.   int block_available_up_right;
  112.   int *mb_size = img->mb_size[IS_LUMA];
  113.   for (i=0;i<4;i++)
  114.   {
  115.     getNeighbour(currMB, ioff -1 , joff +i , mb_size, &pix_a[i]);
  116.   }
  117.   getNeighbour(currMB, ioff    , joff -1 , mb_size, &pix_b);
  118.   getNeighbour(currMB, ioff +4 , joff -1 , mb_size, &pix_c);
  119.   getNeighbour(currMB, ioff -1 , joff -1 , mb_size, &pix_d);
  120.   pix_c.available = pix_c.available && !((ioff==4) && ((joff==4)||(joff==12)));
  121.   if (params->UseConstrainedIntraPred)
  122.   {
  123.     for (i=0, block_available_left=1; i<4;i++)
  124.       block_available_left  &= pix_a[i].available ? img->intra_block[pix_a[i].mb_addr]: 0;
  125.     block_available_up       = pix_b.available ? img->intra_block [pix_b.mb_addr] : 0;
  126.     block_available_up_right = pix_c.available ? img->intra_block [pix_c.mb_addr] : 0;
  127.     block_available_up_left  = pix_d.available ? img->intra_block [pix_d.mb_addr] : 0;
  128.   }
  129.   else
  130.   {
  131.     block_available_left     = pix_a[0].available;
  132.     block_available_up       = pix_b.available;
  133.     block_available_up_right = pix_c.available;
  134.     block_available_up_left  = pix_d.available;
  135.   }
  136.   *left_available = block_available_left;
  137.   *up_available   = block_available_up;
  138.   *all_available  = block_available_up && block_available_left && block_available_up_left;
  139.   i = (img_x & 15);
  140.   j = (img_y & 15);
  141.   // form predictor pels
  142.   if (block_available_up)
  143.   {
  144.     img_pel = &img_enc[pix_b.pos_y][pix_b.pos_x];
  145.     P_A = *(img_pel++);
  146.     P_B = *(img_pel++);
  147.     P_C = *(img_pel++);
  148.     P_D = *(img_pel);
  149.   }
  150.   else
  151.   {
  152.     P_A = P_B = P_C = P_D = dc_pred_value;
  153.   }
  154.   if (block_available_up_right)
  155.   {
  156.     img_pel = &img_enc[pix_c.pos_y][pix_c.pos_x];
  157.     P_E = *(img_pel++);
  158.     P_F = *(img_pel++);
  159.     P_G = *(img_pel++);
  160.     P_H = *(img_pel);
  161.   }
  162.   else
  163.   {
  164.     P_E = P_F = P_G = P_H = P_D;
  165.   }
  166.   if (block_available_left)
  167.   {
  168.     P_I = img_enc[pix_a[0].pos_y][pix_a[0].pos_x];
  169.     P_J = img_enc[pix_a[1].pos_y][pix_a[1].pos_x];
  170.     P_K = img_enc[pix_a[2].pos_y][pix_a[2].pos_x];
  171.     P_L = img_enc[pix_a[3].pos_y][pix_a[3].pos_x];
  172.   }
  173.   else
  174.   {
  175.     P_I = P_J = P_K = P_L = dc_pred_value;
  176.   }
  177.   if (block_available_up_left)
  178.   {
  179.     P_X = img_enc[pix_d.pos_y][pix_d.pos_x];
  180.   }
  181.   else
  182.   {
  183.     P_X = dc_pred_value;
  184.   }
  185.   for(i=0;i<9;i++)
  186.     curr_mpr_4x4[i][0][0]=-1;
  187.   ///////////////////////////////
  188.   // make DC prediction
  189.   ///////////////////////////////
  190.   s0 = 0;
  191.   if (block_available_up && block_available_left)
  192.   {
  193.     // no edge
  194.     s0 = (P_A + P_B + P_C + P_D + P_I + P_J + P_K + P_L + 4) >> (BLOCK_SHIFT + 1);
  195.   }
  196.   else if (!block_available_up && block_available_left)
  197.   {
  198.     // upper edge
  199.     s0 = (P_I + P_J + P_K + P_L + 2) >> BLOCK_SHIFT;;
  200.   }
  201.   else if (block_available_up && !block_available_left)
  202.   {
  203.     // left edge
  204.     s0 = (P_A + P_B + P_C + P_D + 2) >> BLOCK_SHIFT;
  205.   }
  206.   else //if (!block_available_up && !block_available_left)
  207.   {
  208.     // top left corner, nothing to predict from
  209.     s0 = dc_pred_value;
  210.   }
  211.   // store DC prediction
  212.   cur_pred = curr_mpr_4x4[DC_PRED];
  213.   for (j=0; j < BLOCK_SIZE; j++)
  214.   {
  215.     for (i=0; i < BLOCK_SIZE; i++)
  216.       cur_pred[j][i] = (imgpel) s0;
  217.   }
  218.   ///////////////////////////////
  219.   // make horiz and vert prediction
  220.   ///////////////////////////////
  221.   //Mode vertical
  222.   cur_pred = curr_mpr_4x4[VERT_PRED];
  223.   for (i=0; i < BLOCK_SIZE; i++)
  224.   {
  225.     cur_pred[0][i] =
  226.     cur_pred[1][i] =
  227.     cur_pred[2][i] =
  228.     cur_pred[3][i] = (imgpel) (&P_A)[i];
  229.   }
  230.   if(!block_available_up)
  231.     cur_pred [0][0]=-1;
  232.   //Mode horizontal
  233.   cur_pred = curr_mpr_4x4[HOR_PRED];
  234.   for (i=0; i < BLOCK_SIZE; i++)
  235.   {
  236.     cur_pred[i][0]  =
  237.     cur_pred[i][1]  =
  238.     cur_pred[i][2]  =
  239.     cur_pred[i][3]  = (imgpel) (&P_I)[i];
  240.   }
  241.   if(!block_available_left)
  242.     cur_pred[0][0]=-1;
  243.   if (block_available_up)
  244.   {
  245.     // Mode DIAG_DOWN_LEFT_PRED
  246.     cur_pred = curr_mpr_4x4[DIAG_DOWN_LEFT_PRED];
  247.     cur_pred[0][0] = (imgpel) ((P_A + P_C + ((P_B)<<1) + 2) >> 2);
  248.     cur_pred[0][1] =
  249.     cur_pred[1][0] = (imgpel) ((P_B + P_D + ((P_C)<<1) + 2) >> 2);
  250.     cur_pred[0][2] =
  251.     cur_pred[1][1] =
  252.     cur_pred[2][0] = (imgpel) ((P_C + P_E + ((P_D)<<1) + 2) >> 2);
  253.     cur_pred[0][3] =
  254.     cur_pred[1][2] =
  255.     cur_pred[2][1] =
  256.     cur_pred[3][0] = (imgpel) ((P_D + P_F + ((P_E)<<1) + 2) >> 2);
  257.     cur_pred[1][3] =
  258.     cur_pred[2][2] =
  259.     cur_pred[3][1] = (imgpel) ((P_E + P_G + ((P_F)<<1) + 2) >> 2);
  260.     cur_pred[2][3] =
  261.     cur_pred[3][2] = (imgpel) ((P_F + P_H + ((P_G)<<1) + 2) >> 2);
  262.     cur_pred[3][3] = (imgpel) ((P_G + 3*(P_H) + 2) >> 2);
  263.     // Mode VERT_LEFT_PRED
  264.     cur_pred = curr_mpr_4x4[VERT_LEFT_PRED];
  265.     cur_pred[0][0] = (imgpel) ((P_A + P_B + 1) >> 1);
  266.     cur_pred[0][1] =
  267.     cur_pred[2][0] = (imgpel) ((P_B + P_C + 1) >> 1);
  268.     cur_pred[0][2] =
  269.     cur_pred[2][1] = (imgpel) ((P_C + P_D + 1) >> 1);
  270.     cur_pred[0][3] =
  271.     cur_pred[2][2] = (imgpel) ((P_D + P_E + 1) >> 1);
  272.     cur_pred[2][3] = (imgpel) ((P_E + P_F + 1) >> 1);
  273.     cur_pred[1][0] = (imgpel) ((P_A + ((P_B)<<1) + P_C + 2) >> 2);
  274.     cur_pred[1][1] =
  275.     cur_pred[3][0] = (imgpel) ((P_B + ((P_C)<<1) + P_D + 2) >> 2);
  276.     cur_pred[1][2] =
  277.     cur_pred[3][1] = (imgpel) ((P_C + ((P_D)<<1) + P_E + 2) >> 2);
  278.     cur_pred[1][3] =
  279.     cur_pred[3][2] = (imgpel) ((P_D + ((P_E)<<1) + P_F + 2) >> 2);
  280.     cur_pred[3][3] = (imgpel) ((P_E + ((P_F)<<1) + P_G + 2) >> 2);
  281.   }
  282.   /*  Prediction according to 'diagonal' modes */
  283.   if (block_available_left)
  284.   {
  285.     // Mode HOR_UP_PRED
  286.     cur_pred = curr_mpr_4x4[HOR_UP_PRED];
  287.     cur_pred[0][0] = (imgpel) ((P_I + P_J + 1) >> 1);
  288.     cur_pred[0][1] = (imgpel) ((P_I + 2*P_J + P_K + 2) >> 2);
  289.     cur_pred[0][2] =
  290.     cur_pred[1][0] = (imgpel) ((P_J + P_K + 1) >> 1);
  291.     cur_pred[0][3] =
  292.     cur_pred[1][1] = (imgpel) ((P_J + 2*P_K + P_L + 2) >> 2);
  293.     cur_pred[1][2] =
  294.     cur_pred[2][0] = (imgpel) ((P_K + P_L + 1) >> 1);
  295.     cur_pred[1][3] =
  296.     cur_pred[2][1] = (imgpel) ((P_K + 2*P_L + P_L + 2) >> 2);
  297.     cur_pred[3][0] =
  298.     cur_pred[2][2] =
  299.     cur_pred[2][3] =
  300.     cur_pred[3][1] =
  301.     cur_pred[3][2] =
  302.     cur_pred[3][3] = (imgpel) P_L;
  303.   }
  304.   /*  Prediction according to 'diagonal' modes */
  305.   if (block_available_up && block_available_left && block_available_up_left)
  306.   {
  307.     // Mode DIAG_DOWN_RIGHT_PRED
  308.     cur_pred = curr_mpr_4x4[DIAG_DOWN_RIGHT_PRED];
  309.     cur_pred[3][0] = (imgpel) ((P_L + 2*P_K + P_J + 2) >> 2);
  310.     cur_pred[2][0] =
  311.     cur_pred[3][1] = (imgpel) ((P_K + 2*P_J + P_I + 2) >> 2);
  312.     cur_pred[1][0] =
  313.     cur_pred[2][1] =
  314.     cur_pred[3][2] = (imgpel) ((P_J + 2*P_I + P_X + 2) >> 2);
  315.     cur_pred[0][0] =
  316.     cur_pred[1][1] =
  317.     cur_pred[2][2] =
  318.     cur_pred[3][3] = (imgpel) ((P_I + 2*P_X + P_A + 2) >> 2);
  319.     cur_pred[0][1] =
  320.     cur_pred[1][2] =
  321.     cur_pred[2][3] = (imgpel) ((P_X + 2*P_A + P_B + 2) >> 2);
  322.     cur_pred[0][2] =
  323.     cur_pred[1][3] = (imgpel) ((P_A + 2*P_B + P_C + 2) >> 2);
  324.     cur_pred[0][3] = (imgpel) ((P_B + 2*P_C + P_D + 2) >> 2);
  325.     // Mode VERT_RIGHT_PRED
  326.     cur_pred = curr_mpr_4x4[VERT_RIGHT_PRED];
  327.     cur_pred[0][0] =
  328.     cur_pred[2][1] = (imgpel) ((P_X + P_A + 1) >> 1);
  329.     cur_pred[0][1] =
  330.     cur_pred[2][2] = (imgpel) ((P_A + P_B + 1) >> 1);
  331.     cur_pred[0][2] =
  332.     cur_pred[2][3] = (imgpel) ((P_B + P_C + 1) >> 1);
  333.     cur_pred[0][3] = (imgpel) ((P_C + P_D + 1) >> 1);
  334.     cur_pred[1][0] =
  335.     cur_pred[3][1] = (imgpel) ((P_I + 2*P_X + P_A + 2) >> 2);
  336.     cur_pred[1][1] =
  337.     cur_pred[3][2] = (imgpel) ((P_X + 2*P_A + P_B + 2) >> 2);
  338.     cur_pred[1][2] =
  339.     cur_pred[3][3] = (imgpel) ((P_A + 2*P_B + P_C + 2) >> 2);
  340.     cur_pred[1][3] = (imgpel) ((P_B + 2*P_C + P_D + 2) >> 2);
  341.     cur_pred[2][0] = (imgpel) ((P_X + 2*P_I + P_J + 2) >> 2);
  342.     cur_pred[3][0] = (imgpel) ((P_I + 2*P_J + P_K + 2) >> 2);
  343.     // Mode HOR_DOWN_PRED
  344.     cur_pred = curr_mpr_4x4[HOR_DOWN_PRED];
  345.     cur_pred[0][0] =
  346.     cur_pred[1][2] = (imgpel) ((P_X + P_I + 1) >> 1);
  347.     cur_pred[0][1] =
  348.     cur_pred[1][3] = (imgpel) ((P_I + 2*P_X + P_A + 2) >> 2);
  349.     cur_pred[0][2] = (imgpel) ((P_X + 2*P_A + P_B + 2) >> 2);
  350.     cur_pred[0][3] = (imgpel) ((P_A + 2*P_B + P_C + 2) >> 2);
  351.     cur_pred[1][0] =
  352.     cur_pred[2][2] = (imgpel) ((P_I + P_J + 1) >> 1);
  353.     cur_pred[1][1] =
  354.     cur_pred[2][3] = (imgpel) ((P_X + 2*P_I + P_J + 2) >> 2);
  355.     cur_pred[2][0] =
  356.     cur_pred[3][2] = (imgpel) ((P_J + P_K + 1) >> 1);
  357.     cur_pred[2][1] =
  358.     cur_pred[3][3] = (imgpel) ((P_I + 2*P_J + P_K + 2) >> 2);
  359.     cur_pred[3][0] = (imgpel) ((P_K + P_L + 1) >> 1);
  360.     cur_pred[3][1] = (imgpel) ((P_J + 2*P_K + P_L + 2) >> 2);
  361.   }
  362. }
  363. /*!
  364.  ************************************************************************
  365.  * brief
  366.  *    16x16 based luma prediction
  367.  *
  368.  * par Input:
  369.  *    Image parameters
  370.  *
  371.  * par Output:
  372.  *    none
  373.  ************************************************************************
  374.  */
  375. void intrapred_16x16(Macroblock *currMB, ColorPlane pl)
  376. {
  377.   int s0=0,s1,s2;
  378.   imgpel s[2][16];
  379.   int i,j;
  380.   int ih,iv;
  381.   int ib,ic,iaa;
  382.   imgpel **img_enc = enc_picture->p_curr_img;
  383.   imgpel (*curr_mpr_16x16)[MB_BLOCK_SIZE][MB_BLOCK_SIZE]  = img->mpr_16x16[pl];
  384.   unsigned int dc_pred_value = img->dc_pred_value;
  385.   PixelPos up;          //!< pixel position p(0,-1)
  386.   PixelPos left[17];    //!< pixel positions p(-1, -1..15)
  387.   int up_avail, left_avail, left_up_avail;
  388.   int *mb_size = img->mb_size[IS_LUMA];
  389.   for (i=0;i<17;i++)
  390.   {
  391.     getNeighbour(currMB, -1,  i-1, mb_size, &left[i]);
  392.   }
  393.   getNeighbour(currMB,    0,   -1, mb_size, &up);
  394.   if (!(params->UseConstrainedIntraPred))
  395.   {
  396.     up_avail      = up.available;
  397.     left_avail    = left[1].available;
  398.     left_up_avail = left[0].available;
  399.   }
  400.   else
  401.   {
  402.     up_avail      = up.available ? img->intra_block[up.mb_addr] : 0;
  403.     for (i=1, left_avail=1; i<17;i++)
  404.       left_avail  &= left[i].available ? img->intra_block[left[i].mb_addr]: 0;
  405.     left_up_avail = left[0].available ? img->intra_block[left[0].mb_addr]: 0;
  406.   }
  407.   s1=s2=0;
  408.   // make DC prediction
  409.   if (up_avail)
  410.   {
  411.     for (i=up.pos_x; i < up.pos_x + MB_BLOCK_SIZE; i++)
  412.       s1 += img_enc[up.pos_y][i];    // sum hor pix
  413.   }
  414.   if (left_avail)
  415.   {
  416.     for (i=1; i < MB_BLOCK_SIZE + 1; i++)
  417.       s2 += img_enc[left[i].pos_y][left[i].pos_x];    // sum vert pix
  418.   }
  419.   if (up_avail)
  420.   {
  421.     s0= left_avail
  422.       ? rshift_rnd_sf((s1+s2),(MB_BLOCK_SHIFT + 1)) // no edge
  423.       : rshift_rnd_sf(s1, MB_BLOCK_SHIFT);          // left edge
  424.   }
  425.   else
  426.   {
  427.     s0=left_avail
  428.       ? rshift_rnd_sf(s2, MB_BLOCK_SHIFT)           // upper edge
  429.       : dc_pred_value;                              // top left corner, nothing to predict from
  430.   }
  431.   // vertical prediction
  432.   if (up_avail)
  433.     memcpy(s[0], &img_enc[up.pos_y][up.pos_x], MB_BLOCK_SIZE * sizeof(imgpel));
  434.   // horizontal prediction
  435.   if (left_avail)
  436.   {
  437.     for (i=1; i < MB_BLOCK_SIZE + 1; i++)
  438.       s[1][i - 1]=img_enc[left[i].pos_y][left[i].pos_x];
  439.   }
  440.   for (j=0; j < MB_BLOCK_SIZE; j++)
  441.   {
  442.     memcpy(curr_mpr_16x16[VERT_PRED_16][j], s[0], MB_BLOCK_SIZE * sizeof(imgpel)); // store vertical prediction
  443.     for (i=0; i < MB_BLOCK_SIZE; i++)
  444.     {
  445.       curr_mpr_16x16[HOR_PRED_16 ][j][i] = s[1][j]; // store horizontal prediction
  446.       curr_mpr_16x16[DC_PRED_16  ][j][i] = s0;      // store DC prediction
  447.     }
  448.   }
  449.   
  450.   if (!up_avail || !left_avail || !left_up_avail) // edge
  451.     return;
  452.   // 16 bit integer plan pred
  453.   ih=0;
  454.   iv=0;
  455.   for (i=1;i<9;i++)
  456.   {
  457.     if (i<8)
  458.       ih += i*(img_enc[up.pos_y][up.pos_x+7+i] - img_enc[up.pos_y][up.pos_x+7-i]);
  459.     else
  460.       ih += i*(img_enc[up.pos_y][up.pos_x+7+i] - img_enc[left[0].pos_y][left[0].pos_x]);
  461.     iv += i*(img_enc[left[8+i].pos_y][left[8+i].pos_x] - img_enc[left[8-i].pos_y][left[8-i].pos_x]);
  462.   }
  463.   ib=(5*ih+32)>>6;
  464.   ic=(5*iv+32)>>6;
  465.   iaa=16*(img_enc[up.pos_y][up.pos_x+15]+img_enc[left[16].pos_y][left[16].pos_x]);
  466.   for (j=0;j< MB_BLOCK_SIZE;j++)
  467.   {
  468.     for (i=0;i< MB_BLOCK_SIZE;i++)
  469.     {
  470.       curr_mpr_16x16[PLANE_16][j][i]= iClip1( img->max_imgpel_value, rshift_rnd_sf((iaa+(i-7)*ib +(j-7)*ic), 5));// store plane prediction
  471.     }
  472.   }
  473. }
  474. /*!
  475.  ************************************************************************
  476.  * brief
  477.  *    For new intra pred routines
  478.  *
  479.  * par Input:
  480.  *    Image par, 16x16 based intra mode
  481.  *
  482.  * par Output:
  483.  *    none
  484.  ************************************************************************
  485.  */
  486. int dct_16x16(Macroblock *currMB, ColorPlane pl, int new_intra_mode, int is_cavlc)
  487. {
  488.   int i,j;
  489.   int ii,jj;
  490.   int ac_coef = 0;
  491.   static imgpel *img_Y, *predY;
  492.   int nonzero = FALSE;
  493.   int   jpos, ipos;
  494.   int   b8, b4;
  495.   //begin the changes
  496.   int   pl_off = pl<<2;
  497.   int*  DCLevel = img->cofDC[pl][0];
  498.   int*  DCRun   = img->cofDC[pl][1];
  499.   int   ****cofAC = &img->cofAC[pl_off];
  500.   int*  ACLevel;
  501.   int*  ACRun;  
  502.   int coeff_cost;
  503.   imgpel **img_enc          = enc_picture->p_curr_img;
  504.   int    max_imgpel_value   = img->max_imgpel_value;
  505.   int    qp                 = currMB->qp_scaled[pl]; 
  506.   const byte (*pos_scan)[2] = currMB->is_field_mode ? FIELD_SCAN : SNGL_SCAN;
  507.   imgpel  (*curr_mpr_16x16)[MB_BLOCK_SIZE][MB_BLOCK_SIZE]  = img->mpr_16x16[pl];
  508.   int qp_per = qp_per_matrix[qp];
  509.   int qp_rem = qp_rem_matrix[qp];
  510.   // select scaling parameters
  511.   levelscale    = LevelScale4x4Comp[pl][1][qp_rem];
  512.   invlevelscale = InvLevelScale4x4Comp[pl][1][qp_rem];
  513.   leveloffset   = ptLevelOffset4x4  [1][qp]; 
  514.   fadjust4x4 = img->AdaptiveRounding ? (pl ? &img->fadjust4x4Cr[pl-1][2][0] : &img->fadjust4x4[2][0]): NULL;
  515.   for (j = 0; j < 16; j++)
  516.   {
  517.     predY = curr_mpr_16x16[new_intra_mode][j];
  518.     img_Y = &pCurImg[img->opix_y + j][img->opix_x];
  519.     for (i = 0; i < 16; i++)
  520.     {
  521.       M1[j][i] = img_Y[i] - predY[i];
  522.     }
  523.   }
  524.   // forward 4x4 DCT
  525.   for (j = 0; j < 16; j+=4)
  526.   {
  527.     for (i = 0;i < 16; i+=4)
  528.     {
  529.       forward4x4(M1, M1, j, i);
  530.     }
  531.   }
  532.   // pick out DC coeff
  533.   for (j = 0; j < 4; j++)
  534.     for (i = 0; i < 4; i++)
  535.       M4[j][i]= M1[j << 2][i << 2];
  536.   // hadamard of DC coefficients
  537.   hadamard4x4(M4, M4);
  538.   nonzero = quant_dc4x4(&M4[0], qp, DCLevel, DCRun, levelscale[0][0], invlevelscale[0][0], leveloffset[0][0], pos_scan, is_cavlc);
  539.   // inverse DC transform
  540.   if (nonzero)
  541.   {
  542.     ihadamard4x4(M4, M4);
  543.     // Reset DC coefficients
  544.     for (j = 0; j < 4; j++)
  545.     {
  546.       for (i = 0; i<4;i++)
  547.       {
  548.         M1[j<<2][i<<2] = rshift_rnd_sf(((M4[j][i]) * invlevelscale[0][0]) << qp_per, 6);
  549.       }
  550.     }
  551.   }
  552.   else // All DC equal to 0.
  553.   {
  554.     for (j=0;j<4;j++)
  555.     {
  556.       for (i=0;i<4;i++)
  557.       {
  558.         M1[j<<2][i<<2] = 0;
  559.       }
  560.     }
  561.   }
  562.   // AC processing for MB
  563.   for (jj=0;jj<4;jj++)
  564.   {
  565.     jpos = (jj << 2);
  566.     for (ii=0;ii<4;ii++)
  567.     {
  568.       ipos = (ii << 2);
  569.       b8       = 2*(jj >> 1) + (ii >> 1);
  570.       b4       = 2*(jj & 0x01) + (ii & 0x01);
  571.       ACLevel  = cofAC[b8][b4][0];
  572.       ACRun    = cofAC[b8][b4][1];
  573.       img->subblock_y = jj;
  574.       img->subblock_x = ii;
  575.       // Quantization process
  576.       nonzero = quant_ac4x4(&M1[jpos], jpos, ipos, qp, ACLevel, ACRun, &fadjust4x4[jpos], 
  577.         levelscale, invlevelscale, leveloffset, &coeff_cost, pos_scan, COEFF_COST4x4[params->disthres], LUMA_16AC, is_cavlc);
  578.       if (nonzero)
  579.         ac_coef = 15;
  580.       //IDCT
  581.       if (M1[jpos][ipos]!= 0 || nonzero)
  582.         inverse4x4(M1, M1, jpos, ipos);
  583.     }
  584.   }
  585.     // Reconstruct samples
  586.     SampleReconstruct (img_enc, curr_mpr_16x16[new_intra_mode], M1, 0, 0, img->pix_y, img->pix_x, 16, 16, max_imgpel_value, DQ_BITS);
  587.   if(img->type == SP_SLICE)
  588.   {
  589.     for (j = img->pix_y; j < img->pix_y + 16;j++)
  590.       for (i = img->pix_x; i < img->pix_x + 16;i++)
  591.         lrec[j][i]=-16; //signals an I16 block in the SP frame
  592.   }
  593.   return ac_coef;
  594. }
  595. /*!
  596.  ************************************************************************
  597.  * brief
  598.  *    For new intra pred routines
  599.  *
  600.  * par Input:
  601.  *    Image par, 16x16 based intra mode
  602.  *
  603.  * par Output:
  604.  *    none
  605.  ************************************************************************
  606.  */
  607. int dct_16x16_ls(Macroblock *currMB, ColorPlane pl, int new_intra_mode, int is_cavlc)
  608. {
  609.   int i,j;
  610.   int ii,jj;
  611.   int run,scan_pos,coeff_ctr;
  612.   int ac_coef = 0;
  613.   static imgpel *img_Y, *predY;
  614.   int   b8, b4;
  615.   //begin the changes
  616.   int   pl_off = pl<<2;
  617.   int*  DCLevel = img->cofDC[pl][0];
  618.   int*  DCRun   = img->cofDC[pl][1];
  619.   int*  ACLevel;
  620.   int*  ACRun;  
  621.   imgpel **img_enc = enc_picture->p_curr_img;
  622.   int   *m7;
  623.   const byte (*pos_scan)[2] = currMB->is_field_mode ? FIELD_SCAN : SNGL_SCAN;
  624.   imgpel  (*curr_mpr_16x16)[MB_BLOCK_SIZE][MB_BLOCK_SIZE]  = img->mpr_16x16[pl];
  625.   for (j = 0; j < 16; j++)
  626.   {
  627.     predY = curr_mpr_16x16[new_intra_mode][j];
  628.     img_Y = &pCurImg[img->opix_y + j][img->opix_x];
  629.     for (i = 0; i < 16; i++)
  630.     {
  631.       M1[j][i] = img_Y[i] - predY[i];
  632.     }
  633.   }
  634.   // pick out DC coeff
  635.   for (j = 0; j < 4;j++)
  636.     for (i = 0; i < 4;i++)
  637.       M4[j][i]= M1[j << 2][i << 2];
  638.   run=-1;
  639.   scan_pos=0;
  640.   for (coeff_ctr=0;coeff_ctr<16;coeff_ctr++)
  641.   {
  642.     i=pos_scan[coeff_ctr][0];
  643.     j=pos_scan[coeff_ctr][1];
  644.     run++;
  645.     m7 = &M4[j][i];
  646.     if (*m7 != 0)
  647.     {
  648.       if (is_cavlc)
  649.         *m7 = iClip3(-CAVLC_LEVEL_LIMIT, CAVLC_LEVEL_LIMIT, *m7);
  650.       DCLevel[scan_pos  ] = *m7;
  651.       DCRun  [scan_pos++] = run;
  652.       run=-1;
  653.     }
  654.   }
  655.   DCLevel[scan_pos]=0;
  656.   // replace DC coeff. This is needed in case of out of limits for CAVLC. Could be done only for CAVLC
  657.   for (j = 0; j < 4;j++)
  658.     for (i = 0; i < 4;i++)
  659.       M1[j << 2][i << 2] = M4[j][i];
  660.   // AC inverse trans/quant for MB
  661.   for (jj=0;jj<4;jj++)
  662.   {
  663.     for (ii=0;ii<4;ii++)
  664.     {
  665.       for (j=0;j<4;j++)
  666.       {
  667.         memcpy(M4[j],&M1[(jj<<2)+j][(ii<<2)], BLOCK_SIZE * sizeof(int));
  668.       }
  669.       //For residual DPCM
  670.       if(new_intra_mode < 2)  //residual DPCM
  671.       {
  672.         Residual_DPCM_4x4_for_Intra16x16(M4, new_intra_mode);  
  673.       }
  674.       run      = -1;
  675.       scan_pos =  0;
  676.       b8       = 2*(jj >> 1) + (ii >> 1);
  677.       b4       = 2*(jj & 0x01) + (ii & 0x01);
  678.       ACLevel  = img->cofAC [b8+pl_off][b4][0];
  679.       ACRun    = img->cofAC [b8+pl_off][b4][1];
  680.       for (coeff_ctr=1;coeff_ctr<16;coeff_ctr++) // set in AC coeff
  681.       {
  682.         i=pos_scan[coeff_ctr][0];
  683.         j=pos_scan[coeff_ctr][1];
  684.         run++;
  685.         m7 = &M4[j][i];
  686.         if (*m7 != 0)
  687.         {
  688.           if (is_cavlc)
  689.             *m7 = iClip3(-CAVLC_LEVEL_LIMIT, CAVLC_LEVEL_LIMIT, *m7);
  690.           ac_coef = 15;
  691.           ACLevel[scan_pos  ] = *m7;
  692.           ACRun  [scan_pos++] = run;
  693.           run=-1;
  694.         }
  695.         // set adaptive rounding params to 0 since process is not meaningful here.
  696.       }
  697.       ACLevel[scan_pos] = 0;
  698.       ///For residual DPCM.  inv. residual DCPM
  699.       if(new_intra_mode<2)  
  700.       {
  701.         Inv_Residual_DPCM_4x4_for_Intra16x16(M4, new_intra_mode);  
  702.       }
  703.       for (j=0;j<4;j++)
  704.         memcpy(&M1[(jj<<2)+j][(ii<<2)],M4[j], BLOCK_SIZE * sizeof(int)); 
  705.     }
  706.   }
  707.   for (j = 0; j < 16; j++)
  708.   {
  709.     img_Y = &img_enc[img->pix_y + j][img->pix_x];
  710.     predY = curr_mpr_16x16[new_intra_mode][j];        
  711.     for (i = 0; i < 16; i++)
  712.       img_Y[i]=(imgpel)(M1[j][i] + predY[i]);
  713.   }
  714.   if(img->type == SP_SLICE)
  715.   {
  716.     for (j = img->pix_y; j < img->pix_y + 16;j++)
  717.       for (i = img->pix_x; i < img->pix_x + 16;i++)
  718.         lrec[j][i]=-16; //signals an I16 block in the SP frame
  719.   }
  720.   return ac_coef;
  721. }
  722. /*!
  723. ************************************************************************
  724. * brief
  725. *    The routine performs transform,quantization,inverse transform, 
  726. *    adds the diff to the prediction and writes the result to the 
  727. *    decoded luma frame. 
  728. *
  729. * par Input:
  730. *    currMB:          Current macroblock.
  731. *    pl:              Color plane for 4:4:4 coding.
  732. *    block_x,block_y: Block position inside a macro block (0,4,8,12).
  733. *    intra:           Intra block indicator.
  734. *
  735. * par Output_
  736. *    nonzero:         0 if no levels are nonzero. n
  737. *                     1 if there are nonzero levels.n
  738. *    coeff_cost:      Coeff coding cost for thresholding consideration.n
  739. ************************************************************************
  740. */
  741. int dct_4x4(Macroblock *currMB, ColorPlane pl, int block_x,int block_y, int *coeff_cost, int intra, int is_cavlc)
  742. {
  743.   int j;
  744.   int nonzero = FALSE;
  745.   int   pos_x   = block_x >> BLOCK_SHIFT;
  746.   int   pos_y   = block_y >> BLOCK_SHIFT;
  747.   int   b8      = 2*(pos_y >> 1) + (pos_x >> 1) + (pl<<2);
  748.   int   b4      = 2*(pos_y & 0x01) + (pos_x & 0x01);
  749.   int*  ACLevel = img->cofAC[b8][b4][0];
  750.   int*  ACRun   = img->cofAC[b8][b4][1];
  751.   imgpel **img_enc      = enc_picture->p_curr_img;
  752.   imgpel (*mb_pred)[MB_BLOCK_SIZE] = img->mb_pred[pl];
  753.   int    (*mb_ores)[MB_BLOCK_SIZE] = img->mb_ores[pl];
  754.   int    (*mb_rres)[MB_BLOCK_SIZE] = img->mb_rres[pl]; 
  755.   int   max_imgpel_value = img->max_imgpel_value;
  756.   int   qp = currMB->qp_scaled[pl]; 
  757.   const byte (*pos_scan)[2] = currMB->is_field_mode ? FIELD_SCAN : SNGL_SCAN;
  758.   int qp_rem = qp_rem_matrix[qp];
  759.   // select scaling parameters
  760.   levelscale    = LevelScale4x4Comp[pl][intra][qp_rem];
  761.   invlevelscale = InvLevelScale4x4Comp[pl][intra][qp_rem];
  762.   leveloffset   = ptLevelOffset4x4[intra][qp];
  763.   fadjust4x4    = img->AdaptiveRounding ? (pl ? &img->fadjust4x4Cr[pl-1][intra][block_y] : &img->fadjust4x4[intra][block_y]) : NULL;
  764.   img->subblock_x = ((b8&0x1)==0) ? (((b4&0x1)==0)? 0: 1) : (((b4&0x1)==0)? 2: 3); // horiz. position for coeff_count context
  765.   img->subblock_y = (b8<2)        ? ((b4<2)       ? 0: 1) : ((b4<2)       ? 2: 3); // vert.  position for coeff_count context
  766.   //  Forward 4x4 transform
  767.   forward4x4(mb_ores, M1, block_y, block_x);
  768.   // Quantization process
  769.   nonzero = quant_4x4(&M1[block_y], block_y, block_x, qp, ACLevel, ACRun, fadjust4x4, 
  770.     levelscale, invlevelscale, leveloffset, coeff_cost, pos_scan, COEFF_COST4x4[params->disthres], is_cavlc);
  771.   //  Decoded block moved to frame memory
  772.   if (nonzero)
  773.   {
  774.     // Inverse 4x4 transform
  775.     inverse4x4(M1, mb_rres, block_y, block_x);
  776.     // generate final block
  777.     SampleReconstruct (img_enc, mb_pred, mb_rres, block_y, block_x, img->pix_y, img->pix_x + block_x, BLOCK_SIZE, BLOCK_SIZE, max_imgpel_value, DQ_BITS);
  778.   }
  779.   else // if (nonzero) => No transformed residual. Just use prediction.
  780.   {
  781.     for (j=block_y; j < block_y + BLOCK_SIZE; j++)
  782.     {
  783.       memcpy(&(img_enc[img->pix_y + j][img->pix_x + block_x]),&(mb_pred[j][block_x]), BLOCK_SIZE * sizeof(imgpel));
  784.     }
  785.   }
  786.   return nonzero;
  787. }
  788. /*!
  789. ************************************************************************
  790. * brief
  791. *    Process for lossless coding of coefficients.
  792. *    The routine performs transform, quantization,inverse transform, 
  793. *    adds the diff to the prediction and writes the result to the 
  794. *    decoded luma frame. 
  795. *
  796. * par Input:
  797. *    currMB:          Current macroblock.
  798. *    pl:              Color plane for 4:4:4 coding.
  799. *    block_x,block_y: Block position inside a macro block (0,4,8,12).
  800. *    intra:           Intra block indicator.
  801. *
  802. * par Output_
  803. *    nonzero:         0 if no levels are nonzero. n
  804. *                     1 if there are nonzero levels.n
  805. *    coeff_cost:      Coeff coding cost for thresholding consideration.n
  806. ************************************************************************
  807. */
  808. int dct_4x4_ls(Macroblock *currMB, ColorPlane pl, int block_x,int block_y,int *coeff_cost, int intra, int is_cavlc)
  809. {
  810.   int i,j, coeff_ctr;
  811.   int run = -1;
  812.   int nonzero = FALSE;  
  813.   int   pos_x   = block_x >> BLOCK_SHIFT;
  814.   int   pos_y   = block_y >> BLOCK_SHIFT;
  815.   int   b8      = 2*(pos_y >> 1) + (pos_x >> 1) + (pl<<2);
  816.   int   b4      = 2*(pos_y & 0x01) + (pos_x & 0x01);
  817.   int*  ACL = &img->cofAC[b8][b4][0][0];
  818.   int*  ACR = &img->cofAC[b8][b4][1][0];
  819.   int   pix_y, pix_x;
  820.   imgpel **img_enc       = enc_picture->p_curr_img;
  821.   imgpel (*mb_pred)[MB_BLOCK_SIZE] = img->mb_pred[pl];
  822.   int    (*mb_ores)[MB_BLOCK_SIZE] = img->mb_ores[pl];
  823.   int    (*mb_rres)[MB_BLOCK_SIZE] = img->mb_rres[pl]; 
  824.   int   *m7;
  825.   const byte *p_scan = currMB->is_field_mode ? &FIELD_SCAN[0][0] : &SNGL_SCAN[0][0];
  826.   // select scaling parameters
  827.   fadjust4x4 = img->AdaptiveRounding ? &img->fadjust4x4[intra][block_y] : NULL;
  828.   if( (ipmode_DPCM < 2) && (intra))
  829.   {
  830.     Residual_DPCM_4x4(ipmode_DPCM, mb_ores, mb_rres, block_y, block_x);
  831.   }
  832.   for (coeff_ctr=0;coeff_ctr < 16;coeff_ctr++)
  833.   {
  834.     i = *p_scan++;
  835.     j = *p_scan++;
  836.     run++;
  837.     m7 = &mb_rres[j+block_y][i+block_x];    
  838.     if (img->AdaptiveRounding)
  839.       fadjust4x4[j][block_x+i] = 0;
  840.     if (*m7 != 0)
  841.     {
  842.       if (is_cavlc)
  843.         *m7 = iClip3(-CAVLC_LEVEL_LIMIT, CAVLC_LEVEL_LIMIT, *m7);
  844.       nonzero=TRUE;
  845.       *coeff_cost += MAX_VALUE;
  846.       *ACL++ = *m7;
  847.       *ACR++ = run;
  848.       run=-1;                     // reset zero level counter        
  849.     }
  850.   }
  851.   *ACL = 0;
  852.   if( (ipmode_DPCM < 2) && (intra))
  853.   {
  854.     Inv_Residual_DPCM_4x4(mb_rres, block_y, block_x);
  855.   }
  856.   for (j=0; j < BLOCK_SIZE; j++)
  857.   {
  858.     pix_y = img->pix_y + block_y + j;
  859.     pix_x = img->pix_x+block_x;
  860.     for (i=0; i < BLOCK_SIZE; i++)
  861.     {
  862.       img_enc[pix_y][pix_x+i] = mb_rres[j+block_y][i+block_x] + mb_pred[j+block_y][i+block_x];
  863.     }
  864.   }
  865.   return nonzero;
  866. }
  867. /*!
  868. ************************************************************************
  869. * brief
  870. *    Residual DPCM for Intra lossless coding
  871. *
  872. * par Input:
  873. *    block_x,block_y: Block position inside a macro block (0,4,8,12).
  874. ************************************************************************
  875. */
  876. static int Residual_DPCM_4x4(int ipmode, int mb_ores[16][16], int mb_rres[16][16], int block_y, int block_x)
  877. {
  878.   int i;
  879.   int temp[4][4];
  880.   if(ipmode==VERT_PRED)
  881.   {
  882.     temp[0][0] = mb_ores[block_y][block_x    ];
  883.     temp[0][1] = mb_ores[block_y][block_x + 1];
  884.     temp[0][2] = mb_ores[block_y][block_x + 2];
  885.     temp[0][3] = mb_ores[block_y][block_x + 3];
  886.     for (i=1; i<4; i++) 
  887.     {
  888.       temp[i][0] = mb_ores[block_y + i][block_x    ] - mb_ores[block_y + i - 1][block_x    ];
  889.       temp[i][1] = mb_ores[block_y + i][block_x + 1] - mb_ores[block_y + i - 1][block_x + 1];
  890.       temp[i][2] = mb_ores[block_y + i][block_x + 2] - mb_ores[block_y + i - 1][block_x + 2];
  891.       temp[i][3] = mb_ores[block_y + i][block_x + 3] - mb_ores[block_y + i - 1][block_x + 3];
  892.     }
  893.     for (i = 0; i < 4; i++)
  894.     {
  895.       mb_ores[block_y+i][block_x    ] = temp[i][0];
  896.       mb_ores[block_y+i][block_x + 1] = temp[i][1];
  897.       mb_ores[block_y+i][block_x + 2] = temp[i][2];
  898.       mb_ores[block_y+i][block_x + 3] = temp[i][3];
  899.     }
  900.   }
  901.   else  //HOR_PRED
  902.   {
  903.     temp[0][0] = mb_ores[block_y    ][block_x];
  904.     temp[1][0] = mb_ores[block_y + 1][block_x];
  905.     temp[2][0] = mb_ores[block_y + 2][block_x];
  906.     temp[3][0] = mb_ores[block_y + 3][block_x];
  907.     for (i=0; i<4; i++)
  908.     {
  909.       temp[i][1] = mb_ores[block_y + i][block_x + 1] - mb_ores[block_y + i][block_x    ];
  910.       temp[i][2] = mb_ores[block_y + i][block_x + 2] - mb_ores[block_y + i][block_x + 1];
  911.       temp[i][3] = mb_ores[block_y + i][block_x + 3] - mb_ores[block_y + i][block_x + 2];
  912.     }
  913.     for (i=0; i<4; i++)
  914.     {
  915.       mb_ores[block_y + i][block_x + 0] = temp[i][0];
  916.       mb_ores[block_y + i][block_x + 1] = temp[i][1];
  917.       mb_ores[block_y + i][block_x + 2] = temp[i][2];
  918.       mb_ores[block_y + i][block_x + 3] = temp[i][3];
  919.     }
  920.   }
  921.   return 0;
  922. }
  923. /*!
  924. ************************************************************************
  925. * brief
  926. *    Inverse residual DPCM for Intra lossless coding
  927. *
  928. * par Input:
  929. *    block_x,block_y: Block position inside a macro block (0,4,8,12).
  930. ************************************************************************
  931. */
  932. //For residual DPCM
  933. static int Inv_Residual_DPCM_4x4(int m7[16][16], int block_y, int block_x)  
  934. {
  935.   int i;
  936.   int temp[4][4];
  937.   if(ipmode_DPCM==VERT_PRED)
  938.   {
  939.     for(i=0; i<4; i++)
  940.     {
  941.       temp[0][i] = m7[block_y + 0][block_x + i];
  942.       temp[1][i] = temp[0][i] + m7[block_y + 1][block_x + i];
  943.       temp[2][i] = temp[1][i] + m7[block_y + 2][block_x + i];
  944.       temp[3][i] = temp[2][i] + m7[block_y + 3][block_x + i];
  945.     }
  946.     for(i=0; i<4; i++)
  947.     {      
  948.       m7[block_y + i][block_x    ] = temp[i][0];
  949.       m7[block_y + i][block_x + 1] = temp[i][1];
  950.       m7[block_y + i][block_x + 2] = temp[i][2];
  951.       m7[block_y + i][block_x + 3] = temp[i][3];
  952.     }
  953.   }
  954.   else //HOR_PRED
  955.   {
  956.     for(i=0; i<4; i++)
  957.     {
  958.       temp[i][0] = m7[block_y+i][block_x+0];
  959.       temp[i][1] = temp[i][0] + m7[block_y + i][block_x + 1];
  960.       temp[i][2] = temp[i][1] + m7[block_y + i][block_x + 2];
  961.       temp[i][3] = temp[i][2] + m7[block_y + i][block_x + 3];    
  962.     }
  963.     for(i=0; i<4; i++)
  964.     {
  965.       m7[block_y+i][block_x  ] = temp[i][0];
  966.       m7[block_y+i][block_x+1] = temp[i][1];
  967.       m7[block_y+i][block_x+2] = temp[i][2];
  968.       m7[block_y+i][block_x+3] = temp[i][3];
  969.     }
  970.   }
  971.   return 0;
  972. }
  973. /*!
  974. ************************************************************************
  975. * brief
  976. *    Residual DPCM for Intra lossless coding
  977. ************************************************************************
  978. */
  979. //For residual DPCM
  980. static int Residual_DPCM_4x4_for_Intra16x16(int m7[4][4], int ipmode)  
  981. {
  982.   int i,j;
  983.   int temp[4][4];
  984.   if(ipmode==VERT_PRED)
  985.   {   
  986.     for (i=1; i<4; i++) 
  987.       for (j=0; j<4; j++)
  988.         temp[i][j] = m7[i][j] - m7[i-1][j];
  989.     for (i=1; i<4; i++)
  990.       for (j=0; j<4; j++)
  991.         m7[i][j] = temp[i][j];
  992.   }
  993.   else  //HOR_PRED
  994.   {
  995.     for (i=0; i<4; i++)
  996.       for (j=1; j<4; j++)
  997.         temp[i][j] = m7[i][j] - m7[i][j-1];
  998.     for (i=0; i<4; i++)
  999.       for (j=1; j<4; j++)
  1000.         m7[i][j] = temp[i][j];
  1001.   }
  1002.   return 0;
  1003. }
  1004. /*!
  1005. ************************************************************************
  1006. * brief
  1007. *    Inverse residual DPCM for Intra lossless coding
  1008. ************************************************************************
  1009. */
  1010. //For residual DPCM
  1011. static int Inv_Residual_DPCM_4x4_for_Intra16x16(int m7[4][4], int ipmode)  
  1012. {
  1013.   int i;
  1014.   int temp[4][4];
  1015.   if(ipmode==VERT_PRED)
  1016.   {
  1017.     for (i=0; i<4; i++) 
  1018.     {
  1019.       temp[0][i] = m7[0][i];
  1020.       temp[1][i] = m7[1][i] + temp[0][i];
  1021.       temp[2][i] = m7[2][i] + temp[1][i];
  1022.       temp[3][i] = m7[3][i] + temp[2][i];
  1023.     }
  1024.     // These could now just use a memcpy
  1025.     for (i=0; i<4; i++)
  1026.     {
  1027.       m7[1][i] = temp[1][i];
  1028.       m7[2][i] = temp[2][i];
  1029.       m7[3][i] = temp[3][i];
  1030.     }
  1031.   }
  1032.   else  //HOR_PRED
  1033.   {
  1034.     for(i=0; i<4; i++)
  1035.     {
  1036.       temp[i][0] = m7[i][0];
  1037.       temp[i][1] = m7[i][1] + temp[i][0];
  1038.       temp[i][2] = m7[i][2] + temp[i][1];
  1039.       temp[i][3] = m7[i][3] + temp[i][2];
  1040.     }
  1041.     for (i=0; i<4; i++)
  1042.     {
  1043.       m7[i][1] = temp[i][1];
  1044.       m7[i][2] = temp[i][2];
  1045.       m7[i][3] = temp[i][3];
  1046.     }    
  1047.   }
  1048.   return 0;
  1049. }
  1050. /*!
  1051.  ************************************************************************
  1052.  * brief
  1053.  *    Transform,quantization,inverse transform for chroma.
  1054.  *    The main reason why this is done in a separate routine is the
  1055.  *    additional 2x2 transform of DC-coeffs. This routine is called
  1056.  *    once for each of the chroma components.
  1057.  *
  1058.  * par Input:
  1059.  *    uv    : Make difference between the U and V chroma component  n
  1060.  *    cr_cbp: chroma coded block pattern
  1061.  *
  1062.  * par Output:
  1063.  *    cr_cbp: Updated chroma coded block pattern.
  1064.  ************************************************************************
  1065.  */
  1066. int dct_chroma(Macroblock *currMB, int uv, int cr_cbp, int is_cavlc)
  1067. {
  1068.   int i, j, n2, n1, coeff_ctr;
  1069.   static int m1[BLOCK_SIZE];
  1070.   int coeff_cost = 0;
  1071.   int cr_cbp_tmp = 0;
  1072.   int DCzero = FALSE;
  1073.   int nonzero[4][4] = {{FALSE}};
  1074.   int nonezero = FALSE;
  1075.   const byte *c_cost = COEFF_COST4x4[params->disthres];
  1076.   int   b4;
  1077.   int*  DCLevel = img->cofDC[uv+1][0];
  1078.   int*  DCRun   = img->cofDC[uv+1][1];
  1079.   int*  ACLevel;
  1080.   int*  ACRun;
  1081.   int   intra = IS_INTRA (currMB);
  1082.   int   uv_scale = uv * (img->num_blk8x8_uv >> 1);
  1083.   //FRExt
  1084.   static const int64 cbpblk_pattern[4]={0, 0xf0000, 0xff0000, 0xffff0000};
  1085.   int yuv = img->yuv_format;
  1086.   int b8;  
  1087.   const byte (*pos_scan)[2] = currMB->is_field_mode ? FIELD_SCAN : SNGL_SCAN;
  1088.   int cur_qp = currMB->qpc[uv] + img->bitdepth_chroma_qp_scale;  
  1089.   int qp_rem = qp_rem_matrix[cur_qp];
  1090.   int max_imgpel_value_uv = img->max_imgpel_value_comp[uv + 1];
  1091.   int    (*mb_rres)[MB_BLOCK_SIZE] = img->mb_rres[uv + 1]; 
  1092.   int    (*mb_ores)[MB_BLOCK_SIZE] = img->mb_ores[uv + 1];
  1093.   imgpel (*mb_pred)[MB_BLOCK_SIZE] = img->mb_pred[uv + 1]; 
  1094.   levelscale    = LevelScale4x4Comp   [uv + 1][intra][qp_rem];
  1095.   leveloffset   = LevelOffset4x4Comp  [uv + 1][intra][cur_qp];
  1096.   invlevelscale = InvLevelScale4x4Comp[uv + 1][intra][qp_rem];
  1097.   fadjust4x4    = img->AdaptiveRounding ? img->fadjust4x4Cr[intra][uv] : NULL;
  1098.   img->is_v_block = uv;
  1099.   //============= dct transform ===============
  1100.   for (n2=0; n2 < img->mb_cr_size_y; n2 += BLOCK_SIZE)
  1101.   {
  1102.     for (n1=0; n1 < img->mb_cr_size_x; n1 += BLOCK_SIZE)
  1103.     {
  1104.       forward4x4(mb_ores, mb_rres, n2, n1);
  1105.     }
  1106.   }
  1107.   if (yuv == YUV420)
  1108.   {
  1109.     //================== CHROMA DC YUV420 ===================
  1110.   
  1111.     // forward 2x2 hadamard
  1112.     hadamard2x2(mb_rres, m1);
  1113.     // Quantization process of chroma 2X2 hadamard transformed DC coeffs.
  1114.     DCzero = quant_dc_cr(&m1, cur_qp, DCLevel, DCRun, fadjust2x2, levelscale[0][0], invlevelscale[0][0], leveloffset, SCAN_YUV420, is_cavlc);
  1115.     if (DCzero) 
  1116.     {
  1117.         currMB->cbp_blk |= 0xf0000 << (uv << 2) ;    // if one of the 2x2-DC levels is != 0 set the
  1118.         cr_cbp=imax(1,cr_cbp);                     // coded-bit all 4 4x4 blocks (bit 16-19 or 20-23)
  1119.     }
  1120.     //  Inverse transform of 2x2 DC levels
  1121.     ihadamard2x2(m1, m1);
  1122.     mb_rres[0][0] = m1[0] >> 5;
  1123.     mb_rres[0][4] = m1[1] >> 5;
  1124.     mb_rres[4][0] = m1[2] >> 5;
  1125.     mb_rres[4][4] = m1[3] >> 5;
  1126.   }
  1127.   else if (yuv == YUV422)
  1128.   {
  1129.     //for YUV422 only
  1130.     int cur_qp_dc = currMB->qpc[uv] + 3 + img->bitdepth_chroma_qp_scale;
  1131.     int qp_rem_dc = qp_rem_matrix[cur_qp_dc];
  1132.     invlevelscaleDC = InvLevelScale4x4Comp[uv + 1][intra][qp_rem_dc];
  1133.     levelscaleDC    = LevelScale4x4Comp   [uv + 1][intra][qp_rem_dc];
  1134.     leveloffsetDC   = LevelOffset4x4Comp  [uv + 1][intra][cur_qp_dc];
  1135.     //================== CHROMA DC YUV422 ===================
  1136.     //pick out DC coeff    
  1137.     for (j=0; j < img->mb_cr_size_y; j+=BLOCK_SIZE)
  1138.     {
  1139.       for (i=0; i < img->mb_cr_size_x; i+=BLOCK_SIZE)
  1140.         M4[i>>2][j>>2]= mb_rres[j][i];
  1141.     }
  1142.     // forward hadamard transform. Note that coeffs have been transposed (4x2 instead of 2x4) which makes transform a bit faster
  1143.     hadamard4x2(M4, M4);
  1144.     // Quantization process of chroma transformed DC coeffs.
  1145.     DCzero = quant_dc_cr(M4, cur_qp_dc, DCLevel, DCRun, fadjust4x2, levelscaleDC[0][0], invlevelscaleDC[0][0], leveloffsetDC, SCAN_YUV422, is_cavlc);
  1146.     if (DCzero)
  1147.     {
  1148.       currMB->cbp_blk |= 0xff0000 << (uv << 3) ;   // if one of the DC levels is != 0 set the
  1149.       cr_cbp=imax(1,cr_cbp);                       // coded-bit all 4 4x4 blocks (bit 16-31 or 32-47) //YUV444
  1150.     }
  1151.     //inverse DC transform. Note that now M4 is transposed back
  1152.     ihadamard4x2(M4, M4);    
  1153.     // This code assumes sizeof(int) > 16. Therefore, no need to have conditional
  1154.     for (j = 0; j < 4; j++)
  1155.     {
  1156.       mb_rres[j << 2 ][0] = rshift_rnd_sf(M4[j][0], 6);
  1157.       mb_rres[j << 2 ][4] = rshift_rnd_sf(M4[j][1], 6);
  1158.     }
  1159.   }
  1160.   //     Quant of chroma AC-coeffs.
  1161.   for (b8=0; b8 < (img->num_blk8x8_uv >> 1); b8++)
  1162.   {
  1163.     for (b4=0; b4 < 4; b4++)
  1164.     {
  1165.       int64 uv_cbpblk = ((int64)1) << cbp_blk_chroma[b8 + uv_scale][b4];      
  1166.       n1 = hor_offset[yuv][b8][b4];
  1167.       n2 = ver_offset[yuv][b8][b4];
  1168.       ACLevel = img->cofAC[4 + b8 + uv_scale][b4][0];
  1169.       ACRun   = img->cofAC[4 + b8 + uv_scale][b4][1];
  1170.       img->subblock_y = subblk_offset_y[img->yuv_format - 1][b8][b4]>>2;
  1171.       img->subblock_x = subblk_offset_x[img->yuv_format - 1][b8][b4]>>2;
  1172.       // Quantization process
  1173.       nonzero[n2>>2][n1>>2] = quant_ac4x4cr(&mb_rres[n2], n2, n1, cur_qp, ACLevel, ACRun, &fadjust4x4[n2], 
  1174.         levelscale, invlevelscale, leveloffset, &coeff_cost, pos_scan, c_cost, CHROMA_AC, is_cavlc);
  1175.       if (nonzero[n2>>2][n1>>2])
  1176.       {
  1177.         currMB->cbp_blk |= uv_cbpblk;
  1178.         cr_cbp_tmp = 2;
  1179.         nonezero = TRUE;
  1180.       }
  1181.     }
  1182.   }
  1183.   // Perform thresholding
  1184.   // * reset chroma coeffs
  1185.   if(nonezero && coeff_cost < _CHROMA_COEFF_COST_)
  1186.   {
  1187.     int64 uv_cbpblk = ((int64)cbpblk_pattern[yuv] << (uv << (1+yuv)));
  1188.     cr_cbp_tmp = 0;
  1189.     for (b8 = 0; b8 < (img->num_blk8x8_uv >> 1); b8++)
  1190.     {
  1191.       for (b4 = 0; b4 < 4; b4++)
  1192.       {
  1193.         n1 = hor_offset[yuv][b8][b4];
  1194.         n2 = ver_offset[yuv][b8][b4];
  1195.         if (nonzero[n2>>2][n1>>2] == TRUE)
  1196.         {
  1197.           nonzero[n2>>2][n1>>2] = FALSE;
  1198.           ACLevel = img->cofAC[4 + b8 + uv_scale][b4][0];
  1199.           ACRun   = img->cofAC[4 + b8 + uv_scale][b4][1];
  1200.           if (DCzero == 0)
  1201.             currMB->cbp_blk &= ~(uv_cbpblk);  // if no chroma DC's: then reset coded-bits of this chroma subblock
  1202.           ACLevel[0] = 0;
  1203.           for (coeff_ctr=1; coeff_ctr < 16; coeff_ctr++)// ac coeff
  1204.           {
  1205.             mb_rres[n2 + pos_scan[coeff_ctr][1]][n1 + pos_scan[coeff_ctr][0]] = 0;
  1206.             ACLevel[coeff_ctr]  = 0;
  1207.           }
  1208.         }
  1209.       }
  1210.     }
  1211.   }
  1212.   //     IDCT.
  1213.   //     Horizontal.
  1214.   if(cr_cbp_tmp == 2)
  1215.     cr_cbp = 2;
  1216.   nonezero = FALSE;
  1217.   for (n2=0; n2 < img->mb_cr_size_y; n2 += BLOCK_SIZE)
  1218.   {
  1219.     for (n1=0; n1 < img->mb_cr_size_x; n1 += BLOCK_SIZE)
  1220.     {
  1221.       if (mb_rres[n2][n1] != 0 || nonzero[n2>>2][n1>>2] == TRUE)
  1222.       {
  1223.         inverse4x4(mb_rres, mb_rres, n2, n1);
  1224.         nonezero = TRUE;
  1225.       }
  1226.     }
  1227.   }
  1228.   //  Decoded block moved to memory
  1229.   if (nonezero == TRUE)
  1230.   {
  1231.     SampleReconstruct (enc_picture->imgUV[uv], mb_pred, mb_rres, 0, 0, img->pix_c_y, img->pix_c_x, img->mb_cr_size_x, img->mb_cr_size_y, max_imgpel_value_uv, DQ_BITS);
  1232.   }
  1233.   else
  1234.   {
  1235.     for (j=0; j < img->mb_cr_size_y; j++)
  1236.     {
  1237.       memcpy(&enc_picture->imgUV[uv][img->pix_c_y + j][img->pix_c_x], mb_pred[j], img->mb_cr_size_x * sizeof(imgpel));
  1238.     }
  1239.   }
  1240.   return cr_cbp;
  1241. }
  1242. /*!
  1243.  ************************************************************************
  1244.  * brief
  1245.  *    Transform,quantization,inverse transform for chroma.
  1246.  *    The main reason why this is done in a separate routine is the
  1247.  *    additional 2x2 transform of DC-coeffs. This routine is called
  1248.  *    once for each of the chroma components.
  1249.  *
  1250.  * par Input:
  1251.  *    uv    : Make difference between the U and V chroma component  n
  1252.  *    cr_cbp: chroma coded block pattern
  1253.  *
  1254.  * par Output:
  1255.  *    cr_cbp: Updated chroma coded block pattern.
  1256.  ************************************************************************
  1257.  */
  1258. int dct_chroma_ls(Macroblock *currMB, int uv, int cr_cbp, int is_cavlc)
  1259. {
  1260.   int i,j,n2,n1,coeff_ctr,level ,scan_pos,run;
  1261.   static int m1[BLOCK_SIZE];
  1262.   int coeff_cost;
  1263.   int cr_cbp_tmp;
  1264.   int nonzero = FALSE;
  1265.   static imgpel *orig_img, *pred_img;
  1266.   int   b4;
  1267.   int*  DCLevel = img->cofDC[uv+1][0];
  1268.   int*  DCRun   = img->cofDC[uv+1][1];
  1269.   int*  ACLevel;
  1270.   int*  ACRun;
  1271.   int   intra = IS_INTRA (currMB);
  1272.   int   uv_scale = uv * (img->num_blk8x8_uv >> 1);
  1273.   //FRExt
  1274.   int yuv = img->yuv_format;
  1275.   int b8;
  1276.   static int *m7;
  1277.   static int m3[4][4];
  1278.   const byte (*pos_scan)[2] = currMB->is_field_mode ? FIELD_SCAN : SNGL_SCAN;
  1279.   int    (*mb_rres)[MB_BLOCK_SIZE] = img->mb_rres[uv + 1]; 
  1280.   int    (*mb_ores)[MB_BLOCK_SIZE] = img->mb_ores[uv + 1];
  1281.   imgpel (*mb_pred)[MB_BLOCK_SIZE] = img->mb_pred[uv + 1]; 
  1282.   fadjust4x4    = img->AdaptiveRounding ? img->fadjust4x4Cr[intra][uv] : NULL;
  1283.   if (yuv == YUV420)
  1284.   {
  1285.     //================== CHROMA DC YUV420 ===================
  1286.     //     2X2 transform of DC coeffs.
  1287.     run=-1;
  1288.     scan_pos=0;    
  1289.     m1[0] = mb_rres[0][0] = mb_ores[0][0];
  1290.     m1[1] = mb_rres[0][4] = mb_ores[0][4];
  1291.     m1[2] = mb_rres[4][0] = mb_ores[4][0];
  1292.     m1[3] = mb_rres[4][4] = mb_ores[4][4];
  1293.     for (coeff_ctr=0; coeff_ctr < 4; coeff_ctr++)
  1294.     {
  1295.       run++;
  1296.       level =iabs(m1[coeff_ctr]);
  1297.       if (level  != 0)
  1298.       {
  1299.         if (is_cavlc)
  1300.           level = imin(level, CAVLC_LEVEL_LIMIT);
  1301.         currMB->cbp_blk |= 0xf0000 << (uv << 2) ;    // if one of the 2x2-DC levels is != 0 set the
  1302.         cr_cbp=imax(1, cr_cbp);                     // coded-bit all 4 4x4 blocks (bit 16-19 or 20-23)
  1303.         nonzero = TRUE;
  1304.         level = isignab(level, m1[coeff_ctr]);
  1305.         DCLevel[scan_pos  ] = level;
  1306.         DCRun  [scan_pos++] = run;
  1307.         run=-1;
  1308.       }
  1309.     }
  1310.     DCLevel[scan_pos] = 0;    
  1311.   }
  1312.   else if(yuv == YUV422)
  1313.   {
  1314.     //================== CHROMA DC YUV422 ===================
  1315.     //transform DC coeff
  1316.     //horizontal
  1317.     //pick out DC coeff
  1318.     for (j=0; j < img->mb_cr_size_y; j+=BLOCK_SIZE)
  1319.     {
  1320.       for (i=0; i < img->mb_cr_size_x; i+=BLOCK_SIZE)
  1321.       {
  1322.         m3[i>>2][j>>2] = mb_ores[j][i];
  1323.         mb_rres[j][i]  = mb_ores[j][i];
  1324.       }
  1325.     }
  1326.     run=-1;
  1327.     scan_pos=0;
  1328.     //quant of chroma DC-coeffs
  1329.     for (coeff_ctr=0;coeff_ctr<8;coeff_ctr++)
  1330.     {
  1331.       i=SCAN_YUV422[coeff_ctr][0];
  1332.       j=SCAN_YUV422[coeff_ctr][1];
  1333.       run++;
  1334.       level = iabs(m3[i][j]);
  1335.       M4[i][j]=m3[i][j];
  1336.       if (level != 0)
  1337.       {
  1338.         //YUV422
  1339.         currMB->cbp_blk |= 0xff0000 << (uv << 3) ;   // if one of the DC levels is != 0 set the
  1340.         cr_cbp=imax(1,cr_cbp);                       // coded-bit all 4 4x4 blocks (bit 16-31 or 32-47) //YUV444
  1341.         nonzero = TRUE;
  1342.         DCLevel[scan_pos  ] = isignab(level,M4[i][j]);
  1343.         DCRun  [scan_pos++] = run;
  1344.         run=-1;
  1345.       }
  1346.     }
  1347.     DCLevel[scan_pos]=0;
  1348.     //inverse DC transform
  1349.     //horizontal    
  1350.   }
  1351.   //     Quant of chroma AC-coeffs.
  1352.   coeff_cost=0;
  1353.   cr_cbp_tmp=0;
  1354.   for (b8=0; b8 < (img->num_blk8x8_uv >> 1); b8++)
  1355.   {
  1356.     for (b4=0; b4 < 4; b4++)
  1357.     {
  1358.       int64 uv_cbpblk = ((int64)1) << cbp_blk_chroma[b8 + uv_scale][b4];
  1359.       n1 = hor_offset[yuv][b8][b4];
  1360.       n2 = ver_offset[yuv][b8][b4];
  1361.       ACLevel = img->cofAC[4 + b8 + uv_scale][b4][0];
  1362.       ACRun   = img->cofAC[4 + b8 + uv_scale][b4][1];
  1363.       run=-1;
  1364.       scan_pos=0;
  1365.       for (coeff_ctr=1; coeff_ctr < 16; coeff_ctr++)// start change rd_quant
  1366.       {
  1367.         i=pos_scan[coeff_ctr][0];
  1368.         j=pos_scan[coeff_ctr][1];
  1369.         ++run;
  1370.         level = iabs(mb_ores[n2+j][n1+i]);
  1371.         mb_rres[n2+j][n1+i] = mb_ores[n2+j][n1+i];
  1372.         if (img->AdaptiveRounding)
  1373.         {
  1374.           fadjust4x4[n2+j][n1+i] = 0;
  1375.         }
  1376.         if (level  != 0)
  1377.         {
  1378.           currMB->cbp_blk |= uv_cbpblk;
  1379.           coeff_cost += MAX_VALUE;                // set high cost, shall not be discarded
  1380.           cr_cbp_tmp=2;
  1381.           ACLevel[scan_pos  ] = isignab(level, mb_ores[n2+j][n1+i]);
  1382.           ACRun  [scan_pos++] = run;
  1383.           run=-1;
  1384.           level = isignab(level, mb_ores[n2+j][n1+i]);          
  1385.         }
  1386.       }
  1387.       ACLevel[scan_pos] = 0;
  1388.     }
  1389.   }
  1390.   for (j=0; j < img->mb_cr_size_y; j++)
  1391.   {      
  1392.     orig_img = &enc_picture->imgUV[uv][img->pix_c_y + j][img->pix_c_x];
  1393.     m7 = mb_rres[j];
  1394.     pred_img = mb_pred[j];
  1395.     for (i=0; i < img->mb_cr_size_x; i++)
  1396.     {        
  1397.       orig_img[i] = (imgpel) m7[i] + pred_img[i];
  1398.     }
  1399.   }  
  1400.   return cr_cbp;
  1401. }
  1402. /*!
  1403.  ************************************************************************
  1404.  * brief
  1405.  *    The routine performs transform,quantization,inverse transform, adds the diff.
  1406.  *    to the prediction and writes the result to the decoded luma frame. Includes the
  1407.  *    RD constrained quantization also.
  1408.  *
  1409.  * par Input:
  1410.  *    block_x,block_y: Block position inside a macro block (0,4,8,12).
  1411.  *
  1412.  * par Output:
  1413.  *    nonzero: 0 if no levels are nonzero.  1 if there are nonzero levels.              n
  1414.  *    coeff_cost: Counter for nonzero coefficients, used to discard expensive levels.
  1415.  *
  1416.  *
  1417.  ************************************************************************
  1418.  */
  1419. int dct_4x4_sp(Macroblock *currMB, ColorPlane pl, int block_x,int block_y,int *coeff_cost, int intra, int is_cavlc)
  1420. {
  1421.   int i,j,coeff_ctr;
  1422.   int qp_const,ilev, level,scan_pos = 0,run = -1;
  1423.   int nonzero = FALSE;
  1424.   imgpel **img_enc = enc_picture->p_curr_img;
  1425.   imgpel (*mb_pred)[MB_BLOCK_SIZE] = img->mb_pred[pl];
  1426.   int    (*mb_rres)[MB_BLOCK_SIZE] = img->mb_rres[pl]; 
  1427.   int    (*mb_ores)[MB_BLOCK_SIZE] = img->mb_ores[pl];
  1428.   int c_err,qp_const2;
  1429.   int   qp = currMB->qp_scaled[pl]; 
  1430.   int   qp_sp = (currMB->qpsp);
  1431.   const byte *c_cost = COEFF_COST4x4[params->disthres];
  1432.   const byte (*pos_scan)[2] = currMB->is_field_mode ? FIELD_SCAN : SNGL_SCAN;
  1433.   int   pos_x   = block_x >> BLOCK_SHIFT;
  1434.   int   pos_y   = block_y >> BLOCK_SHIFT;
  1435.   int   b8      = 2*(pos_y >> 1) + (pos_x >> 1);
  1436.   int   b4      = 2*(pos_y & 0x01) + (pos_x & 0x01);
  1437.   int*  ACLevel = img->cofAC[b8][b4][0];
  1438.   int*  ACRun   = img->cofAC[b8][b4][1];
  1439.   // For encoding optimization
  1440.   int c_err1, c_err2, level1, level2;
  1441.   double D_dis1, D_dis2;
  1442.   int len, info;
  1443.   double lambda_mode   = 0.85 * pow (2, (qp - SHIFT_QP)/3.0) * 4;
  1444.   int qp_per    = qp_per_matrix[qp];
  1445.   int qp_rem    = qp_rem_matrix[qp];
  1446.   int q_bits    = Q_BITS + qp_per;
  1447.   int qp_per_sp = qp_per_matrix[qp_sp];
  1448.   int qp_rem_sp = qp_rem_matrix[qp_sp];
  1449.   int q_bits_sp = Q_BITS + qp_per_sp;
  1450.   levelscale    = LevelScale4x4Comp[pl][intra][qp_rem];
  1451.   invlevelscale = InvLevelScale4x4Comp[pl][intra][qp_rem];
  1452.   leveloffset   = ptLevelOffset4x4[intra][qp];
  1453.   levelscale_sp    = LevelScale4x4Comp[pl][intra][qp_rem_sp];
  1454.   invlevelscale_sp = InvLevelScale4x4Comp[pl][intra][qp_rem_sp];
  1455.   leveloffset_sp   = ptLevelOffset4x4[intra][qp_sp];
  1456.   qp_const  = (1<<q_bits)/6;    // inter
  1457.   qp_const2 = (1<<q_bits_sp)/2;  //sp_pred
  1458.   //  Horizontal transform
  1459.   for (j=block_y; j< block_x + BLOCK_SIZE; j++)
  1460.   {
  1461.     for (i=block_x; i< block_x + BLOCK_SIZE; i++)
  1462.     { 
  1463.       mb_rres[j][i] = mb_ores[j][i];
  1464.       mb_rres[j][i]+=mb_pred[j][i];
  1465.       M1[j][i] = mb_pred[j][i];
  1466.     }
  1467.   }
  1468.   // 4x4 transform
  1469.   forward4x4(mb_rres, mb_rres, block_y, block_x);
  1470.   forward4x4(M1, M1, block_y, block_x);
  1471.   for (coeff_ctr = 0;coeff_ctr < 16;coeff_ctr++)     
  1472.   {
  1473.     i = pos_scan[coeff_ctr][0];
  1474.     j = pos_scan[coeff_ctr][1];
  1475.     run++;
  1476.     ilev=0;
  1477.     // decide prediction
  1478.     // case 1
  1479.     level1 = (iabs (M1[j][i]) * levelscale_sp[j][i] + qp_const2) >> q_bits_sp;
  1480.     level1 = (level1 << q_bits_sp) / levelscale_sp[j][i];
  1481.     c_err1 = mb_rres[j][i] - isignab(level1, M1[j][i]);
  1482.     level1 = (iabs (c_err1) * levelscale[j][i] + qp_const) >> q_bits;
  1483.     // case 2
  1484.     c_err2 = mb_rres[j][i] - M1[j][i];
  1485.     level2 = (iabs (c_err2) * levelscale[j][i] + qp_const) >> q_bits;
  1486.     // select prediction
  1487.     if ((level1 != level2) && (level1 != 0) && (level2 != 0))
  1488.     {
  1489.       D_dis1 = mb_rres[j][i] - ((isignab(level1,c_err1) * invlevelscale[j][i] * A[j][i]<< qp_per) >>6) - M1[j][i];
  1490.       levrun_linfo_inter(level1, run, &len, &info);
  1491.       D_dis1 = D_dis1 * D_dis1 + lambda_mode * len;
  1492.       D_dis2 = mb_rres[j][i] - ((isignab(level2,c_err2)*invlevelscale[j][i] * A[j][i]<< qp_per) >>6) - M1[j][i];
  1493.       levrun_linfo_inter(level2, run, &len, &info);
  1494.       D_dis2 = D_dis2 * D_dis2 + lambda_mode * len;
  1495.       if (D_dis1 == D_dis2)
  1496.         level = (iabs(level1) < iabs(level2)) ? level1 : level2;
  1497.       else if (D_dis1 < D_dis2)
  1498.         level = level1;
  1499.       else
  1500.         level = level2;
  1501.       c_err = (level == level1) ? c_err1 : c_err2;
  1502.     }
  1503.     else if (level1 == level2)
  1504.     {
  1505.       level = level1;
  1506.       c_err = c_err1;
  1507.     }
  1508.     else
  1509.     {
  1510.       level = (level1 == 0) ? level1 : level2;
  1511.       c_err = (level1 == 0) ? c_err1 : c_err2;
  1512.     }
  1513.     if (level != 0)
  1514.     {
  1515.       nonzero = TRUE;
  1516.       *coeff_cost += (level > 1) ? MAX_VALUE : c_cost[run];
  1517.       level = isignab(level,c_err);
  1518.       ACLevel[scan_pos] = level;
  1519.       ACRun  [scan_pos] = run;
  1520.       ++scan_pos;
  1521.       run=-1;                     // reset zero level counter
  1522.       ilev=((level * invlevelscale[j][i] * A[j][i] << qp_per) >>6);
  1523.     }
  1524.     ilev += M1[j][i];
  1525.     if(!si_frame_indicator && !sp2_frame_indicator)//stores the SP frame coefficients in lrec, will be useful to encode these and create SI or SP switching frame
  1526.     {
  1527.       lrec[img->pix_y+block_y+j][img->pix_x+block_x+i]=
  1528.         isignab((iabs(ilev) * levelscale_sp[j][i] + qp_const2) >> q_bits_sp, ilev);
  1529.     }    
  1530.     mb_rres[j][i] = isignab((iabs(ilev) * levelscale_sp[j][i] + qp_const2)>> q_bits_sp, ilev) * invlevelscale_sp[j][i] << qp_per_sp;
  1531.   }
  1532.   ACLevel[scan_pos] = 0;
  1533.   // inverse transform
  1534.   // inverse4x4(mb_rres, mb_rres, block_y, block_x);
  1535.   inverse4x4(M1, mb_rres, 0, 0);
  1536.   for (j=0; j < BLOCK_SIZE; j++)
  1537.     for (i=0; i < BLOCK_SIZE; i++)
  1538.     {
  1539.       //printf("%d ",mb_rres[j][i]);
  1540.       mb_rres[j][i] = iClip1 (img->max_imgpel_value, rshift_rnd_sf(mb_rres[j][i], DQ_BITS));
  1541.        //printf("%dn",mb_rres[j][i]);
  1542.     }
  1543.   //  Decoded block moved to frame memory
  1544.   for (j=0; j < BLOCK_SIZE; j++)
  1545.   {
  1546.     for (i=0; i < BLOCK_SIZE; i++)
  1547.     {
  1548.       img_enc[img->pix_y+block_y+j][img->pix_x+block_x+i]= (imgpel) mb_rres[j][i];
  1549.   //printf("%dn",mb_rres[j][i]);
  1550.     }
  1551.   }
  1552.   return nonzero;
  1553. }
  1554. /*!
  1555.  ************************************************************************
  1556.  * brief
  1557.  *    Transform,quantization,inverse transform for chroma.
  1558.  *    The main reason why this is done in a separate routine is the
  1559.  *    additional 2x2 transform of DC-coeffs. This routine is called
  1560.  *    once for each of the chroma components.
  1561.  *
  1562.  * par Input:
  1563.  *    uv    : Make difference between the U and V chroma component               n
  1564.  *    cr_cbp: chroma coded block pattern
  1565.  *
  1566.  * par Output:
  1567.  *    cr_cbp: Updated chroma coded block pattern.
  1568.  ************************************************************************
  1569.  */
  1570. int dct_chroma_sp(Macroblock *currMB, int uv,int cr_cbp, int is_cavlc)
  1571. {
  1572.   int i, j, n2, n1, coeff_ctr;
  1573.   static int m1[BLOCK_SIZE];
  1574.   int coeff_cost = 0;
  1575.   int cr_cbp_tmp = 0;
  1576.   int DCzero = FALSE;
  1577.   int nonzero[4][4] = {{FALSE}};
  1578.   int nonezero = FALSE;
  1579.   const byte *c_cost = COEFF_COST4x4[params->disthres];
  1580.   int   b4;
  1581.   int*  DCLevel = img->cofDC[uv+1][0];
  1582.   int*  DCRun   = img->cofDC[uv+1][1];
  1583.   int*  ACLevel;
  1584.   int*  ACRun;
  1585.   int   intra = IS_INTRA (currMB);
  1586.   int   uv_scale = uv * (img->num_blk8x8_uv >> 1);
  1587.   //FRExt
  1588.   static const int64 cbpblk_pattern[4]={0, 0xf0000, 0xff0000, 0xffff0000};
  1589.   int yuv = img->yuv_format;
  1590.   int b8;  
  1591.   const byte (*pos_scan)[2] = currMB->is_field_mode ? FIELD_SCAN : SNGL_SCAN;
  1592.   int cur_qp = currMB->qpc[uv] + img->bitdepth_chroma_qp_scale;  
  1593.   int qp_rem = qp_rem_matrix[cur_qp];
  1594.   int max_imgpel_value_uv = img->max_imgpel_value_comp[uv + 1];
  1595.   int    (*mb_rres)[MB_BLOCK_SIZE] = img->mb_rres[uv + 1]; 
  1596.   int    (*mb_ores)[MB_BLOCK_SIZE] = img->mb_ores[uv + 1]; 
  1597.   imgpel (*mb_pred)[MB_BLOCK_SIZE] = img->mb_pred[uv + 1]; 
  1598.   levelscale    = LevelScale4x4Comp   [uv + 1][intra][qp_rem];
  1599.   leveloffset   = LevelOffset4x4Comp  [uv + 1][intra][cur_qp];
  1600.   invlevelscale = InvLevelScale4x4Comp[uv + 1][intra][qp_rem];
  1601.   fadjust4x4    = img->AdaptiveRounding ? img->fadjust4x4Cr[intra][uv] : NULL;
  1602.   //============= dct transform ===============
  1603.   for (n2=0; n2 < img->mb_cr_size_y; n2 += BLOCK_SIZE)
  1604.   {
  1605.     for (n1=0; n1 < img->mb_cr_size_x; n1 += BLOCK_SIZE)
  1606.     {
  1607.       forward4x4(mb_ores, mb_rres, n2, n1);
  1608.     }
  1609.   }
  1610.   if (yuv == YUV420)
  1611.   {
  1612.     //================== CHROMA DC YUV420 ===================
  1613.   
  1614.     // forward 2x2 hadamard
  1615.     hadamard2x2(mb_rres, m1);
  1616.     // Quantization process of chroma 2X2 hadamard transformed DC coeffs.
  1617.     DCzero = quant_dc_cr(&m1, cur_qp, DCLevel, DCRun, fadjust2x2, levelscale[0][0], invlevelscale[0][0], leveloffset, pos_scan, is_cavlc);
  1618.     if (DCzero) 
  1619.     {
  1620.         currMB->cbp_blk |= 0xf0000 << (uv << 2) ;    // if one of the 2x2-DC levels is != 0 set the
  1621.         cr_cbp=imax(1,cr_cbp);                     // coded-bit all 4 4x4 blocks (bit 16-19 or 20-23)
  1622.     }
  1623.     //  Inverse transform of 2x2 DC levels
  1624.     ihadamard2x2(m1, m1);
  1625.     mb_rres[0][0] = m1[0];
  1626.     mb_rres[0][4] = m1[1];
  1627.     mb_rres[4][0] = m1[2];
  1628.     mb_rres[4][4] = m1[3];
  1629.   }
  1630.   else if (yuv == YUV422)
  1631.   {
  1632.     //for YUV422 only
  1633.     int cur_qp_dc = currMB->qpc[uv] + 3 + img->bitdepth_chroma_qp_scale;
  1634.     int qp_rem_dc = qp_rem_matrix[cur_qp_dc];
  1635.     invlevelscaleDC = InvLevelScale4x4Comp[uv + 1][intra][qp_rem_dc];
  1636.     levelscaleDC    = LevelScale4x4Comp   [uv + 1][intra][qp_rem_dc];
  1637.     leveloffsetDC   = LevelOffset4x4Comp  [uv + 1][intra][cur_qp_dc];
  1638.     //================== CHROMA DC YUV422 ===================
  1639.     //pick out DC coeff    
  1640.     for (j=0; j < img->mb_cr_size_y; j+=BLOCK_SIZE)
  1641.     {
  1642.       for (i=0; i < img->mb_cr_size_x; i+=BLOCK_SIZE)
  1643.         M4[i>>2][j>>2]= mb_rres[j][i];
  1644.     }
  1645.     // forward hadamard transform. Note that coeffs have been transposed (4x2 instead of 2x4) which makes transform a bit faster
  1646.     hadamard4x2(M4, M4);
  1647.     // Quantization process of chroma transformed DC coeffs.
  1648.     DCzero = quant_dc_cr(M4, cur_qp_dc, DCLevel, DCRun, fadjust4x2, levelscaleDC[0][0], invlevelscaleDC[0][0], leveloffsetDC, SCAN_YUV422, is_cavlc);
  1649.     if (DCzero)
  1650.     {
  1651.       currMB->cbp_blk |= 0xff0000 << (uv << 3) ;   // if one of the DC levels is != 0 set the
  1652.       cr_cbp=imax(1,cr_cbp);                       // coded-bit all 4 4x4 blocks (bit 16-31 or 32-47) //YUV444
  1653.     }
  1654.     //inverse DC transform. Note that now M4 is transposed back
  1655.     ihadamard4x2(M4, M4);    
  1656.     // This code assumes sizeof(int) > 16. Therefore, no need to have conditional
  1657.     for (j = 0; j < 4; j++)
  1658.     {
  1659.       mb_rres[j << 2 ][0] = M4[j][0];
  1660.       mb_rres[j << 2 ][4] = M4[j][1];
  1661.     }
  1662.   }
  1663.   //     Quant of chroma AC-coeffs.
  1664.   for (b8=0; b8 < (img->num_blk8x8_uv >> 1); b8++)
  1665.   {
  1666.     for (b4=0; b4 < 4; b4++)
  1667.     {
  1668.       int64 uv_cbpblk = ((int64)1) << cbp_blk_chroma[b8 + uv_scale][b4];      
  1669.       n1 = hor_offset[yuv][b8][b4];
  1670.       n2 = ver_offset[yuv][b8][b4];
  1671.       ACLevel = img->cofAC[4 + b8 + uv_scale][b4][0];
  1672.       ACRun   = img->cofAC[4 + b8 + uv_scale][b4][1];
  1673.       // Quantization process
  1674.       nonzero[n2>>2][n1>>2] = quant_ac4x4cr(&mb_rres[n2], n2, n1, cur_qp, ACLevel, ACRun, &fadjust4x4[n2], 
  1675.         levelscale, invlevelscale, leveloffset, &coeff_cost, pos_scan, c_cost, CHROMA_AC, is_cavlc);
  1676.       if (nonzero[n2>>2][n1>>2])
  1677.       {
  1678.         currMB->cbp_blk |= uv_cbpblk;
  1679.         cr_cbp_tmp = 2;
  1680.         nonezero = TRUE;
  1681.       }
  1682.     }
  1683.   }
  1684.   // Perform thresholding
  1685.   // * reset chroma coeffs
  1686.   if(nonezero && coeff_cost < _CHROMA_COEFF_COST_)
  1687.   {
  1688.     int64 uv_cbpblk = ((int64)cbpblk_pattern[yuv] << (uv << (1+yuv)));
  1689.     cr_cbp_tmp = 0;
  1690.     for (b8 = 0; b8 < (img->num_blk8x8_uv >> 1); b8++)
  1691.     {
  1692.       for (b4 = 0; b4 < 4; b4++)
  1693.       {
  1694.         n1 = hor_offset[yuv][b8][b4];
  1695.         n2 = ver_offset[yuv][b8][b4];
  1696.         if (nonzero[n2>>2][n1>>2] == TRUE)
  1697.         {
  1698.           nonzero[n2>>2][n1>>2] = FALSE;
  1699.           ACLevel = img->cofAC[4 + b8 + uv_scale][b4][0];
  1700.           ACRun   = img->cofAC[4 + b8 + uv_scale][b4][1];
  1701.           if (DCzero == 0)
  1702.             currMB->cbp_blk &= ~(uv_cbpblk);  // if no chroma DC's: then reset coded-bits of this chroma subblock
  1703.           ACLevel[0] = 0;
  1704.           for (coeff_ctr=1; coeff_ctr < 16; coeff_ctr++)// ac coeff
  1705.           {
  1706.             mb_rres[n2 + pos_scan[coeff_ctr][1]][n1 + pos_scan[coeff_ctr][0]] = 0;
  1707.             ACLevel[coeff_ctr]  = 0;
  1708.           }
  1709.         }
  1710.       }
  1711.     }
  1712.   }
  1713.   //     IDCT.
  1714.   //     Horizontal.
  1715.   if(cr_cbp_tmp == 2)
  1716.     cr_cbp = 2;
  1717.   nonezero = FALSE;
  1718.   for (n2=0; n2 < img->mb_cr_size_y; n2 += BLOCK_SIZE)
  1719.   {
  1720.     for (n1=0; n1 < img->mb_cr_size_x; n1 += BLOCK_SIZE)
  1721.     {
  1722.       if (mb_rres[n2][n1] != 0 || nonzero[n2>>2][n1>>2] == TRUE)
  1723.       {
  1724.         inverse4x4(mb_rres, mb_rres, n2, n1);
  1725.         nonezero = TRUE;
  1726.       }
  1727.     }
  1728.   }
  1729.   //  Decoded block moved to memory
  1730.   if (nonezero == TRUE)
  1731.   {
  1732.     SampleReconstruct (enc_picture->imgUV[uv], mb_pred, mb_rres, 0, 0, img->pix_c_y, img->pix_c_x, img->mb_cr_size_x, img->mb_cr_size_y, max_imgpel_value_uv, DQ_BITS);
  1733.   }
  1734.   else
  1735.   {
  1736.     for (j=0; j < img->mb_cr_size_y; j++)
  1737.     {
  1738.       memcpy(&enc_picture->imgUV[uv][img->pix_c_y + j][img->pix_c_x], mb_pred[j], img->mb_cr_size_x * sizeof(imgpel));
  1739.     }
  1740.   }
  1741.   return cr_cbp;
  1742. }
  1743. int dct_chroma_sp_old(Macroblock *currMB, int uv,int cr_cbp, int is_cavlc)
  1744. {
  1745.   int i,j,ilev,n2,n1,coeff_ctr,c_err,level ,scan_pos,run;
  1746.   int m1[BLOCK_SIZE];
  1747.   int coeff_cost;
  1748.   int cr_cbp_tmp;
  1749.   int mp1[BLOCK_SIZE];
  1750.   const byte *c_cost = COEFF_COST4x4[params->disthres];
  1751.   const byte (*pos_scan)[2] = currMB->is_field_mode ? FIELD_SCAN : SNGL_SCAN;
  1752.   int   intra = IS_INTRA (currMB);
  1753.   int   b4;
  1754.   int*  DCLevel = img->cofDC[uv+1][0];
  1755.   int*  DCRun   = img->cofDC[uv+1][1];
  1756.   int*  ACLevel;
  1757.   int*  ACRun;
  1758.   int c_err1, c_err2, level1, level2;
  1759.   int len, info;
  1760.   double D_dis1, D_dis2;
  1761.   double lambda_mode   = 0.85 * pow (2, (currMB->qp -SHIFT_QP)/3.0) * 4;
  1762.   int max_imgpel_value_uv = img->max_imgpel_value_comp[1];
  1763.   int qpChroma = currMB->qpc[uv] + img->bitdepth_chroma_qp_scale;   
  1764.   int qpChromaSP=iClip3(-img->bitdepth_chroma_qp_scale, 51, currMB->qpsp + active_pps->chroma_qp_index_offset);
  1765.   int    (*mb_rres)[MB_BLOCK_SIZE] = img->mb_rres[uv + 1]; 
  1766.   int    (*mb_ores)[MB_BLOCK_SIZE] = img->mb_ores[uv + 1]; 
  1767.   imgpel (*mb_pred)[MB_BLOCK_SIZE] = img->mb_pred[uv + 1]; 
  1768.   int qp_per    = qp_per_matrix[qpChroma];
  1769.   int qp_rem    = qp_rem_matrix[qpChroma];
  1770.   int q_bits    = Q_BITS + qp_per;
  1771.   int qp_const  = (1<<q_bits)/6;    // inter
  1772.   int qp_per_sp = qp_per_matrix[qpChromaSP];
  1773.   int qp_rem_sp = qp_rem_matrix[qpChromaSP];
  1774.   int q_bits_sp = Q_BITS + qp_per_sp;
  1775.   int qp_const2 = (1<<q_bits_sp)/2;  //sp_pred
  1776.   
  1777.   levelscale    = LevelScale4x4Comp   [uv + 1][intra][qp_rem];
  1778.   invlevelscale = InvLevelScale4x4Comp[uv + 1][intra][qp_rem];
  1779.   leveloffset   = LevelOffset4x4Comp  [uv + 1][intra][qpChroma];
  1780.   levelscale_sp    = LevelScale4x4Comp   [uv + 1][intra][qp_rem_sp];
  1781.   invlevelscale_sp = InvLevelScale4x4Comp[uv + 1][intra][qp_rem_sp];
  1782.   leveloffset_sp   = LevelOffset4x4Comp  [uv + 1][intra][qpChromaSP];
  1783.   for (j=0; j < img->mb_cr_size_y; j++)
  1784.   {
  1785.     for (i=0; i < img->mb_cr_size_x; i++)
  1786.     {
  1787.       mb_rres[j][i]  = mb_ores[j][i];
  1788.       mb_rres[j][i] += mb_pred[j][i];
  1789.       M1[j][i] = mb_pred[j][i];
  1790.     }
  1791.   }
  1792.   
  1793.   for (n2=0; n2 < img->mb_cr_size_y; n2 += BLOCK_SIZE)
  1794.   {
  1795.     for (n1=0; n1 < img->mb_cr_size_x; n1 += BLOCK_SIZE)
  1796.     {
  1797.       forward4x4(mb_rres, mb_rres, n2, n1);      
  1798.       forward4x4(M1, M1, n2, n1);
  1799.     }
  1800.   }
  1801.   //     2X2 transform of DC coeffs.
  1802.   hadamard2x2(mb_rres, m1);
  1803.   hadamard2x2(M1, mp1);
  1804.   run=-1;
  1805.   scan_pos=0;
  1806.   for (coeff_ctr = 0; coeff_ctr < 4; coeff_ctr++)
  1807.   {
  1808.     run++;
  1809.     ilev=0;
  1810.     // case 1
  1811.     c_err1 = (iabs (mp1[coeff_ctr]) * levelscale_sp[0][0] + 2 * qp_const2) >> (q_bits_sp + 1);
  1812.     c_err1 = (c_err1 << (q_bits_sp + 1)) / levelscale_sp[0][0];
  1813.     c_err1 = m1[coeff_ctr] - isignab(c_err1, mp1[coeff_ctr]);
  1814.     level1 = (iabs(c_err1) * levelscale[0][0] + 2 * qp_const) >> (q_bits+1);
  1815.     // case 2
  1816.     c_err2 = m1[coeff_ctr] - mp1[coeff_ctr];
  1817.     level2 = (iabs(c_err2) * levelscale[0][0] + 2 * qp_const) >> (q_bits+1);
  1818.     if (level1 != level2 && level1 != 0 && level2 != 0)
  1819.     {
  1820.       D_dis1 = m1[coeff_ctr] - ((isignab(level1,c_err1)*invlevelscale[0][0] * A[0][0]<< qp_per) >>5)- mp1[coeff_ctr];
  1821.       levrun_linfo_c2x2(level1, run, &len, &info);
  1822.       D_dis1 = D_dis1 * D_dis1 + lambda_mode * len;
  1823.       D_dis2 = m1[coeff_ctr] - ((isignab(level2,c_err2)*invlevelscale[0][0] * A[0][0]<< qp_per) >>5)- mp1[coeff_ctr];
  1824.       levrun_linfo_c2x2(level2, run, &len, &info);
  1825.       D_dis2 = D_dis2 * D_dis2 + lambda_mode * len;
  1826.       if (D_dis1 == D_dis2)
  1827.         level = (iabs(level1) < iabs(level2)) ? level1 : level2;
  1828.       else if (D_dis1 < D_dis2)
  1829.         level = level1;
  1830.       else
  1831.         level = level2;
  1832.       c_err = (level == level1) ? c_err1 : c_err2;
  1833.     }
  1834.     else if (level1 == level2)
  1835.     {
  1836.       level = level1;
  1837.       c_err = c_err1;
  1838.     }
  1839.     else
  1840.     {
  1841.       level = (level1 == 0) ? level1 : level2;
  1842.       c_err = (level1 == 0) ? c_err1 : c_err2;
  1843.     }
  1844.     if (level  != 0)
  1845.     {
  1846.       if (is_cavlc)
  1847.         level = imin(level, CAVLC_LEVEL_LIMIT);
  1848.       
  1849.       currMB->cbp_blk |= 0xf0000 << (uv << 2) ;  // if one of the 2x2-DC levels is != 0 the coded-bit
  1850.       cr_cbp = imax(1, cr_cbp);
  1851.       DCLevel[scan_pos  ] = isignab(level ,c_err);
  1852.       DCRun  [scan_pos++] = run;
  1853.       run=-1;
  1854.       ilev=((isignab(level,c_err)*invlevelscale[0][0]*A[0][0]<< qp_per) >>5);
  1855.     }
  1856.     ilev+= mp1[coeff_ctr];
  1857.     m1[coeff_ctr]=isignab((iabs(ilev)  * levelscale_sp[0][0] + 2 * qp_const2) >> (q_bits_sp+1), ilev) * invlevelscale_sp[0][0] << qp_per_sp;
  1858.     if(!si_frame_indicator && !sp2_frame_indicator)
  1859.       lrec_uv[uv][img->pix_c_y+4*(coeff_ctr%2)][img->pix_c_x+4*(coeff_ctr/2)]=isignab((iabs(ilev)  * levelscale_sp[0][0] + 2 * qp_const2) >> (q_bits_sp+1), ilev);// stores the SP frames coefficients, will be useful to encode SI or switching SP frame
  1860.   }
  1861.   DCLevel[scan_pos] = 0;
  1862.   //  Inverse transform of 2x2 DC levels
  1863.   ihadamard2x2(m1, m1);
  1864.   mb_rres[0][0]=(m1[0])>>1;
  1865.   mb_rres[0][4]=(m1[1])>>1;
  1866.   mb_rres[4][0]=(m1[2])>>1;
  1867.   mb_rres[4][4]=(m1[3])>>1;
  1868.   //     Quant of chroma AC-coeffs.
  1869.   coeff_cost=0;
  1870.   cr_cbp_tmp=0;
  1871.   for (n2=0; n2 <= BLOCK_SIZE; n2 += BLOCK_SIZE)
  1872.   {
  1873.     for (n1=0; n1 <= BLOCK_SIZE; n1 += BLOCK_SIZE)
  1874.     {
  1875.       b4      = 2*(n2 >> 2) + (n1 >> 2);
  1876.       ACLevel = img->cofAC[uv+4][b4][0];
  1877.       ACRun   = img->cofAC[uv+4][b4][1];
  1878.       run      = -1;
  1879.       scan_pos =  0;
  1880.       for (coeff_ctr=1; coeff_ctr < 16; coeff_ctr++)// start change rd_quant
  1881.       {
  1882.         i=pos_scan[coeff_ctr][0];
  1883.         j=pos_scan[coeff_ctr][1];
  1884.         ++run;
  1885.         ilev=0;
  1886.         // quantization on prediction
  1887.         c_err1 = (iabs(M1[n2+j][n1+i]) * levelscale_sp[j][i] + qp_const2) >> q_bits_sp;
  1888.         c_err1 = (c_err1 << q_bits_sp) / levelscale_sp[j][i];
  1889.         c_err1 = mb_rres[n2+j][n1+i] - isignab(c_err1, M1[n2+j][n1+i]);
  1890.         level1 = (iabs(c_err1) * levelscale[j][i] + qp_const) >> q_bits;
  1891.         // no quantization on prediction
  1892.         c_err2 = mb_rres[n2+j][n1+i] - M1[n2+j][n1+i];
  1893.         level2 = (iabs(c_err2) * levelscale[j][i] + qp_const) >> q_bits;
  1894.         if (level1 != level2 && level1 != 0 && level2 != 0)
  1895.         {
  1896.           D_dis1 = mb_rres[n2+j][n1+i] - ((isignab(level1,c_err1)*invlevelscale[j][i]*A[j][i]<< qp_per) >>6) - M1[n2+j][n1+i];
  1897.           levrun_linfo_inter(level1, run, &len, &info);
  1898.           D_dis1 = D_dis1 * D_dis1 + lambda_mode * len;
  1899.           D_dis2 = mb_rres[n2+j][n1+i] - ((isignab(level2,c_err2)*invlevelscale[j][i]*A[j][i]<< qp_per) >>6) - M1[n2+j][n1+i];
  1900.           levrun_linfo_inter(level2, run, &len, &info);
  1901.           D_dis2 = D_dis2 * D_dis2 + lambda_mode * len;
  1902.           if (D_dis1 == D_dis2)
  1903.             level = (iabs(level1) < iabs(level2)) ? level1 : level2;
  1904.           else
  1905.           {
  1906.             if (D_dis1 < D_dis2)
  1907.               level = level1;
  1908.             else
  1909.               level = level2;
  1910.           }
  1911.           c_err = (level == level1) ? c_err1 : c_err2;
  1912.         }
  1913.         else if (level1 == level2)
  1914.         {
  1915.           level = level1;
  1916.           c_err = c_err1;
  1917.         }
  1918.         else
  1919.         {
  1920.           level = (level1 == 0) ? level1 : level2;
  1921.           c_err = (level1 == 0) ? c_err1 : c_err2;
  1922.         }
  1923.         if (level  != 0)
  1924.         {
  1925.           currMB->cbp_blk |=  (int64)1 << (16 + (uv << 2) + ((n2 >> 1) + (n1 >> 2))) ;
  1926.           coeff_cost += (level > 1) ? MAX_VALUE : c_cost[run];  // set high cost, shall not be discarded
  1927.           cr_cbp_tmp=2;
  1928.           level = isignab(level,c_err);
  1929.           ACLevel[scan_pos] = level;
  1930.           ACRun  [scan_pos] = run;
  1931.           ++scan_pos;
  1932.           run=-1;
  1933.           ilev=((level * invlevelscale[j][i]*A[j][i]<< qp_per) >>6);
  1934.         }
  1935.         ilev+=M1[n2+j][n1+i];
  1936.         if(!si_frame_indicator && !sp2_frame_indicator)
  1937.           if(!( (n2+j) % 4==0 && (n1+i)%4 ==0 ))
  1938.             lrec_uv[uv][img->pix_c_y+n1+j][img->pix_c_x+n2+i]=isignab((iabs(ilev) * levelscale_sp[j][i] + qp_const2) >> q_bits_sp,ilev);//stores the SP frames coefficients, will be useful to encode SI or switching SP frame
  1939.         mb_rres[n2+j][n1+i] = isignab((iabs(ilev) * levelscale_sp[j][i] + qp_const2) >> q_bits_sp,ilev) * invlevelscale_sp[j][i] << qp_per_sp;
  1940.       }
  1941.       ACLevel[scan_pos] = 0;
  1942.     }
  1943.   }
  1944.   // * reset chroma coeffs
  1945.   if(cr_cbp_tmp==2)
  1946.     cr_cbp=2;
  1947.   //     IDCT.
  1948.   //     Horizontal.
  1949.   for (n2=0; n2 <= BLOCK_SIZE; n2 += BLOCK_SIZE)
  1950.   {
  1951.     for (n1=0; n1 <= BLOCK_SIZE; n1 += BLOCK_SIZE)
  1952.     {
  1953.       inverse4x4(mb_rres, mb_rres, n2, n1);
  1954.       for (j=0; j < BLOCK_SIZE; j++)
  1955.         for (i=0; i < BLOCK_SIZE; i++)
  1956.         {
  1957.           mb_rres[n2+j][n1+i] = iClip1 (max_imgpel_value_uv,rshift_rnd_sf(mb_rres[n2+j][n1+i], DQ_BITS));
  1958.         }
  1959.     }
  1960.   }
  1961.   //  Decoded block moved to memory
  1962.   for (j=0; j < BLOCK_SIZE*2; j++)
  1963.     for (i=0; i < BLOCK_SIZE*2; i++)
  1964.     {
  1965.       enc_picture->imgUV[uv][img->pix_c_y+j][img->pix_c_x+i]= (imgpel) mb_rres[j][i];
  1966.     }
  1967.     return cr_cbp;
  1968. }
  1969. /*!
  1970.  ************************************************************************
  1971.  * brief
  1972.  *    The routine performs transform,quantization,inverse transform, adds the diff.
  1973.  *    to the prediction and writes the result to the decoded luma frame. Includes the
  1974.  *    RD constrained quantization also.
  1975.  *
  1976.  * par Input:
  1977.  *    block_x,block_y: Block position inside a macro block (0,4,8,12).
  1978.  *
  1979.  * par Output:
  1980.  *    nonzero: 0 if no levels are nonzero.  1 if there are nonzero levels.            n
  1981.  *    coeff_cost: Counter for nonzero coefficients, used to discard expensive levels.
  1982.  ************************************************************************
  1983.  */
  1984. void copyblock_sp(Macroblock *currMB, ColorPlane pl, int block_x,int block_y)
  1985. {
  1986.   int i, j;
  1987.   int cur_qp = currMB->qpsp + img->bitdepth_luma_qp_scale;  
  1988.   int qp_per = qp_per_matrix[cur_qp];
  1989.   int qp_rem = qp_rem_matrix[cur_qp];
  1990.   int q_bits = Q_BITS + qp_per;
  1991.   int qp_const2=(1<<q_bits)/2;  //sp_pred
  1992.   imgpel **img_enc       = enc_picture->p_curr_img;
  1993.   imgpel (*mb_pred)[MB_BLOCK_SIZE] = img->mb_pred[pl]; 
  1994.   int    (*mb_ores)[MB_BLOCK_SIZE] = img->mb_ores[pl]; 
  1995.   int    (*mb_rres)[MB_BLOCK_SIZE] = img->mb_rres[pl]; 
  1996.   levelscale    = LevelScale4x4Comp[pl][0][qp_rem];
  1997.   invlevelscale = InvLevelScale4x4Comp[pl][0][qp_rem];
  1998.   leveloffset   = ptLevelOffset4x4[0][cur_qp];
  1999.   //  Horizontal transform
  2000.   for (j=0; j< BLOCK_SIZE; j++)
  2001.   {
  2002.     for (i=0; i< BLOCK_SIZE; i++)
  2003.     {
  2004.       mb_rres[j+block_y][i+block_x] = mb_ores[j+block_y][i+block_x];
  2005.       M1[i][j]=mb_pred[j+block_y][i+block_x];
  2006.     }
  2007.   }
  2008.   forward4x4(M1, M1, 0, 0);
  2009.   // Quant
  2010.   for (j=0;j < BLOCK_SIZE; j++)
  2011.   {
  2012.     for (i=0; i < BLOCK_SIZE; i++)
  2013.     {
  2014.       mb_rres[j][i]=isignab((iabs(M1[i][j])* levelscale[i][j]+qp_const2)>> q_bits,M1[i][j])*levelscale[i][j]<<qp_per;
  2015.       if(!si_frame_indicator && !sp2_frame_indicator)
  2016.       {
  2017.         lrec[img->pix_y+block_y+j][img->pix_x+block_x+i] =
  2018.           isignab((iabs(M1[i][j]) * levelscale[i][j] + qp_const2) >> q_bits, M1[i][j]);// stores the SP frames coefficients, will be useful to encode SI or switching SP frame
  2019.       }
  2020.     }
  2021.   }
  2022.   //     IDCT.
  2023.   //     horizontal
  2024.   inverse4x4(mb_rres, mb_rres, 0, 0);
  2025.   //  Decoded block moved to frame memory
  2026.   for (j=0; j < BLOCK_SIZE; j++)
  2027.   {
  2028.     for (i=0; i < BLOCK_SIZE; i++)
  2029.     {
  2030.       mb_rres[j][i] = iClip1 (img->max_imgpel_value, mb_rres[j][i]);
  2031.       img_enc[img->pix_y+block_y+j][img->pix_x+block_x+i]=(imgpel) mb_rres[j][i];
  2032.     }
  2033.   }
  2034. }
  2035. /*!
  2036.  ************************************************************************
  2037.  * brief Eric Setton
  2038.  * Encoding of a secondary SP / SI frame.
  2039.  * For an SI frame the predicted block should only come from spatial pred.
  2040.  * The original image signal is the error coefficients of a primary SP in the raw data stream
  2041.  * the difference with the primary SP are :
  2042.  *  - the prediction signal is transformed and quantized (qpsp) but not dequantized
  2043.  *  - only one kind of prediction is considered and not two
  2044.  *  - the resulting error coefficients are not quantized before being sent to the VLC
  2045.  *
  2046.  * par Input:
  2047.  *    block_x,block_y: Block position inside a macro block (0,4,8,12).
  2048.  *
  2049.  * par Output:
  2050.  *    nonzero: 0 if no levels are nonzero.  1 if there are nonzero levels.
  2051.  *    coeff_cost: Counter for nonzero coefficients, used to discard expensive levels.
  2052.  *
  2053.  *
  2054.  ************************************************************************
  2055.  */
  2056. int dct_4x4_sp2(Macroblock *currMB, ColorPlane pl, int block_x,int block_y,int *coeff_cost, int intra, int is_cavlc)
  2057. {
  2058.   int i,j,ilev,coeff_ctr;
  2059.   int qp_const,level,scan_pos = 0,run = -1;
  2060.   int nonzero = FALSE;
  2061.   imgpel **img_enc = enc_picture->p_curr_img;
  2062.   imgpel (*mb_pred)[MB_BLOCK_SIZE] = img->mb_pred[pl];   
  2063. //  int    (*mb_ores)[MB_BLOCK_SIZE] = img->mb_ores[pl];   
  2064.   int    (*mb_rres)[MB_BLOCK_SIZE] = img->mb_rres[pl];   
  2065.   int c_err,qp_const2;
  2066.   int   pos_x   = block_x >> BLOCK_SHIFT;
  2067.   int   pos_y   = block_y >> BLOCK_SHIFT;
  2068.   int   b8      = 2*(pos_y >> 1) + (pos_x >> 1);
  2069.   int   b4      = 2*(pos_y & 0x01) + (pos_x & 0x01);
  2070.   int*  ACLevel = img->cofAC[b8][b4][0];
  2071.   int*  ACRun   = img->cofAC[b8][b4][1];
  2072.   const byte *c_cost = COEFF_COST4x4[params->disthres];
  2073.   const byte (*pos_scan)[2] = currMB->is_field_mode ? FIELD_SCAN : SNGL_SCAN;
  2074.   int level1;
  2075.   int   qp    = (currMB->qpsp); // should double check spec why these are equal
  2076.   int   qp_sp = (currMB->qpsp);
  2077.   int qp_per    = qp_per_matrix[qp];
  2078.   int qp_rem    = qp_rem_matrix[qp];
  2079.   int q_bits    = Q_BITS + qp_per;
  2080.   int qp_per_sp = qp_per_matrix[qp_sp];
  2081.   int qp_rem_sp = qp_rem_matrix[qp_sp];
  2082.   int q_bits_sp = Q_BITS + qp_per_sp;
  2083.   levelscale    = LevelScale4x4Comp[pl][intra][qp_rem];
  2084.   invlevelscale = InvLevelScale4x4Comp[pl][intra][qp_rem];
  2085.   leveloffset   = ptLevelOffset4x4[intra][qp];
  2086.   levelscale_sp    = LevelScale4x4Comp[pl][intra][qp_rem_sp];
  2087.   invlevelscale_sp = InvLevelScale4x4Comp[pl][intra][qp_rem_sp];
  2088.   leveloffset_sp   = ptLevelOffset4x4[intra][qp_sp];
  2089.   qp_const=(1<<q_bits)/6;    // inter
  2090.   qp_const2=(1<<q_bits_sp)/2;  //sp_pred
  2091.   for (j=0; j< BLOCK_SIZE; j++)
  2092.   {
  2093.     for (i=0; i< BLOCK_SIZE; i++)
  2094.     {
  2095.       //Coefficients obtained from the prior encoding of the SP frame
  2096.       mb_rres[j][i] = lrec[img->pix_y+block_y+j][img->pix_x+block_x+i];
  2097.       //Predicted block
  2098.       M1[j][i]=mb_pred[j+block_y][i+block_x];
  2099.     }
  2100.   }
  2101.   // forward transform
  2102.   forward4x4(M1, M1, 0, 0);
  2103.   for (coeff_ctr=0;coeff_ctr < 16;coeff_ctr++)     // 8 times if double scan, 16 normal scan
  2104.   {
  2105.     i=pos_scan[coeff_ctr][0];
  2106.     j=pos_scan[coeff_ctr][1];
  2107.     run++;
  2108.     ilev=0;
  2109.     //quantization of the predicted block
  2110.     level1 = (iabs (M1[j][i]) * levelscale_sp[j][i] + qp_const2) >> q_bits_sp;
  2111.     //substracted from lrec
  2112.     c_err = mb_rres[j][i]-isignab(level1, M1[j][i]);   //substracting the predicted block
  2113.     level = iabs(c_err);
  2114.     if (level != 0)
  2115.     {
  2116.       nonzero=TRUE;
  2117.       *coeff_cost += (level > 1) ? MAX_VALUE : c_cost[run];
  2118.       ACLevel[scan_pos] = isignab(level,c_err);
  2119.       ACRun  [scan_pos] = run;
  2120.       ++scan_pos;
  2121.       run=-1;                     // reset zero level counter
  2122.     }
  2123.     //from now on we are in decoder land
  2124.     ilev=c_err + isignab(level1,M1[j][i]) ;  // adding the quantized predicted block
  2125.     mb_rres[j][i] = ilev * invlevelscale_sp[j][i] << qp_per_sp;
  2126.   }
  2127.   ACLevel[scan_pos] = 0;
  2128.   //  Inverse transform
  2129.   inverse4x4(mb_rres, mb_rres, 0, 0);
  2130.   for (j=0; j < BLOCK_SIZE; j++)
  2131.     for (i=0; i < BLOCK_SIZE; i++)
  2132.       img_enc[img->pix_y+block_y+j][img->pix_x+block_x+i] =iClip3 (0, img->max_imgpel_value,rshift_rnd_sf(mb_rres[j][i], DQ_BITS));
  2133.   return nonzero;
  2134. }
  2135. /*!
  2136.  ************************************************************************
  2137.  * brief Eric Setton
  2138.  * Encoding of the chroma of a  secondary SP / SI frame.
  2139.  * For an SI frame the predicted block should only come from spatial pred.
  2140.  * The original image signal is the error coefficients of a primary SP in the raw data stream
  2141.  * the difference with the primary SP are :
  2142.  *  - the prediction signal is transformed and quantized (qpsp) but not dequantized
  2143.  *  - the resulting error coefficients are not quantized before being sent to the VLC
  2144.  *
  2145.  * par Input:
  2146.  *    uv    : Make difference between the U and V chroma component
  2147.  *    cr_cbp: chroma coded block pattern
  2148.  *
  2149.  * par Output:
  2150.  *    cr_cbp: Updated chroma coded block pattern.
  2151.  *
  2152.  ************************************************************************
  2153.  */
  2154. int dct_chroma_sp2(Macroblock *currMB, int uv,int cr_cbp, int is_cavlc)
  2155. {
  2156.   int i,j,ilev,n2,n1,coeff_ctr,c_err,level ,scan_pos = 0,run = -1;
  2157.   int m1[BLOCK_SIZE];
  2158.   int coeff_cost;
  2159.   int cr_cbp_tmp;
  2160.   int mp1[BLOCK_SIZE];
  2161.   const byte *c_cost = COEFF_COST4x4[params->disthres];
  2162.   const byte (*pos_scan)[2] = currMB->is_field_mode ? FIELD_SCAN : SNGL_SCAN;
  2163.   int   b4;
  2164.   int*  DCLevel = img->cofDC[uv+1][0];
  2165.   int*  DCRun   = img->cofDC[uv+1][1];
  2166.   int*  ACLevel;
  2167.   int*  ACRun;
  2168.   int  level1;
  2169.   int    (*mb_rres)[MB_BLOCK_SIZE] = img->mb_rres[uv + 1]; 
  2170.   //int    (*mb_ores)[MB_BLOCK_SIZE] = img->mb_ores[uv + 1]; 
  2171.   imgpel (*mb_pred)[MB_BLOCK_SIZE] = img->mb_pred[uv + 1]; 
  2172.   int   intra = IS_INTRA (currMB);
  2173.   int qpChroma   = currMB->qpc[uv] + img->bitdepth_chroma_qp_scale;   
  2174.   int qpChromaSP = iClip3(-img->bitdepth_chroma_qp_scale, 51, currMB->qpsp + active_pps->chroma_qp_index_offset);
  2175.   int qp_per    = qp_per_matrix[qpChroma];
  2176.   int qp_rem    = qp_rem_matrix[qpChroma];
  2177.   int qp_per_sp = qp_per_matrix[qpChromaSP];
  2178.   int qp_rem_sp = qp_rem_matrix[qpChromaSP];
  2179.   int q_bits_sp = Q_BITS + qp_per;
  2180.   int qp_const2 = (1 << q_bits_sp)/2;  //sp_pred
  2181.   levelscale    = LevelScale4x4Comp[uv + 1][intra][qp_rem];
  2182.   invlevelscale = InvLevelScale4x4Comp[uv + 1][intra][qp_rem];
  2183.   leveloffset   = ptLevelOffset4x4[intra][qpChroma];
  2184.   levelscale_sp    = LevelScale4x4Comp[uv + 1][intra][qp_rem_sp];
  2185.   invlevelscale_sp = InvLevelScale4x4Comp[uv + 1][intra][qp_rem_sp];
  2186.   leveloffset_sp   = ptLevelOffset4x4[intra][qpChromaSP];
  2187.   for (j=0; j < MB_BLOCK_SIZE>>1; j++)
  2188.   {
  2189.     for (i=0; i < MB_BLOCK_SIZE>>1; i++)
  2190.     {
  2191.       M1[j][i]=mb_pred[j][i];
  2192.       mb_rres[j][i]=lrec_uv[uv][img->pix_c_y+j][img->pix_c_x+i];
  2193.     }
  2194.   }
  2195.   for (n2=0; n2 <= BLOCK_SIZE; n2 += BLOCK_SIZE)
  2196.   {
  2197.     for (n1=0; n1 <= BLOCK_SIZE; n1 += BLOCK_SIZE)
  2198.     {
  2199.       forward4x4(M1, M1, n2, n1);
  2200.     }
  2201.   }
  2202.   //   DC coefficients already transformed and quantized
  2203.   m1[0]= mb_rres[0][0];
  2204.   m1[1]= mb_rres[0][4];
  2205.   m1[2]= mb_rres[4][0];
  2206.   m1[3]= mb_rres[4][4];
  2207.   //     2X2 transform of predicted DC coeffs.
  2208.   hadamard2x2(M1, mp1);
  2209.   for (coeff_ctr=0; coeff_ctr < 4; coeff_ctr++)
  2210.   {
  2211.     run++;
  2212.     ilev=0;
  2213.     //quantization of predicted DC coeff
  2214.     level1 = (iabs (mp1[coeff_ctr]) * levelscale_sp[0][0] + 2 * qp_const2) >> (q_bits_sp + 1);
  2215.     //substratcted from lrecUV
  2216.     c_err = m1[coeff_ctr] - isignab(level1, mp1[coeff_ctr]);
  2217.     level = iabs(c_err);
  2218.     if (level  != 0)
  2219.     {
  2220.       currMB->cbp_blk |= 0xf0000 << (uv << 2) ;  // if one of the 2x2-DC levels is != 0 the coded-bit
  2221.       cr_cbp=imax(1,cr_cbp);
  2222.       DCLevel[scan_pos] = isignab(level ,c_err);
  2223.       DCRun  [scan_pos] = run;
  2224.       scan_pos++;
  2225.       run=-1;
  2226.     }
  2227.     //from now on decoder world
  2228.     ilev = c_err + isignab(level1,mp1[coeff_ctr]) ; // we have perfect reconstruction here
  2229.     m1[coeff_ctr]= ilev  * invlevelscale_sp[0][0] << qp_per_sp;
  2230.   }
  2231.   DCLevel[scan_pos] = 0;
  2232.   //  Inverse transform of 2x2 DC levels
  2233.   ihadamard2x2(m1, m1);
  2234.   mb_rres[0][0]=m1[0]/2;
  2235.   mb_rres[0][4]=m1[1]/2;
  2236.   mb_rres[4][0]=m1[2]/2;
  2237.   mb_rres[4][4]=m1[3]/2;
  2238.   //     Quant of chroma AC-coeffs.
  2239.   coeff_cost=0;
  2240.   cr_cbp_tmp=0;
  2241.   for (n2=0; n2 <= BLOCK_SIZE; n2 += BLOCK_SIZE)
  2242.   {
  2243.     for (n1=0; n1 <= BLOCK_SIZE; n1 += BLOCK_SIZE)
  2244.     {
  2245.       b4      = 2*(n2/4) + (n1/4);
  2246.       ACLevel = img->cofAC[uv+4][b4][0];
  2247.       ACRun   = img->cofAC[uv+4][b4][1];
  2248.       run      = -1;
  2249.       scan_pos =  0;
  2250.       for (coeff_ctr=1; coeff_ctr < 16; coeff_ctr++)// start change rd_quant
  2251.       {
  2252.         i=pos_scan[coeff_ctr][0];
  2253.         j=pos_scan[coeff_ctr][1];
  2254.         ++run;
  2255.         ilev=0;
  2256.         // quantization on prediction
  2257.         level1 = (iabs(M1[n2+j][n1+i]) * levelscale_sp[j][i] + qp_const2) >> q_bits_sp;
  2258.         //substracted from lrec
  2259.         c_err  = mb_rres[n2+j][n1+i] - isignab(level1, M1[n2+j][n1+i]);
  2260.         level  = iabs(c_err) ;
  2261.         if (level  != 0)
  2262.         {
  2263.           currMB->cbp_blk |=  (int64)1 << (16 + (uv << 2) + ((n2 >> 1) + (n1 >> 2))) ;
  2264.           coeff_cost += (level > 1) ? MAX_VALUE : c_cost[run];
  2265.           cr_cbp_tmp=2;
  2266.           ACLevel[scan_pos] = isignab(level,c_err);
  2267.           ACRun  [scan_pos] = run;
  2268.           ++scan_pos;
  2269.           run=-1;
  2270.         }
  2271.         //from now on decoder land
  2272.         ilev=c_err + isignab(level1,M1[n2+j][n1+i]);
  2273.         mb_rres[n2+j][n1+i] = ilev * invlevelscale_sp[j][i] << qp_per_sp;
  2274.       }
  2275.       ACLevel[scan_pos] = 0;
  2276.     }
  2277.   }
  2278.   // * reset chroma coeffs
  2279.   if(cr_cbp_tmp==2)
  2280.     cr_cbp=2;
  2281.   //     IDCT.
  2282.   //     Horizontal.
  2283.   for (n2=0; n2 <= BLOCK_SIZE; n2 += BLOCK_SIZE)
  2284.   {
  2285.     for (n1=0; n1 <= BLOCK_SIZE; n1 += BLOCK_SIZE)
  2286.     {
  2287.       inverse4x4(mb_rres, mb_rres, n2, n1);
  2288.       //     Vertical.
  2289.       for (j=0; j < BLOCK_SIZE; j++)
  2290.       {
  2291.         for (i=0; i < BLOCK_SIZE; i++)
  2292.         {
  2293.           enc_picture->imgUV[uv][img->pix_c_y+j+n2][img->pix_c_x+i +n1 ] = iClip3 (0, img->max_imgpel_value,rshift_rnd_sf(mb_rres[n2+j][n1+i], DQ_BITS));
  2294.         }
  2295.       }
  2296.     }
  2297.   }
  2298.   return cr_cbp;
  2299. }
  2300. void select_dct(ImageParameters *img, Macroblock *currMB)
  2301. {
  2302.   if (img->type!=SP_SLICE)
  2303.   {
  2304.     if (img->lossless_qpprime_flag == 1)
  2305.     {
  2306.       if (currMB->qp_scaled[img->colour_plane_id] == 0)
  2307.       {
  2308.         pDCT_4x4   = dct_4x4_ls;
  2309.         pDCT_16x16 = dct_16x16_ls;
  2310.         pDCT_8x8   = dct_8x8_ls;
  2311.       }
  2312.       else
  2313.       {
  2314.         pDCT_4x4   = dct_4x4;
  2315.         pDCT_16x16 = dct_16x16;
  2316.         if (img->currentSlice->symbol_mode == CAVLC)
  2317.           pDCT_8x8   = dct_8x8_cavlc;
  2318.         else
  2319.           pDCT_8x8   = dct_8x8;
  2320.         dct_cr_4x4[0] = dct_chroma;
  2321.         dct_cr_4x4[1] = dct_chroma;
  2322.       }
  2323.       if (currMB->qp_scaled[1] == 0)
  2324.       {
  2325.         dct_cr_4x4[0] = dct_chroma_ls;
  2326.       }
  2327.       if (currMB->qp_scaled[2] == 0)
  2328.       {
  2329.         dct_cr_4x4[1] = dct_chroma_ls;
  2330.       }
  2331.     }
  2332.     else
  2333.     {
  2334.       pDCT_4x4   = dct_4x4;
  2335.       pDCT_16x16 = dct_16x16;
  2336.       if (img->currentSlice->symbol_mode == CAVLC)
  2337.         pDCT_8x8   = dct_8x8_cavlc;
  2338.       else
  2339.         pDCT_8x8   = dct_8x8;
  2340.       dct_cr_4x4[0] = dct_chroma;
  2341.       dct_cr_4x4[1] = dct_chroma;
  2342.     }
  2343.   }
  2344.   else if(!si_frame_indicator && !sp2_frame_indicator)
  2345.   {
  2346.     pDCT_4x4 = dct_4x4_sp;
  2347.     pDCT_16x16 = dct_16x16;
  2348.     if (img->currentSlice->symbol_mode == CAVLC)
  2349.       pDCT_8x8   = dct_8x8_cavlc;
  2350.     else
  2351.       pDCT_8x8   = dct_8x8;
  2352.     dct_cr_4x4[0]  = dct_chroma_sp;
  2353.     dct_cr_4x4[1]  = dct_chroma_sp;
  2354.   }
  2355.   else
  2356.   {
  2357.     pDCT_4x4 = dct_4x4_sp2;
  2358.     pDCT_16x16 = dct_16x16;
  2359.     if (img->currentSlice->symbol_mode == CAVLC)
  2360.       pDCT_8x8   = dct_8x8_cavlc;
  2361.     else
  2362.       pDCT_8x8   = dct_8x8;
  2363.     dct_cr_4x4[0]  = dct_chroma_sp2;
  2364.     dct_cr_4x4[1]  = dct_chroma_sp2;
  2365.   }
  2366. }