TreeParser.cpp 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787
  1. /*
  2. * Copyright (c) 2021, Hunter Salyer <thefalsehonesty@gmail.com>
  3. * Copyright (c) 2022, Gregory Bertilson <zaggy1024@gmail.com>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include <AK/Function.h>
  8. #include "TreeParser.h"
  9. #include "Enums.h"
  10. #include "LookupTables.h"
  11. #include "Parser.h"
  12. namespace Video::VP9 {
  13. template<typename T>
  14. ErrorOr<T> TreeParser::parse_tree(SyntaxElementType type)
  15. {
  16. auto tree_selection = select_tree(type);
  17. int value;
  18. if (tree_selection.is_single_value()) {
  19. value = tree_selection.single_value();
  20. } else {
  21. auto tree = tree_selection.tree();
  22. int n = 0;
  23. do {
  24. n = tree[n + TRY(m_decoder.m_bit_stream->read_bool(select_tree_probability(type, n >> 1)))];
  25. } while (n > 0);
  26. value = -n;
  27. }
  28. count_syntax_element(type, value);
  29. return static_cast<T>(value);
  30. }
  31. template ErrorOr<int> TreeParser::parse_tree(SyntaxElementType);
  32. template ErrorOr<bool> TreeParser::parse_tree(SyntaxElementType);
  33. template ErrorOr<u8> TreeParser::parse_tree(SyntaxElementType);
  34. template ErrorOr<u32> TreeParser::parse_tree(SyntaxElementType);
  35. template ErrorOr<PredictionMode> TreeParser::parse_tree(SyntaxElementType);
  36. template ErrorOr<TXSize> TreeParser::parse_tree(SyntaxElementType);
  37. template ErrorOr<InterpolationFilter> TreeParser::parse_tree(SyntaxElementType);
  38. template ErrorOr<ReferenceMode> TreeParser::parse_tree(SyntaxElementType);
  39. template ErrorOr<Token> TreeParser::parse_tree(SyntaxElementType);
  40. template ErrorOr<MvClass> TreeParser::parse_tree(SyntaxElementType);
  41. template ErrorOr<MvJoint> TreeParser::parse_tree(SyntaxElementType);
  42. template<typename OutputType>
  43. inline ErrorOr<OutputType> parse_tree_new(BitStream& bit_stream, TreeParser::TreeSelection tree_selection, Function<u8(u8)> const& probability_getter)
  44. {
  45. if (tree_selection.is_single_value())
  46. return static_cast<OutputType>(tree_selection.single_value());
  47. int const* tree = tree_selection.tree();
  48. int n = 0;
  49. do {
  50. u8 node = n >> 1;
  51. n = tree[n + TRY(bit_stream.read_bool(probability_getter(node)))];
  52. } while (n > 0);
  53. return static_cast<OutputType>(-n);
  54. }
  55. inline void increment_counter(u8& counter)
  56. {
  57. counter = min(static_cast<u32>(counter) + 1, 255);
  58. }
  59. ErrorOr<Partition> TreeParser::parse_partition(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, bool has_rows, bool has_columns, BlockSubsize block_subsize, u8 num_8x8, Vector<u8> const& above_partition_context, Vector<u8> const& left_partition_context, u32 row, u32 column, bool frame_is_intra)
  60. {
  61. // Tree array
  62. TreeParser::TreeSelection tree = { PartitionSplit };
  63. if (has_rows && has_columns)
  64. tree = { partition_tree };
  65. else if (has_rows)
  66. tree = { rows_partition_tree };
  67. else if (has_columns)
  68. tree = { cols_partition_tree };
  69. // Probability array
  70. u32 above = 0;
  71. u32 left = 0;
  72. auto bsl = mi_width_log2_lookup[block_subsize];
  73. auto block_offset = mi_width_log2_lookup[Block_64x64] - bsl;
  74. for (auto i = 0; i < num_8x8; i++) {
  75. above |= above_partition_context[column + i];
  76. left |= left_partition_context[row + i];
  77. }
  78. above = (above & (1 << block_offset)) > 0;
  79. left = (left & (1 << block_offset)) > 0;
  80. auto context = bsl * 4 + left * 2 + above;
  81. u8 const* probabilities = frame_is_intra ? probability_table.kf_partition_probs()[context] : probability_table.partition_probs()[context];
  82. Function<u8(u8)> probability_getter = [&](u8 node) {
  83. if (has_rows && has_columns)
  84. return probabilities[node];
  85. if (has_columns)
  86. return probabilities[1];
  87. return probabilities[2];
  88. };
  89. auto value = TRY(parse_tree_new<Partition>(bit_stream, tree, probability_getter));
  90. increment_counter(counter.m_counts_partition[context][value]);
  91. return value;
  92. }
  93. /*
  94. * 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
  95. */
  96. TreeParser::TreeSelection TreeParser::select_tree(SyntaxElementType type)
  97. {
  98. switch (type) {
  99. case SyntaxElementType::DefaultIntraMode:
  100. case SyntaxElementType::DefaultUVMode:
  101. case SyntaxElementType::IntraMode:
  102. case SyntaxElementType::SubIntraMode:
  103. case SyntaxElementType::UVMode:
  104. return { intra_mode_tree };
  105. case SyntaxElementType::SegmentID:
  106. return { segment_tree };
  107. case SyntaxElementType::Skip:
  108. case SyntaxElementType::SegIDPredicted:
  109. case SyntaxElementType::IsInter:
  110. case SyntaxElementType::CompMode:
  111. case SyntaxElementType::CompRef:
  112. case SyntaxElementType::SingleRefP1:
  113. case SyntaxElementType::SingleRefP2:
  114. case SyntaxElementType::MVSign:
  115. case SyntaxElementType::MVClass0Bit:
  116. case SyntaxElementType::MVBit:
  117. case SyntaxElementType::MoreCoefs:
  118. return { binary_tree };
  119. case SyntaxElementType::TXSize:
  120. if (m_decoder.m_max_tx_size == TX_32x32)
  121. return { tx_size_32_tree };
  122. if (m_decoder.m_max_tx_size == TX_16x16)
  123. return { tx_size_16_tree };
  124. return { tx_size_8_tree };
  125. case SyntaxElementType::InterMode:
  126. return { inter_mode_tree };
  127. case SyntaxElementType::InterpFilter:
  128. return { interp_filter_tree };
  129. case SyntaxElementType::MVJoint:
  130. return { mv_joint_tree };
  131. case SyntaxElementType::MVClass:
  132. return { mv_class_tree };
  133. case SyntaxElementType::MVClass0FR:
  134. case SyntaxElementType::MVFR:
  135. return { mv_fr_tree };
  136. case SyntaxElementType::MVClass0HP:
  137. case SyntaxElementType::MVHP:
  138. if (m_decoder.m_use_hp)
  139. return { binary_tree };
  140. return { 1 };
  141. case SyntaxElementType::Token:
  142. return { token_tree };
  143. default:
  144. break;
  145. }
  146. VERIFY_NOT_REACHED();
  147. }
  148. /*
  149. * Select a probability with which to read a boolean when decoding a tree, as specified in section 9.3.2
  150. */
  151. u8 TreeParser::select_tree_probability(SyntaxElementType type, u8 node)
  152. {
  153. switch (type) {
  154. case SyntaxElementType::DefaultIntraMode:
  155. return calculate_default_intra_mode_probability(node);
  156. case SyntaxElementType::DefaultUVMode:
  157. return calculate_default_uv_mode_probability(node);
  158. case SyntaxElementType::IntraMode:
  159. return calculate_intra_mode_probability(node);
  160. case SyntaxElementType::SubIntraMode:
  161. return calculate_sub_intra_mode_probability(node);
  162. case SyntaxElementType::UVMode:
  163. return calculate_uv_mode_probability(node);
  164. case SyntaxElementType::SegmentID:
  165. return calculate_segment_id_probability(node);
  166. case SyntaxElementType::Skip:
  167. return calculate_skip_probability();
  168. case SyntaxElementType::SegIDPredicted:
  169. return calculate_seg_id_predicted_probability();
  170. case SyntaxElementType::IsInter:
  171. return calculate_is_inter_probability();
  172. case SyntaxElementType::CompMode:
  173. return calculate_comp_mode_probability();
  174. case SyntaxElementType::CompRef:
  175. return calculate_comp_ref_probability();
  176. case SyntaxElementType::SingleRefP1:
  177. return calculate_single_ref_p1_probability();
  178. case SyntaxElementType::SingleRefP2:
  179. return calculate_single_ref_p2_probability();
  180. case SyntaxElementType::MVSign:
  181. return m_decoder.m_probability_tables->mv_sign_prob()[m_mv_component];
  182. case SyntaxElementType::MVClass0Bit:
  183. return m_decoder.m_probability_tables->mv_class0_bit_prob()[m_mv_component];
  184. case SyntaxElementType::MVBit:
  185. VERIFY(m_mv_bit < MV_OFFSET_BITS);
  186. return m_decoder.m_probability_tables->mv_bits_prob()[m_mv_component][m_mv_bit];
  187. case SyntaxElementType::TXSize:
  188. return calculate_tx_size_probability(node);
  189. case SyntaxElementType::InterMode:
  190. return calculate_inter_mode_probability(node);
  191. case SyntaxElementType::InterpFilter:
  192. return calculate_interp_filter_probability(node);
  193. case SyntaxElementType::MVJoint:
  194. return m_decoder.m_probability_tables->mv_joint_probs()[node];
  195. case SyntaxElementType::MVClass:
  196. // Spec doesn't mention node, but the probabilities table has an extra dimension
  197. // so we will use node for that.
  198. return m_decoder.m_probability_tables->mv_class_probs()[m_mv_component][node];
  199. case SyntaxElementType::MVClass0FR:
  200. VERIFY(m_mv_class0_bit < CLASS0_SIZE);
  201. return m_decoder.m_probability_tables->mv_class0_fr_probs()[m_mv_component][m_mv_class0_bit][node];
  202. case SyntaxElementType::MVClass0HP:
  203. return m_decoder.m_probability_tables->mv_class0_hp_prob()[m_mv_component];
  204. case SyntaxElementType::MVFR:
  205. return m_decoder.m_probability_tables->mv_fr_probs()[m_mv_component][node];
  206. case SyntaxElementType::MVHP:
  207. return m_decoder.m_probability_tables->mv_hp_prob()[m_mv_component];
  208. case SyntaxElementType::Token:
  209. return calculate_token_probability(node);
  210. case SyntaxElementType::MoreCoefs:
  211. return calculate_more_coefs_probability();
  212. default:
  213. break;
  214. }
  215. VERIFY_NOT_REACHED();
  216. }
  217. #define ABOVE_FRAME_0 m_decoder.m_above_ref_frame[0]
  218. #define ABOVE_FRAME_1 m_decoder.m_above_ref_frame[1]
  219. #define LEFT_FRAME_0 m_decoder.m_left_ref_frame[0]
  220. #define LEFT_FRAME_1 m_decoder.m_left_ref_frame[1]
  221. #define AVAIL_U m_decoder.m_available_u
  222. #define AVAIL_L m_decoder.m_available_l
  223. #define ABOVE_INTRA m_decoder.m_above_intra
  224. #define LEFT_INTRA m_decoder.m_left_intra
  225. #define ABOVE_SINGLE m_decoder.m_above_single
  226. #define LEFT_SINGLE m_decoder.m_left_single
  227. u8 TreeParser::calculate_default_intra_mode_probability(u8 node)
  228. {
  229. PredictionMode above_mode, left_mode;
  230. if (m_decoder.m_mi_size >= Block_8x8) {
  231. above_mode = AVAIL_U
  232. ? m_decoder.m_sub_modes[m_decoder.get_image_index(m_decoder.m_mi_row - 1, m_decoder.m_mi_col)][2]
  233. : PredictionMode::DcPred;
  234. left_mode = AVAIL_L
  235. ? m_decoder.m_sub_modes[m_decoder.get_image_index(m_decoder.m_mi_row, m_decoder.m_mi_col - 1)][1]
  236. : PredictionMode::DcPred;
  237. } else {
  238. if (m_idy) {
  239. above_mode = m_decoder.m_block_sub_modes[m_idx];
  240. } else {
  241. above_mode = AVAIL_U
  242. ? m_decoder.m_sub_modes[m_decoder.get_image_index(m_decoder.m_mi_row - 1, m_decoder.m_mi_col)][2 + m_idx]
  243. : PredictionMode::DcPred;
  244. }
  245. if (m_idx) {
  246. left_mode = m_decoder.m_block_sub_modes[m_idy * 2];
  247. } else {
  248. left_mode = AVAIL_L
  249. ? m_decoder.m_sub_modes[m_decoder.get_image_index(m_decoder.m_mi_row, m_decoder.m_mi_col - 1)][1 + m_idy * 2]
  250. : PredictionMode::DcPred;
  251. }
  252. }
  253. return m_decoder.m_probability_tables->kf_y_mode_probs()[to_underlying(above_mode)][to_underlying(left_mode)][node];
  254. }
  255. u8 TreeParser::calculate_default_uv_mode_probability(u8 node)
  256. {
  257. return m_decoder.m_probability_tables->kf_uv_mode_prob()[to_underlying(m_decoder.m_y_mode)][node];
  258. }
  259. u8 TreeParser::calculate_intra_mode_probability(u8 node)
  260. {
  261. m_ctx = size_group_lookup[m_decoder.m_mi_size];
  262. return m_decoder.m_probability_tables->y_mode_probs()[m_ctx][node];
  263. }
  264. u8 TreeParser::calculate_sub_intra_mode_probability(u8 node)
  265. {
  266. m_ctx = 0;
  267. return m_decoder.m_probability_tables->y_mode_probs()[m_ctx][node];
  268. }
  269. u8 TreeParser::calculate_uv_mode_probability(u8 node)
  270. {
  271. m_ctx = to_underlying(m_decoder.m_y_mode);
  272. return m_decoder.m_probability_tables->uv_mode_probs()[m_ctx][node];
  273. }
  274. u8 TreeParser::calculate_segment_id_probability(u8 node)
  275. {
  276. return m_decoder.m_segmentation_tree_probs[node];
  277. }
  278. u8 TreeParser::calculate_skip_probability()
  279. {
  280. m_ctx = 0;
  281. if (AVAIL_U)
  282. m_ctx += m_decoder.m_skips[(m_decoder.m_mi_row - 1) * m_decoder.m_mi_cols + m_decoder.m_mi_col];
  283. if (AVAIL_L)
  284. m_ctx += m_decoder.m_skips[m_decoder.m_mi_row * m_decoder.m_mi_cols + m_decoder.m_mi_col - 1];
  285. return m_decoder.m_probability_tables->skip_prob()[m_ctx];
  286. }
  287. u8 TreeParser::calculate_seg_id_predicted_probability()
  288. {
  289. m_ctx = m_decoder.m_left_seg_pred_context[m_decoder.m_mi_row] + m_decoder.m_above_seg_pred_context[m_decoder.m_mi_col];
  290. return m_decoder.m_segmentation_pred_prob[m_ctx];
  291. }
  292. u8 TreeParser::calculate_is_inter_probability()
  293. {
  294. if (AVAIL_U && AVAIL_L) {
  295. m_ctx = (LEFT_INTRA && ABOVE_INTRA) ? 3 : LEFT_INTRA || ABOVE_INTRA;
  296. } else if (AVAIL_U || AVAIL_L) {
  297. m_ctx = 2 * (AVAIL_U ? ABOVE_INTRA : LEFT_INTRA);
  298. } else {
  299. m_ctx = 0;
  300. }
  301. return m_decoder.m_probability_tables->is_inter_prob()[m_ctx];
  302. }
  303. u8 TreeParser::calculate_comp_mode_probability()
  304. {
  305. if (AVAIL_U && AVAIL_L) {
  306. if (ABOVE_SINGLE && LEFT_SINGLE) {
  307. auto is_above_fixed = ABOVE_FRAME_0 == m_decoder.m_comp_fixed_ref;
  308. auto is_left_fixed = LEFT_FRAME_0 == m_decoder.m_comp_fixed_ref;
  309. m_ctx = is_above_fixed ^ is_left_fixed;
  310. } else if (ABOVE_SINGLE) {
  311. auto is_above_fixed = ABOVE_FRAME_0 == m_decoder.m_comp_fixed_ref;
  312. m_ctx = 2 + (is_above_fixed || ABOVE_INTRA);
  313. } else if (LEFT_SINGLE) {
  314. auto is_left_fixed = LEFT_FRAME_0 == m_decoder.m_comp_fixed_ref;
  315. m_ctx = 2 + (is_left_fixed || LEFT_INTRA);
  316. } else {
  317. m_ctx = 4;
  318. }
  319. } else if (AVAIL_U) {
  320. if (ABOVE_SINGLE) {
  321. m_ctx = ABOVE_FRAME_0 == m_decoder.m_comp_fixed_ref;
  322. } else {
  323. m_ctx = 3;
  324. }
  325. } else if (AVAIL_L) {
  326. if (LEFT_SINGLE) {
  327. m_ctx = LEFT_FRAME_0 == m_decoder.m_comp_fixed_ref;
  328. } else {
  329. m_ctx = 3;
  330. }
  331. } else {
  332. m_ctx = 1;
  333. }
  334. return m_decoder.m_probability_tables->comp_mode_prob()[m_ctx];
  335. }
  336. u8 TreeParser::calculate_comp_ref_probability()
  337. {
  338. auto fix_ref_idx = m_decoder.m_ref_frame_sign_bias[m_decoder.m_comp_fixed_ref];
  339. auto var_ref_idx = !fix_ref_idx;
  340. if (AVAIL_U && AVAIL_L) {
  341. if (ABOVE_INTRA && LEFT_INTRA) {
  342. m_ctx = 2;
  343. } else if (LEFT_INTRA) {
  344. if (ABOVE_SINGLE) {
  345. m_ctx = 1 + 2 * (ABOVE_FRAME_0 != m_decoder.m_comp_var_ref[1]);
  346. } else {
  347. m_ctx = 1 + 2 * (m_decoder.m_above_ref_frame[var_ref_idx] != m_decoder.m_comp_var_ref[1]);
  348. }
  349. } else if (ABOVE_INTRA) {
  350. if (LEFT_SINGLE) {
  351. m_ctx = 1 + 2 * (LEFT_FRAME_0 != m_decoder.m_comp_var_ref[1]);
  352. } else {
  353. m_ctx = 1 + 2 * (m_decoder.m_left_ref_frame[var_ref_idx] != m_decoder.m_comp_var_ref[1]);
  354. }
  355. } else {
  356. auto var_ref_above = m_decoder.m_above_ref_frame[ABOVE_SINGLE ? 0 : var_ref_idx];
  357. auto var_ref_left = m_decoder.m_left_ref_frame[LEFT_SINGLE ? 0 : var_ref_idx];
  358. if (var_ref_above == var_ref_left && m_decoder.m_comp_var_ref[1] == var_ref_above) {
  359. m_ctx = 0;
  360. } else if (LEFT_SINGLE && ABOVE_SINGLE) {
  361. if ((var_ref_above == m_decoder.m_comp_fixed_ref && var_ref_left == m_decoder.m_comp_var_ref[0])
  362. || (var_ref_left == m_decoder.m_comp_fixed_ref && var_ref_above == m_decoder.m_comp_var_ref[0])) {
  363. m_ctx = 4;
  364. } else if (var_ref_above == var_ref_left) {
  365. m_ctx = 3;
  366. } else {
  367. m_ctx = 1;
  368. }
  369. } else if (LEFT_SINGLE || ABOVE_SINGLE) {
  370. auto vrfc = LEFT_SINGLE ? var_ref_above : var_ref_left;
  371. auto rfs = ABOVE_SINGLE ? var_ref_above : var_ref_left;
  372. if (vrfc == m_decoder.m_comp_var_ref[1] && rfs != m_decoder.m_comp_var_ref[1]) {
  373. m_ctx = 1;
  374. } else if (rfs == m_decoder.m_comp_var_ref[1] && vrfc != m_decoder.m_comp_var_ref[1]) {
  375. m_ctx = 2;
  376. } else {
  377. m_ctx = 4;
  378. }
  379. } else if (var_ref_above == var_ref_left) {
  380. m_ctx = 4;
  381. } else {
  382. m_ctx = 2;
  383. }
  384. }
  385. } else if (AVAIL_U) {
  386. if (ABOVE_INTRA) {
  387. m_ctx = 2;
  388. } else {
  389. if (ABOVE_SINGLE) {
  390. m_ctx = 3 * (ABOVE_FRAME_0 != m_decoder.m_comp_var_ref[1]);
  391. } else {
  392. m_ctx = 4 * (m_decoder.m_above_ref_frame[var_ref_idx] != m_decoder.m_comp_var_ref[1]);
  393. }
  394. }
  395. } else if (AVAIL_L) {
  396. if (LEFT_INTRA) {
  397. m_ctx = 2;
  398. } else {
  399. if (LEFT_SINGLE) {
  400. m_ctx = 3 * (LEFT_FRAME_0 != m_decoder.m_comp_var_ref[1]);
  401. } else {
  402. m_ctx = 4 * (m_decoder.m_left_ref_frame[var_ref_idx] != m_decoder.m_comp_var_ref[1]);
  403. }
  404. }
  405. } else {
  406. m_ctx = 2;
  407. }
  408. return m_decoder.m_probability_tables->comp_ref_prob()[m_ctx];
  409. }
  410. u8 TreeParser::calculate_single_ref_p1_probability()
  411. {
  412. if (AVAIL_U && AVAIL_L) {
  413. if (ABOVE_INTRA && LEFT_INTRA) {
  414. m_ctx = 2;
  415. } else if (LEFT_INTRA) {
  416. if (ABOVE_SINGLE) {
  417. m_ctx = 4 * (ABOVE_FRAME_0 == LastFrame);
  418. } else {
  419. m_ctx = 1 + (ABOVE_FRAME_0 == LastFrame || ABOVE_FRAME_1 == LastFrame);
  420. }
  421. } else if (ABOVE_INTRA) {
  422. if (LEFT_SINGLE) {
  423. m_ctx = 4 * (LEFT_FRAME_0 == LastFrame);
  424. } else {
  425. m_ctx = 1 + (LEFT_FRAME_0 == LastFrame || LEFT_FRAME_1 == LastFrame);
  426. }
  427. } else {
  428. if (LEFT_SINGLE && ABOVE_SINGLE) {
  429. m_ctx = 2 * (ABOVE_FRAME_0 == LastFrame) + 2 * (LEFT_FRAME_0 == LastFrame);
  430. } else if (!LEFT_SINGLE && !ABOVE_SINGLE) {
  431. auto above_is_last = ABOVE_FRAME_0 == LastFrame || ABOVE_FRAME_1 == LastFrame;
  432. auto left_is_last = LEFT_FRAME_0 == LastFrame || LEFT_FRAME_1 == LastFrame;
  433. m_ctx = 1 + (above_is_last || left_is_last);
  434. } else {
  435. auto rfs = ABOVE_SINGLE ? ABOVE_FRAME_0 : LEFT_FRAME_0;
  436. auto crf1 = ABOVE_SINGLE ? LEFT_FRAME_0 : ABOVE_FRAME_0;
  437. auto crf2 = ABOVE_SINGLE ? LEFT_FRAME_1 : ABOVE_FRAME_1;
  438. m_ctx = crf1 == LastFrame || crf2 == LastFrame;
  439. if (rfs == LastFrame)
  440. m_ctx += 3;
  441. }
  442. }
  443. } else if (AVAIL_U) {
  444. if (ABOVE_INTRA) {
  445. m_ctx = 2;
  446. } else {
  447. if (ABOVE_SINGLE) {
  448. m_ctx = 4 * (ABOVE_FRAME_0 == LastFrame);
  449. } else {
  450. m_ctx = 1 + (ABOVE_FRAME_0 == LastFrame || ABOVE_FRAME_1 == LastFrame);
  451. }
  452. }
  453. } else if (AVAIL_L) {
  454. if (LEFT_INTRA) {
  455. m_ctx = 2;
  456. } else {
  457. if (LEFT_SINGLE) {
  458. m_ctx = 4 * (LEFT_FRAME_0 == LastFrame);
  459. } else {
  460. m_ctx = 1 + (LEFT_FRAME_0 == LastFrame || LEFT_FRAME_1 == LastFrame);
  461. }
  462. }
  463. } else {
  464. m_ctx = 2;
  465. }
  466. return m_decoder.m_probability_tables->single_ref_prob()[m_ctx][0];
  467. }
  468. u8 TreeParser::calculate_single_ref_p2_probability()
  469. {
  470. if (AVAIL_U && AVAIL_L) {
  471. if (ABOVE_INTRA && LEFT_INTRA) {
  472. m_ctx = 2;
  473. } else if (LEFT_INTRA) {
  474. if (ABOVE_SINGLE) {
  475. if (ABOVE_FRAME_0 == LastFrame) {
  476. m_ctx = 3;
  477. } else {
  478. m_ctx = 4 * (ABOVE_FRAME_0 == GoldenFrame);
  479. }
  480. } else {
  481. m_ctx = 1 + 2 * (ABOVE_FRAME_0 == GoldenFrame || ABOVE_FRAME_1 == GoldenFrame);
  482. }
  483. } else if (ABOVE_INTRA) {
  484. if (LEFT_SINGLE) {
  485. if (LEFT_FRAME_0 == LastFrame) {
  486. m_ctx = 3;
  487. } else {
  488. m_ctx = 4 * (LEFT_FRAME_0 == GoldenFrame);
  489. }
  490. } else {
  491. m_ctx = 1 + 2 * (LEFT_FRAME_0 == GoldenFrame || LEFT_FRAME_1 == GoldenFrame);
  492. }
  493. } else {
  494. if (LEFT_SINGLE && ABOVE_SINGLE) {
  495. auto above_last = ABOVE_FRAME_0 == LastFrame;
  496. auto left_last = LEFT_FRAME_0 == LastFrame;
  497. if (above_last && left_last) {
  498. m_ctx = 3;
  499. } else if (above_last) {
  500. m_ctx = 4 * (LEFT_FRAME_0 == GoldenFrame);
  501. } else if (left_last) {
  502. m_ctx = 4 * (ABOVE_FRAME_0 == GoldenFrame);
  503. } else {
  504. m_ctx = 2 * (ABOVE_FRAME_0 == GoldenFrame) + 2 * (LEFT_FRAME_0 == GoldenFrame);
  505. }
  506. } else if (!LEFT_SINGLE && !ABOVE_SINGLE) {
  507. if (ABOVE_FRAME_0 == LEFT_FRAME_0 && ABOVE_FRAME_1 == LEFT_FRAME_1) {
  508. m_ctx = 3 * (ABOVE_FRAME_0 == GoldenFrame || ABOVE_FRAME_1 == GoldenFrame);
  509. } else {
  510. m_ctx = 2;
  511. }
  512. } else {
  513. auto rfs = ABOVE_SINGLE ? ABOVE_FRAME_0 : LEFT_FRAME_0;
  514. auto crf1 = ABOVE_SINGLE ? LEFT_FRAME_0 : ABOVE_FRAME_0;
  515. auto crf2 = ABOVE_SINGLE ? LEFT_FRAME_1 : ABOVE_FRAME_1;
  516. m_ctx = crf1 == GoldenFrame || crf2 == GoldenFrame;
  517. if (rfs == GoldenFrame) {
  518. m_ctx += 3;
  519. } else if (rfs != AltRefFrame) {
  520. m_ctx = 1 + (2 * m_ctx);
  521. }
  522. }
  523. }
  524. } else if (AVAIL_U) {
  525. if (ABOVE_INTRA || (ABOVE_FRAME_0 == LastFrame && ABOVE_SINGLE)) {
  526. m_ctx = 2;
  527. } else if (ABOVE_SINGLE) {
  528. m_ctx = 4 * (ABOVE_FRAME_0 == GoldenFrame);
  529. } else {
  530. m_ctx = 3 * (ABOVE_FRAME_0 == GoldenFrame || ABOVE_FRAME_1 == GoldenFrame);
  531. }
  532. } else if (AVAIL_L) {
  533. if (LEFT_INTRA || (LEFT_FRAME_0 == LastFrame && LEFT_SINGLE)) {
  534. m_ctx = 2;
  535. } else if (LEFT_SINGLE) {
  536. m_ctx = 4 * (LEFT_FRAME_0 == GoldenFrame);
  537. } else {
  538. m_ctx = 3 * (LEFT_FRAME_0 == GoldenFrame || LEFT_FRAME_1 == GoldenFrame);
  539. }
  540. } else {
  541. m_ctx = 2;
  542. }
  543. return m_decoder.m_probability_tables->single_ref_prob()[m_ctx][1];
  544. }
  545. u8 TreeParser::calculate_tx_size_probability(u8 node)
  546. {
  547. auto above = m_decoder.m_max_tx_size;
  548. auto left = m_decoder.m_max_tx_size;
  549. if (AVAIL_U) {
  550. auto u_pos = (m_decoder.m_mi_row - 1) * m_decoder.m_mi_cols + m_decoder.m_mi_col;
  551. if (!m_decoder.m_skips[u_pos])
  552. above = m_decoder.m_tx_sizes[u_pos];
  553. }
  554. if (AVAIL_L) {
  555. auto l_pos = m_decoder.m_mi_row * m_decoder.m_mi_cols + m_decoder.m_mi_col - 1;
  556. if (!m_decoder.m_skips[l_pos])
  557. left = m_decoder.m_tx_sizes[l_pos];
  558. }
  559. if (!AVAIL_L)
  560. left = above;
  561. if (!AVAIL_U)
  562. above = left;
  563. m_ctx = (above + left) > m_decoder.m_max_tx_size;
  564. return m_decoder.m_probability_tables->tx_probs()[m_decoder.m_max_tx_size][m_ctx][node];
  565. }
  566. u8 TreeParser::calculate_inter_mode_probability(u8 node)
  567. {
  568. m_ctx = m_decoder.m_mode_context[m_decoder.m_ref_frame[0]];
  569. return m_decoder.m_probability_tables->inter_mode_probs()[m_ctx][node];
  570. }
  571. u8 TreeParser::calculate_interp_filter_probability(u8 node)
  572. {
  573. // NOTE: SWITCHABLE_FILTERS is not used in the spec for this function. Therefore, the number
  574. // was demystified by referencing the reference codec libvpx:
  575. // https://github.com/webmproject/libvpx/blob/705bf9de8c96cfe5301451f1d7e5c90a41c64e5f/vp9/common/vp9_pred_common.h#L69
  576. auto left_interp = (AVAIL_L && m_decoder.m_left_ref_frame[0] > IntraFrame)
  577. ? m_decoder.m_interp_filters[m_decoder.get_image_index(m_decoder.m_mi_row, m_decoder.m_mi_col - 1)]
  578. : SWITCHABLE_FILTERS;
  579. auto above_interp = (AVAIL_U && m_decoder.m_above_ref_frame[0] > IntraFrame)
  580. ? m_decoder.m_interp_filters[m_decoder.get_image_index(m_decoder.m_mi_row - 1, m_decoder.m_mi_col)]
  581. : SWITCHABLE_FILTERS;
  582. if (left_interp == above_interp)
  583. m_ctx = left_interp;
  584. else if (left_interp == SWITCHABLE_FILTERS)
  585. m_ctx = above_interp;
  586. else if (above_interp == SWITCHABLE_FILTERS)
  587. m_ctx = left_interp;
  588. else
  589. m_ctx = SWITCHABLE_FILTERS;
  590. return m_decoder.m_probability_tables->interp_filter_probs()[m_ctx][node];
  591. }
  592. void TreeParser::set_tokens_variables(u8 band, u32 c, u32 plane, TXSize tx_size, u32 pos)
  593. {
  594. m_band = band;
  595. m_c = c;
  596. m_plane = plane;
  597. m_tx_size = tx_size;
  598. m_pos = pos;
  599. if (m_c == 0) {
  600. auto sx = m_plane > 0 ? m_decoder.m_subsampling_x : 0;
  601. auto sy = m_plane > 0 ? m_decoder.m_subsampling_y : 0;
  602. auto max_x = (2 * m_decoder.m_mi_cols) >> sx;
  603. auto max_y = (2 * m_decoder.m_mi_rows) >> sy;
  604. u8 numpts = 1 << m_tx_size;
  605. auto x4 = m_start_x >> 2;
  606. auto y4 = m_start_y >> 2;
  607. u32 above = 0;
  608. u32 left = 0;
  609. for (size_t i = 0; i < numpts; i++) {
  610. if (x4 + i < max_x)
  611. above |= m_decoder.m_above_nonzero_context[m_plane][x4 + i];
  612. if (y4 + i < max_y)
  613. left |= m_decoder.m_left_nonzero_context[m_plane][y4 + i];
  614. }
  615. m_ctx = above + left;
  616. } else {
  617. u32 neighbor_0, neighbor_1;
  618. auto n = 4 << m_tx_size;
  619. auto i = m_pos / n;
  620. auto j = m_pos % n;
  621. auto a = i > 0 ? (i - 1) * n + j : 0;
  622. auto a2 = i * n + j - 1;
  623. if (i > 0 && j > 0) {
  624. if (m_decoder.m_tx_type == DCT_ADST) {
  625. neighbor_0 = a;
  626. neighbor_1 = a;
  627. } else if (m_decoder.m_tx_type == ADST_DCT) {
  628. neighbor_0 = a2;
  629. neighbor_1 = a2;
  630. } else {
  631. neighbor_0 = a;
  632. neighbor_1 = a2;
  633. }
  634. } else if (i > 0) {
  635. neighbor_0 = a;
  636. neighbor_1 = a;
  637. } else {
  638. neighbor_0 = a2;
  639. neighbor_1 = a2;
  640. }
  641. m_ctx = (1 + m_decoder.m_token_cache[neighbor_0] + m_decoder.m_token_cache[neighbor_1]) >> 1;
  642. }
  643. }
  644. u8 TreeParser::calculate_more_coefs_probability()
  645. {
  646. return m_decoder.m_probability_tables->coef_probs()[m_tx_size][m_plane > 0][m_decoder.m_is_inter][m_band][m_ctx][0];
  647. }
  648. u8 TreeParser::calculate_token_probability(u8 node)
  649. {
  650. auto prob = m_decoder.m_probability_tables->coef_probs()[m_tx_size][m_plane > 0][m_decoder.m_is_inter][m_band][m_ctx][min(2, 1 + node)];
  651. if (node < 2)
  652. return prob;
  653. auto x = (prob - 1) / 2;
  654. auto& pareto_table = m_decoder.m_probability_tables->pareto_table();
  655. if (prob & 1)
  656. return pareto_table[x][node - 2];
  657. return (pareto_table[x][node - 2] + pareto_table[x + 1][node - 2]) >> 1;
  658. }
  659. void TreeParser::count_syntax_element(SyntaxElementType type, int value)
  660. {
  661. auto increment = [](u8& count) {
  662. increment_counter(count);
  663. };
  664. switch (type) {
  665. case SyntaxElementType::IntraMode:
  666. case SyntaxElementType::SubIntraMode:
  667. increment(m_decoder.m_syntax_element_counter->m_counts_intra_mode[m_ctx][value]);
  668. return;
  669. case SyntaxElementType::UVMode:
  670. increment(m_decoder.m_syntax_element_counter->m_counts_uv_mode[m_ctx][value]);
  671. return;
  672. case SyntaxElementType::Skip:
  673. increment(m_decoder.m_syntax_element_counter->m_counts_skip[m_ctx][value]);
  674. return;
  675. case SyntaxElementType::IsInter:
  676. increment(m_decoder.m_syntax_element_counter->m_counts_is_inter[m_ctx][value]);
  677. return;
  678. case SyntaxElementType::CompMode:
  679. increment(m_decoder.m_syntax_element_counter->m_counts_comp_mode[m_ctx][value]);
  680. return;
  681. case SyntaxElementType::CompRef:
  682. increment(m_decoder.m_syntax_element_counter->m_counts_comp_ref[m_ctx][value]);
  683. return;
  684. case SyntaxElementType::SingleRefP1:
  685. increment(m_decoder.m_syntax_element_counter->m_counts_single_ref[m_ctx][0][value]);
  686. return;
  687. case SyntaxElementType::SingleRefP2:
  688. increment(m_decoder.m_syntax_element_counter->m_counts_single_ref[m_ctx][1][value]);
  689. return;
  690. case SyntaxElementType::MVSign:
  691. increment(m_decoder.m_syntax_element_counter->m_counts_mv_sign[m_mv_component][value]);
  692. return;
  693. case SyntaxElementType::MVClass0Bit:
  694. increment(m_decoder.m_syntax_element_counter->m_counts_mv_class0_bit[m_mv_component][value]);
  695. return;
  696. case SyntaxElementType::MVBit:
  697. VERIFY(m_mv_bit < MV_OFFSET_BITS);
  698. increment(m_decoder.m_syntax_element_counter->m_counts_mv_bits[m_mv_component][m_mv_bit][value]);
  699. m_mv_bit = 0xFF;
  700. return;
  701. case SyntaxElementType::TXSize:
  702. increment(m_decoder.m_syntax_element_counter->m_counts_tx_size[m_decoder.m_max_tx_size][m_ctx][value]);
  703. return;
  704. case SyntaxElementType::InterMode:
  705. increment(m_decoder.m_syntax_element_counter->m_counts_inter_mode[m_ctx][value]);
  706. return;
  707. case SyntaxElementType::InterpFilter:
  708. increment(m_decoder.m_syntax_element_counter->m_counts_interp_filter[m_ctx][value]);
  709. return;
  710. case SyntaxElementType::MVJoint:
  711. increment(m_decoder.m_syntax_element_counter->m_counts_mv_joint[value]);
  712. return;
  713. case SyntaxElementType::MVClass:
  714. increment(m_decoder.m_syntax_element_counter->m_counts_mv_class[m_mv_component][value]);
  715. return;
  716. case SyntaxElementType::MVClass0FR:
  717. VERIFY(m_mv_class0_bit < CLASS0_SIZE);
  718. increment(m_decoder.m_syntax_element_counter->m_counts_mv_class0_fr[m_mv_component][m_mv_class0_bit][value]);
  719. m_mv_class0_bit = 0xFF;
  720. return;
  721. case SyntaxElementType::MVClass0HP:
  722. increment(m_decoder.m_syntax_element_counter->m_counts_mv_class0_hp[m_mv_component][value]);
  723. return;
  724. case SyntaxElementType::MVFR:
  725. increment(m_decoder.m_syntax_element_counter->m_counts_mv_fr[m_mv_component][value]);
  726. return;
  727. case SyntaxElementType::MVHP:
  728. increment(m_decoder.m_syntax_element_counter->m_counts_mv_hp[m_mv_component][value]);
  729. return;
  730. case SyntaxElementType::Token:
  731. increment(m_decoder.m_syntax_element_counter->m_counts_token[m_tx_size][m_plane > 0][m_decoder.m_is_inter][m_band][m_ctx][min(2, value)]);
  732. return;
  733. case SyntaxElementType::MoreCoefs:
  734. increment(m_decoder.m_syntax_element_counter->m_counts_more_coefs[m_tx_size][m_plane > 0][m_decoder.m_is_inter][m_band][m_ctx][value]);
  735. return;
  736. case SyntaxElementType::DefaultIntraMode:
  737. case SyntaxElementType::DefaultUVMode:
  738. case SyntaxElementType::SegmentID:
  739. case SyntaxElementType::SegIDPredicted:
  740. // No counting required
  741. return;
  742. default:
  743. break;
  744. }
  745. VERIFY_NOT_REACHED();
  746. }
  747. }