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

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file quant8x8_around.c
  4.  *
  5.  * brief
  6.  *    Quantization process for a 8x8 block with adaptive rounding
  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_around(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.         fadjust8x8[j][block_x + i] = rshift_rnd_sf((AdaptRndWeight * (scaled_coeff - (level << q_bits))), (q_bits + 1));
  64.         nonzero = TRUE;
  65.         *coeff_cost += (level > 1) ? MAX_VALUE : c_cost[run];
  66.         level  = isignab(level, *m7);
  67.         *m7    = rshift_rnd_sf(((level * invlevelscale[j][i]) << qp_per), 6);
  68.         *ACL++ = level;
  69.         *ACR++ = run; 
  70.         // reset zero level counter
  71.         run    = 0;
  72.       }
  73.       else
  74.       {
  75.         fadjust8x8[j][block_x + i] = 0;
  76.         run++;
  77.         *m7 = 0;
  78.       }
  79.     }
  80.     else
  81.     {
  82.       fadjust8x8[j][block_x + i] = 0;
  83.       run++;
  84.     }
  85.   }
  86.   *ACL = 0;
  87.   return nonzero;
  88. }
  89. /*!
  90.  ************************************************************************
  91.  * brief
  92.  *    Quantization process for All coefficients for a 8x8 block 
  93.  *    CAVLC version
  94.  *
  95.  * par Input:
  96.  *
  97.  * par Output:
  98.  *
  99.  ************************************************************************
  100.  */
  101. int quant_8x8cavlc_around(int (*tblock)[16], int block_y, int block_x, int  qp,                 
  102.                           int***  cofAC, 
  103.                           int **fadjust8x8, int **levelscale, int **invlevelscale, int **leveloffset,
  104.                           int *coeff_cost, const byte (*pos_scan)[2], const byte *c_cost)
  105. {
  106.   static int i,j, k, coeff_ctr;
  107.   static int *m7;
  108.   static int scaled_coeff;  
  109.   int level, runs[4] = { 0 };
  110.   int nonzero = FALSE; 
  111.   int qp_per = qp_per_matrix[qp];  
  112.   int q_bits = Q_BITS_8 + qp_per;
  113.   const byte *p_scan = &pos_scan[0][0];
  114.   int*  ACL[4];  
  115.   int*  ACR[4];
  116.   for (k = 0; k < 4; k++)
  117.   {
  118.     ACL[k] = &cofAC[k][0][0];
  119.     ACR[k] = &cofAC[k][1][0];
  120.   }
  121.   // Quantization
  122.   for (coeff_ctr = 0; coeff_ctr < 16; coeff_ctr++)
  123.   {
  124.     for (k = 0; k < 4; k++)
  125.     {
  126.       i = *p_scan++;  // horizontal position
  127.       j = *p_scan++;  // vertical position
  128.       m7 = &tblock[j][block_x + i];
  129.       if (*m7 != 0)
  130.       {
  131.         scaled_coeff = iabs (*m7) * levelscale[j][i];
  132.         level = (scaled_coeff + leveloffset[j][i]) >> q_bits;
  133.         if (level != 0)
  134.         {
  135.           level = imin(level, CAVLC_LEVEL_LIMIT);
  136.           fadjust8x8[j][block_x + i] = rshift_rnd_sf((AdaptRndWeight * (scaled_coeff - (level << q_bits))), (q_bits + 1));
  137.           nonzero=TRUE;
  138.           *coeff_cost += (level > 1) ? MAX_VALUE : c_cost[runs[k]];
  139.           level  = isignab(level, *m7);
  140.           *m7    = rshift_rnd_sf(((level * invlevelscale[j][i]) << qp_per), 6);
  141.           *(ACL[k])++ = level;
  142.           *(ACR[k])++ = runs[k];
  143.           // reset zero level counter
  144.           runs[k] = 0;
  145.         }
  146.         else
  147.         {
  148.           fadjust8x8[j][block_x + i] = 0;
  149.           runs[k]++;
  150.           *m7 = 0;      
  151.         }
  152.       }
  153.       else
  154.       {
  155.         fadjust8x8[j][block_x + i] = 0;
  156.         runs[k]++;
  157.       }
  158.     }
  159.   }
  160.   for(k = 0; k < 4; k++)
  161.     *(ACL[k]) = 0;
  162.   return nonzero;
  163. }