TreeParser.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. /*
  2. * Copyright (c) 2021, Hunter Salyer <thefalsehonesty@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "TreeParser.h"
  7. #include "LookupTables.h"
  8. namespace Video::VP9 {
  9. int TreeParser::parse_tree(SyntaxElementType type)
  10. {
  11. auto tree_selection = select_tree(type);
  12. int value;
  13. if (tree_selection.is_single_value()) {
  14. value = tree_selection.get_single_value();
  15. } else {
  16. auto tree = tree_selection.get_tree_value();
  17. int n = 0;
  18. do {
  19. n = tree[n + m_bit_stream->read_bool(select_tree_probability(type, n >> 1))];
  20. } while (n > 0);
  21. value = -n;
  22. }
  23. count_syntax_element(type, value);
  24. return value;
  25. }
  26. /*
  27. * Select a tree value based on the type of syntax element being parsed, as well as some parser state, as specified in section 9.3.1
  28. */
  29. TreeParser::TreeSelection TreeParser::select_tree(SyntaxElementType type)
  30. {
  31. switch (type) {
  32. case SyntaxElementType::Partition:
  33. if (m_has_rows && m_has_cols)
  34. return { partition_tree };
  35. if (m_has_cols)
  36. return { cols_partition_tree };
  37. if (m_has_rows)
  38. return { rows_partition_tree };
  39. return { PartitionSplit };
  40. case SyntaxElementType::DefaultIntraMode:
  41. case SyntaxElementType::DefaultUVMode:
  42. case SyntaxElementType::IntraMode:
  43. case SyntaxElementType::SubIntraMode:
  44. case SyntaxElementType::UVMode:
  45. return { intra_mode_tree };
  46. case SyntaxElementType::SegmentID:
  47. return { segment_tree };
  48. case SyntaxElementType::Skip:
  49. case SyntaxElementType::SegIDPredicted:
  50. case SyntaxElementType::IsInter:
  51. case SyntaxElementType::CompMode:
  52. case SyntaxElementType::CompRef:
  53. case SyntaxElementType::SingleRefP1:
  54. case SyntaxElementType::SingleRefP2:
  55. case SyntaxElementType::MVSign:
  56. case SyntaxElementType::MVClass0Bit:
  57. case SyntaxElementType::MVBit:
  58. case SyntaxElementType::MoreCoefs:
  59. return { binary_tree };
  60. case SyntaxElementType::TXSize:
  61. if (m_max_tx_size == TX_32x32)
  62. return { tx_size_32_tree };
  63. if (m_max_tx_size == TX_16x16)
  64. return { tx_size_16_tree };
  65. return { tx_size_8_tree };
  66. case SyntaxElementType::InterMode:
  67. return { inter_mode_tree };
  68. case SyntaxElementType::InterpFilter:
  69. return { interp_filter_tree };
  70. case SyntaxElementType::MVJoint:
  71. return { mv_joint_tree };
  72. case SyntaxElementType::MVClass:
  73. return { mv_class_tree };
  74. case SyntaxElementType::MVClass0FR:
  75. case SyntaxElementType::MVFR:
  76. return { mv_fr_tree };
  77. case SyntaxElementType::MVClass0HP:
  78. case SyntaxElementType::MVHP:
  79. if (m_use_hp)
  80. return { binary_tree };
  81. return { 1 };
  82. case SyntaxElementType::Token:
  83. return { token_tree };
  84. }
  85. VERIFY_NOT_REACHED();
  86. }
  87. /*
  88. * Select a probability with which to read a boolean when decoding a tree, as specified in section 9.3.2
  89. */
  90. u8 TreeParser::select_tree_probability(SyntaxElementType type, u8 node)
  91. {
  92. switch (type) {
  93. case SyntaxElementType::Partition:
  94. return calculate_partition_probability(node);
  95. case SyntaxElementType::DefaultIntraMode:
  96. break;
  97. case SyntaxElementType::DefaultUVMode:
  98. break;
  99. case SyntaxElementType::IntraMode:
  100. break;
  101. case SyntaxElementType::SubIntraMode:
  102. break;
  103. case SyntaxElementType::UVMode:
  104. break;
  105. case SyntaxElementType::SegmentID:
  106. break;
  107. case SyntaxElementType::Skip:
  108. break;
  109. case SyntaxElementType::SegIDPredicted:
  110. break;
  111. case SyntaxElementType::IsInter:
  112. break;
  113. case SyntaxElementType::CompMode:
  114. break;
  115. case SyntaxElementType::CompRef:
  116. break;
  117. case SyntaxElementType::SingleRefP1:
  118. break;
  119. case SyntaxElementType::SingleRefP2:
  120. break;
  121. case SyntaxElementType::MVSign:
  122. break;
  123. case SyntaxElementType::MVClass0Bit:
  124. break;
  125. case SyntaxElementType::MVBit:
  126. break;
  127. case SyntaxElementType::TXSize:
  128. break;
  129. case SyntaxElementType::InterMode:
  130. break;
  131. case SyntaxElementType::InterpFilter:
  132. break;
  133. case SyntaxElementType::MVJoint:
  134. break;
  135. case SyntaxElementType::MVClass:
  136. break;
  137. case SyntaxElementType::MVClass0FR:
  138. break;
  139. case SyntaxElementType::MVClass0HP:
  140. break;
  141. case SyntaxElementType::MVFR:
  142. break;
  143. case SyntaxElementType::MVHP:
  144. break;
  145. case SyntaxElementType::Token:
  146. break;
  147. case SyntaxElementType::MoreCoefs:
  148. break;
  149. }
  150. TODO();
  151. }
  152. u8 TreeParser::calculate_partition_probability(u8 node)
  153. {
  154. int node2;
  155. if (m_has_rows && m_has_cols) {
  156. node2 = node;
  157. } else if (m_has_cols) {
  158. node2 = 1;
  159. } else {
  160. node2 = 2;
  161. }
  162. u32 above = 0;
  163. u32 left = 0;
  164. auto bsl = mi_width_log2_lookup[m_block_subsize];
  165. auto block_offset = mi_width_log2_lookup[Block_64x64] - bsl;
  166. for (auto i = 0; i < m_num_8x8; i++) {
  167. above |= m_above_partition_context[m_col + i];
  168. left |= m_left_partition_context[m_row + i];
  169. }
  170. above = (above & (1 << block_offset)) > 0;
  171. left = (left & (1 << block_offset)) > 0;
  172. m_ctx = bsl * 4 + left * 2 + above;
  173. if (m_frame_is_intra)
  174. return m_probability_tables.kf_partition_probs()[m_ctx][node2];
  175. return m_probability_tables.partition_probs()[m_ctx][node2];
  176. }
  177. void TreeParser::count_syntax_element(SyntaxElementType type, int value)
  178. {
  179. switch (type) {
  180. case SyntaxElementType::Partition:
  181. m_syntax_element_counter->m_counts_partition[m_ctx][value]++;
  182. break;
  183. case SyntaxElementType::IntraMode:
  184. break;
  185. case SyntaxElementType::SubIntraMode:
  186. break;
  187. case SyntaxElementType::UVMode:
  188. break;
  189. case SyntaxElementType::Skip:
  190. break;
  191. case SyntaxElementType::IsInter:
  192. break;
  193. case SyntaxElementType::CompMode:
  194. break;
  195. case SyntaxElementType::CompRef:
  196. break;
  197. case SyntaxElementType::SingleRefP1:
  198. break;
  199. case SyntaxElementType::SingleRefP2:
  200. break;
  201. case SyntaxElementType::MVSign:
  202. break;
  203. case SyntaxElementType::MVClass0Bit:
  204. break;
  205. case SyntaxElementType::MVBit:
  206. break;
  207. case SyntaxElementType::TXSize:
  208. break;
  209. case SyntaxElementType::InterMode:
  210. break;
  211. case SyntaxElementType::InterpFilter:
  212. break;
  213. case SyntaxElementType::MVJoint:
  214. break;
  215. case SyntaxElementType::MVClass:
  216. break;
  217. case SyntaxElementType::MVClass0FR:
  218. break;
  219. case SyntaxElementType::MVClass0HP:
  220. break;
  221. case SyntaxElementType::MVFR:
  222. break;
  223. case SyntaxElementType::MVHP:
  224. break;
  225. case SyntaxElementType::Token:
  226. break;
  227. case SyntaxElementType::MoreCoefs:
  228. break;
  229. case SyntaxElementType::DefaultIntraMode:
  230. case SyntaxElementType::DefaultUVMode:
  231. case SyntaxElementType::SegmentID:
  232. case SyntaxElementType::SegIDPredicted:
  233. break;
  234. }
  235. }
  236. TreeParser::TreeSelection::TreeSelection(const int* values)
  237. : m_is_single_value(false)
  238. , m_value { .m_tree = values }
  239. {
  240. }
  241. TreeParser::TreeSelection::TreeSelection(int value)
  242. : m_is_single_value(true)
  243. , m_value { .m_value = value }
  244. {
  245. }
  246. }