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

Audio

开发平台:

Visual C++

  1. /*!
  2.  ***********************************************************************
  3.  *  file
  4.  *      quant.c
  5.  *
  6.  *  brief
  7.  *      Quantization functions
  8.  *
  9.  *  author
  10.  *      Main contributors (see contributors.h for copyright, address and affiliation details)
  11.  *
  12.  ***********************************************************************
  13.  */
  14. #include "contributors.h"
  15. #include "global.h"
  16. #include "memalloc.h"
  17. #include "block.h"
  18. #include "image.h"
  19. #include "mb_access.h"
  20. #include "transform.h"
  21. #include "quant.h"
  22. const int dequant_coef8[6][8][8] =
  23. {
  24.   {
  25.     {20,  19, 25, 19, 20, 19, 25, 19},
  26.     {19,  18, 24, 18, 19, 18, 24, 18},
  27.     {25,  24, 32, 24, 25, 24, 32, 24},
  28.     {19,  18, 24, 18, 19, 18, 24, 18},
  29.     {20,  19, 25, 19, 20, 19, 25, 19},
  30.     {19,  18, 24, 18, 19, 18, 24, 18},
  31.     {25,  24, 32, 24, 25, 24, 32, 24},
  32.     {19,  18, 24, 18, 19, 18, 24, 18}
  33.   },
  34.   {
  35.     {22,  21, 28, 21, 22, 21, 28, 21},
  36.     {21,  19, 26, 19, 21, 19, 26, 19},
  37.     {28,  26, 35, 26, 28, 26, 35, 26},
  38.     {21,  19, 26, 19, 21, 19, 26, 19},
  39.     {22,  21, 28, 21, 22, 21, 28, 21},
  40.     {21,  19, 26, 19, 21, 19, 26, 19},
  41.     {28,  26, 35, 26, 28, 26, 35, 26},
  42.     {21,  19, 26, 19, 21, 19, 26, 19}
  43.   },
  44.   {
  45.     {26,  24, 33, 24, 26, 24, 33, 24},
  46.     {24,  23, 31, 23, 24, 23, 31, 23},
  47.     {33,  31, 42, 31, 33, 31, 42, 31},
  48.     {24,  23, 31, 23, 24, 23, 31, 23},
  49.     {26,  24, 33, 24, 26, 24, 33, 24},
  50.     {24,  23, 31, 23, 24, 23, 31, 23},
  51.     {33,  31, 42, 31, 33, 31, 42, 31},
  52.     {24,  23, 31, 23, 24, 23, 31, 23}
  53.   },
  54.   {
  55.     {28,  26, 35, 26, 28, 26, 35, 26},
  56.     {26,  25, 33, 25, 26, 25, 33, 25},
  57.     {35,  33, 45, 33, 35, 33, 45, 33},
  58.     {26,  25, 33, 25, 26, 25, 33, 25},
  59.     {28,  26, 35, 26, 28, 26, 35, 26},
  60.     {26,  25, 33, 25, 26, 25, 33, 25},
  61.     {35,  33, 45, 33, 35, 33, 45, 33},
  62.     {26,  25, 33, 25, 26, 25, 33, 25}
  63.   },
  64.   {
  65.     {32,  30, 40, 30, 32, 30, 40, 30},
  66.     {30,  28, 38, 28, 30, 28, 38, 28},
  67.     {40,  38, 51, 38, 40, 38, 51, 38},
  68.     {30,  28, 38, 28, 30, 28, 38, 28},
  69.     {32,  30, 40, 30, 32, 30, 40, 30},
  70.     {30,  28, 38, 28, 30, 28, 38, 28},
  71.     {40,  38, 51, 38, 40, 38, 51, 38},
  72.     {30,  28, 38, 28, 30, 28, 38, 28}
  73.   },
  74.   {
  75.     {36,  34, 46, 34, 36, 34, 46, 34},
  76.     {34,  32, 43, 32, 34, 32, 43, 32},
  77.     {46,  43, 58, 43, 46, 43, 58, 43},
  78.     {34,  32, 43, 32, 34, 32, 43, 32},
  79.     {36,  34, 46, 34, 36, 34, 46, 34},
  80.     {34,  32, 43, 32, 34, 32, 43, 32},
  81.     {46,  43, 58, 43, 46, 43, 58, 43},
  82.     {34,  32, 43, 32, 34, 32, 43, 32}
  83.   }
  84. };
  85. //! Dequantization coefficients
  86. const int dequant_coef[6][4][4] = {
  87.   {
  88.     { 10, 13, 10, 13},
  89.     { 13, 16, 13, 16},
  90.     { 10, 13, 10, 13},
  91.     { 13, 16, 13, 16}},
  92.   {
  93.     { 11, 14, 11, 14},
  94.     { 14, 18, 14, 18},
  95.     { 11, 14, 11, 14},
  96.     { 14, 18, 14, 18}},
  97.   {
  98.     { 13, 16, 13, 16},
  99.     { 16, 20, 16, 20},
  100.     { 13, 16, 13, 16},
  101.     { 16, 20, 16, 20}},
  102.   {
  103.     { 14, 18, 14, 18},
  104.     { 18, 23, 18, 23},
  105.     { 14, 18, 14, 18},
  106.     { 18, 23, 18, 23}},
  107.   {
  108.     { 16, 20, 16, 20},
  109.     { 20, 25, 20, 25},
  110.     { 16, 20, 16, 20},
  111.     { 20, 25, 20, 25}},
  112.   {
  113.     { 18, 23, 18, 23},
  114.     { 23, 29, 23, 29},
  115.     { 18, 23, 18, 23},
  116.     { 23, 29, 23, 29}}
  117. };
  118. const int quant_coef[6][4][4] = {
  119.   {
  120.     { 13107,  8066, 13107,  8066},
  121.     {  8066,  5243,  8066,  5243},
  122.     { 13107,  8066, 13107,  8066},
  123.     {  8066,  5243,  8066,  5243}},
  124.   {
  125.     { 11916,  7490, 11916,  7490},
  126.     {  7490,  4660,  7490,  4660},
  127.     { 11916,  7490, 11916,  7490},
  128.     {  7490,  4660,  7490,  4660}},
  129.   {
  130.     { 10082,  6554, 10082,  6554},
  131.     {  6554,  4194,  6554,  4194},
  132.     { 10082,  6554, 10082,  6554},
  133.     {  6554,  4194,  6554,  4194}},
  134.   {
  135.     {  9362,  5825,  9362,  5825},
  136.     {  5825,  3647,  5825,  3647},
  137.     {  9362,  5825,  9362,  5825},
  138.     {  5825,  3647,  5825,  3647}},
  139.   {
  140.     {  8192,  5243,  8192,  5243},
  141.     {  5243,  3355,  5243,  3355},
  142.     {  8192,  5243,  8192,  5243},
  143.     {  5243,  3355,  5243,  3355}},
  144.   {
  145.     {  7282,  4559,  7282,  4559},
  146.     {  4559,  2893,  4559,  2893},
  147.     {  7282,  4559,  7282,  4559},
  148.     {  4559,  2893,  4559,  2893}}
  149. };
  150. const int A[4][4] = {
  151.   { 16, 20, 16, 20},
  152.   { 20, 25, 20, 25},
  153.   { 16, 20, 16, 20},
  154.   { 20, 25, 20, 25}
  155. };
  156. int quant_intra_default[16] = {
  157.    6,13,20,28,
  158.   13,20,28,32,
  159.   20,28,32,37,
  160.   28,32,37,42
  161. };
  162. int quant_inter_default[16] = {
  163.   10,14,20,24,
  164.   14,20,24,27,
  165.   20,24,27,30,
  166.   24,27,30,34
  167. };
  168. int quant8_intra_default[64] = {
  169.  6,10,13,16,18,23,25,27,
  170. 10,11,16,18,23,25,27,29,
  171. 13,16,18,23,25,27,29,31,
  172. 16,18,23,25,27,29,31,33,
  173. 18,23,25,27,29,31,33,36,
  174. 23,25,27,29,31,33,36,38,
  175. 25,27,29,31,33,36,38,40,
  176. 27,29,31,33,36,38,40,42
  177. };
  178. int quant8_inter_default[64] = {
  179.  9,13,15,17,19,21,22,24,
  180. 13,13,17,19,21,22,24,25,
  181. 15,17,19,21,22,24,25,27,
  182. 17,19,21,22,24,25,27,28,
  183. 19,21,22,24,25,27,28,30,
  184. 21,22,24,25,27,28,30,32,
  185. 22,24,25,27,28,30,32,33,
  186. 24,25,27,28,30,32,33,35
  187. };
  188. int quant_org[16] = { //to be use if no q matrix is chosen
  189. 16,16,16,16,
  190. 16,16,16,16,
  191. 16,16,16,16,
  192. 16,16,16,16
  193. };
  194. int quant8_org[64] = { //to be use if no q matrix is chosen
  195. 16,16,16,16,16,16,16,16,
  196. 16,16,16,16,16,16,16,16,
  197. 16,16,16,16,16,16,16,16,
  198. 16,16,16,16,16,16,16,16,
  199. 16,16,16,16,16,16,16,16,
  200. 16,16,16,16,16,16,16,16,
  201. 16,16,16,16,16,16,16,16,
  202. 16,16,16,16,16,16,16,16
  203. };
  204. int *qp_per_matrix;
  205. int *qp_rem_matrix;
  206. int  InvLevelScale4x4_Intra[3][6][4][4];
  207. int  InvLevelScale4x4_Inter[3][6][4][4];
  208. int  InvLevelScale8x8_Intra[3][6][8][8];
  209. int  InvLevelScale8x8_Inter[3][6][8][8];
  210. int  *qmatrix[12];
  211. /*!
  212.  ***********************************************************************
  213.  * brief
  214.  *    Initiate quantization process arrays
  215.  ***********************************************************************
  216.  */
  217. void init_qp_process(ImageParameters *img)
  218. {
  219.   int bitdepth_qp_scale = imax(img->bitdepth_luma_qp_scale,img->bitdepth_chroma_qp_scale);
  220.   int i;
  221.   // We should allocate memory outside of this process since maybe we will have a change of SPS 
  222.   // and we may need to recreate these. Currently should only support same bitdepth
  223.   if (qp_per_matrix == NULL)
  224.     if ((qp_per_matrix = (int*)malloc((MAX_QP + 1 +  bitdepth_qp_scale)*sizeof(int))) == NULL)
  225.       no_mem_exit("init_global_buffers: qp_per_matrix");
  226.   if (qp_rem_matrix == NULL)
  227.     if ((qp_rem_matrix = (int*)malloc((MAX_QP + 1 +  bitdepth_qp_scale)*sizeof(int))) == NULL)
  228.       no_mem_exit("init_global_buffers: qp_per_matrix");
  229.   for (i = 0; i < MAX_QP + bitdepth_qp_scale + 1; i++)
  230.   {
  231.     qp_per_matrix[i] = i / 6;
  232.     qp_rem_matrix[i] = i % 6;
  233.   }
  234. }
  235. /*!
  236.  ************************************************************************
  237.  * brief
  238.  *    For mapping the q-matrix to the active id and calculate quantisation values
  239.  *
  240.  * param pps
  241.  *    Picture parameter set
  242.  * param sps
  243.  *    Sequence parameter set
  244.  *
  245.  ************************************************************************
  246.  */
  247. void AssignQuantParam(pic_parameter_set_rbsp_t* pps, seq_parameter_set_rbsp_t* sps)
  248. {
  249.   int i;
  250.   int n_ScalingList;
  251.   if(!pps->pic_scaling_matrix_present_flag && !sps->seq_scaling_matrix_present_flag)
  252.   {
  253.     for(i=0; i<12; i++)
  254.       qmatrix[i] = (i < 6) ? quant_org : quant8_org;
  255.   }
  256.   else
  257.   {
  258.     n_ScalingList = (sps->chroma_format_idc != YUV444) ? 8 : 12;
  259.     if(sps->seq_scaling_matrix_present_flag) // check sps first
  260.     {
  261.       for(i=0; i<n_ScalingList; i++)
  262.       {
  263.         if(i<6)
  264.         {
  265.           if(!sps->seq_scaling_list_present_flag[i]) // fall-back rule A
  266.           {
  267.             if(i==0)
  268.               qmatrix[i] = quant_intra_default;
  269.             else if(i==3)
  270.               qmatrix[i] = quant_inter_default;
  271.             else
  272.               qmatrix[i] = qmatrix[i-1];
  273.           }
  274.           else
  275.           {
  276.             if(sps->UseDefaultScalingMatrix4x4Flag[i])
  277.               qmatrix[i] = (i<3) ? quant_intra_default : quant_inter_default;
  278.             else
  279.               qmatrix[i] = sps->ScalingList4x4[i];
  280.           }
  281.         }
  282.         else
  283.         {
  284.           if(!sps->seq_scaling_list_present_flag[i]) // fall-back rule A
  285.           {
  286.             if(i==6)
  287.               qmatrix[i] = quant8_intra_default;
  288.             else if(i==7)
  289.               qmatrix[i] = quant8_inter_default;
  290.             else
  291.               qmatrix[i] = qmatrix[i-2];
  292.           }
  293.           else
  294.           {
  295.             if(sps->UseDefaultScalingMatrix8x8Flag[i-6])
  296.               qmatrix[i] = (i==6 || i==8 || i==10) ? quant8_intra_default:quant8_inter_default;
  297.             else
  298.               qmatrix[i] = sps->ScalingList8x8[i-6];
  299.           }
  300.         }
  301.       }
  302.     }
  303.     if(pps->pic_scaling_matrix_present_flag) // then check pps
  304.     {
  305.       for(i=0; i<n_ScalingList; i++)
  306.       {
  307.         if(i<6)
  308.         {
  309.           if(!pps->pic_scaling_list_present_flag[i]) // fall-back rule B
  310.           {
  311.             if (i==0)
  312.             {
  313.               if(!sps->seq_scaling_matrix_present_flag)
  314.                 qmatrix[i] = quant_intra_default;
  315.             }
  316.             else if (i==3)
  317.             {
  318.               if(!sps->seq_scaling_matrix_present_flag)
  319.                 qmatrix[i] = quant_inter_default;
  320.             }
  321.             else
  322.               qmatrix[i] = qmatrix[i-1];
  323.           }
  324.           else
  325.           {
  326.             if(pps->UseDefaultScalingMatrix4x4Flag[i])
  327.               qmatrix[i] = (i<3) ? quant_intra_default:quant_inter_default;
  328.             else
  329.               qmatrix[i] = pps->ScalingList4x4[i];
  330.           }
  331.         }
  332.         else
  333.         {
  334.           if(!pps->pic_scaling_list_present_flag[i]) // fall-back rule B
  335.           {
  336.             if (i==6)
  337.             {
  338.               if(!sps->seq_scaling_matrix_present_flag)
  339.                 qmatrix[i] = quant8_intra_default;
  340.             }
  341.             else if(i==7)
  342.             {
  343.               if(!sps->seq_scaling_matrix_present_flag)
  344.                 qmatrix[i] = quant8_inter_default;
  345.             }
  346.             else  
  347.               qmatrix[i] = qmatrix[i-2];
  348.           }
  349.           else
  350.           {
  351.             if(pps->UseDefaultScalingMatrix8x8Flag[i-6])
  352.               qmatrix[i] = (i==6 || i==8 || i==10) ? quant8_intra_default:quant8_inter_default;
  353.             else
  354.               qmatrix[i] = pps->ScalingList8x8[i-6];
  355.           }
  356.         }
  357.       }
  358.     }
  359.   }
  360.   CalculateQuantParam();
  361.   if(pps->transform_8x8_mode_flag)
  362.     CalculateQuant8Param();
  363. }
  364. /*!
  365.  ************************************************************************
  366.  * brief
  367.  *    For calculating the quantisation values at frame level
  368.  *
  369.  ************************************************************************
  370.  */
  371. void CalculateQuantParam()
  372. {
  373.   int i, j, k, temp;
  374.   for(k=0; k<6; k++)
  375.   {
  376.     for(i=0; i<4; i++)
  377.     {
  378.       for(j=0; j<4; j++)
  379.       {
  380.         temp = (i<<2)+j;
  381.         InvLevelScale4x4_Intra[0][k][i][j] = dequant_coef[k][i][j] * qmatrix[0][temp];
  382.         InvLevelScale4x4_Intra[1][k][i][j] = dequant_coef[k][i][j] * qmatrix[1][temp];
  383.         InvLevelScale4x4_Intra[2][k][i][j] = dequant_coef[k][i][j] * qmatrix[2][temp];
  384.         InvLevelScale4x4_Inter[0][k][i][j] = dequant_coef[k][i][j] * qmatrix[3][temp];
  385.         InvLevelScale4x4_Inter[1][k][i][j] = dequant_coef[k][i][j] * qmatrix[4][temp];
  386.         InvLevelScale4x4_Inter[2][k][i][j] = dequant_coef[k][i][j] * qmatrix[5][temp];
  387.       }
  388.     }
  389.   }
  390. }
  391. /*!
  392.  ************************************************************************
  393.  * brief
  394.  *    Calculate the quantisation and inverse quantisation parameters
  395.  *
  396.  ************************************************************************
  397.  */
  398. void CalculateQuant8Param()
  399. {
  400.   int i, j, k, temp;
  401.   for(k=0; k<6; k++)
  402.   {
  403.     for(i=0; i<8; i++)
  404.     {
  405.       for(j=0; j<8; j++)
  406.       {
  407.         temp = (i<<3)+j;
  408.         InvLevelScale8x8_Intra[0][k][i][j] = dequant_coef8[k][i][j] * qmatrix[6][temp];
  409.         InvLevelScale8x8_Inter[0][k][i][j] = dequant_coef8[k][i][j] * qmatrix[7][temp];
  410.       }
  411.     }
  412.   }
  413.   if( active_sps->chroma_format_idc == 3 )  // 4:4:4
  414.   {
  415.     for(k=0; k<6; k++)
  416.     {
  417.       for(i=0; i<8; i++)
  418.       {
  419.         for(j=0; j<8; j++)
  420.         {
  421.           temp = (i<<3)+j;
  422.           InvLevelScale8x8_Intra[1][k][i][j] = dequant_coef8[k][i][j] * qmatrix[8][temp];
  423.           InvLevelScale8x8_Inter[1][k][i][j] = dequant_coef8[k][i][j] * qmatrix[9][temp];
  424.           InvLevelScale8x8_Intra[2][k][i][j] = dequant_coef8[k][i][j] * qmatrix[10][temp];
  425.           InvLevelScale8x8_Inter[2][k][i][j] = dequant_coef8[k][i][j] * qmatrix[11][temp];
  426.         }
  427.       }
  428.     }
  429.   }
  430. }