TreeParser.cpp 34 KB

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