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

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file quantChroma_around.c
  4.  *
  5.  * brief
  6.  *    Quantization process for a Chroma block
  7.  *
  8.  * author
  9.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10.  *    - Alexis Michael Tourapis                  <alexismt@ieee.org>
  11.  *
  12.  *************************************************************************************
  13.  */
  14. #include "contributors.h"
  15. #include <math.h>
  16. #include "global.h"
  17. #include "q_matrix.h"
  18. #include "quant4x4.h"
  19. #include "quantChroma.h"
  20. /*!
  21.  ************************************************************************
  22.  * brief
  23.  *    Quantization process for All coefficients for a 2x2 DC block
  24.  *
  25.  * par Input:
  26.  *
  27.  * par Output:
  28.  *
  29.  ************************************************************************
  30.  */
  31. int quant_dc2x2_around(int (*tblock)[4], int qp, int* DCLevel, int* DCRun, 
  32.                        int **fadjust, int levelscale, int invlevelscale, int **leveloffset,
  33.                        const byte (*pos_scan)[2], int is_cavlc)
  34. {
  35.   static int coeff_ctr;
  36.   static int *m7;
  37.   static int scaled_coeff;
  38.   int   level, run = 0;
  39.   int   nonzero = FALSE;  
  40.   int   qp_per = qp_per_matrix[qp];
  41.   int   q_bits = Q_BITS + qp_per + 1;
  42.   //const byte *p_scan = &pos_scan[0][0];
  43.   int*  DCL = &DCLevel[0];
  44.   int*  DCR = &DCRun[0];
  45.   m7 = *tblock;
  46.   // Quantization
  47.   for (coeff_ctr=0; coeff_ctr < 4; coeff_ctr++)
  48.   {
  49.     // we need to update leveloffset to a 4x1 array that would contain offset info for 
  50.     // every 2x2 DC position
  51.     if (*m7)
  52.     {
  53.       scaled_coeff = iabs (*m7) * levelscale;
  54.       level = (scaled_coeff + (leveloffset[0][0] << 1) ) >> q_bits;
  55.       if (level  != 0)
  56.       {
  57.         if (is_cavlc)
  58.           level = imin(level, CAVLC_LEVEL_LIMIT);
  59.         level = isignab(level, *m7);
  60.         *m7++ = ((level * invlevelscale) << qp_per);
  61.         *DCL++  = level;
  62.         *DCR++  = run;
  63.         // reset zero level counter
  64.         run     = 0;
  65.         nonzero = TRUE;
  66.       }
  67.       else
  68.       {
  69.         run++;
  70.         *m7++ = 0;
  71.       }
  72.     }
  73.     else
  74.     {
  75.       run++;
  76.       m7++;
  77.     }
  78.   }
  79.   *DCL = 0;
  80.   return nonzero;
  81. }
  82. /*!
  83.  ************************************************************************
  84.  * brief
  85.  *    Quantization process for All coefficients for a 2x2 DC block
  86.  *
  87.  * par Input:
  88.  *
  89.  * par Output:
  90.  *
  91.  ************************************************************************
  92.  */
  93. int quant_dc4x2_around(int (*tblock)[4], int qp, int* DCLevel, int* DCRun, 
  94.                        int **fadjust, int levelscale, int invlevelscale, int **leveloffset,
  95.                        const byte (*pos_scan)[2], int is_cavlc)
  96. {
  97.   static int i,j, coeff_ctr;
  98.   static int *m7;
  99.   static int scaled_coeff;
  100.   int   level, run = 0;
  101.   int   nonzero = FALSE;  
  102.   int   qp_per = qp_per_matrix[qp];
  103.   int   q_bits = Q_BITS + qp_per + 1;
  104.   const byte *p_scan = &pos_scan[0][0];
  105.   int*  DCL = &DCLevel[0];
  106.   int*  DCR = &DCRun[0];
  107.   // Quantization
  108.   for (coeff_ctr = 0; coeff_ctr < 8; coeff_ctr++)
  109.   {
  110.     j = *p_scan++;  // note that in this part, somehow coefficients were transposed from 2x4 to 4x2.
  111.     i = *p_scan++;  
  112.     m7 = &tblock[j][i];
  113.     if (*m7 != 0)
  114.     {
  115.       scaled_coeff = iabs (*m7) * levelscale;
  116.       level = (scaled_coeff + (leveloffset[0][0] << 1) ) >> q_bits;
  117.       if (level  != 0)
  118.       {
  119.         if (is_cavlc)
  120.           level = imin(level, CAVLC_LEVEL_LIMIT);
  121.         level = isignab(level, *m7);
  122.         *m7 = ((level * invlevelscale) << qp_per);
  123.         *DCL++  = level;
  124.         *DCR++  = run;
  125.         // reset zero level counter
  126.         run     = 0;
  127.         nonzero = TRUE;
  128.       }
  129.       else
  130.       {
  131.         run++;
  132.         *m7 = 0;
  133.       }
  134.     }
  135.     else
  136.     {
  137.       run++;
  138.     }
  139.   }
  140.   *DCL = 0;
  141.   return nonzero;
  142. }