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

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file quant8x8_normal.c
  4.  *
  5.  * brief
  6.  *    Quantization process for a 8x8 block without any adaptation
  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 "image.h"
  18. #include "mb_access.h"
  19. #include "vlc.h"
  20. #include "transform.h"
  21. #include "mc_prediction.h"
  22. #include "q_offsets.h"
  23. #include "q_matrix.h"
  24. #include "quant8x8.h"
  25. /*!
  26.  ************************************************************************
  27.  * brief
  28.  *    Quantization process for All coefficients for a 8x8 block
  29.  *
  30.  * par Input:
  31.  *
  32.  * par Output:
  33.  *
  34.  ************************************************************************
  35.  */
  36. int quant_8x8_normal(int (*tblock)[16], int block_y, int block_x, int  qp,
  37.                      int*  ACLevel, int*  ACRun, 
  38.                      int **fadjust8x8, int **levelscale, int **invlevelscale, int **leveloffset,
  39.                      int *coeff_cost, const byte (*pos_scan)[2], const byte *c_cost)
  40. {
  41.   static int i,j, coeff_ctr;
  42.   static int *m7;
  43.   static int scaled_coeff;
  44.   int   level, run = 0;
  45.   int   nonzero = FALSE;
  46.   int   qp_per = qp_per_matrix[qp];
  47.   int   q_bits = Q_BITS_8 + qp_per;
  48.   const byte *p_scan = &pos_scan[0][0];
  49.   int*  ACL = &ACLevel[0];
  50.   int*  ACR = &ACRun[0];
  51.   // Quantization
  52.   for (coeff_ctr = 0; coeff_ctr < 64; coeff_ctr++)
  53.   {
  54.     i = *p_scan++;  // horizontal position
  55.     j = *p_scan++;  // vertical position
  56.     m7 = &tblock[j][block_x + i];
  57.     if (*m7 != 0)
  58.     {
  59.       scaled_coeff = iabs (*m7) * levelscale[j][i];
  60.       level = (scaled_coeff + leveloffset[j][i]) >> q_bits;
  61.       if (level != 0)
  62.       {
  63.         nonzero = TRUE;
  64.         *coeff_cost += (level > 1) ? MAX_VALUE : c_cost[run];
  65.         level  = isignab(level, *m7);
  66.         *m7    = rshift_rnd_sf(((level * invlevelscale[j][i]) << qp_per), 6);
  67.         *ACL++ = level;
  68.         *ACR++ = run; 
  69.         // reset zero level counter
  70.         run    = 0;
  71.       }
  72.       else
  73.       {
  74.         run++;
  75.         *m7 = 0;
  76.       }
  77.     }
  78.     else
  79.     {
  80.       run++;
  81.     }
  82.   }
  83.   *ACL = 0;
  84.   return nonzero;
  85. }
  86. /*!
  87.  ************************************************************************
  88.  * brief
  89.  *    Quantization process for All coefficients for a 8x8 block 
  90.  *    CAVLC version
  91.  *
  92.  * par Input:
  93.  *
  94.  * par Output:
  95.  *
  96.  ************************************************************************
  97.  */
  98. int quant_8x8cavlc_normal(int (*tblock)[16], int block_y, int block_x, int  qp,                 
  99.                    int***  cofAC, 
  100.                    int **fadjust8x8, int **levelscale, int **invlevelscale, int **leveloffset,
  101.                    int *coeff_cost, const byte (*pos_scan)[2], const byte *c_cost)
  102. {
  103.   static int i,j, k, coeff_ctr;
  104.   static int *m7;
  105.   static int scaled_coeff;  
  106.   int level, runs[4] = { 0 };
  107.   int nonzero = FALSE; 
  108.   int qp_per = qp_per_matrix[qp];  
  109.   int q_bits = Q_BITS_8 + qp_per;
  110.   const byte *p_scan = &pos_scan[0][0];
  111.   int*  ACL[4];  
  112.   int*  ACR[4];
  113.   for (k = 0; k < 4; k++)
  114.   {
  115.     ACL[k] = &cofAC[k][0][0];
  116.     ACR[k] = &cofAC[k][1][0];
  117.   }
  118.   // Quantization
  119.   for (coeff_ctr = 0; coeff_ctr < 16; coeff_ctr++)
  120.   {
  121.     for (k = 0; k < 4; k++)
  122.     {
  123.       i = *p_scan++;  // horizontal position
  124.       j = *p_scan++;  // vertical position
  125.       m7 = &tblock[j][block_x + i];
  126.       if (*m7 != 0)
  127.       {
  128.       scaled_coeff = iabs (*m7) * levelscale[j][i];
  129.       level = (scaled_coeff + leveloffset[j][i]) >> q_bits;
  130.       if (level != 0)
  131.       {
  132.         level = imin(level, CAVLC_LEVEL_LIMIT);
  133.         nonzero=TRUE;
  134.         *coeff_cost += (level > 1) ? MAX_VALUE : c_cost[runs[k]];
  135.         level  = isignab(level, *m7);
  136.         *m7    = rshift_rnd_sf(((level * invlevelscale[j][i]) << qp_per), 6);
  137.         *(ACL[k])++ = level;
  138.         *(ACR[k])++ = runs[k];
  139.         // reset zero level counter
  140.         runs[k] = 0;
  141.       }
  142.       else
  143.       {        
  144.           runs[k]++;
  145.           *m7 = 0;      
  146.         }
  147.       }
  148.       else
  149.       {
  150.         runs[k]++;
  151.       }
  152.     }
  153.   }
  154.   for(k = 0; k < 4; k++)
  155.     *(ACL[k]) = 0;
  156.   return nonzero;
  157. }