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

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file quant4x4.c
  4.  *
  5.  * brief
  6.  *    Quantization process for a 4x4 block
  7.  *
  8.  * author
  9.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10.  *    - Alexis Michael Tourapis                  <alexismt@ieee.org>
  11.  *    - Limin Liu                                <limin.liu@dolby.com>
  12.  *
  13.  *************************************************************************************
  14.  */
  15. #include "contributors.h"
  16. #include <math.h>
  17. #include "global.h"
  18. #include "image.h"
  19. #include "mb_access.h"
  20. #include "vlc.h"
  21. #include "transform.h"
  22. #include "mc_prediction.h"
  23. #include "q_offsets.h"
  24. #include "q_matrix.h"
  25. #include "quant4x4.h"
  26. /*!
  27.  ************************************************************************
  28.  * brief
  29.  *    Quantization process for All coefficients for a 4x4 block
  30.  *
  31.  * par Input:
  32.  *
  33.  * par Output:
  34.  *
  35.  ************************************************************************
  36.  */
  37. int quant_4x4_normal(int (*tblock)[16], int block_y, int block_x, int  qp,
  38.                      int*  ACLevel, int*  ACRun, 
  39.                      int **fadjust4x4, int **levelscale, int **invlevelscale, int **leveloffset,
  40.                      int *coeff_cost, const byte (*pos_scan)[2], const byte *c_cost, int is_cavlc)
  41. {
  42.   static int i,j, coeff_ctr;
  43.   static int *m7;
  44.   static int scaled_coeff;
  45.   int   level, run = 0;
  46.   int   nonzero = FALSE;
  47.   int   qp_per = qp_per_matrix[qp];
  48.   int   q_bits = Q_BITS + qp_per;
  49.   const byte *p_scan = &pos_scan[0][0];
  50.   int*  ACL = &ACLevel[0];
  51.   int*  ACR = &ACRun[0];
  52.   // Quantization
  53.   for (coeff_ctr = 0; coeff_ctr < 16; coeff_ctr++)
  54.   {
  55.     i = *p_scan++;  // horizontal position
  56.     j = *p_scan++;  // vertical position
  57.     m7 = &tblock[j][block_x + i];
  58.     if (*m7 != 0)
  59.     {
  60.       scaled_coeff = iabs (*m7) * levelscale[j][i];
  61.       level = (scaled_coeff + leveloffset[j][i]) >> q_bits;
  62.       if (level != 0)
  63.       {
  64.         if (is_cavlc)
  65.           level = imin(level, CAVLC_LEVEL_LIMIT);
  66.         *coeff_cost += (level > 1) ? MAX_VALUE : c_cost[run];
  67.         level  = isignab(level, *m7);
  68.         *m7    = rshift_rnd_sf(((level * invlevelscale[j][i]) << qp_per), 4);
  69.         // inverse scale can be alternative performed as follows to ensure 16bit
  70.         // arithmetic is satisfied.
  71.         // *m7 = (qp_per<4) ? rshift_rnd_sf((level*invlevelscale[j][i]),4-qp_per) : (level*invlevelscale[j][i])<<(qp_per-4);
  72.         *ACL++ = level;
  73.         *ACR++ = run; 
  74.         // reset zero level counter
  75.         run    = 0;
  76.         nonzero = TRUE;        
  77.       }
  78.       else
  79.       {
  80.         run++;
  81.         *m7 = 0;
  82.       }
  83.     }
  84.     else
  85.     {
  86.       run++;
  87.     } 
  88.   }
  89.   *ACL = 0;
  90.   return nonzero;
  91. }
  92. int quant_ac4x4_normal(int (*tblock)[16], int block_y, int block_x, int qp,                 
  93.                        int*  ACLevel, int*  ACRun, 
  94.                        int **fadjust4x4, int **levelscale, int **invlevelscale, int **leveloffset,
  95.                        int *coeff_cost, const byte (*pos_scan)[2], const byte *c_cost, int type, 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;
  104.   const byte *p_scan = &pos_scan[1][0];
  105.   int*  ACL = &ACLevel[0];
  106.   int*  ACR = &ACRun[0];
  107.   // Quantization
  108.   for (coeff_ctr = 1; coeff_ctr < 16; coeff_ctr++)
  109.   {
  110.     i = *p_scan++;  // horizontal position
  111.     j = *p_scan++;  // vertical position
  112.     m7 = &tblock[j][block_x + i];
  113.     if (*m7 != 0)
  114.     {
  115.       scaled_coeff = iabs (*m7) * levelscale[j][i];
  116.       level = (scaled_coeff + leveloffset[j][i]) >> q_bits;
  117.       if (level != 0)
  118.       {
  119.         if (is_cavlc)
  120.           level = imin(level, CAVLC_LEVEL_LIMIT);
  121.         *coeff_cost += (level > 1) ? MAX_VALUE : c_cost[run];
  122.         level  = isignab(level, *m7);
  123.         *m7    = rshift_rnd_sf(((level * invlevelscale[j][i]) << qp_per), 4);
  124.         // inverse scale can be alternative performed as follows to ensure 16bit
  125.         // arithmetic is satisfied.
  126.         // *m7 = (qp_per<4) ? rshift_rnd_sf((level*invlevelscale[j][i]),4-qp_per) : (level*invlevelscale[j][i])<<(qp_per-4);
  127.         *ACL++  = level;
  128.         *ACR++  = run; 
  129.         // reset zero level counter
  130.         run     = 0;
  131.         nonzero = TRUE;
  132.       }
  133.       else
  134.       {
  135.         run++;
  136.         *m7 = 0;
  137.       }
  138.     }
  139.     else
  140.     {
  141.       run++;
  142.     }          
  143.   }
  144.   *ACL = 0;
  145.   return nonzero;
  146. }
  147.  
  148. /*!
  149.  ************************************************************************
  150.  * brief
  151.  *    Quantization process for All coefficients for a 4x4 DC block
  152.  *
  153.  * par Input:
  154.  *
  155.  * par Output:
  156.  *
  157.  ************************************************************************
  158.  */
  159. int quant_dc4x4_normal(int (*tblock)[4], int qp, int* DCLevel, int* DCRun, 
  160.                        int levelscale, int invlevelscale, int leveloffset, const byte (*pos_scan)[2], int is_calvc)
  161. {
  162.   static int i,j, coeff_ctr;
  163.   static int *m7;
  164.   static int scaled_coeff;
  165.   int   level, run = 0;
  166.   int   nonzero = FALSE;  
  167.   int   qp_per = qp_per_matrix[qp];
  168.   int   q_bits = Q_BITS + qp_per + 1;
  169.   const byte *p_scan = &pos_scan[0][0];
  170.   int*  DCL = &DCLevel[0];
  171.   int*  DCR = &DCRun[0];
  172.   // Quantization
  173.   for (coeff_ctr = 0; coeff_ctr < 16; coeff_ctr++)
  174.   {
  175.     i = *p_scan++;  // horizontal position
  176.     j = *p_scan++;  // vertical position
  177.     m7 = &tblock[j][i];
  178.     if (*m7 != 0)
  179.     {    
  180.       scaled_coeff = iabs (*m7) * levelscale;
  181.       level = (scaled_coeff + (leveloffset << 1) ) >> q_bits;
  182.       if (level != 0)
  183.       {
  184.         if (is_calvc)
  185.           level = imin(level, CAVLC_LEVEL_LIMIT);
  186.         level = isignab(level, *m7);
  187.         *m7     = level;
  188.         *DCL++  = level;
  189.         *DCR++  = run;
  190.         // reset zero level counter
  191.         run     = 0;
  192.         nonzero = TRUE;
  193.       }
  194.       else
  195.       {
  196.         run++;
  197.         *m7 = 0;
  198.       }
  199.     }
  200.     else
  201.     {
  202.       run++;
  203.     }                    
  204.   }
  205.   *DCL = 0;
  206.   return nonzero;
  207. }