1
0

quant.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  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. int quant_intra_default[16] = {
  23. 6,13,20,28,
  24. 13,20,28,32,
  25. 20,28,32,37,
  26. 28,32,37,42
  27. };
  28. int quant_inter_default[16] = {
  29. 10,14,20,24,
  30. 14,20,24,27,
  31. 20,24,27,30,
  32. 24,27,30,34
  33. };
  34. int quant8_intra_default[64] = {
  35. 6,10,13,16,18,23,25,27,
  36. 10,11,16,18,23,25,27,29,
  37. 13,16,18,23,25,27,29,31,
  38. 16,18,23,25,27,29,31,33,
  39. 18,23,25,27,29,31,33,36,
  40. 23,25,27,29,31,33,36,38,
  41. 25,27,29,31,33,36,38,40,
  42. 27,29,31,33,36,38,40,42
  43. };
  44. int quant8_inter_default[64] = {
  45. 9,13,15,17,19,21,22,24,
  46. 13,13,17,19,21,22,24,25,
  47. 15,17,19,21,22,24,25,27,
  48. 17,19,21,22,24,25,27,28,
  49. 19,21,22,24,25,27,28,30,
  50. 21,22,24,25,27,28,30,32,
  51. 22,24,25,27,28,30,32,33,
  52. 24,25,27,28,30,32,33,35
  53. };
  54. int quant_org[16] = { //to be use if no q matrix is chosen
  55. 16,16,16,16,
  56. 16,16,16,16,
  57. 16,16,16,16,
  58. 16,16,16,16
  59. };
  60. int quant8_org[64] = { //to be use if no q matrix is chosen
  61. 16,16,16,16,16,16,16,16,
  62. 16,16,16,16,16,16,16,16,
  63. 16,16,16,16,16,16,16,16,
  64. 16,16,16,16,16,16,16,16,
  65. 16,16,16,16,16,16,16,16,
  66. 16,16,16,16,16,16,16,16,
  67. 16,16,16,16,16,16,16,16,
  68. 16,16,16,16,16,16,16,16
  69. };
  70. static void CalculateQuant8x8Param(Slice *currslice);
  71. /*!
  72. ***********************************************************************
  73. * \brief
  74. * Initiate quantization process arrays
  75. ***********************************************************************
  76. */
  77. void init_qp_process(VideoParameters *p_Vid)
  78. {
  79. int bitdepth_qp_scale = imax(p_Vid->bitdepth_luma_qp_scale,p_Vid->bitdepth_chroma_qp_scale);
  80. int i;
  81. // We should allocate memory outside of this process since maybe we will have a change of SPS
  82. // and we may need to recreate these. Currently should only support same bitdepth
  83. if (p_Vid->qp_per_matrix == NULL)
  84. if ((p_Vid->qp_per_matrix = (int*)malloc((MAX_QP + 1 + bitdepth_qp_scale)*sizeof(int))) == NULL)
  85. no_mem_exit("init_qp_process: p_Vid->qp_per_matrix");
  86. if (p_Vid->qp_rem_matrix == NULL)
  87. if ((p_Vid->qp_rem_matrix = (int*)malloc((MAX_QP + 1 + bitdepth_qp_scale)*sizeof(int))) == NULL)
  88. no_mem_exit("init_qp_process: p_Vid->qp_rem_matrix");
  89. for (i = 0; i < MAX_QP + bitdepth_qp_scale + 1; i++)
  90. {
  91. p_Vid->qp_per_matrix[i] = i / 6;
  92. p_Vid->qp_rem_matrix[i] = i % 6;
  93. }
  94. }
  95. void free_qp_matrices(VideoParameters *p_Vid)
  96. {
  97. if (p_Vid->qp_per_matrix != NULL)
  98. {
  99. free (p_Vid->qp_per_matrix);
  100. p_Vid->qp_per_matrix = NULL;
  101. }
  102. if (p_Vid->qp_rem_matrix != NULL)
  103. {
  104. free (p_Vid->qp_rem_matrix);
  105. p_Vid->qp_rem_matrix = NULL;
  106. }
  107. }
  108. /*!
  109. ************************************************************************
  110. * \brief
  111. * For mapping the q-matrix to the active id and calculate quantisation values
  112. *
  113. * \param currSlice
  114. * Slice pointer
  115. * \param pps
  116. * Picture parameter set
  117. * \param sps
  118. * Sequence parameter set
  119. *
  120. ************************************************************************
  121. */
  122. void assign_quant_params(Slice *currSlice)
  123. {
  124. seq_parameter_set_rbsp_t* sps = currSlice->active_sps;
  125. pic_parameter_set_rbsp_t* pps = currSlice->active_pps;
  126. int i;
  127. int n_ScalingList;
  128. if(!pps->pic_scaling_matrix_present_flag && !sps->seq_scaling_matrix_present_flag)
  129. {
  130. for(i=0; i<12; i++)
  131. currSlice->qmatrix[i] = (i < 6) ? quant_org : quant8_org;
  132. }
  133. else
  134. {
  135. n_ScalingList = (sps->chroma_format_idc != YUV444) ? 8 : 12;
  136. if(sps->seq_scaling_matrix_present_flag) // check sps first
  137. {
  138. for(i=0; i<n_ScalingList; i++)
  139. {
  140. if(i<6)
  141. {
  142. if(!sps->seq_scaling_list_present_flag[i]) // fall-back rule A
  143. {
  144. if(i==0)
  145. currSlice->qmatrix[i] = quant_intra_default;
  146. else if(i==3)
  147. currSlice->qmatrix[i] = quant_inter_default;
  148. else
  149. currSlice->qmatrix[i] = currSlice->qmatrix[i-1];
  150. }
  151. else
  152. {
  153. if(sps->UseDefaultScalingMatrix4x4Flag[i])
  154. currSlice->qmatrix[i] = (i<3) ? quant_intra_default : quant_inter_default;
  155. else
  156. currSlice->qmatrix[i] = sps->ScalingList4x4[i];
  157. }
  158. }
  159. else
  160. {
  161. if(!sps->seq_scaling_list_present_flag[i]) // fall-back rule A
  162. {
  163. if(i==6)
  164. currSlice->qmatrix[i] = quant8_intra_default;
  165. else if(i==7)
  166. currSlice->qmatrix[i] = quant8_inter_default;
  167. else
  168. currSlice->qmatrix[i] = currSlice->qmatrix[i-2];
  169. }
  170. else
  171. {
  172. if(sps->UseDefaultScalingMatrix8x8Flag[i-6])
  173. currSlice->qmatrix[i] = (i==6 || i==8 || i==10) ? quant8_intra_default:quant8_inter_default;
  174. else
  175. currSlice->qmatrix[i] = sps->ScalingList8x8[i-6];
  176. }
  177. }
  178. }
  179. }
  180. if(pps->pic_scaling_matrix_present_flag) // then check pps
  181. {
  182. for(i=0; i<n_ScalingList; i++)
  183. {
  184. if(i<6)
  185. {
  186. if(!pps->pic_scaling_list_present_flag[i]) // fall-back rule B
  187. {
  188. if (i==0)
  189. {
  190. if(!sps->seq_scaling_matrix_present_flag)
  191. currSlice->qmatrix[i] = quant_intra_default;
  192. }
  193. else if (i==3)
  194. {
  195. if(!sps->seq_scaling_matrix_present_flag)
  196. currSlice->qmatrix[i] = quant_inter_default;
  197. }
  198. else
  199. currSlice->qmatrix[i] = currSlice->qmatrix[i-1];
  200. }
  201. else
  202. {
  203. if(pps->UseDefaultScalingMatrix4x4Flag[i])
  204. currSlice->qmatrix[i] = (i<3) ? quant_intra_default:quant_inter_default;
  205. else
  206. currSlice->qmatrix[i] = pps->ScalingList4x4[i];
  207. }
  208. }
  209. else
  210. {
  211. if(!pps->pic_scaling_list_present_flag[i]) // fall-back rule B
  212. {
  213. if (i==6)
  214. {
  215. if(!sps->seq_scaling_matrix_present_flag)
  216. currSlice->qmatrix[i] = quant8_intra_default;
  217. }
  218. else if(i==7)
  219. {
  220. if(!sps->seq_scaling_matrix_present_flag)
  221. currSlice->qmatrix[i] = quant8_inter_default;
  222. }
  223. else
  224. currSlice->qmatrix[i] = currSlice->qmatrix[i-2];
  225. }
  226. else
  227. {
  228. if(pps->UseDefaultScalingMatrix8x8Flag[i-6])
  229. currSlice->qmatrix[i] = (i==6 || i==8 || i==10) ? quant8_intra_default:quant8_inter_default;
  230. else
  231. currSlice->qmatrix[i] = pps->ScalingList8x8[i-6];
  232. }
  233. }
  234. }
  235. }
  236. }
  237. CalculateQuant4x4Param(currSlice);
  238. if(pps->transform_8x8_mode_flag)
  239. CalculateQuant8x8Param(currSlice);
  240. }
  241. /*!
  242. ************************************************************************
  243. * \brief
  244. * For calculating the quantisation values at frame level
  245. *
  246. ************************************************************************
  247. */
  248. void CalculateQuant4x4Param(Slice *currSlice)
  249. {
  250. int i, j, k, temp;
  251. for(k=0; k<6; k++)
  252. {
  253. for(i=0; i<4; i++)
  254. {
  255. for(j=0; j<4; j++)
  256. {
  257. temp = (i<<2)+j;
  258. currSlice->InvLevelScale4x4_Intra[0][k][i][j] = dequant_coef[k][i][j] * currSlice->qmatrix[0][temp];
  259. currSlice->InvLevelScale4x4_Intra[1][k][i][j] = dequant_coef[k][i][j] * currSlice->qmatrix[1][temp];
  260. currSlice->InvLevelScale4x4_Intra[2][k][i][j] = dequant_coef[k][i][j] * currSlice->qmatrix[2][temp];
  261. currSlice->InvLevelScale4x4_Inter[0][k][i][j] = dequant_coef[k][i][j] * currSlice->qmatrix[3][temp];
  262. currSlice->InvLevelScale4x4_Inter[1][k][i][j] = dequant_coef[k][i][j] * currSlice->qmatrix[4][temp];
  263. currSlice->InvLevelScale4x4_Inter[2][k][i][j] = dequant_coef[k][i][j] * currSlice->qmatrix[5][temp];
  264. }
  265. }
  266. }
  267. }
  268. /*!
  269. ************************************************************************
  270. * \brief
  271. * Calculate the quantisation and inverse quantisation parameters
  272. *
  273. ************************************************************************
  274. */
  275. static void CalculateQuant8x8Param(Slice *currSlice)
  276. {
  277. VideoParameters *p_Vid = currSlice->p_Vid;
  278. int i, j, k, temp;
  279. for(k=0; k<6; k++)
  280. {
  281. int x = 0;
  282. for(i=0; i<8; i++)
  283. {
  284. for(j=0; j<8; j++)
  285. {
  286. temp = (i<<3)+j;
  287. currSlice->InvLevelScale8x8_Intra[0][k][x] = dequant_coef8[k][x] * currSlice->qmatrix[6][temp];
  288. currSlice->InvLevelScale8x8_Inter[0][k][x] = dequant_coef8[k][x] * currSlice->qmatrix[7][temp];
  289. x++;
  290. }
  291. }
  292. }
  293. if( p_Vid->active_sps->chroma_format_idc == YUV444 ) // 4:4:4
  294. {
  295. for(k=0; k<6; k++)
  296. {
  297. int x=0;
  298. for(i=0; i<8; i++)
  299. {
  300. for(j=0; j<8; j++)
  301. {
  302. temp = (i<<3)+j;
  303. currSlice->InvLevelScale8x8_Intra[1][k][x] = dequant_coef8[k][x] * currSlice->qmatrix[8][temp];
  304. currSlice->InvLevelScale8x8_Inter[1][k][x] = dequant_coef8[k][x] * currSlice->qmatrix[9][temp];
  305. currSlice->InvLevelScale8x8_Intra[2][k][x] = dequant_coef8[k][x] * currSlice->qmatrix[10][temp];
  306. currSlice->InvLevelScale8x8_Inter[2][k][x] = dequant_coef8[k][x] * currSlice->qmatrix[11][temp];
  307. x++;
  308. }
  309. }
  310. }
  311. }
  312. }