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

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file quantChroma_normal.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_normal(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.         run    = 0;
  64.         nonzero = TRUE;
  65.       }
  66.       else
  67.       {
  68.         run++;
  69.         *m7++ = 0;
  70.       }
  71.     }
  72.     else
  73.     {
  74.       run++;
  75.       m7++;
  76.     }
  77.   }
  78.   *DCL = 0;
  79.   return nonzero;
  80. }
  81. /*!
  82.  ************************************************************************
  83.  * brief
  84.  *    Quantization process for All coefficients for a 2x2 DC block
  85.  *
  86.  * par Input:
  87.  *
  88.  * par Output:
  89.  *
  90.  ************************************************************************
  91.  */
  92. int quant_dc4x2_normal(int (*tblock)[4], int qp, int* DCLevel, int* DCRun, 
  93.                        int **fadjust, int levelscale, int invlevelscale, int **leveloffset,
  94.                        const byte (*pos_scan)[2], int is_cavlc)
  95. {
  96.   static int i,j, coeff_ctr;
  97.   static int *m7;
  98.   static int scaled_coeff;
  99.   int   level, run = 0;
  100.   int   nonzero = FALSE;  
  101.   int   qp_per = qp_per_matrix[qp];
  102.   int   q_bits = Q_BITS + qp_per + 1;
  103.   const byte *p_scan = &pos_scan[0][0];
  104.   int*  DCL = &DCLevel[0];
  105.   int*  DCR = &DCRun[0];
  106.   // Quantization
  107.   for (coeff_ctr = 0; coeff_ctr < 8; coeff_ctr++)
  108.   {
  109.     j = *p_scan++;  // note that in this part, somehow coefficients were transposed from 2x4 to 4x2.
  110.     i = *p_scan++;  
  111.     m7 = &tblock[j][i];
  112.     if (*m7 != 0)
  113.     {
  114.       scaled_coeff = iabs (*m7) * levelscale;
  115.       level = (scaled_coeff + (leveloffset[0][0] << 1) ) >> q_bits;
  116.       if (level  != 0)
  117.       {
  118.         if (is_cavlc)
  119.           level = imin(level, CAVLC_LEVEL_LIMIT);
  120.         level = isignab(level, *m7);
  121.         *m7 = ((level * invlevelscale) << qp_per);
  122.         *DCL++ = level;
  123.         *DCR++ = run;
  124.         // reset zero level counter
  125.         run    = 0;
  126.         nonzero = TRUE;
  127.       }
  128.       else
  129.       {
  130.         run++;
  131.         *m7 = 0;
  132.       }
  133.     }
  134.     else
  135.     {
  136.       run++;
  137.     }
  138.   }
  139.   *DCL = 0;
  140.   return nonzero;
  141. }