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

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file quant8x8_trellis.c
  4.  *
  5.  * brief
  6.  *    Quantization process for a 4x4 block using trellis based quantization
  7.  *
  8.  * author
  9.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10.  *
  11.  *************************************************************************************
  12.  */
  13. #include "contributors.h"
  14. #include <math.h>
  15. #include "global.h"
  16. #include "image.h"
  17. #include "mb_access.h"
  18. #include "vlc.h"
  19. #include "transform.h"
  20. #include "mc_prediction.h"
  21. #include "q_offsets.h"
  22. #include "q_matrix.h"
  23. #include "quant8x8.h"
  24. #include "rdoq.h"
  25. extern const byte SNGL_SCAN[16][2]; // need to revisit
  26. extern const byte FIELD_SCAN[16][2]; 
  27. extern const byte FIELD_SCAN8x8[64][2];
  28. extern const byte SNGL_SCAN8x8[64][2];
  29. void rdoq_8x8_CABAC(int (*tblock)[16], int block_y, int block_x, int qp_per, int qp_rem, 
  30.                     int **levelscale, int **leveloffset, const byte *p_scan, int levelTrellis[64]);
  31. void rdoq_8x8_CAVLC(int (*tblock)[16], int block_y, int block_x, int qp_per, int qp_rem, 
  32.                     int **levelscale, int **leveloffset, const byte *p_scan, int levelTrellis[4][16]);
  33. /*!
  34.  ************************************************************************
  35.  * brief
  36.  *    Quantization process for All coefficients for a 8x8 block
  37.  *
  38.  * par Input:
  39.  *
  40.  * par Output:
  41.  *
  42.  ************************************************************************
  43.  */
  44. int quant_8x8_trellis(int (*tblock)[16], int block_y, int block_x, int  qp,                
  45.                       int*  ACLevel, int*  ACRun, 
  46.                       int **fadjust8x8, int **levelscale, int **invlevelscale, int **leveloffset,
  47.                       int *coeff_cost, const byte (*pos_scan)[2], const byte *c_cost)
  48. {
  49.   static int i,j, coeff_ctr;
  50.   static int *m7;
  51.   static int scaled_coeff;
  52.   int   level, run = 0;
  53.   int   nonzero = FALSE;
  54.   int   qp_per = qp_per_matrix[qp];
  55.   int   qp_rem = qp_rem_matrix[qp];
  56.   const byte *p_scan = &pos_scan[0][0];
  57.   int*  ACL = &ACLevel[0];
  58.   int*  ACR = &ACRun[0];
  59.   int   levelTrellis[64];
  60.   rdoq_8x8_CABAC(tblock, block_y, block_x, qp_per, qp_rem, levelscale, leveloffset, p_scan, levelTrellis);
  61.   // Quantization
  62.   for (coeff_ctr = 0; coeff_ctr < 64; coeff_ctr++)
  63.   {
  64.     i = *p_scan++;  // horizontal position
  65.     j = *p_scan++;  // vertical position
  66.     m7 = &tblock[j][block_x + i];
  67.     if (*m7 != 0)
  68.     {    
  69.       scaled_coeff = iabs (*m7) * levelscale[j][i];
  70.       level = levelTrellis[coeff_ctr];
  71.       if (level != 0)
  72.       {
  73.         nonzero = TRUE;
  74.         *coeff_cost += (level > 1) ? MAX_VALUE : c_cost[run];
  75.         level  = isignab(level, *m7);
  76.         *m7    = rshift_rnd_sf(((level * invlevelscale[j][i]) << qp_per), 6);
  77.         *ACL++ = level;
  78.         *ACR++ = run; 
  79.         // reset zero level counter
  80.         run    = 0;
  81.       }
  82.       else
  83.       {
  84.         run++;
  85.         *m7 = 0;
  86.       }      
  87.     }
  88.     else
  89.     {
  90.       run++;
  91.     }
  92.   }
  93.   *ACL = 0;
  94.   return nonzero;
  95. }
  96. /*!
  97.  ************************************************************************
  98.  * brief
  99.  *    Quantization process for All coefficients for a 8x8 block 
  100.  *    CAVLC version
  101.  *
  102.  * par Input:
  103.  *
  104.  * par Output:
  105.  *
  106.  ************************************************************************
  107.  */
  108. int quant_8x8cavlc_trellis(int (*tblock)[16], int block_y, int block_x, int  qp, int***  cofAC, 
  109.                            int **fadjust8x8, int **levelscale, int **invlevelscale, int **leveloffset,
  110.                            int *coeff_cost, const byte (*pos_scan)[2], const byte *c_cost)
  111. {
  112.   static int i,j, k, coeff_ctr;
  113.   static int *m7;
  114.   int level, runs[4] = { 0 };
  115.   int nonzero = FALSE; 
  116.   int qp_per = qp_per_matrix[qp];  
  117.   int qp_rem = qp_rem_matrix[qp];
  118.   const byte *p_scan = &pos_scan[0][0];
  119.   int*  ACL[4];  
  120.   int*  ACR[4];
  121.   int levelTrellis[4][16];
  122.   rdoq_8x8_CAVLC(tblock, block_y, block_x, qp_per, qp_rem, levelscale, leveloffset, p_scan, levelTrellis);
  123.   for (k = 0; k < 4; k++)
  124.   {
  125.     ACL[k] = &cofAC[k][0][0];
  126.     ACR[k] = &cofAC[k][1][0];
  127.   }
  128.   // Quantization
  129.   for (coeff_ctr = 0; coeff_ctr < 16; coeff_ctr++)
  130.   {
  131.     for (k = 0; k < 4; k++)
  132.     {
  133.       i = *p_scan++;  // horizontal position
  134.       j = *p_scan++;  // vertical position
  135.       m7 = &tblock[j][block_x + i];
  136.       if (m7 != 0)
  137.       {
  138.         level = levelTrellis[k][coeff_ctr];
  139.         if (level != 0)
  140.         {
  141.           nonzero=TRUE;
  142.           *coeff_cost += (level > 1) ? MAX_VALUE : c_cost[runs[k]];
  143.           level  = isignab(level, *m7);
  144.           *m7    = rshift_rnd_sf(((level * invlevelscale[j][i]) << qp_per), 6);
  145.           *(ACL[k])++ = level;
  146.           *(ACR[k])++ = runs[k];
  147.           // reset zero level counter
  148.           runs[k] = 0;
  149.         }
  150.         else
  151.         {        
  152.           runs[k]++;
  153.           *m7 = 0;      
  154.         }
  155.       }
  156.       else
  157.       {
  158.         runs[k]++;
  159.       }
  160.     }
  161.   }
  162.   for(k = 0; k < 4; k++)
  163.     *(ACL[k]) = 0;
  164.   return nonzero;
  165. }
  166. /*!
  167. ************************************************************************
  168. * brief
  169. *    Rate distortion optimized Quantization process for 
  170. *    all coefficients in a 8x8 block
  171. *
  172. ************************************************************************
  173. */
  174. void rdoq_8x8_CABAC(int (*tblock)[16], int block_y, int block_x,int qp_per, int qp_rem, 
  175.               int **levelscale, int **leveloffset, const byte *p_scan, int levelTrellis[64])
  176. {
  177.   levelDataStruct levelData[64];
  178.   double  lambda_md=0;
  179.   int kStart = 0, kStop = 0, noCoeff = 0;
  180.   Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  181.   if ((img->type==B_SLICE) && img->nal_reference_idc)
  182.   {
  183.     lambda_md = img->lambda_md[5][img->masterQP];  
  184.   }
  185.   else
  186.   {
  187.     lambda_md = img->lambda_md[img->type][img->masterQP]; 
  188.   }
  189.   noCoeff = init_trellis_data_8x8_CABAC(tblock, block_x, qp_per, qp_rem, levelscale, leveloffset, p_scan, currMB, &levelData[0], &kStart, &kStop, CABAC);
  190.   est_writeRunLevel_CABAC(levelData, levelTrellis, LUMA_8x8, lambda_md, kStart, kStop, noCoeff, 0);
  191. }
  192. /*!
  193. ************************************************************************
  194. * brief
  195. *    Rate distortion optimized Quantization process for 
  196. *    all coefficients in a 8x8 block
  197. *
  198. ************************************************************************
  199. */
  200. void rdoq_8x8_CAVLC(int (*tblock)[16], int block_y, int block_x, int qp_per, int qp_rem,
  201.                     int **levelscale, int **leveloffset, const byte *p_scan, int levelTrellis[4][16])
  202. {
  203.   int k;
  204.   levelDataStruct levelData[4][16]; 
  205.   double lambda_md;
  206.   Macroblock *currMB = &img->mb_data[img->current_mb_nr];
  207.   int b8 = ((block_y/8)<<1)+block_x/8;
  208.   if ((img->type==B_SLICE) && img->nal_reference_idc)
  209.   {
  210.     lambda_md = img->lambda_md[5][img->masterQP];  
  211.   }
  212.   else
  213.   {
  214.     lambda_md = img->lambda_md[img->type][img->masterQP]; 
  215.   }
  216.   init_trellis_data_8x8_CAVLC (tblock, block_x, qp_per, qp_rem, levelscale, leveloffset, p_scan, currMB, levelData);
  217.   for (k = 0; k < 4; k++)
  218.     est_RunLevel_CAVLC(levelData[k], levelTrellis[k], LUMA, b8, k, 16, lambda_md);
  219. }