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

Audio

开发平台:

Visual C++

  1. /*!
  2.  ***********************************************************************
  3.  *  file
  4.  *      block.c
  5.  *
  6.  *  brief
  7.  *      Block functions
  8.  *
  9.  *  author
  10.  *      Main contributors (see contributors.h for copyright, address and affiliation details)
  11.  *      - Inge Lille-Langoy          <inge.lille-langoy@telenor.com>
  12.  *      - Rickard Sjoberg            <rickard.sjoberg@era.ericsson.se>
  13.  ***********************************************************************
  14.  */
  15. #include "contributors.h"
  16. #include "global.h"
  17. #include "block.h"
  18. #include "image.h"
  19. #include "mb_access.h"
  20. #include "transform.h"
  21. #include "quant.h"
  22. // Notation for comments regarding prediction and predictors.
  23. // The pels of the 4x4 block are labelled a..p. The predictor pels above
  24. // are labelled A..H, from the left I..L, and from above left X, as follows:
  25. //
  26. //  X A B C D E F G H
  27. //  I a b c d
  28. //  J e f g h
  29. //  K i j k l
  30. //  L m n o p
  31. //
  32. // Predictor array index definitions
  33. #define P_X (PredPel[0])
  34. #define P_A (PredPel[1])
  35. #define P_B (PredPel[2])
  36. #define P_C (PredPel[3])
  37. #define P_D (PredPel[4])
  38. #define P_E (PredPel[5])
  39. #define P_F (PredPel[6])
  40. #define P_G (PredPel[7])
  41. #define P_H (PredPel[8])
  42. #define P_I (PredPel[9])
  43. #define P_J (PredPel[10])
  44. #define P_K (PredPel[11])
  45. #define P_L (PredPel[12])
  46.   static int M4[BLOCK_SIZE][BLOCK_SIZE];
  47.   static int PBlock[MB_BLOCK_SIZE][MB_BLOCK_SIZE];
  48. static void intra_chroma_DC_single(imgpel **curr_img, int up_avail, int left_avail, PixelPos up, PixelPos left[17], int blk_x, int blk_y, int *pred, int direction )
  49. {
  50.   static int i;
  51.   int s0 = 0;
  52.   if ((direction && up_avail) || (!left_avail && up_avail))
  53.   {
  54.     for (i = blk_x; i < (blk_x + 4);i++)  
  55.       s0 += curr_img[up.pos_y][up.pos_x + i];
  56.     *pred = (s0 + 2) >> 2;
  57.   }
  58.   else if (left_avail)  
  59.   {
  60.     for (i = blk_y; i < (blk_y + 4);i++)  
  61.       s0 += curr_img[left[i].pos_y][left[i].pos_x];
  62.     *pred = (s0 + 2) >> 2;
  63.   }
  64. }
  65. static void intra_chroma_DC_all(imgpel **curr_img, int up_avail, int left_avail, PixelPos up, PixelPos left[17], int blk_x, int blk_y, int *pred )
  66. {
  67.   static int i;
  68.   int s0 = 0, s1 = 0;
  69.   if (up_avail)       
  70.     for (i = blk_x; i < (blk_x + 4);i++)  
  71.       s0 += curr_img[up.pos_y][up.pos_x + i];
  72.   
  73.   if (left_avail)  
  74.     for (i = blk_y; i < (blk_y + 4);i++)  
  75.       s1 += curr_img[left[i].pos_y][left[i].pos_x];
  76.   
  77.   if (up_avail && left_avail)
  78.     *pred = (s0 + s1 + 4) >> 3;
  79.   else if (up_avail)
  80.     *pred = (s0 + 2) >> 2;
  81.   else if (left_avail)
  82.     *pred = (s1 + 2) >> 2;
  83. }
  84. /*!
  85.  ***********************************************************************
  86.  * brief
  87.  *    makes and returns 4x4 blocks with all 5 intra prediction modes
  88.  *
  89.  * return
  90.  *    DECODING_OK   decoding of intraprediction mode was sucessfull            n
  91.  *    SEARCH_SYNC   search next sync element as errors while decoding occured
  92.  ***********************************************************************
  93.  */
  94. int intrapred(ImageParameters *img,  //!< image parameters 
  95.               Macroblock *currMB, 
  96.               ColorPlane pl,               
  97.               int ioff,             //!< pixel offset X within MB
  98.               int joff,             //!< pixel offset Y within MB
  99.               int img_block_x,      //!< location of block X, multiples of 4
  100.               int img_block_y)      //!< location of block Y, multiples of 4
  101. {
  102.   int i,j;
  103.   int s0;  
  104.   imgpel PredPel[13];  // array of predictor pels
  105.   int uv = pl-1;
  106.   imgpel **imgY = (pl) ? dec_picture->imgUV[uv] : dec_picture->imgY;
  107.   PixelPos pix_a[4];
  108.   PixelPos pix_b, pix_c, pix_d;
  109.   int block_available_up;
  110.   int block_available_left;
  111.   int block_available_up_left;
  112.   int block_available_up_right;
  113.   byte predmode = img->ipredmode[img_block_y][img_block_x];
  114.   int jpos0 = joff, jpos1 = joff + 1, jpos2 = joff + 2, jpos3 = joff + 3;
  115.   int ipos0 = ioff, ipos1 = ioff + 1, ipos2 = ioff + 2, ipos3 = ioff + 3;
  116.   imgpel *predrow, prediction, (*mpr)[16] = img->mb_pred[pl];
  117.   ipmode_DPCM = predmode; //For residual DPCM
  118.   for (i=0;i<4;i++)
  119.   {
  120.     getNeighbour(currMB, ioff -1 , joff +i , img->mb_size[IS_LUMA], &pix_a[i]);
  121.   }
  122.   getNeighbour(currMB, ioff    , joff -1 , img->mb_size[IS_LUMA], &pix_b);
  123.   getNeighbour(currMB, ioff +4 , joff -1 , img->mb_size[IS_LUMA], &pix_c);
  124.   getNeighbour(currMB, ioff -1 , joff -1 , img->mb_size[IS_LUMA], &pix_d);
  125.   pix_c.available = pix_c.available && !((ioff==4) && ((joff==4)||(joff==12)));
  126.   if (active_pps->constrained_intra_pred_flag)
  127.   {
  128.     for (i=0, block_available_left=1; i<4;i++)
  129.       block_available_left  &= pix_a[i].available ? img->intra_block[pix_a[i].mb_addr]: 0;
  130.     block_available_up       = pix_b.available ? img->intra_block [pix_b.mb_addr] : 0;
  131.     block_available_up_right = pix_c.available ? img->intra_block [pix_c.mb_addr] : 0;
  132.     block_available_up_left  = pix_d.available ? img->intra_block [pix_d.mb_addr] : 0;
  133.   }
  134.   else
  135.   {
  136.     block_available_left     = pix_a[0].available;
  137.     block_available_up       = pix_b.available;
  138.     block_available_up_right = pix_c.available;
  139.     block_available_up_left  = pix_d.available;
  140.   }
  141.   // form predictor pels
  142.   if (block_available_up)
  143.   {
  144.     P_A = imgY[pix_b.pos_y][pix_b.pos_x + 0];
  145.     P_B = imgY[pix_b.pos_y][pix_b.pos_x + 1];
  146.     P_C = imgY[pix_b.pos_y][pix_b.pos_x + 2];
  147.     P_D = imgY[pix_b.pos_y][pix_b.pos_x + 3];
  148.   }
  149.   else
  150.   {
  151.     P_A = P_B = P_C = P_D = (imgpel) img->dc_pred_value_comp[pl];
  152.   }
  153.   if (block_available_up_right)
  154.   {
  155.     P_E = imgY[pix_c.pos_y][pix_c.pos_x + 0];
  156.     P_F = imgY[pix_c.pos_y][pix_c.pos_x + 1];
  157.     P_G = imgY[pix_c.pos_y][pix_c.pos_x + 2];
  158.     P_H = imgY[pix_c.pos_y][pix_c.pos_x + 3];
  159.   }
  160.   else
  161.   {
  162.     P_E = P_F = P_G = P_H = P_D;
  163.   }
  164.   if (block_available_left)
  165.   {
  166.     P_I = imgY[pix_a[0].pos_y][pix_a[0].pos_x];
  167.     P_J = imgY[pix_a[1].pos_y][pix_a[1].pos_x];
  168.     P_K = imgY[pix_a[2].pos_y][pix_a[2].pos_x];
  169.     P_L = imgY[pix_a[3].pos_y][pix_a[3].pos_x];
  170.   }
  171.   else
  172.   {
  173.     P_I = P_J = P_K = P_L = (imgpel) img->dc_pred_value_comp[pl];
  174.   }
  175.   if (block_available_up_left)
  176.   {
  177.     P_X = imgY[pix_d.pos_y][pix_d.pos_x];
  178.   }
  179.   else
  180.   {
  181.     P_X = (imgpel) img->dc_pred_value_comp[pl];
  182.   }
  183.   switch (predmode)
  184.   {
  185.   case DC_PRED:                         /* DC prediction */
  186.     s0 = 0;
  187.     if (block_available_up && block_available_left)
  188.     {
  189.       // no edge
  190.       s0 = (P_A + P_B + P_C + P_D + P_I + P_J + P_K + P_L + 4)>>3;
  191.     }
  192.     else if (!block_available_up && block_available_left)
  193.     {
  194.       // upper edge
  195.       s0 = (P_I + P_J + P_K + P_L + 2)>>2;
  196.     }
  197.     else if (block_available_up && !block_available_left)
  198.     {
  199.       // left edge
  200.       s0 = (P_A + P_B + P_C + P_D + 2)>>2;
  201.     }
  202.     else //if (!block_available_up && !block_available_left)
  203.     {
  204.       // top left corner, nothing to predict from
  205.       s0 = img->dc_pred_value_comp[pl];
  206.     }
  207.     for (j=joff; j < joff + BLOCK_SIZE; j++)
  208.     {
  209.       for (i=ioff; i < ioff + BLOCK_SIZE; i++)
  210.       {
  211.         // store DC prediction
  212.         mpr[j][i] = (imgpel) s0;
  213.       }
  214.     }
  215.     break;
  216.   case VERT_PRED:                       /* vertical prediction from block above */
  217.     if (!block_available_up)
  218.       printf ("warning: Intra_4x4_Vertical prediction mode not allowed at mb %dn", (int) img->current_mb_nr);
  219.     for(j = joff; j < joff + BLOCK_SIZE; j++) /* store predicted 4x4 block */
  220.       memcpy(&(mpr[j][ioff]), &(imgY[pix_b.pos_y][pix_b.pos_x]), BLOCK_SIZE * sizeof(imgpel));
  221.     break;
  222.   case HOR_PRED:                        /* horizontal prediction from left block */
  223.     if (!block_available_left)
  224.       printf ("warning: Intra_4x4_Horizontal prediction mode not allowed at mb %dn",(int) img->current_mb_nr);
  225.     for(j=0;j<BLOCK_SIZE;j++)
  226.     {
  227.       predrow = mpr[j+joff];
  228.       prediction = imgY[pix_a[j].pos_y][pix_a[j].pos_x];
  229.       for(i = ioff;i < ioff + BLOCK_SIZE;i++)
  230.         predrow[i]= prediction; /* store predicted 4x4 block */
  231.     }
  232.     break;
  233.   case DIAG_DOWN_RIGHT_PRED:
  234.     if ((!block_available_up)||(!block_available_left)||(!block_available_up_left))
  235.       printf ("warning: Intra_4x4_Diagonal_Down_Right prediction mode not allowed at mb %dn",(int) img->current_mb_nr);
  236.     mpr[jpos3][ipos0] = (imgpel) ((P_L + 2*P_K + P_J + 2) >> 2);
  237.     mpr[jpos2][ipos0] =
  238.     mpr[jpos3][ipos1] = (imgpel) ((P_K + 2*P_J + P_I + 2) >> 2);
  239.     mpr[jpos1][ipos0] =
  240.     mpr[jpos2][ipos1] =
  241.     mpr[jpos3][ipos2] = (imgpel) ((P_J + 2*P_I + P_X + 2) >> 2);
  242.     mpr[jpos0][ipos0] =
  243.     mpr[jpos1][ipos1] =
  244.     mpr[jpos2][ipos2] =
  245.     mpr[jpos3][ipos3] = (imgpel) ((P_I + 2*P_X + P_A + 2) >> 2);
  246.     mpr[jpos0][ipos1] =
  247.     mpr[jpos1][ipos2] =
  248.     mpr[jpos2][ipos3] = (imgpel) ((P_X + 2*P_A + P_B + 2) >> 2);
  249.     mpr[jpos0][ipos2] =
  250.     mpr[jpos1][ipos3] = (imgpel) ((P_A + 2*P_B + P_C + 2) >> 2);
  251.     mpr[jpos0][ipos3] = (imgpel) ((P_B + 2*P_C + P_D + 2) >> 2);
  252.     break;
  253.   case DIAG_DOWN_LEFT_PRED:
  254.     if (!block_available_up)
  255.       printf ("warning: Intra_4x4_Diagonal_Down_Left prediction mode not allowed at mb %dn", (int) img->current_mb_nr);
  256.     mpr[jpos0][ipos0] = (imgpel) ((P_A + P_C + 2*(P_B) + 2) >> 2);
  257.     mpr[jpos0][ipos1] =
  258.     mpr[jpos1][ipos0] = (imgpel) ((P_B + P_D + 2*(P_C) + 2) >> 2);
  259.     mpr[jpos0][ipos2] =
  260.     mpr[jpos1][ipos1] =
  261.     mpr[jpos2][ipos0] = (imgpel) ((P_C + P_E + 2*(P_D) + 2) >> 2);
  262.     mpr[jpos0][ipos3] =
  263.     mpr[jpos1][ipos2] =
  264.     mpr[jpos2][ipos1] =
  265.     mpr[jpos3][ipos0] = (imgpel) ((P_D + P_F + 2*(P_E) + 2) >> 2);
  266.     mpr[jpos1][ipos3] =
  267.     mpr[jpos2][ipos2] =
  268.     mpr[jpos3][ipos1] = (imgpel) ((P_E + P_G + 2*(P_F) + 2) >> 2);
  269.     mpr[jpos2][ipos3] =
  270.     mpr[jpos3][ipos2] = (imgpel) ((P_F + P_H + 2*(P_G) + 2) >> 2);
  271.     mpr[jpos3][ipos3] = (imgpel) ((P_G + 3*(P_H) + 2) >> 2);
  272.     break;
  273.   case  VERT_RIGHT_PRED:/* diagonal prediction -22.5 deg to horizontal plane */
  274.     if ((!block_available_up)||(!block_available_left)||(!block_available_up_left))
  275.       printf ("warning: Intra_4x4_Vertical_Right prediction mode not allowed at mb %dn", (int) img->current_mb_nr);
  276.     mpr[jpos0][ipos0] =
  277.     mpr[jpos2][ipos1] = (imgpel) ((P_X + P_A + 1) >> 1);
  278.     mpr[jpos0][ipos1] =
  279.     mpr[jpos2][ipos2] = (imgpel) ((P_A + P_B + 1) >> 1);
  280.     mpr[jpos0][ipos2] =
  281.     mpr[jpos2][ipos3] = (imgpel) ((P_B + P_C + 1) >> 1);
  282.     mpr[jpos0][ipos3] = (imgpel) ((P_C + P_D + 1) >> 1);
  283.     mpr[jpos1][ipos0] =
  284.     mpr[jpos3][ipos1] = (imgpel) ((P_I + 2*P_X + P_A + 2) >> 2);
  285.     mpr[jpos1][ipos1] =
  286.     mpr[jpos3][ipos2] = (imgpel) ((P_X + 2*P_A + P_B + 2) >> 2);
  287.     mpr[jpos1][ipos2] =
  288.     mpr[jpos3][ipos3] = (imgpel) ((P_A + 2*P_B + P_C + 2) >> 2);
  289.     mpr[jpos1][ipos3] = (imgpel) ((P_B + 2*P_C + P_D + 2) >> 2);
  290.     mpr[jpos2][ipos0] = (imgpel) ((P_X + 2*P_I + P_J + 2) >> 2);
  291.     mpr[jpos3][ipos0] = (imgpel) ((P_I + 2*P_J + P_K + 2) >> 2);
  292.     break;
  293.   case  VERT_LEFT_PRED:/* diagonal prediction -22.5 deg to horizontal plane */
  294.     if (!block_available_up)
  295.       printf ("warning: Intra_4x4_Vertical_Left prediction mode not allowed at mb %dn", (int) img->current_mb_nr);
  296.     mpr[jpos0][ipos0] = (imgpel) ((P_A + P_B + 1) >> 1);
  297.     mpr[jpos0][ipos1] =
  298.     mpr[jpos2][ipos0] = (imgpel) ((P_B + P_C + 1) >> 1);
  299.     mpr[jpos0][ipos2] =
  300.     mpr[jpos2][ipos1] = (imgpel) ((P_C + P_D + 1) >> 1);
  301.     mpr[jpos0][ipos3] =
  302.     mpr[jpos2][ipos2] = (imgpel) ((P_D + P_E + 1) >> 1);
  303.     mpr[jpos2][ipos3] = (imgpel) ((P_E + P_F + 1) >> 1);
  304.     mpr[jpos1][ipos0] = (imgpel) ((P_A + 2*P_B + P_C + 2) >> 2);
  305.     mpr[jpos1][ipos1] =
  306.     mpr[jpos3][ipos0] = (imgpel) ((P_B + 2*P_C + P_D + 2) >> 2);
  307.     mpr[jpos1][ipos2] =
  308.     mpr[jpos3][ipos1] = (imgpel) ((P_C + 2*P_D + P_E + 2) >> 2);
  309.     mpr[jpos1][ipos3] =
  310.     mpr[jpos3][ipos2] = (imgpel) ((P_D + 2*P_E + P_F + 2) >> 2);
  311.     mpr[jpos3][ipos3] = (imgpel) ((P_E + 2*P_F + P_G + 2) >> 2);
  312.     break;
  313.   case  HOR_UP_PRED:/* diagonal prediction -22.5 deg to horizontal plane */
  314.     if (!block_available_left)
  315.       printf ("warning: Intra_4x4_Horizontal_Up prediction mode not allowed at mb %dn",(int) img->current_mb_nr);
  316.     mpr[jpos0][ipos0] = (imgpel) ((P_I + P_J + 1) >> 1);
  317.     mpr[jpos0][ipos1] = (imgpel) ((P_I + 2*P_J + P_K + 2) >> 2);
  318.     mpr[jpos0][ipos2] =
  319.     mpr[jpos1][ipos0] = (imgpel) ((P_J + P_K + 1) >> 1);
  320.     mpr[jpos0][ipos3] =
  321.     mpr[jpos1][ipos1] = (imgpel) ((P_J + 2*P_K + P_L + 2) >> 2);
  322.     mpr[jpos1][ipos2] =
  323.     mpr[jpos2][ipos0] = (imgpel) ((P_K + P_L + 1) >> 1);
  324.     mpr[jpos1][ipos3] =
  325.     mpr[jpos2][ipos1] = (imgpel) ((P_K + 2*P_L + P_L + 2) >> 2);
  326.     mpr[jpos2][ipos3] =
  327.     mpr[jpos3][ipos1] =
  328.     mpr[jpos3][ipos0] =
  329.     mpr[jpos2][ipos2] =
  330.     mpr[jpos3][ipos2] =
  331.     mpr[jpos3][ipos3] = (imgpel) P_L;
  332.     break;
  333.   case  HOR_DOWN_PRED:/* diagonal prediction -22.5 deg to horizontal plane */
  334.     if ((!block_available_up)||(!block_available_left)||(!block_available_up_left))
  335.       printf ("warning: Intra_4x4_Horizontal_Down prediction mode not allowed at mb %dn", (int) img->current_mb_nr);
  336.     mpr[jpos0][ipos0] =
  337.     mpr[jpos1][ipos2] = (imgpel) ((P_X + P_I + 1) >> 1);
  338.     mpr[jpos0][ipos1] =
  339.     mpr[jpos1][ipos3] = (imgpel) ((P_I + 2*P_X + P_A + 2) >> 2);
  340.     mpr[jpos0][ipos2] = (imgpel) ((P_X + 2*P_A + P_B + 2) >> 2);
  341.     mpr[jpos0][ipos3] = (imgpel) ((P_A + 2*P_B + P_C + 2) >> 2);
  342.     mpr[jpos1][ipos0] =
  343.     mpr[jpos2][ipos2] = (imgpel) ((P_I + P_J + 1) >> 1);
  344.     mpr[jpos1][ipos1] =
  345.     mpr[jpos2][ipos3] = (imgpel) ((P_X + 2*P_I + P_J + 2) >> 2);
  346.     mpr[jpos2][ipos0] =
  347.     mpr[jpos3][ipos2] = (imgpel) ((P_J + P_K + 1) >> 1);
  348.     mpr[jpos2][ipos1] =
  349.     mpr[jpos3][ipos3] = (imgpel) ((P_I + 2*P_J + P_K + 2) >> 2);
  350.     mpr[jpos3][ipos0] = (imgpel) ((P_K + P_L + 1) >> 1);
  351.     mpr[jpos3][ipos1] = (imgpel) ((P_J + 2*P_K + P_L + 2) >> 2);
  352.     break;
  353.   default:
  354.     printf("Error: illegal intra_4x4 prediction mode: %dn", (int) predmode);
  355.     return SEARCH_SYNC;
  356.     break;
  357.   }
  358.   return DECODING_OK;
  359. }
  360. /*!
  361.  ***********************************************************************
  362.  * return
  363.  *    best SAD
  364.  ***********************************************************************
  365.  */ 
  366. int intrapred_luma_16x16(ImageParameters *img, //!< image parameters
  367.                          Macroblock *currMB,  //!< Current Macroblock
  368.                          ColorPlane pl,       //!< Current colorplane (for 4:4:4)                         
  369.                          int predmode)        //!< prediction mode
  370. {
  371.   int s0 = 0, s1, s2;
  372.   int i,j;
  373.   int ih,iv;
  374.   int ib,ic,iaa;
  375.   int uv = pl-1;
  376.   imgpel **imgY = (pl) ? dec_picture->imgUV[uv] : dec_picture->imgY;
  377.   imgpel (*mpr)[MB_BLOCK_SIZE] = &(img->mb_pred[pl][0]); 
  378.   imgpel *mpr_line;
  379.   imgpel prediction;
  380.   int max_imgpel_value = img->max_imgpel_value_comp[pl];
  381.   PixelPos up;          //!< pixel position p(0,-1)
  382.   PixelPos left[17];    //!< pixel positions p(-1, -1..15)
  383.   int up_avail, left_avail, left_up_avail;
  384.   s1=s2=0;
  385.   for (i=0;i<17;i++)
  386.   {
  387.     getNeighbour(currMB, -1 ,  i-1 , img->mb_size[IS_LUMA], &left[i]);
  388.   }
  389.   getNeighbour(currMB, 0     ,  -1 , img->mb_size[IS_LUMA], &up);
  390.   if (!active_pps->constrained_intra_pred_flag)
  391.   {
  392.     up_avail   = up.available;
  393.     left_avail = left[1].available;
  394.     left_up_avail = left[0].available;
  395.   }
  396.   else
  397.   {
  398.     up_avail      = up.available ? img->intra_block[up.mb_addr] : 0;
  399.     for (i=1, left_avail=1; i<17;i++)
  400.       left_avail  &= left[i].available ? img->intra_block[left[i].mb_addr]: 0;
  401.     left_up_avail = left[0].available ? img->intra_block[left[0].mb_addr]: 0;
  402.   }
  403.   switch (predmode)
  404.   {
  405.   case VERT_PRED_16:                       // vertical prediction from block above
  406.     if (!up_avail)
  407.       error ("invalid 16x16 intra pred Mode VERT_PRED_16",500);
  408.     for(j=0;j<MB_BLOCK_SIZE;j++)
  409.       memcpy(img->mb_pred[pl][j], &(imgY[up.pos_y][up.pos_x]), MB_BLOCK_SIZE * sizeof(imgpel));
  410.     break;
  411.   case HOR_PRED_16:                        // horizontal prediction from left block
  412.     if (!left_avail)
  413.       error ("invalid 16x16 intra pred Mode HOR_PRED_16",500);
  414.     for(j = 0; j < MB_BLOCK_SIZE; j++)
  415.     {
  416.       prediction = imgY[left[j+1].pos_y][left[j+1].pos_x];
  417.       for(i=0;i<MB_BLOCK_SIZE;i++)
  418.         mpr[j][i]= prediction; // store predicted 16x16 block
  419.     }
  420.     break;
  421.   case DC_PRED_16:                         // DC prediction
  422.     s1=s2=0;
  423.     for (i = 0; i < MB_BLOCK_SIZE; i++)
  424.     {
  425.       if (up_avail)
  426.         s1 += imgY[up.pos_y][up.pos_x+i];    // sum hor pix
  427.       if (left_avail)
  428.         s2 += imgY[left[i + 1].pos_y][left[i + 1].pos_x];    // sum vert pix
  429.     }
  430.     if (up_avail && left_avail)
  431.       s0 = (s1 + s2 + 16)>>5;       // no edge
  432.     if (!up_avail && left_avail)
  433.       s0 = (s2 + 8)>>4;              // upper edge
  434.     if (up_avail && !left_avail)
  435.       s0 = (s1 + 8)>>4;              // left edge
  436.     if (!up_avail && !left_avail)
  437.       s0 = img->dc_pred_value_comp[pl];                            // top left corner, nothing to predict from
  438.     for(j = 0; j < MB_BLOCK_SIZE; j++)
  439.       for(i = 0; i < MB_BLOCK_SIZE; i++)
  440.       {
  441.         mpr[j][i]=(imgpel) s0;
  442.       }
  443.     break;
  444.   case PLANE_16:// 16 bit integer plan pred
  445.     if (!up_avail || !left_up_avail  || !left_avail)
  446.       error ("invalid 16x16 intra pred Mode PLANE_16",500);
  447.     ih=0;
  448.     iv=0;
  449.     mpr_line = &imgY[up.pos_y][up.pos_x+7];
  450.     for (i = 1; i < 8; i++)
  451.     {
  452.       ih += i*(mpr_line[i] - mpr_line[-i]);
  453.       iv += i*(imgY[left[8+i].pos_y][left[8+i].pos_x] - imgY[left[8-i].pos_y][left[8-i].pos_x]);
  454.     }
  455.     ih += 8*(mpr_line[8] - imgY[left[0].pos_y][left[0].pos_x]);
  456.     iv += 8*(imgY[left[16].pos_y][left[16].pos_x] - imgY[left[0].pos_y][left[0].pos_x]);
  457.     ib=(5*ih+32)>>6;
  458.     ic=(5*iv+32)>>6;
  459.     iaa=16*(mpr_line[8] + imgY[left[16].pos_y][left[16].pos_x]);
  460.     for (j=0;j< MB_BLOCK_SIZE;j++)
  461.     {
  462.       for (i=0;i< MB_BLOCK_SIZE;i++)
  463.       {
  464.         mpr[j][i]=(imgpel) iClip1(max_imgpel_value,((iaa+(i-7)*ib +(j-7)*ic + 16)>>5));
  465.       }
  466.     }// store plane prediction
  467.     break;
  468.   default:
  469.     {                                    // indication of fault in bitstream,exit
  470.       printf("illegal 16x16 intra prediction mode input: %dn",predmode);
  471.       return SEARCH_SYNC;
  472.     }
  473.   }
  474.   return DECODING_OK;
  475. }
  476. /*!
  477.  ************************************************************************
  478.  * brief
  479.  *    Chroma Intra prediction. Note that many operations can be moved
  480.  *    outside since they are repeated for both components for no reason.
  481.  ************************************************************************
  482.  */
  483. void intrapred_chroma(ImageParameters *img, Macroblock *currMB, int uv)
  484. {
  485.   int i,j, ii, jj;
  486.   imgpel **imgUV = dec_picture->imgUV[uv];
  487.   imgpel (*mpr)[16] = img->mb_pred[uv + 1];
  488.   int     max_imgpel_value = img->max_imgpel_value_comp[uv + 1];
  489.   
  490.   int ih, iv, ib, ic, iaa;
  491.   int        b8, b4;
  492.   int        yuv = dec_picture->chroma_format_idc - 1;
  493.   int        blk_x, blk_y;
  494.   int        pred;
  495.   static int block_pos[3][4][4]= //[yuv][b8][b4]
  496.   {
  497.     { {0, 1, 2, 3},{0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0}},
  498.     { {0, 1, 2, 3},{2, 3, 2, 3},{0, 0, 0, 0},{0, 0, 0, 0}},
  499.     { {0, 1, 2, 3},{1, 1, 3, 3},{2, 3, 2, 3},{3, 3, 3, 3}}
  500.   };
  501.   PixelPos up;        //!< pixel position  p(0,-1)
  502.   PixelPos left[17];  //!< pixel positions p(-1, -1..16)
  503.   int up_avail, left_avail[2], left_up_avail;
  504.   int cr_MB_x = img->mb_cr_size_x;
  505.   int cr_MB_y = img->mb_cr_size_y;
  506.   int cr_MB_y2 = (cr_MB_y >> 1);
  507.   int cr_MB_x2 = (cr_MB_x >> 1);
  508.   for (i=0; i < cr_MB_y + 1 ; i++)
  509.   {
  510.     getNeighbour(currMB, -1, i-1, img->mb_size[IS_CHROMA], &left[i]);
  511.   }
  512.   getNeighbour(currMB, 0, -1, img->mb_size[IS_CHROMA], &up);
  513.   if (!active_pps->constrained_intra_pred_flag)
  514.   {
  515.     up_avail      = up.available;
  516.     left_avail[0] = left_avail[1] = left[1].available;
  517.     left_up_avail = left[0].available;
  518.   }
  519.   else
  520.   {
  521.     up_avail = up.available ? img->intra_block[up.mb_addr] : 0;
  522.     for (i=0, left_avail[0] = 1; i < cr_MB_y2;i++)
  523.       left_avail[0]  &= left[i + 1].available ? img->intra_block[left[i + 1].mb_addr]: 0;
  524.     for (i = cr_MB_y2, left_avail[1] = 1; i<cr_MB_y;i++)
  525.       left_avail[1]  &= left[i + 1].available ? img->intra_block[left[i + 1].mb_addr]: 0;
  526.     left_up_avail = left[0].available ? img->intra_block[left[0].mb_addr]: 0;
  527.   }
  528.   switch (currMB->c_ipred_mode)
  529.   {
  530.   case DC_PRED_8:
  531.     // DC prediction
  532.     // Note that unlike what is stated in many presentations and papers, this mode does not operate
  533.     // the same way as I_16x16 DC prediction.
  534.     for(b8 = 0; b8 < (img->num_uv_blocks) ;b8++)
  535.     {
  536.       for (b4 = 0; b4 < 4; b4++)
  537.       {
  538.         blk_y = subblk_offset_y[yuv][b8][b4];
  539.         blk_x = subblk_offset_x[yuv][b8][b4];
  540.         pred = img->dc_pred_value_comp[1];
  541.         //===== get prediction value =====
  542.         switch (block_pos[yuv][b8][b4])
  543.         {
  544.         case 0:  //===== TOP LEFT =====
  545.           intra_chroma_DC_all   (imgUV, up_avail, left_avail[0], up, left, blk_x, blk_y + 1, &pred);
  546.           break;
  547.         case 1: //===== TOP RIGHT =====
  548.           intra_chroma_DC_single(imgUV, up_avail, left_avail[0], up, left, blk_x, blk_y + 1, &pred, 1);
  549.           break;
  550.         case 2: //===== BOTTOM LEFT =====
  551.           intra_chroma_DC_single(imgUV, up_avail, left_avail[1], up, left, blk_x, blk_y + 1, &pred, 0);
  552.           break;
  553.         case 3: //===== BOTTOM RIGHT =====
  554.           intra_chroma_DC_all   (imgUV, up_avail, left_avail[1], up, left, blk_x, blk_y + 1, &pred);          
  555.           break;
  556.         }
  557.         
  558.         for (jj = blk_y; jj < blk_y + BLOCK_SIZE; jj++)
  559.           for (ii = blk_x; ii < blk_x + BLOCK_SIZE; ii++)
  560.           {
  561.             mpr[jj][ii]=(imgpel) pred;
  562.           }
  563.       }
  564.     }
  565.     break;
  566.   case HOR_PRED_8:
  567.     // Horizontal Prediction
  568.     if (!left_avail[0] || !left_avail[1])
  569.       error("unexpected HOR_PRED_8 chroma intra prediction mode",-1);
  570.     for (j = 0; j < cr_MB_y; j++)
  571.     {
  572.       pred = imgUV[left[1 + j].pos_y][left[1 + j].pos_x];
  573.       for (i = 0; i < cr_MB_x; i++)
  574.         mpr[j][i]=(imgpel) pred;
  575.     }
  576.     break;
  577.   case VERT_PRED_8:
  578.     // Vertical Prediction
  579.     if (!up_avail)
  580.       error("unexpected VERT_PRED_8 chroma intra prediction mode",-1);
  581.     for (j = 0; j < cr_MB_y; j++)
  582.     {
  583.       memcpy(&(mpr[j][0]), &(imgUV[up.pos_y][up.pos_x]), cr_MB_x * sizeof(imgpel));
  584.     }
  585.     break;
  586.   case PLANE_8:
  587.     // plane prediction
  588.     if (!left_up_avail || !left_avail[0] || !left_avail[1] || !up_avail)
  589.       error("unexpected PLANE_8 chroma intra prediction mode",-1);
  590.     else
  591.     {
  592.       imgpel *upPred = &imgUV[up.pos_y][up.pos_x];
  593.       ih = cr_MB_x2 * (upPred[cr_MB_x - 1] - imgUV[left[0].pos_y][left[0].pos_x]);
  594.       for (i = 0; i < cr_MB_x2 - 1; i++)
  595.         ih += (i + 1) * (upPred[cr_MB_x2 + i] - upPred[cr_MB_x2 - 2 - i]);
  596.       iv = cr_MB_y2 * (imgUV[left[cr_MB_y].pos_y][left[cr_MB_y].pos_x] - imgUV[left[0].pos_y][left[0].pos_x]);
  597.       for (i = 0; i < cr_MB_y2 - 1; i++)
  598.         iv += (i + 1)*(imgUV[left[cr_MB_y2 + 1 + i].pos_y][left[cr_MB_y2 + 1 + i].pos_x] -
  599.         imgUV[left[cr_MB_y2 - 1 - i].pos_y][left[cr_MB_y2 - 1 - i].pos_x]);
  600.       ib= ((cr_MB_x == 8 ? 17 : 5) * ih + 2 * cr_MB_x)>>(cr_MB_x == 8 ? 5 : 6);
  601.       ic= ((cr_MB_y == 8 ? 17 : 5) * iv + 2 * cr_MB_y)>>(cr_MB_y == 8 ? 5 : 6);
  602.       iaa=16*(imgUV[left[cr_MB_y].pos_y][left[cr_MB_y].pos_x] + upPred[cr_MB_x-1]);
  603.       for (j = 0; j < cr_MB_y; j++)
  604.         for (i = 0; i < cr_MB_x; i++)
  605.           mpr[j][i]=(imgpel) iClip1(max_imgpel_value, ((iaa + (i - cr_MB_x2 + 1) * ib + (j - cr_MB_y2 + 1) * ic + 16) >> 5));  }
  606.     break;
  607.   default:
  608.     error("illegal chroma intra prediction mode", 600);
  609.     break;
  610.   }
  611. }
  612. /*!
  613.  ***********************************************************************
  614.  * brief
  615.  *    Inverse 4x4 transformation, transforms cof to m7
  616.  ***********************************************************************
  617.  */
  618. void itrans4x4(ImageParameters *img, //!< image parameters
  619.                ColorPlane pl,              
  620.                int ioff,            //!< index to 4x4 block
  621.                int joff)            //!<
  622. {
  623.   static int i,j;
  624.   int max_imgpel_value = img->max_imgpel_value_comp[pl];
  625.   imgpel (*mpr)[MB_BLOCK_SIZE] = img->mb_pred[pl];
  626.   int    (*m7) [MB_BLOCK_SIZE] = img->mb_rres[pl];
  627.   inverse4x4(img->cof[pl],m7,joff,ioff);
  628.   for (j = joff; j < joff + BLOCK_SIZE; j++)
  629.   {
  630.     for (i = ioff; i < ioff + BLOCK_SIZE; i++)
  631.     {      
  632.       m7[j][i] = iClip1(max_imgpel_value, rshift_rnd_sf((m7[j][i] + ((long)mpr[j][i] << DQ_BITS)), DQ_BITS));
  633.     }
  634.   }
  635. }
  636. /*!
  637.  ***********************************************************************
  638.  * brief
  639.  *    Inverse 4x4 lossless_qpprime transformation, transforms cof to m7
  640.  ***********************************************************************
  641.  */
  642. void itrans4x4_ls(ImageParameters *img, //!< image parameters
  643.                   ColorPlane pl,        //!< Color plane (for 4:4:4)                  
  644.                   int ioff,             //!< index to 4x4 block
  645.                   int joff)             //!<
  646. {
  647.   static int i,j;
  648.   int max_imgpel_value = img->max_imgpel_value_comp[pl];
  649.   imgpel (*mpr)[16] = img->mb_pred[pl];
  650.   int    ( *m7)[16] = img->mb_rres [pl];
  651.   inverse4x4(img->cof[pl],m7,joff,ioff);
  652.   for (j = joff; j < joff + BLOCK_SIZE; j++)
  653.   {
  654.     for (i = ioff; i < ioff + BLOCK_SIZE; i++)
  655.     {      
  656.       m7[j][i] = iClip1(max_imgpel_value, rshift_rnd_sf((m7[j][i] + ((long)mpr[j][i] << DQ_BITS)), DQ_BITS));
  657.     }
  658.   }
  659. }
  660. /*!
  661. ************************************************************************
  662. * brief
  663. *    Inverse residual DPCM for Intra lossless coding
  664. *
  665. * par Input:
  666. *    ioff_x,joff_y: Block position inside a macro block (0,4,8,12).
  667. ************************************************************************
  668. */  //For residual DPCM
  669. void Inv_Residual_trans_4x4(ImageParameters *img, //!< image parameters
  670.                             ColorPlane pl,                            
  671.                             int ioff,            //!< index to 4x4 block
  672.                             int joff)
  673. {
  674.   int i,j;
  675.   int temp[4][4];
  676.   imgpel (*mpr)[MB_BLOCK_SIZE] = img->mb_pred[pl];
  677.   int    (*m7) [MB_BLOCK_SIZE] = img->mb_rres[pl];
  678.   int    (*cof)[MB_BLOCK_SIZE] = img->cof[pl];
  679.   if(ipmode_DPCM==VERT_PRED)
  680.   {
  681.     for(i=0; i<4; i++)
  682.     {
  683.       temp[0][i] = cof[joff + 0][ioff + i];
  684.       temp[1][i] = cof[joff + 1][ioff + i] + temp[0][i];
  685.       temp[2][i] = cof[joff + 2][ioff + i] + temp[1][i];
  686.       temp[3][i] = cof[joff + 3][ioff + i] + temp[2][i];
  687.     }
  688.     for(i=0; i<4; i++)
  689.     {
  690.       m7[joff    ][ioff + i]=temp[0][i];
  691.       m7[joff + 1][ioff + i]=temp[1][i];
  692.       m7[joff + 2][ioff + i]=temp[2][i];
  693.       m7[joff + 3][ioff + i]=temp[3][i];
  694.     }
  695.   }
  696.   else if(ipmode_DPCM==HOR_PRED)
  697.   {
  698.     for(j=0; j<4; j++)
  699.     {
  700.       temp[j][0] = cof[joff + j][ioff    ];
  701.       temp[j][1] = cof[joff + j][ioff + 1] + temp[j][0];
  702.       temp[j][2] = cof[joff + j][ioff + 2] + temp[j][1];
  703.       temp[j][3] = cof[joff + j][ioff + 3] + temp[j][2];
  704.     }
  705.     for(j=0; j<4; j++)
  706.     {
  707.       m7[joff + j][ioff    ]=temp[j][0];
  708.       m7[joff + j][ioff + 1]=temp[j][1];
  709.       m7[joff + j][ioff + 2]=temp[j][2];
  710.       m7[joff + j][ioff + 3]=temp[j][3];
  711.     }
  712.   }
  713.   else
  714.   {
  715.     for (j = 0; j < BLOCK_SIZE; j++)
  716.       for (i = 0; i < BLOCK_SIZE; i++)
  717.         m7[joff+j][ioff+i] = cof[joff+j][ioff+i];
  718.   }
  719.   for (j = 0; j < BLOCK_SIZE; j++)
  720.     for (i = 0; i < BLOCK_SIZE; i++)
  721.       m7[joff+j][ioff+i] +=  (long)mpr[joff+j][ioff+i];
  722. }
  723. /*!
  724. ************************************************************************
  725. * brief
  726. *    Inverse residual DPCM for Intra lossless coding
  727. *
  728. * par Input:
  729. *    ioff_x,joff_y: Block position inside a macro block (0,8).
  730. ************************************************************************
  731. */
  732. //For residual DPCM
  733. void Inv_Residual_trans_8x8(ImageParameters *img, Macroblock *currMB, ColorPlane pl, int ioff,int joff)
  734. {
  735.   int i, j;
  736.   int temp[8][8];
  737.   imgpel (*mpr)[16] = img->mb_pred[pl];
  738.   int    (*m7) [16] = img->mb_rres[pl];
  739.   
  740.   if(ipmode_DPCM==VERT_PRED)
  741.     {
  742.       for(i=0; i<8; i++)
  743.       {
  744.         temp[0][i] = m7[joff + 0][ioff + i];
  745.         temp[1][i] = m7[joff + 1][ioff + i] + temp[0][i];
  746.         temp[2][i] = m7[joff + 2][ioff + i] + temp[1][i];
  747.         temp[3][i] = m7[joff + 3][ioff + i] + temp[2][i];
  748.         temp[4][i] = m7[joff + 4][ioff + i] + temp[3][i];
  749.         temp[5][i] = m7[joff + 5][ioff + i] + temp[4][i];
  750.         temp[6][i] = m7[joff + 6][ioff + i] + temp[5][i];
  751.         temp[7][i] = m7[joff + 7][ioff + i] + temp[6][i];
  752.       }
  753.       for(i=0; i<8; i++)
  754.       {
  755.         m7[joff  ][ioff+i]=temp[0][i];
  756.         m7[joff+1][ioff+i]=temp[1][i];
  757.         m7[joff+2][ioff+i]=temp[2][i];
  758.         m7[joff+3][ioff+i]=temp[3][i];
  759.         m7[joff+4][ioff+i]=temp[4][i];
  760.         m7[joff+5][ioff+i]=temp[5][i];
  761.         m7[joff+6][ioff+i]=temp[6][i];
  762.         m7[joff+7][ioff+i]=temp[7][i];
  763.       }
  764.     }
  765.     else if(ipmode_DPCM==HOR_PRED)//HOR_PRED
  766.     {
  767.       for(i=0; i<8; i++)
  768.       {
  769.         temp[i][0] = m7[joff + i][ioff + 0];
  770.         temp[i][1] = m7[joff + i][ioff + 1] + temp[i][0];
  771.         temp[i][2] = m7[joff + i][ioff + 2] + temp[i][1];
  772.         temp[i][3] = m7[joff + i][ioff + 3] + temp[i][2];
  773.         temp[i][4] = m7[joff + i][ioff + 4] + temp[i][3];
  774.         temp[i][5] = m7[joff + i][ioff + 5] + temp[i][4];
  775.         temp[i][6] = m7[joff + i][ioff + 6] + temp[i][5];
  776.         temp[i][7] = m7[joff + i][ioff + 7] + temp[i][6];
  777.       }
  778.       for(i=0; i<8; i++)
  779.       {
  780.         m7[joff+i][ioff+0]=temp[i][0];
  781.         m7[joff+i][ioff+1]=temp[i][1];
  782.         m7[joff+i][ioff+2]=temp[i][2];
  783.         m7[joff+i][ioff+3]=temp[i][3];
  784.         m7[joff+i][ioff+4]=temp[i][4];
  785.         m7[joff+i][ioff+5]=temp[i][5];
  786.         m7[joff+i][ioff+6]=temp[i][6];
  787.         m7[joff+i][ioff+7]=temp[i][7];
  788.       }
  789.     }
  790.     for (j = 0; j < BLOCK_SIZE*2; j++)
  791.       for (i = 0; i < BLOCK_SIZE*2; i++)
  792.         m7[j+joff][i+ioff] +=  (long)mpr[j+joff][i+ioff];
  793. }
  794. /*!
  795.  ***********************************************************************
  796.  * brief
  797.  *    Luma DC inverse transform
  798.  ***********************************************************************
  799.  */ 
  800. void itrans_2(ImageParameters *img, Macroblock *currMB, ColorPlane pl) //!< image parameters
  801. {
  802.   int i,j;
  803.   int (*cof)[16] = img->cof[pl];
  804.   int qp_scaled = currMB->qp_scaled[pl];
  805.   int qp_per = qp_per_matrix[ qp_scaled ];
  806.   int qp_rem = qp_rem_matrix[ qp_scaled ];    
  807.   int invLevelScale = InvLevelScale4x4_Intra[pl][qp_rem][0][0];
  808.   // horizontal
  809.   for (j=0; j < 4;j++) 
  810.   {
  811.     for (i=0; i < 4;i++) 
  812.     {
  813.       M4[j][i]=cof[j<<2][i<<2];
  814.     }
  815.   }
  816.   ihadamard4x4(M4, M4);
  817.   // vertical
  818.   for (j=0; j < 4;j++) 
  819.   {
  820.     for (i=0; i < 4;i++) 
  821.     {
  822.       cof[j<<2][i<<2] = rshift_rnd((( M4[j][i] * invLevelScale) << qp_per), 6);
  823.     }
  824.   }
  825. }
  826. void itrans_sp(ImageParameters *img,  //!< image parameters
  827.                ColorPlane pl, 
  828.                int ioff,             //!< index to 4x4 block
  829.                int joff)              //!<
  830. {
  831.   int i,j;  
  832.   int ilev, icof;
  833.   int qp = (img->type == SI_SLICE) ? img->qpsp : img->qp;
  834.   int qp_per = qp_per_matrix[ qp ];
  835.   int qp_rem = qp_rem_matrix[ qp ];
  836.   int qp_per_sp = qp_per_matrix[ img->qpsp ];
  837.   int qp_rem_sp = qp_rem_matrix[ img->qpsp ];
  838.   int q_bits_sp = Q_BITS + qp_per_sp;
  839.   imgpel (*mpr)[16] = img->mb_pred[pl];
  840.   int    (*m7) [16] = img->mb_rres[pl];
  841.   int    (*cof)[16] = img->cof[pl];
  842.   int max_imgpel_value = img->max_imgpel_value_comp[pl];
  843.   
  844.   //int (*InvLevelScale4x4)[4] = InvLevelScale4x4_Intra[0][qp_rem];
  845.   const int (*InvLevelScale4x4)  [4] = dequant_coef[qp_rem];
  846.   const int (*InvLevelScale4x4SP)[4] = dequant_coef[qp_rem_sp];
  847.   for (j=0; j< BLOCK_SIZE; j++)
  848.     for (i=0; i< BLOCK_SIZE; i++)
  849.       PBlock[j][i] = mpr[j+joff][i+ioff];
  850.   forward4x4(PBlock, PBlock, 0, 0);
  851.   if(img->sp_switch || img->type==SI_SLICE)
  852.   {    
  853.     for (j=0;j<BLOCK_SIZE;j++)
  854.     {
  855.       for (i=0;i<BLOCK_SIZE;i++)
  856.       {
  857.         // recovering coefficient since they are already dequantized earlier
  858.         icof = (cof[joff + j][ioff + i] >> qp_per) / InvLevelScale4x4[j][i];
  859.         //icof = ((cof[joff + j][ioff + i] * quant_coef[qp_rem][j][i])>> (qp_per + 15)) ;
  860.         // icof  = rshift_rnd_sf(cof[joff + j][ioff + i] * quant_coef[qp_rem][j][i], qp_per + 15);
  861.         ilev  = rshift_rnd_sf(iabs(PBlock[j][i]) * quant_coef[qp_rem_sp][j][i], q_bits_sp);
  862.         ilev  = isignab(ilev, PBlock[j][i]) + icof;
  863.         cof[joff + j][ioff + i] = ilev * InvLevelScale4x4SP[j][i] << qp_per_sp;
  864.       }
  865.     }
  866.   }
  867.   else
  868.   {
  869.     for (j=0;j<BLOCK_SIZE;j++)
  870.     {
  871.       for (i=0;i<BLOCK_SIZE;i++)
  872.       {
  873.         // recovering coefficient since they are already dequantized earlier
  874.         icof = (cof[joff + j][ioff + i] >> qp_per) / InvLevelScale4x4[j][i];
  875.         //icof = cof[joff + j][ioff + i];
  876.         //icof  = rshift_rnd_sf(cof[joff + j][ioff + i] * quant_coef[qp_rem][j][i], qp_per + 15);
  877.         ilev = PBlock[j][i] + ((icof * InvLevelScale4x4[j][i] * A[j][i] <<  qp_per) >> 6);
  878.         ilev  = isign(ilev) * rshift_rnd_sf(iabs(ilev) * quant_coef[qp_rem_sp][j][i], q_bits_sp);
  879.         //cof[joff + j][ioff + i] = ilev * InvLevelScale4x4SP[j][i] << qp_per_sp;
  880.         cof[joff + j][ioff + i] = ilev * dequant_coef[qp_rem_sp][j][i] << qp_per_sp;
  881.       }
  882.     }
  883.   }
  884.   inverse4x4(cof, m7, joff, ioff);
  885.   for (j=0;j<BLOCK_SIZE;j++)
  886.     for (i=0;i<BLOCK_SIZE;i++)
  887.       m7[j + joff][i + ioff] = iClip1(max_imgpel_value,rshift_rnd_sf(m7[j + joff][i + ioff], DQ_BITS));
  888. }
  889. void itrans_sp_cr(ImageParameters *img, int uv)
  890. {
  891.   int i,j,ilev, icof, n2,n1;
  892.   int mp1[BLOCK_SIZE];
  893.   int qp_per,qp_rem;
  894.   int qp_per_sp,qp_rem_sp,q_bits_sp;
  895.   imgpel (*mpr)[MB_BLOCK_SIZE] = img->mb_pred[uv + 1];
  896.   int    (*cof)[MB_BLOCK_SIZE] = img->cof[uv + 1];
  897.   qp_per    = qp_per_matrix[ ((img->qp < 0 ? img->qp : QP_SCALE_CR[img->qp]))];
  898.   qp_rem    = qp_rem_matrix[ ((img->qp < 0 ? img->qp : QP_SCALE_CR[img->qp]))];
  899.   qp_per_sp = qp_per_matrix[ ((img->qpsp < 0 ? img->qpsp : QP_SCALE_CR[img->qpsp]))];
  900.   qp_rem_sp = qp_rem_matrix[ ((img->qpsp < 0 ? img->qpsp : QP_SCALE_CR[img->qpsp]))];
  901.   q_bits_sp = Q_BITS + qp_per_sp;  
  902.   if (img->type == SI_SLICE)
  903.   {
  904.     qp_per = qp_per_sp;
  905.     qp_rem = qp_rem_sp;
  906.   }
  907.   for (j=0; j < img->mb_cr_size_y; j++)
  908.   {
  909.     for (i=0; i < img->mb_cr_size_x; i++)
  910.     {
  911.       PBlock[j][i] = mpr[j][i];
  912.       mpr[j][i] = 0;
  913.     }
  914.   }
  915.   for (n2=0; n2 < img->mb_cr_size_y; n2 += BLOCK_SIZE)
  916.   {
  917.     for (n1=0; n1 < img->mb_cr_size_x; n1 += BLOCK_SIZE)
  918.     {
  919.       forward4x4(PBlock, PBlock, n2, n1);
  920.     }
  921.   }
  922.   //     2X2 transform of DC coeffs.
  923.   mp1[0] = (PBlock[0][0] + PBlock[4][0] + PBlock[0][4] + PBlock[4][4]);
  924.   mp1[1] = (PBlock[0][0] - PBlock[4][0] + PBlock[0][4] - PBlock[4][4]);
  925.   mp1[2] = (PBlock[0][0] + PBlock[4][0] - PBlock[0][4] - PBlock[4][4]);
  926.   mp1[3] = (PBlock[0][0] - PBlock[4][0] - PBlock[0][4] + PBlock[4][4]);
  927.   if (img->sp_switch || img->type==SI_SLICE)  
  928.   {        
  929.     for (n2=0; n2 < 2; n2 ++)
  930.     {
  931.       for (n1=0; n1 < 2; n1 ++)
  932.       {
  933.         //quantization fo predicted block
  934.         ilev = rshift_rnd_sf(iabs (mp1[n1+n2*2]) * quant_coef[qp_rem_sp][0][0], q_bits_sp + 1);
  935.         //addition
  936.         ilev = isignab(ilev, mp1[n1+n2*2]) + cof[n2<<2][n1<<2];
  937.         //dequantization
  938.         mp1[n1+n2*2] =ilev * dequant_coef[qp_rem_sp][0][0] << qp_per_sp;
  939.       }
  940.     }
  941.     for (n2 = 0; n2 < img->mb_cr_size_y; n2 += BLOCK_SIZE)
  942.     {
  943.       for (n1 = 0; n1 < img->mb_cr_size_x; n1 += BLOCK_SIZE)
  944.       {
  945.         for (j = 0; j < BLOCK_SIZE; j++)
  946.         {
  947.           for (i = 0; i < BLOCK_SIZE; i++)
  948.           {
  949.             // recovering coefficient since they are already dequantized earlier
  950.             cof[n2 + j][n1 + i] = (cof[n2 + j][n1 + i] >> qp_per) / dequant_coef[qp_rem][j][i];
  951.             //quantization of the predicted block
  952.             ilev = rshift_rnd_sf(iabs(PBlock[n2 + j][n1 + i]) * quant_coef[qp_rem_sp][j][i], q_bits_sp);
  953.             //addition of the residual
  954.             ilev = isignab(ilev,PBlock[n2 + j][n1 + i]) + cof[n2 + j][n1 + i];
  955.             // Inverse quantization
  956.             cof[n2 + j][n1 + i] = ilev * dequant_coef[qp_rem_sp][j][i] << qp_per_sp;
  957.           }
  958.         }
  959.       }
  960.     }
  961.   }
  962.   else
  963.   {
  964.     for (n2=0; n2 < 2; n2 ++)
  965.     {
  966.       for (n1=0; n1 < 2; n1 ++)
  967.       {
  968.         ilev = mp1[n1+n2*2] + (((cof[n2<<2][n1<<2] * dequant_coef[qp_rem][0][0] * A[0][0]) << qp_per) >> 5);
  969.         ilev = isign(ilev) * rshift_rnd_sf(iabs(ilev) * quant_coef[qp_rem_sp][0][0], q_bits_sp + 1);
  970.         //ilev = isignab(rshift_rnd_sf(iabs(ilev)* quant_coef[qp_rem_sp][0][0], q_bits_sp + 1), ilev);
  971.         mp1[n1+n2*2] = ilev * dequant_coef[qp_rem_sp][0][0] << qp_per_sp;
  972.       }
  973.     }
  974.     for (n2 = 0; n2 < img->mb_cr_size_y; n2 += BLOCK_SIZE)
  975.     {
  976.       for (n1 = 0; n1 < img->mb_cr_size_x; n1 += BLOCK_SIZE)
  977.       {
  978.         for (j = 0; j< BLOCK_SIZE; j++)
  979.         {
  980.           for (i = 0; i< BLOCK_SIZE; i++)
  981.           {
  982.             // recovering coefficient since they are already dequantized earlier
  983.             //icof = ((((cof[n2 + j][n1 + i] << 4) + qp_per/2)>> qp_per) + dequant_coef[qp_rem][j][i]/2) / dequant_coef[qp_rem][j][i];
  984.             icof = (cof[n2 + j][n1 + i] >> qp_per) / dequant_coef[qp_rem][j][i];
  985.             //dequantization and addition of the predicted block      
  986.             ilev = PBlock[n2 + j][n1 + i] + ((icof * dequant_coef[qp_rem][j][i] * A[j][i] << qp_per) >> 6);
  987.             //quantization and dequantization
  988.             ilev = isign(ilev) * rshift_rnd_sf(iabs(ilev) * quant_coef[qp_rem_sp][j][i], q_bits_sp);
  989.             cof[n2 + j][n1 + i] = ilev * dequant_coef[qp_rem_sp][j][i] << qp_per_sp;
  990.             //printf( " %d %d %dn", j, i, quant_coef[qp_rem_sp][j][i]);
  991.           }
  992.         }
  993.       }
  994.     }
  995.   }
  996.   cof[0][0] = (mp1[0] + mp1[1] + mp1[2] + mp1[3]) >> 1;
  997.   cof[0][4] = (mp1[0] + mp1[1] - mp1[2] - mp1[3]) >> 1;
  998.   cof[4][0] = (mp1[0] - mp1[1] + mp1[2] - mp1[3]) >> 1;
  999.   cof[4][4] = (mp1[0] - mp1[1] - mp1[2] + mp1[3]) >> 1;
  1000. }
  1001. static const byte decode_block_scan[16] = {0, 1, 4, 5, 2, 3, 6, 7, 8, 9, 12, 13, 10, 11, 14, 15};
  1002. void iMBtrans4x4(ColorPlane pl, ImageParameters *img, int smb)
  1003. {
  1004.   int i_pos;
  1005.   int jj, ii;
  1006.   int block8x8;
  1007.   int i, j, k;  
  1008.   int    (*m7) [16] = img->mb_rres[pl];
  1009.   imgpel **curr_img = pl ? &(dec_picture->imgUV[pl - 1][img->pix_y]): &dec_picture->imgY[img->pix_y];
  1010.   //For residual DPCM
  1011.   Boolean lossless_qpprime = (Boolean) (((img->qp + img->bitdepth_luma_qp_scale) == 0) && (img->lossless_qpprime_flag == 1));  
  1012.   // =============== 4x4 itrans ================
  1013.   // -------------------------------------------
  1014.   itrans_4x4 = (smb) ? itrans_sp : ((!lossless_qpprime) ? itrans4x4 : Inv_Residual_trans_4x4);
  1015.   i_pos = img->pix_x;
  1016.   for (block8x8=0; block8x8 < MB_BLOCK_SIZE; block8x8 += 4)
  1017.   { 
  1018.     for (k = block8x8; k < block8x8 + 4; k ++)
  1019.     {
  1020.       jj = ((decode_block_scan[k] >> 2) & 3) << BLOCK_SHIFT;
  1021.       ii = (decode_block_scan[k] & 3) << BLOCK_SHIFT;
  1022.       itrans_4x4(img, pl, ii, jj);   // use DCT transform and make 4x4 block m7 from prediction block mpr
  1023.       
  1024.       for(j = jj; j < jj + BLOCK_SIZE; j++)
  1025.       {
  1026.         for(i = ii; i < ii + BLOCK_SIZE; i++)
  1027.         {
  1028.           curr_img[j][i_pos + i] = (imgpel) m7[j][i]; // construct picture from 4x4 blocks
  1029.         }
  1030.       }
  1031.     }
  1032.   }
  1033. }
  1034. void iMBtrans8x8(ImageParameters *img,  Macroblock *currMB, ColorPlane pl)
  1035. {
  1036.   imgpel **curr_img = pl ? &dec_picture->imgUV[pl - 1][img->pix_y]: &dec_picture->imgY[img->pix_y];
  1037.   int    (*m7)[MB_BLOCK_SIZE] = img->mb_rres[pl];
  1038.   int block8x8;
  1039.   int i,j;
  1040.   int ioff, joff;
  1041.   for (block8x8=0; block8x8<4; block8x8++)
  1042.   {
  1043.     // =============== 8x8 itrans ================
  1044.     // -------------------------------------------
  1045.     ioff = 8 * (block8x8 & 0x01);
  1046.     joff = 8 * (block8x8 >> 1);
  1047.     itrans8x8(img, currMB, pl, ioff, joff);      // use DCT transform and make 8x8 block m7 from prediction block mpr
  1048.     for(j = joff; j < joff + 8; j++)
  1049.     {
  1050.       for(i = ioff; i < ioff + 8; i++)
  1051.       {
  1052.         curr_img[j][img->pix_x + i] = (imgpel) m7[j][i];
  1053.       }
  1054.     }
  1055.   }
  1056. }
  1057. void iTransform(ImageParameters *img,  Macroblock *currMB, ColorPlane pl, int need_4x4_transform, int smb)
  1058. {
  1059.   static imgpel (*mpr) [16];
  1060.   static imgpel **curr_img;
  1061.   int j, uv = pl-1; 
  1062.   if ((currMB->cbp & 15) != 0 || smb)
  1063.   {
  1064.     if(need_4x4_transform) // 4x4 inverse transform
  1065.     {
  1066.       iMBtrans4x4(pl, img, smb); 
  1067.     }
  1068.     else // 8x8 inverse transform
  1069.     {  
  1070.       iMBtrans8x8(img, currMB, pl);    
  1071.     }
  1072.   }
  1073.   else
  1074.   {
  1075.     mpr = img->mb_pred[pl]; 
  1076.     curr_img = pl ? &dec_picture->imgUV[uv][img->pix_y] : &dec_picture->imgY[img->pix_y];
  1077.     for(j = 0; j < MB_BLOCK_SIZE; j++)
  1078.     { 
  1079.       memcpy(&(curr_img[j][img->pix_x]), &(img->mb_pred[pl][j][0]), MB_BLOCK_SIZE * sizeof(imgpel));
  1080.     }
  1081.   }
  1082.   if ((dec_picture->chroma_format_idc != YUV400) && (dec_picture->chroma_format_idc != YUV444)) 
  1083.   {
  1084.     static imgpel **curUV, *cur_line;
  1085.     static int b4, b8;
  1086.     static int ioff, joff, ii, jj;
  1087.     static int (*m7UV)[16], *m7;
  1088.     for(uv=0;uv<2;uv++)
  1089.     {
  1090.       Boolean lossless_qpprime = (Boolean) ((img->lossless_qpprime_flag == 1) &&((img->qp + dec_picture->chroma_qp_offset[uv] + img->bitdepth_chroma_qp_scale) == 0));  
  1091.       itrans_4x4 = (!lossless_qpprime) ? itrans4x4 : itrans4x4_ls;
  1092.       // =============== 4x4 itrans ================
  1093.       // -------------------------------------------
  1094.       curUV = &dec_picture->imgUV[uv][img->pix_c_y]; 
  1095.       m7UV  = img->mb_rres[uv+1];
  1096.       if (!smb && (currMB->cbp>>4))
  1097.       {
  1098.         for (b8 = 0; b8 < (img->num_uv_blocks); b8++)
  1099.         {
  1100.           for(b4 = 0; b4 < 4; b4++)
  1101.           {
  1102.             joff = subblk_offset_y[1][b8][b4];
  1103.             ioff = subblk_offset_x[1][b8][b4];
  1104.             itrans_4x4(img, (ColorPlane) (uv + 1), ioff, joff);
  1105.             for(jj=joff;jj<joff + 4;jj++)
  1106.             {
  1107.               cur_line = &curUV[jj][img->pix_c_x + ioff];
  1108.               m7 = &m7UV[jj][ioff];
  1109.               for(ii=0;ii<4;ii++)
  1110.               {
  1111.                 *(cur_line++) = (imgpel) *(m7++);
  1112.               }
  1113.             }
  1114.           }
  1115.         }
  1116.       }
  1117.       else if (smb)
  1118.       {
  1119.         itrans_sp_cr(img, uv);
  1120.         for (joff = 0; joff < img->mb_cr_size_y; joff += BLOCK_SIZE)
  1121.         {
  1122.           for(ioff = 0; ioff < img->mb_cr_size_x ;ioff += BLOCK_SIZE)
  1123.           {
  1124.             itrans_4x4(img, (ColorPlane) (uv + 1), ioff, joff);
  1125.             for(jj=joff;jj<joff + 4;jj++)
  1126.               for(ii=ioff;ii<ioff + 4;ii++)
  1127.               {
  1128.                 curUV[jj][img->pix_c_x+ii]= (imgpel) m7UV[jj][ii];
  1129.               }
  1130.           }
  1131.         }
  1132.       }
  1133.       else 
  1134.       {
  1135.         mpr = img->mb_pred[uv + 1];
  1136.         for(jj = 0; jj < img->mb_size[1][1]; jj++)
  1137.           memcpy(&(curUV[jj][img->pix_c_x]), &(mpr[jj][0]), img->mb_size[1][0] * sizeof(imgpel));
  1138.       }
  1139.     }
  1140.   }
  1141. }