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

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file quantChroma_trellis.c
  4.  *
  5.  * brief
  6.  *    Quantization process for a Chroma block (trellis based)
  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. #include "rdoq.h"
  21. void rdoq_dc_cr(int (*tblock)[4], int qp_per, int qp_rem, int levelscale, int **leveloffset, const byte (*pos_scan)[2], int levelTrellis[16], int type);
  22. /*!
  23.  ************************************************************************
  24.  * brief
  25.  *    Quantization process for All coefficients for a 2x2 DC block
  26.  *
  27.  * par Input:
  28.  *
  29.  * par Output:
  30.  *
  31.  ************************************************************************
  32.  */
  33. int quant_dc2x2_trellis(int (*tblock)[4], int qp, int* DCLevel, int* DCRun, 
  34.                        int **fadjust, int levelscale, int invlevelscale, int **leveloffset,
  35.                        const byte (*pos_scan)[2], int is_cavlc)
  36. {
  37.   static int coeff_ctr;
  38.   static int *m7;
  39.   int   level, run = 0;
  40.   int   nonzero = FALSE;  
  41.   int   qp_per = qp_per_matrix[qp];
  42.   int   qp_rem = qp_rem_matrix[qp]; 
  43.   //const byte *p_scan = &pos_scan[0][0];
  44.   int*  DCL = &DCLevel[0];
  45.   int*  DCR = &DCRun[0];
  46.   static int levelTrellis[16];
  47.   rdoq_dc_cr(tblock,qp_per,qp_rem, levelscale, leveloffset,pos_scan, levelTrellis, CHROMA_DC);
  48.   m7 = *tblock;
  49.   // Quantization
  50.   for (coeff_ctr=0; coeff_ctr < 4; coeff_ctr++)
  51.   {
  52.     // we need to update leveloffset to a 4x1 array that would contain offset info for 
  53.     // every 2x2 DC position
  54.     if (*m7)
  55.     {
  56.       level = levelTrellis[coeff_ctr];
  57.       if (level  != 0)
  58.       {
  59.         if (is_cavlc)
  60.           level = imin(level, CAVLC_LEVEL_LIMIT);
  61.         level = isignab(level, *m7);
  62.         *m7++ = ((level * invlevelscale) << qp_per);
  63.         *DCL++  = level;
  64.         *DCR++  = run;
  65.         // reset zero level counter
  66.         run     = 0;
  67.         nonzero = TRUE;
  68.       }
  69.       else
  70.       {
  71.         run++;
  72.         *m7++ = 0;
  73.       }
  74.     }
  75.     else
  76.     {
  77.       run++;
  78.       m7++;
  79.     }
  80.   }
  81.   *DCL = 0;
  82.   return nonzero;
  83. }
  84. /*!
  85.  ************************************************************************
  86.  * brief
  87.  *    Quantization process for All coefficients for a 2x2 DC block
  88.  *
  89.  * par Input:
  90.  *
  91.  * par Output:
  92.  *
  93.  ************************************************************************
  94.  */
  95. int quant_dc4x2_trellis(int (*tblock)[4], int qp, int* DCLevel, int* DCRun, 
  96.                        int **fadjust, int levelscale, int invlevelscale, int **leveloffset,
  97.                        const byte (*pos_scan)[2], int is_cavlc)
  98. {
  99.   static int i,j, coeff_ctr;
  100.   static int *m7;
  101.   int   level, run = 0;
  102.   int   nonzero = FALSE;  
  103.   int   qp_per = qp_per_matrix[qp];
  104.   int   qp_rem = qp_rem_matrix[qp]; 
  105.   const byte *p_scan = &pos_scan[0][0];
  106.   int*  DCL = &DCLevel[0];
  107.   int*  DCR = &DCRun[0];
  108.   static int levelTrellis[16];
  109.   rdoq_dc_cr(tblock,qp_per,qp_rem, levelscale, leveloffset,pos_scan, levelTrellis, CHROMA_DC_2x4);
  110.   for (coeff_ctr=0; coeff_ctr < 4; coeff_ctr++)
  111.   {
  112.     j = *p_scan++;  // note that in this part, somehow coefficients were transposed from 2x4 to 4x2.
  113.     i = *p_scan++;  
  114.     m7 = &tblock[j][i];
  115.     if (*m7 != 0)
  116.     {
  117.       level = levelTrellis[coeff_ctr];
  118.       if (level  != 0)
  119.       {
  120.         if (is_cavlc)
  121.           level = imin(level, CAVLC_LEVEL_LIMIT);
  122.         level = isignab(level, *m7);
  123.         *m7 = ((level * invlevelscale) << qp_per);
  124.         *DCL++  = level;
  125.         *DCR++  = run;
  126.         // reset zero level counter
  127.         run     = 0;
  128.         nonzero = TRUE;
  129.       }
  130.       else
  131.       {
  132.         run++;
  133.         *m7 = 0;
  134.       }
  135.     }
  136.     else
  137.     {
  138.       run++;
  139.     }
  140.   }
  141.   *DCL = 0;
  142.   return nonzero;
  143. }
  144. /*!
  145. ************************************************************************
  146. * brief
  147. *    Rate distortion optimized Quantization process for 
  148. *    all coefficients in a chroma DC block
  149. *
  150. ************************************************************************
  151. */
  152. void rdoq_dc_cr(int (*tblock)[4], int qp_per, int qp_rem, int levelscale, int **leveloffset, const byte (*pos_scan)[2], int levelTrellis[], int type)
  153. {
  154.   const byte *p_scan = &pos_scan[0][0];
  155.   levelDataStruct levelData[16];
  156.   double  lambda_md = 0;
  157.   int kStart=0, kStop=0, noCoeff = 0, estBits;
  158.   Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  159.   if ((img->type==B_SLICE) && img->nal_reference_idc)
  160.   {
  161.     lambda_md = img->lambda_md[5][img->masterQP];  
  162.   }
  163.   else
  164.   {
  165.     lambda_md = img->lambda_md[img->type][img->masterQP]; 
  166.   }
  167.   noCoeff = init_trellis_data_DC_cr(tblock, qp_per, qp_rem, levelscale, leveloffset, p_scan, currMB, &levelData[0], &kStart, &kStop, type);
  168.   estBits = est_write_and_store_CBP_block_bit(currMB, type);
  169.   est_writeRunLevel_CABAC(levelData, levelTrellis, type, lambda_md, kStart, kStop, noCoeff, estBits);
  170. }