TreeParser.cpp 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733
  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 "Context.h"
  9. #include "Enums.h"
  10. #include "LookupTables.h"
  11. #include "Parser.h"
  12. #include "TreeParser.h"
  13. #include "Utilities.h"
  14. namespace Video::VP9 {
  15. // Parsing of binary trees is handled here, as defined in sections 9.3.
  16. // Each syntax element is defined in its own section for each overarching section listed here:
  17. // - 9.3.1: Selection of the binary tree to be used.
  18. // - 9.3.2: Probability selection based on context and often the node of the tree.
  19. // - 9.3.4: Counting each syntax element when it is read.
  20. class TreeSelection {
  21. public:
  22. union TreeSelectionValue {
  23. int const* m_tree;
  24. int m_value;
  25. };
  26. constexpr TreeSelection(int const* values)
  27. : m_is_single_value(false)
  28. , m_value { .m_tree = values }
  29. {
  30. }
  31. constexpr TreeSelection(int value)
  32. : m_is_single_value(true)
  33. , m_value { .m_value = value }
  34. {
  35. }
  36. bool is_single_value() const { return m_is_single_value; }
  37. int single_value() const { return m_value.m_value; }
  38. int const* tree() const { return m_value.m_tree; }
  39. private:
  40. bool m_is_single_value;
  41. TreeSelectionValue m_value;
  42. };
  43. template<typename OutputType>
  44. inline OutputType parse_tree(BooleanDecoder& decoder, TreeSelection tree_selection, Function<u8(u8)> const& probability_getter)
  45. {
  46. // 9.3.3: The tree decoding function.
  47. if (tree_selection.is_single_value())
  48. return static_cast<OutputType>(tree_selection.single_value());
  49. int const* tree = tree_selection.tree();
  50. int n = 0;
  51. do {
  52. u8 node = n >> 1;
  53. n = tree[n + decoder.read_bool(probability_getter(node))];
  54. } while (n > 0);
  55. return static_cast<OutputType>(-n);
  56. }
  57. Partition TreeParser::parse_partition(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, bool has_rows, bool has_columns, BlockSubsize block_subsize, u8 num_8x8, PartitionContextView above_partition_context, PartitionContextView left_partition_context, u32 row, u32 column, bool frame_is_intra)
  58. {
  59. // Tree array
  60. TreeSelection tree = { PartitionSplit };
  61. if (has_rows && has_columns)
  62. tree = { partition_tree };
  63. else if (has_rows)
  64. tree = { rows_partition_tree };
  65. else if (has_columns)
  66. tree = { cols_partition_tree };
  67. // Probability array
  68. u32 above = 0;
  69. u32 left = 0;
  70. auto bsl = mi_width_log2_lookup[block_subsize];
  71. auto block_offset = mi_width_log2_lookup[Block_64x64] - bsl;
  72. for (auto i = 0; i < num_8x8; i++) {
  73. above |= above_partition_context[column + i];
  74. left |= left_partition_context[row + i];
  75. }
  76. above = (above & (1 << block_offset)) > 0;
  77. left = (left & (1 << block_offset)) > 0;
  78. auto context = bsl * 4 + left * 2 + above;
  79. u8 const* probabilities = frame_is_intra ? probability_table.kf_partition_probs()[context] : probability_table.partition_probs()[context];
  80. Function<u8(u8)> probability_getter = [&](u8 node) {
  81. if (has_rows && has_columns)
  82. return probabilities[node];
  83. if (has_columns)
  84. return probabilities[1];
  85. return probabilities[2];
  86. };
  87. auto value = parse_tree<Partition>(decoder, tree, probability_getter);
  88. counter.m_counts_partition[context][value]++;
  89. return value;
  90. }
  91. PredictionMode TreeParser::parse_default_intra_mode(BooleanDecoder& decoder, ProbabilityTables const& probability_table, BlockSubsize mi_size, FrameBlockContext above, FrameBlockContext left, Array<PredictionMode, 4> const& block_sub_modes, u8 index_x, u8 index_y)
  92. {
  93. // FIXME: This should use a struct for the above and left contexts.
  94. // Tree
  95. TreeSelection tree = { intra_mode_tree };
  96. // Probabilities
  97. PredictionMode above_mode, left_mode;
  98. if (mi_size >= Block_8x8) {
  99. above_mode = above.sub_modes[2];
  100. left_mode = left.sub_modes[1];
  101. } else {
  102. if (index_y > 0)
  103. above_mode = block_sub_modes[index_x];
  104. else
  105. above_mode = above.sub_modes[2 + index_x];
  106. if (index_x > 0)
  107. left_mode = block_sub_modes[index_y << 1];
  108. else
  109. left_mode = left.sub_modes[1 + (index_y << 1)];
  110. }
  111. u8 const* probabilities = probability_table.kf_y_mode_probs()[to_underlying(above_mode)][to_underlying(left_mode)];
  112. auto value = parse_tree<PredictionMode>(decoder, tree, [&](u8 node) { return probabilities[node]; });
  113. // Default intra mode is not counted.
  114. return value;
  115. }
  116. PredictionMode TreeParser::parse_default_uv_mode(BooleanDecoder& decoder, ProbabilityTables const& probability_table, PredictionMode y_mode)
  117. {
  118. // Tree
  119. TreeSelection tree = { intra_mode_tree };
  120. // Probabilities
  121. u8 const* probabilities = probability_table.kf_uv_mode_prob()[to_underlying(y_mode)];
  122. auto value = parse_tree<PredictionMode>(decoder, tree, [&](u8 node) { return probabilities[node]; });
  123. // Default UV mode is not counted.
  124. return value;
  125. }
  126. PredictionMode TreeParser::parse_intra_mode(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, BlockSubsize mi_size)
  127. {
  128. // Tree
  129. TreeSelection tree = { intra_mode_tree };
  130. // Probabilities
  131. auto context = size_group_lookup[mi_size];
  132. u8 const* probabilities = probability_table.y_mode_probs()[context];
  133. auto value = parse_tree<PredictionMode>(decoder, tree, [&](u8 node) { return probabilities[node]; });
  134. counter.m_counts_intra_mode[context][to_underlying(value)]++;
  135. return value;
  136. }
  137. PredictionMode TreeParser::parse_sub_intra_mode(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter)
  138. {
  139. // Tree
  140. TreeSelection tree = { intra_mode_tree };
  141. // Probabilities
  142. u8 const* probabilities = probability_table.y_mode_probs()[0];
  143. auto value = parse_tree<PredictionMode>(decoder, tree, [&](u8 node) { return probabilities[node]; });
  144. counter.m_counts_intra_mode[0][to_underlying(value)]++;
  145. return value;
  146. }
  147. PredictionMode TreeParser::parse_uv_mode(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, PredictionMode y_mode)
  148. {
  149. // Tree
  150. TreeSelection tree = { intra_mode_tree };
  151. // Probabilities
  152. u8 const* probabilities = probability_table.uv_mode_probs()[to_underlying(y_mode)];
  153. auto value = parse_tree<PredictionMode>(decoder, tree, [&](u8 node) { return probabilities[node]; });
  154. counter.m_counts_uv_mode[to_underlying(y_mode)][to_underlying(value)]++;
  155. return value;
  156. }
  157. u8 TreeParser::parse_segment_id(BooleanDecoder& decoder, Array<u8, 7> const& probabilities)
  158. {
  159. auto value = parse_tree<u8>(decoder, { segment_tree }, [&](u8 node) { return probabilities[node]; });
  160. // Segment ID is not counted.
  161. return value;
  162. }
  163. bool TreeParser::parse_segment_id_predicted(BooleanDecoder& decoder, Array<u8, 3> const& probabilities, u8 above_seg_pred_context, u8 left_seg_pred_context)
  164. {
  165. auto context = left_seg_pred_context + above_seg_pred_context;
  166. auto value = parse_tree<bool>(decoder, { binary_tree }, [&](u8) { return probabilities[context]; });
  167. // Segment ID prediction is not counted.
  168. return value;
  169. }
  170. PredictionMode TreeParser::parse_inter_mode(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, u8 mode_context_for_ref_frame_0)
  171. {
  172. // Tree
  173. TreeSelection tree = { inter_mode_tree };
  174. // Probabilities
  175. u8 const* probabilities = probability_table.inter_mode_probs()[mode_context_for_ref_frame_0];
  176. auto value = parse_tree<u8>(decoder, tree, [&](u8 node) { return probabilities[node]; });
  177. counter.m_counts_inter_mode[mode_context_for_ref_frame_0][value]++;
  178. return static_cast<PredictionMode>(value + to_underlying(PredictionMode::NearestMv));
  179. }
  180. InterpolationFilter TreeParser::parse_interpolation_filter(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, FrameBlockContext above, FrameBlockContext left)
  181. {
  182. // FIXME: Above and left context should be provided by a struct.
  183. // Tree
  184. TreeSelection tree = { interp_filter_tree };
  185. // Probabilities
  186. // NOTE: SWITCHABLE_FILTERS is not used in the spec for this function. Therefore, the number
  187. // was demystified by referencing the reference codec libvpx:
  188. // https://github.com/webmproject/libvpx/blob/705bf9de8c96cfe5301451f1d7e5c90a41c64e5f/vp9/common/vp9_pred_common.h#L69
  189. u8 left_interp = !left.is_intra_predicted() ? left.interpolation_filter : SWITCHABLE_FILTERS;
  190. u8 above_interp = !above.is_intra_predicted() ? above.interpolation_filter : SWITCHABLE_FILTERS;
  191. u8 context = SWITCHABLE_FILTERS;
  192. if (above_interp == left_interp || above_interp == SWITCHABLE_FILTERS)
  193. context = left_interp;
  194. else if (left_interp == SWITCHABLE_FILTERS)
  195. context = above_interp;
  196. u8 const* probabilities = probability_table.interp_filter_probs()[context];
  197. auto value = parse_tree<InterpolationFilter>(decoder, tree, [&](u8 node) { return probabilities[node]; });
  198. counter.m_counts_interp_filter[context][to_underlying(value)]++;
  199. return value;
  200. }
  201. bool TreeParser::parse_skip(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, FrameBlockContext above, FrameBlockContext left)
  202. {
  203. // Probabilities
  204. u8 context = 0;
  205. context += static_cast<u8>(above.skip_coefficients);
  206. context += static_cast<u8>(left.skip_coefficients);
  207. u8 probability = probability_table.skip_prob()[context];
  208. auto value = parse_tree<bool>(decoder, { binary_tree }, [&](u8) { return probability; });
  209. counter.m_counts_skip[context][value]++;
  210. return value;
  211. }
  212. TransformSize TreeParser::parse_tx_size(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, TransformSize max_tx_size, FrameBlockContext above, FrameBlockContext left)
  213. {
  214. // FIXME: Above and left contexts should be in structs.
  215. // Tree
  216. TreeSelection tree { tx_size_8_tree };
  217. if (max_tx_size == Transform_16x16)
  218. tree = { tx_size_16_tree };
  219. if (max_tx_size == Transform_32x32)
  220. tree = { tx_size_32_tree };
  221. // Probabilities
  222. auto above_context = max_tx_size;
  223. auto left_context = max_tx_size;
  224. if (above.is_available && !above.skip_coefficients)
  225. above_context = above.transform_size;
  226. if (left.is_available && !left.skip_coefficients)
  227. left_context = left.transform_size;
  228. if (!left.is_available)
  229. left_context = above_context;
  230. if (!above.is_available)
  231. above_context = left_context;
  232. auto context = (above_context + left_context) > max_tx_size;
  233. u8 const* probabilities = probability_table.tx_probs()[max_tx_size][context];
  234. auto value = parse_tree<TransformSize>(decoder, tree, [&](u8 node) { return probabilities[node]; });
  235. counter.m_counts_tx_size[max_tx_size][context][value]++;
  236. return value;
  237. }
  238. bool TreeParser::parse_block_is_inter_predicted(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, FrameBlockContext above, FrameBlockContext left)
  239. {
  240. // FIXME: Above and left contexts should be in structs.
  241. // Probabilities
  242. u8 context = 0;
  243. if (above.is_available && left.is_available)
  244. context = (left.is_intra_predicted() && above.is_intra_predicted()) ? 3 : static_cast<u8>(above.is_intra_predicted() || left.is_intra_predicted());
  245. else if (above.is_available || left.is_available)
  246. context = 2 * static_cast<u8>(above.is_available ? above.is_intra_predicted() : left.is_intra_predicted());
  247. u8 probability = probability_table.is_inter_prob()[context];
  248. auto value = parse_tree<bool>(decoder, { binary_tree }, [&](u8) { return probability; });
  249. counter.m_counts_is_inter[context][value]++;
  250. return value;
  251. }
  252. ReferenceMode TreeParser::parse_comp_mode(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, ReferenceFrameType comp_fixed_ref, FrameBlockContext above, FrameBlockContext left)
  253. {
  254. // FIXME: Above and left contexts should be in structs.
  255. // Probabilities
  256. u8 context;
  257. if (above.is_available && left.is_available) {
  258. if (above.is_single_reference() && left.is_single_reference()) {
  259. auto is_above_fixed = above.ref_frames.primary == comp_fixed_ref;
  260. auto is_left_fixed = left.ref_frames.primary == comp_fixed_ref;
  261. context = is_above_fixed ^ is_left_fixed;
  262. } else if (above.is_single_reference()) {
  263. auto is_above_fixed = above.ref_frames.primary == comp_fixed_ref;
  264. context = 2 + static_cast<u8>(is_above_fixed || above.is_intra_predicted());
  265. } else if (left.is_single_reference()) {
  266. auto is_left_fixed = left.ref_frames.primary == comp_fixed_ref;
  267. context = 2 + static_cast<u8>(is_left_fixed || left.is_intra_predicted());
  268. } else {
  269. context = 4;
  270. }
  271. } else if (above.is_available) {
  272. if (above.is_single_reference())
  273. context = above.ref_frames.primary == comp_fixed_ref;
  274. else
  275. context = 3;
  276. } else if (left.is_available) {
  277. if (left.is_single_reference())
  278. context = static_cast<u8>(left.ref_frames.primary == comp_fixed_ref);
  279. else
  280. context = 3;
  281. } else {
  282. context = 1;
  283. }
  284. u8 probability = probability_table.comp_mode_prob()[context];
  285. auto value = parse_tree<ReferenceMode>(decoder, { binary_tree }, [&](u8) { return probability; });
  286. counter.m_counts_comp_mode[context][value]++;
  287. return value;
  288. }
  289. ReferenceIndex TreeParser::parse_comp_ref(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, ReferenceFrameType comp_fixed_ref, ReferenceFramePair comp_var_ref, ReferenceIndex variable_reference_index, FrameBlockContext above, FrameBlockContext left)
  290. {
  291. // FIXME: Above and left contexts should be in structs.
  292. // Probabilities
  293. u8 context;
  294. if (above.is_available && left.is_available) {
  295. if (above.is_intra_predicted() && left.is_intra_predicted()) {
  296. context = 2;
  297. } else if (left.is_intra_predicted()) {
  298. if (above.is_single_reference()) {
  299. context = 1 + 2 * (above.ref_frames.primary != comp_var_ref.secondary);
  300. } else {
  301. context = 1 + 2 * (above.ref_frames[variable_reference_index] != comp_var_ref.secondary);
  302. }
  303. } else if (above.is_intra_predicted()) {
  304. if (left.is_single_reference()) {
  305. context = 1 + 2 * (left.ref_frames.primary != comp_var_ref.secondary);
  306. } else {
  307. context = 1 + 2 * (left.ref_frames[variable_reference_index] != comp_var_ref.secondary);
  308. }
  309. } else {
  310. auto var_ref_above = above.is_single_reference() ? above.ref_frames.primary : above.ref_frames[variable_reference_index];
  311. auto var_ref_left = left.is_single_reference() ? left.ref_frames.primary : left.ref_frames[variable_reference_index];
  312. if (var_ref_above == var_ref_left && comp_var_ref.secondary == var_ref_above) {
  313. context = 0;
  314. } else if (left.is_single_reference() && above.is_single_reference()) {
  315. if ((var_ref_above == comp_fixed_ref && var_ref_left == comp_var_ref.primary)
  316. || (var_ref_left == comp_fixed_ref && var_ref_above == comp_var_ref.primary)) {
  317. context = 4;
  318. } else if (var_ref_above == var_ref_left) {
  319. context = 3;
  320. } else {
  321. context = 1;
  322. }
  323. } else if (left.is_single_reference() || above.is_single_reference()) {
  324. auto vrfc = left.is_single_reference() ? var_ref_above : var_ref_left;
  325. auto rfs = above.is_single_reference() ? var_ref_above : var_ref_left;
  326. if (vrfc == comp_var_ref.secondary && rfs != comp_var_ref.secondary) {
  327. context = 1;
  328. } else if (rfs == comp_var_ref.secondary && vrfc != comp_var_ref.secondary) {
  329. context = 2;
  330. } else {
  331. context = 4;
  332. }
  333. } else if (var_ref_above == var_ref_left) {
  334. context = 4;
  335. } else {
  336. context = 2;
  337. }
  338. }
  339. } else if (above.is_available) {
  340. if (above.is_intra_predicted()) {
  341. context = 2;
  342. } else {
  343. if (above.is_single_reference()) {
  344. context = 3 * static_cast<u8>(above.ref_frames.primary != comp_var_ref.secondary);
  345. } else {
  346. context = 4 * static_cast<u8>(above.ref_frames[variable_reference_index] != comp_var_ref.secondary);
  347. }
  348. }
  349. } else if (left.is_available) {
  350. if (left.is_intra_predicted()) {
  351. context = 2;
  352. } else {
  353. if (left.is_single_reference()) {
  354. context = 3 * static_cast<u8>(left.ref_frames.primary != comp_var_ref.secondary);
  355. } else {
  356. context = 4 * static_cast<u8>(left.ref_frames[variable_reference_index] != comp_var_ref.secondary);
  357. }
  358. }
  359. } else {
  360. context = 2;
  361. }
  362. u8 probability = probability_table.comp_ref_prob()[context];
  363. auto value = parse_tree<ReferenceIndex>(decoder, { binary_tree }, [&](u8) { return probability; });
  364. counter.m_counts_comp_ref[context][to_underlying(value)]++;
  365. return value;
  366. }
  367. bool TreeParser::parse_single_ref_part_1(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, FrameBlockContext above, FrameBlockContext left)
  368. {
  369. // FIXME: Above and left contexts should be in structs.
  370. // Probabilities
  371. u8 context;
  372. if (above.is_available && left.is_available) {
  373. if (above.is_intra_predicted() && left.is_intra_predicted()) {
  374. context = 2;
  375. } else if (left.is_intra_predicted()) {
  376. if (above.is_single_reference()) {
  377. context = 4 * (above.ref_frames.primary == ReferenceFrameType::LastFrame);
  378. } else {
  379. context = 1 + (above.ref_frames.primary == ReferenceFrameType::LastFrame || above.ref_frames.secondary == ReferenceFrameType::LastFrame);
  380. }
  381. } else if (above.is_intra_predicted()) {
  382. if (left.is_single_reference()) {
  383. context = 4 * (left.ref_frames.primary == ReferenceFrameType::LastFrame);
  384. } else {
  385. context = 1 + (left.ref_frames.primary == ReferenceFrameType::LastFrame || left.ref_frames.secondary == ReferenceFrameType::LastFrame);
  386. }
  387. } else {
  388. if (left.is_single_reference() && above.is_single_reference()) {
  389. context = 2 * (above.ref_frames.primary == ReferenceFrameType::LastFrame) + 2 * (left.ref_frames.primary == ReferenceFrameType::LastFrame);
  390. } else if (!left.is_single_reference() && !above.is_single_reference()) {
  391. auto above_used_last_frame = above.ref_frames.primary == ReferenceFrameType::LastFrame || above.ref_frames.secondary == ReferenceFrameType::LastFrame;
  392. auto left_used_last_frame = left.ref_frames.primary == ReferenceFrameType::LastFrame || left.ref_frames.secondary == ReferenceFrameType::LastFrame;
  393. context = 1 + (above_used_last_frame || left_used_last_frame);
  394. } else {
  395. auto single_reference_type = above.is_single_reference() ? above.ref_frames.primary : left.ref_frames.primary;
  396. auto compound_reference_a_type = above.is_single_reference() ? left.ref_frames.primary : above.ref_frames.primary;
  397. auto compound_reference_b_type = above.is_single_reference() ? left.ref_frames.secondary : above.ref_frames.secondary;
  398. context = compound_reference_a_type == ReferenceFrameType::LastFrame || compound_reference_b_type == ReferenceFrameType::LastFrame;
  399. if (single_reference_type == ReferenceFrameType::LastFrame)
  400. context += 3;
  401. }
  402. }
  403. } else if (above.is_available) {
  404. if (above.is_intra_predicted()) {
  405. context = 2;
  406. } else {
  407. if (above.is_single_reference()) {
  408. context = 4 * (above.ref_frames.primary == ReferenceFrameType::LastFrame);
  409. } else {
  410. context = 1 + (above.ref_frames.primary == ReferenceFrameType::LastFrame || above.ref_frames.secondary == ReferenceFrameType::LastFrame);
  411. }
  412. }
  413. } else if (left.is_available) {
  414. if (left.is_intra_predicted()) {
  415. context = 2;
  416. } else {
  417. if (left.is_single_reference()) {
  418. context = 4 * (left.ref_frames.primary == ReferenceFrameType::LastFrame);
  419. } else {
  420. context = 1 + (left.ref_frames.primary == ReferenceFrameType::LastFrame || left.ref_frames.secondary == ReferenceFrameType::LastFrame);
  421. }
  422. }
  423. } else {
  424. context = 2;
  425. }
  426. u8 probability = probability_table.single_ref_prob()[context][0];
  427. auto value = parse_tree<bool>(decoder, { binary_tree }, [&](u8) { return probability; });
  428. counter.m_counts_single_ref[context][0][value]++;
  429. return value;
  430. }
  431. bool TreeParser::parse_single_ref_part_2(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, FrameBlockContext above, FrameBlockContext left)
  432. {
  433. // FIXME: Above and left contexts should be in structs.
  434. // Probabilities
  435. u8 context;
  436. if (above.is_available && left.is_available) {
  437. if (above.is_intra_predicted() && left.is_intra_predicted()) {
  438. context = 2;
  439. } else if (left.is_intra_predicted()) {
  440. if (above.is_single_reference()) {
  441. if (above.ref_frames.primary == ReferenceFrameType::LastFrame) {
  442. context = 3;
  443. } else {
  444. context = 4 * (above.ref_frames.primary == ReferenceFrameType::GoldenFrame);
  445. }
  446. } else {
  447. context = 1 + 2 * (above.ref_frames.primary == ReferenceFrameType::GoldenFrame || above.ref_frames.secondary == ReferenceFrameType::GoldenFrame);
  448. }
  449. } else if (above.is_intra_predicted()) {
  450. if (left.is_single_reference()) {
  451. if (left.ref_frames.primary == ReferenceFrameType::LastFrame) {
  452. context = 3;
  453. } else {
  454. context = 4 * (left.ref_frames.primary == ReferenceFrameType::GoldenFrame);
  455. }
  456. } else {
  457. context = 1 + 2 * (left.ref_frames.primary == ReferenceFrameType::GoldenFrame || left.ref_frames.secondary == ReferenceFrameType::GoldenFrame);
  458. }
  459. } else {
  460. if (left.is_single_reference() && above.is_single_reference()) {
  461. auto above_last = above.ref_frames.primary == ReferenceFrameType::LastFrame;
  462. auto left_last = left.ref_frames.primary == ReferenceFrameType::LastFrame;
  463. if (above_last && left_last) {
  464. context = 3;
  465. } else if (above_last) {
  466. context = 4 * (left.ref_frames.primary == ReferenceFrameType::GoldenFrame);
  467. } else if (left_last) {
  468. context = 4 * (above.ref_frames.primary == ReferenceFrameType::GoldenFrame);
  469. } else {
  470. context = 2 * (above.ref_frames.primary == ReferenceFrameType::GoldenFrame) + 2 * (left.ref_frames.primary == ReferenceFrameType::GoldenFrame);
  471. }
  472. } else if (!left.is_single_reference() && !above.is_single_reference()) {
  473. if (above.ref_frames.primary == left.ref_frames.primary && above.ref_frames.secondary == left.ref_frames.secondary) {
  474. context = 3 * (above.ref_frames.primary == ReferenceFrameType::GoldenFrame || above.ref_frames.secondary == ReferenceFrameType::GoldenFrame);
  475. } else {
  476. context = 2;
  477. }
  478. } else {
  479. auto single_reference_type = above.is_single_reference() ? above.ref_frames.primary : left.ref_frames.primary;
  480. auto compound_reference_a_type = above.is_single_reference() ? left.ref_frames.primary : above.ref_frames.primary;
  481. auto compound_reference_b_type = above.is_single_reference() ? left.ref_frames.secondary : above.ref_frames.secondary;
  482. context = compound_reference_a_type == ReferenceFrameType::GoldenFrame || compound_reference_b_type == ReferenceFrameType::GoldenFrame;
  483. if (single_reference_type == ReferenceFrameType::GoldenFrame) {
  484. context += 3;
  485. } else if (single_reference_type != ReferenceFrameType::AltRefFrame) {
  486. context = 1 + (2 * context);
  487. }
  488. }
  489. }
  490. } else if (above.is_available) {
  491. if (above.is_intra_predicted() || (above.ref_frames.primary == ReferenceFrameType::LastFrame && above.is_single_reference())) {
  492. context = 2;
  493. } else if (above.is_single_reference()) {
  494. context = 4 * (above.ref_frames.primary == ReferenceFrameType::GoldenFrame);
  495. } else {
  496. context = 3 * (above.ref_frames.primary == ReferenceFrameType::GoldenFrame || above.ref_frames.secondary == ReferenceFrameType::GoldenFrame);
  497. }
  498. } else if (left.is_available) {
  499. if (left.is_intra_predicted() || (left.ref_frames.primary == ReferenceFrameType::LastFrame && left.is_single_reference())) {
  500. context = 2;
  501. } else if (left.is_single_reference()) {
  502. context = 4 * (left.ref_frames.primary == ReferenceFrameType::GoldenFrame);
  503. } else {
  504. context = 3 * (left.ref_frames.primary == ReferenceFrameType::GoldenFrame || left.ref_frames.secondary == ReferenceFrameType::GoldenFrame);
  505. }
  506. } else {
  507. context = 2;
  508. }
  509. u8 probability = probability_table.single_ref_prob()[context][1];
  510. auto value = parse_tree<bool>(decoder, { binary_tree }, [&](u8) { return probability; });
  511. counter.m_counts_single_ref[context][1][value]++;
  512. return value;
  513. }
  514. MvJoint TreeParser::parse_motion_vector_joint(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter)
  515. {
  516. auto value = parse_tree<MvJoint>(decoder, { mv_joint_tree }, [&](u8 node) { return probability_table.mv_joint_probs()[node]; });
  517. counter.m_counts_mv_joint[value]++;
  518. return value;
  519. }
  520. bool TreeParser::parse_motion_vector_sign(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, u8 component)
  521. {
  522. auto value = parse_tree<bool>(decoder, { binary_tree }, [&](u8) { return probability_table.mv_sign_prob()[component]; });
  523. counter.m_counts_mv_sign[component][value]++;
  524. return value;
  525. }
  526. MvClass TreeParser::parse_motion_vector_class(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, u8 component)
  527. {
  528. // Spec doesn't mention node, but the probabilities table has an extra dimension
  529. // so we will use node for that.
  530. auto value = parse_tree<MvClass>(decoder, { mv_class_tree }, [&](u8 node) { return probability_table.mv_class_probs()[component][node]; });
  531. counter.m_counts_mv_class[component][value]++;
  532. return value;
  533. }
  534. bool TreeParser::parse_motion_vector_class0_bit(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, u8 component)
  535. {
  536. auto value = parse_tree<bool>(decoder, { binary_tree }, [&](u8) { return probability_table.mv_class0_bit_prob()[component]; });
  537. counter.m_counts_mv_class0_bit[component][value]++;
  538. return value;
  539. }
  540. u8 TreeParser::parse_motion_vector_class0_fr(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, u8 component, bool class_0_bit)
  541. {
  542. auto value = parse_tree<u8>(decoder, { mv_fr_tree }, [&](u8 node) { return probability_table.mv_class0_fr_probs()[component][class_0_bit][node]; });
  543. counter.m_counts_mv_class0_fr[component][class_0_bit][value]++;
  544. return value;
  545. }
  546. bool TreeParser::parse_motion_vector_class0_hp(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, u8 component, bool use_hp)
  547. {
  548. TreeSelection tree { 1 };
  549. if (use_hp)
  550. tree = { binary_tree };
  551. auto value = parse_tree<bool>(decoder, tree, [&](u8) { return probability_table.mv_class0_hp_prob()[component]; });
  552. counter.m_counts_mv_class0_hp[component][value]++;
  553. return value;
  554. }
  555. bool TreeParser::parse_motion_vector_bit(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, u8 component, u8 bit_index)
  556. {
  557. auto value = parse_tree<bool>(decoder, { binary_tree }, [&](u8) { return probability_table.mv_bits_prob()[component][bit_index]; });
  558. counter.m_counts_mv_bits[component][bit_index][value]++;
  559. return value;
  560. }
  561. u8 TreeParser::parse_motion_vector_fr(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, u8 component)
  562. {
  563. auto value = parse_tree<u8>(decoder, { mv_fr_tree }, [&](u8 node) { return probability_table.mv_fr_probs()[component][node]; });
  564. counter.m_counts_mv_fr[component][value]++;
  565. return value;
  566. }
  567. bool TreeParser::parse_motion_vector_hp(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, u8 component, bool use_hp)
  568. {
  569. TreeSelection tree { 1 };
  570. if (use_hp)
  571. tree = { binary_tree };
  572. auto value = parse_tree<u8>(decoder, tree, [&](u8) { return probability_table.mv_hp_prob()[component]; });
  573. counter.m_counts_mv_hp[component][value]++;
  574. return value;
  575. }
  576. TokensContext TreeParser::get_context_for_first_token(NonZeroTokensView above_non_zero_tokens, NonZeroTokensView left_non_zero_tokens_in_block, TransformSize transform_size, u8 plane, u32 sub_block_column, u32 sub_block_row, bool is_inter, u8 band)
  577. {
  578. u8 transform_size_in_sub_blocks = transform_size_to_sub_blocks(transform_size);
  579. bool above_has_non_zero_tokens = false;
  580. for (u8 x = 0; x < transform_size_in_sub_blocks && x < above_non_zero_tokens[plane].size() - sub_block_column; x++) {
  581. if (above_non_zero_tokens[plane][sub_block_column + x]) {
  582. above_has_non_zero_tokens = true;
  583. break;
  584. }
  585. }
  586. bool left_has_non_zero_tokens = false;
  587. for (u8 y = 0; y < transform_size_in_sub_blocks && y < left_non_zero_tokens_in_block[plane].size() - sub_block_row; y++) {
  588. if (left_non_zero_tokens_in_block[plane][sub_block_row + y]) {
  589. left_has_non_zero_tokens = true;
  590. break;
  591. }
  592. }
  593. u8 context = above_has_non_zero_tokens + left_has_non_zero_tokens;
  594. return TokensContext { transform_size, plane > 0, is_inter, band, context };
  595. }
  596. TokensContext TreeParser::get_context_for_other_tokens(Array<u8, 1024> token_cache, TransformSize transform_size, TransformSet transform_set, u8 plane, u16 token_position, bool is_inter, u8 band)
  597. {
  598. auto transform_size_in_pixels = sub_blocks_to_pixels(transform_size_to_sub_blocks(transform_size));
  599. auto log2_of_transform_size = transform_size + 2;
  600. auto pixel_y = token_position >> log2_of_transform_size;
  601. auto pixel_x = token_position - (pixel_y << log2_of_transform_size);
  602. auto above_token_energy = pixel_y > 0 ? (pixel_y - 1) * transform_size_in_pixels + pixel_x : 0;
  603. auto left_token_energy = pixel_y * transform_size_in_pixels + pixel_x - 1;
  604. u32 neighbor_a, neighbor_b;
  605. if (pixel_y > 0 && pixel_x > 0) {
  606. if (transform_set == TransformSet { TransformType::DCT, TransformType::ADST }) {
  607. neighbor_a = above_token_energy;
  608. neighbor_b = above_token_energy;
  609. } else if (transform_set == TransformSet { TransformType::ADST, TransformType::DCT }) {
  610. neighbor_a = left_token_energy;
  611. neighbor_b = left_token_energy;
  612. } else {
  613. neighbor_a = above_token_energy;
  614. neighbor_b = left_token_energy;
  615. }
  616. } else if (pixel_y > 0) {
  617. neighbor_a = above_token_energy;
  618. neighbor_b = above_token_energy;
  619. } else {
  620. neighbor_a = left_token_energy;
  621. neighbor_b = left_token_energy;
  622. }
  623. u8 context = (1 + token_cache[neighbor_a] + token_cache[neighbor_b]) >> 1;
  624. return TokensContext { transform_size, plane > 0, is_inter, band, context };
  625. }
  626. bool TreeParser::parse_more_coefficients(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, TokensContext const& context)
  627. {
  628. auto probability = probability_table.coef_probs()[context.m_tx_size][context.m_is_uv_plane][context.m_is_inter][context.m_band][context.m_context_index][0];
  629. auto value = parse_tree<u8>(decoder, { binary_tree }, [&](u8) { return probability; });
  630. counter.m_counts_more_coefs[context.m_tx_size][context.m_is_uv_plane][context.m_is_inter][context.m_band][context.m_context_index][value]++;
  631. return value;
  632. }
  633. Token TreeParser::parse_token(BooleanDecoder& decoder, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, TokensContext const& context)
  634. {
  635. Function<u8(u8)> probability_getter = [&](u8 node) -> u8 {
  636. auto prob = probability_table.coef_probs()[context.m_tx_size][context.m_is_uv_plane][context.m_is_inter][context.m_band][context.m_context_index][min(2, 1 + node)];
  637. if (node < 2)
  638. return prob;
  639. auto x = (prob - 1) / 2;
  640. auto const& pareto_table = probability_table.pareto_table();
  641. if ((prob & 1) != 0)
  642. return pareto_table[x][node - 2];
  643. return (pareto_table[x][node - 2] + pareto_table[x + 1][node - 2]) >> 1;
  644. };
  645. auto value = parse_tree<Token>(decoder, { token_tree }, probability_getter);
  646. counter.m_counts_token[context.m_tx_size][context.m_is_uv_plane][context.m_is_inter][context.m_band][context.m_context_index][min(2, value)]++;
  647. return value;
  648. }
  649. }