TreeParser.cpp 35 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 "Enums.h"
  9. #include "LookupTables.h"
  10. #include "Parser.h"
  11. #include "TreeParser.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. ErrorOr<PredictionMode> TreeParser::parse_default_intra_mode(BitStream& bit_stream, ProbabilityTables const& probability_table, BlockSubsize mi_size, Optional<Array<PredictionMode, 4> const&> above_context, Optional<Array<PredictionMode, 4> const&> left_context, PredictionMode block_sub_modes[4], u8 index_x, u8 index_y)
  94. {
  95. // FIXME: This should use a struct for the above and left contexts.
  96. // Tree
  97. TreeParser::TreeSelection tree = { intra_mode_tree };
  98. // Probabilities
  99. PredictionMode above_mode, left_mode;
  100. if (mi_size >= Block_8x8) {
  101. above_mode = above_context.has_value() ? above_context.value()[2] : PredictionMode::DcPred;
  102. left_mode = left_context.has_value() ? left_context.value()[1] : PredictionMode::DcPred;
  103. } else {
  104. if (index_y > 0)
  105. above_mode = block_sub_modes[index_x];
  106. else
  107. above_mode = above_context.has_value() ? above_context.value()[2 + index_x] : PredictionMode::DcPred;
  108. if (index_x > 0)
  109. left_mode = block_sub_modes[index_y << 1];
  110. else
  111. left_mode = left_context.has_value() ? left_context.value()[1 + (index_y << 1)] : PredictionMode::DcPred;
  112. }
  113. u8 const* probabilities = probability_table.kf_y_mode_probs()[to_underlying(above_mode)][to_underlying(left_mode)];
  114. auto value = TRY(parse_tree_new<PredictionMode>(bit_stream, tree, [&](u8 node) { return probabilities[node]; }));
  115. // Default intra mode is not counted.
  116. return value;
  117. }
  118. ErrorOr<PredictionMode> TreeParser::parse_default_uv_mode(BitStream& bit_stream, ProbabilityTables const& probability_table, PredictionMode y_mode)
  119. {
  120. // Tree
  121. TreeParser::TreeSelection tree = { intra_mode_tree };
  122. // Probabilities
  123. u8 const* probabilities = probability_table.kf_uv_mode_prob()[to_underlying(y_mode)];
  124. auto value = TRY(parse_tree_new<PredictionMode>(bit_stream, tree, [&](u8 node) { return probabilities[node]; }));
  125. // Default UV mode is not counted.
  126. return value;
  127. }
  128. ErrorOr<PredictionMode> TreeParser::parse_intra_mode(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, BlockSubsize mi_size)
  129. {
  130. // Tree
  131. TreeParser::TreeSelection tree = { intra_mode_tree };
  132. // Probabilities
  133. auto context = size_group_lookup[mi_size];
  134. u8 const* probabilities = probability_table.y_mode_probs()[context];
  135. auto value = TRY(parse_tree_new<PredictionMode>(bit_stream, tree, [&](u8 node) { return probabilities[node]; }));
  136. increment_counter(counter.m_counts_intra_mode[context][to_underlying(value)]);
  137. return value;
  138. }
  139. ErrorOr<PredictionMode> TreeParser::parse_sub_intra_mode(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter)
  140. {
  141. // Tree
  142. TreeParser::TreeSelection tree = { intra_mode_tree };
  143. // Probabilities
  144. u8 const* probabilities = probability_table.y_mode_probs()[0];
  145. auto value = TRY(parse_tree_new<PredictionMode>(bit_stream, tree, [&](u8 node) { return probabilities[node]; }));
  146. increment_counter(counter.m_counts_intra_mode[0][to_underlying(value)]);
  147. return value;
  148. }
  149. ErrorOr<PredictionMode> TreeParser::parse_uv_mode(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, PredictionMode y_mode)
  150. {
  151. // Tree
  152. TreeParser::TreeSelection tree = { intra_mode_tree };
  153. // Probabilities
  154. u8 const* probabilities = probability_table.uv_mode_probs()[to_underlying(y_mode)];
  155. auto value = TRY(parse_tree_new<PredictionMode>(bit_stream, tree, [&](u8 node) { return probabilities[node]; }));
  156. increment_counter(counter.m_counts_uv_mode[to_underlying(y_mode)][to_underlying(value)]);
  157. return value;
  158. }
  159. ErrorOr<u8> TreeParser::parse_segment_id(BitStream& bit_stream, u8 const probabilities[7])
  160. {
  161. auto value = TRY(parse_tree_new<u8>(bit_stream, { segment_tree }, [&](u8 node) { return probabilities[node]; }));
  162. // Segment ID is not counted.
  163. return value;
  164. }
  165. ErrorOr<bool> TreeParser::parse_segment_id_predicted(BitStream& bit_stream, u8 const probabilities[3], u8 above_seg_pred_context, u8 left_seg_pred_context)
  166. {
  167. auto context = left_seg_pred_context + above_seg_pred_context;
  168. auto value = TRY(parse_tree_new<bool>(bit_stream, { binary_tree }, [&](u8) { return probabilities[context]; }));
  169. // Segment ID prediction is not counted.
  170. return value;
  171. }
  172. ErrorOr<PredictionMode> TreeParser::parse_inter_mode(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, u8 mode_context_for_ref_frame_0)
  173. {
  174. // Tree
  175. TreeParser::TreeSelection tree = { inter_mode_tree };
  176. // Probabilities
  177. u8 const* probabilities = probability_table.inter_mode_probs()[mode_context_for_ref_frame_0];
  178. auto value = TRY(parse_tree_new<PredictionMode>(bit_stream, tree, [&](u8 node) { return probabilities[node]; }));
  179. increment_counter(counter.m_counts_inter_mode[mode_context_for_ref_frame_0][to_underlying(value) - to_underlying(PredictionMode::NearestMv)]);
  180. return value;
  181. }
  182. ErrorOr<InterpolationFilter> TreeParser::parse_interpolation_filter(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, Optional<ReferenceFrameType> above_ref_frame, Optional<ReferenceFrameType> left_ref_frame, Optional<InterpolationFilter> above_interpolation_filter, Optional<InterpolationFilter> left_interpolation_filter)
  183. {
  184. // FIXME: Above and left context should be provided by a struct.
  185. // Tree
  186. TreeParser::TreeSelection tree = { interp_filter_tree };
  187. // Probabilities
  188. // NOTE: SWITCHABLE_FILTERS is not used in the spec for this function. Therefore, the number
  189. // was demystified by referencing the reference codec libvpx:
  190. // https://github.com/webmproject/libvpx/blob/705bf9de8c96cfe5301451f1d7e5c90a41c64e5f/vp9/common/vp9_pred_common.h#L69
  191. u8 left_interp = (left_ref_frame.has_value() && left_ref_frame.value() > IntraFrame)
  192. ? left_interpolation_filter.value()
  193. : SWITCHABLE_FILTERS;
  194. u8 above_interp = (above_ref_frame.has_value() && above_ref_frame.value() > IntraFrame)
  195. ? above_interpolation_filter.value()
  196. : SWITCHABLE_FILTERS;
  197. u8 context = SWITCHABLE_FILTERS;
  198. if (above_interp == left_interp || above_interp == SWITCHABLE_FILTERS)
  199. context = left_interp;
  200. else if (left_interp == SWITCHABLE_FILTERS)
  201. context = above_interp;
  202. u8 const* probabilities = probability_table.interp_filter_probs()[context];
  203. auto value = TRY(parse_tree_new<InterpolationFilter>(bit_stream, tree, [&](u8 node) { return probabilities[node]; }));
  204. increment_counter(counter.m_counts_interp_filter[context][to_underlying(value)]);
  205. return value;
  206. }
  207. ErrorOr<bool> TreeParser::parse_skip(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, Optional<bool> const& above_skip, Optional<bool> const& left_skip)
  208. {
  209. // Probabilities
  210. u8 context = 0;
  211. context += static_cast<u8>(above_skip.value_or(false));
  212. context += static_cast<u8>(left_skip.value_or(false));
  213. u8 probability = probability_table.skip_prob()[context];
  214. auto value = TRY(parse_tree_new<bool>(bit_stream, { binary_tree }, [&](u8) { return probability; }));
  215. increment_counter(counter.m_counts_skip[context][value]);
  216. return value;
  217. }
  218. ErrorOr<TXSize> TreeParser::parse_tx_size(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, TXSize max_tx_size, Optional<bool> above_skip, Optional<bool> left_skip, Optional<TXSize> above_tx_size, Optional<TXSize> left_tx_size)
  219. {
  220. // FIXME: Above and left contexts should be in structs.
  221. // Tree
  222. TreeParser::TreeSelection tree { tx_size_8_tree };
  223. if (max_tx_size == TX_16x16)
  224. tree = { tx_size_16_tree };
  225. if (max_tx_size == TX_32x32)
  226. tree = { tx_size_32_tree };
  227. // Probabilities
  228. auto above = max_tx_size;
  229. auto left = max_tx_size;
  230. if (above_skip.has_value() && !above_skip.value()) {
  231. above = above_tx_size.value();
  232. }
  233. if (left_skip.has_value() && !left_skip.value()) {
  234. left = left_tx_size.value();
  235. }
  236. if (!left_skip.has_value())
  237. left = above;
  238. if (!above_skip.has_value())
  239. above = left;
  240. auto context = (above + left) > max_tx_size;
  241. u8 const* probabilities = probability_table.tx_probs()[max_tx_size][context];
  242. auto value = TRY(parse_tree_new<TXSize>(bit_stream, tree, [&](u8 node) { return probabilities[node]; }));
  243. increment_counter(counter.m_counts_tx_size[max_tx_size][context][value]);
  244. return value;
  245. }
  246. ErrorOr<bool> TreeParser::parse_is_inter(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, Optional<bool> above_intra, Optional<bool> left_intra)
  247. {
  248. // FIXME: Above and left contexts should be in structs.
  249. // Probabilities
  250. u8 context = 0;
  251. if (above_intra.has_value() && left_intra.has_value())
  252. context = (left_intra.value() && above_intra.value()) ? 3 : static_cast<u8>(above_intra.value() || left_intra.value());
  253. else if (above_intra.has_value() || left_intra.has_value())
  254. context = 2 * static_cast<u8>(above_intra.has_value() ? above_intra.value() : left_intra.value());
  255. u8 probability = probability_table.is_inter_prob()[context];
  256. auto value = TRY(parse_tree_new<bool>(bit_stream, { binary_tree }, [&](u8) { return probability; }));
  257. increment_counter(counter.m_counts_is_inter[context][value]);
  258. return value;
  259. }
  260. ErrorOr<ReferenceMode> TreeParser::parse_comp_mode(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, ReferenceFrameType comp_fixed_ref, Optional<bool> above_single, Optional<bool> left_single, Optional<bool> above_intra, Optional<bool> left_intra, Optional<ReferenceFrameType> above_ref_frame_0, Optional<ReferenceFrameType> left_ref_frame_0)
  261. {
  262. // FIXME: Above and left contexts should be in structs.
  263. // Probabilities
  264. u8 context;
  265. if (above_single.has_value() && left_single.has_value()) {
  266. if (above_single.value() && left_single.value()) {
  267. auto is_above_fixed = above_ref_frame_0.value() == comp_fixed_ref;
  268. auto is_left_fixed = left_ref_frame_0.value() == comp_fixed_ref;
  269. context = is_above_fixed ^ is_left_fixed;
  270. } else if (above_single.value()) {
  271. auto is_above_fixed = above_ref_frame_0.value() == comp_fixed_ref;
  272. context = 2 + static_cast<u8>(is_above_fixed || above_intra.value());
  273. } else if (left_single.value()) {
  274. auto is_left_fixed = left_ref_frame_0.value() == comp_fixed_ref;
  275. context = 2 + static_cast<u8>(is_left_fixed || left_intra.value());
  276. } else {
  277. context = 4;
  278. }
  279. } else if (above_single.has_value()) {
  280. if (above_single.value())
  281. context = above_ref_frame_0.value() == comp_fixed_ref;
  282. else
  283. context = 3;
  284. } else if (left_single.has_value()) {
  285. if (left_single.value())
  286. context = static_cast<u8>(left_ref_frame_0.value() == comp_fixed_ref);
  287. else
  288. context = 3;
  289. } else {
  290. context = 1;
  291. }
  292. u8 probability = probability_table.comp_mode_prob()[context];
  293. auto value = TRY(parse_tree_new<ReferenceMode>(bit_stream, { binary_tree }, [&](u8) { return probability; }));
  294. increment_counter(counter.m_counts_comp_mode[context][value]);
  295. return value;
  296. }
  297. ErrorOr<bool> TreeParser::parse_comp_ref(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, ReferenceFrameType comp_fixed_ref, ReferenceFramePair comp_var_ref, Optional<bool> above_single, Optional<bool> left_single, Optional<bool> above_intra, Optional<bool> left_intra, Optional<ReferenceFrameType> above_ref_frame_0, Optional<ReferenceFrameType> left_ref_frame_0, Optional<ReferenceFrameType> above_ref_frame_biased, Optional<ReferenceFrameType> left_ref_frame_biased)
  298. {
  299. // FIXME: Above and left contexts should be in structs.
  300. // Probabilities
  301. u8 context;
  302. if (above_intra.has_value() && left_intra.has_value()) {
  303. if (above_intra.value() && left_intra.value()) {
  304. context = 2;
  305. } else if (left_intra.value()) {
  306. if (above_single.value()) {
  307. context = 1 + 2 * (above_ref_frame_0.value() != comp_var_ref[1]);
  308. } else {
  309. context = 1 + 2 * (above_ref_frame_biased.value() != comp_var_ref[1]);
  310. }
  311. } else if (above_intra.value()) {
  312. if (left_single.value()) {
  313. context = 1 + 2 * (left_ref_frame_0.value() != comp_var_ref[1]);
  314. } else {
  315. context = 1 + 2 * (left_ref_frame_biased != comp_var_ref[1]);
  316. }
  317. } else {
  318. auto var_ref_above = above_single.value() ? above_ref_frame_0 : above_ref_frame_biased;
  319. auto var_ref_left = left_single.value() ? left_ref_frame_0 : left_ref_frame_biased;
  320. if (var_ref_above == var_ref_left && comp_var_ref[1] == var_ref_above) {
  321. context = 0;
  322. } else if (left_single.value() && above_single.value()) {
  323. if ((var_ref_above == comp_fixed_ref && var_ref_left == comp_var_ref[0])
  324. || (var_ref_left == comp_fixed_ref && var_ref_above == comp_var_ref[0])) {
  325. context = 4;
  326. } else if (var_ref_above == var_ref_left) {
  327. context = 3;
  328. } else {
  329. context = 1;
  330. }
  331. } else if (left_single.value() || above_single.value()) {
  332. auto vrfc = left_single.value() ? var_ref_above : var_ref_left;
  333. auto rfs = above_single.value() ? var_ref_above : var_ref_left;
  334. if (vrfc == comp_var_ref[1] && rfs != comp_var_ref[1]) {
  335. context = 1;
  336. } else if (rfs == comp_var_ref[1] && vrfc != comp_var_ref[1]) {
  337. context = 2;
  338. } else {
  339. context = 4;
  340. }
  341. } else if (var_ref_above == var_ref_left) {
  342. context = 4;
  343. } else {
  344. context = 2;
  345. }
  346. }
  347. } else if (above_intra.has_value()) {
  348. if (above_intra.value()) {
  349. context = 2;
  350. } else {
  351. if (above_single.value()) {
  352. context = 3 * static_cast<u8>(above_ref_frame_0.value() != comp_var_ref[1]);
  353. } else {
  354. context = 4 * static_cast<u8>(above_ref_frame_biased.value() != comp_var_ref[1]);
  355. }
  356. }
  357. } else if (left_intra.has_value()) {
  358. if (left_intra.value()) {
  359. context = 2;
  360. } else {
  361. if (left_single.value()) {
  362. context = 3 * static_cast<u8>(left_ref_frame_0.value() != comp_var_ref[1]);
  363. } else {
  364. context = 4 * static_cast<u8>(left_ref_frame_biased != comp_var_ref[1]);
  365. }
  366. }
  367. } else {
  368. context = 2;
  369. }
  370. u8 probability = probability_table.comp_ref_prob()[context];
  371. auto value = TRY(parse_tree_new<bool>(bit_stream, { binary_tree }, [&](u8) { return probability; }));
  372. increment_counter(counter.m_counts_comp_ref[context][value]);
  373. return value;
  374. }
  375. ErrorOr<bool> TreeParser::parse_single_ref_part_1(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, Optional<bool> above_single, Optional<bool> left_single, Optional<bool> above_intra, Optional<bool> left_intra, Optional<ReferenceFramePair> above_ref_frame, Optional<ReferenceFramePair> left_ref_frame)
  376. {
  377. // FIXME: Above and left contexts should be in structs.
  378. // Probabilities
  379. u8 context;
  380. if (above_single.has_value() && left_single.has_value()) {
  381. if (above_intra.value() && left_intra.value()) {
  382. context = 2;
  383. } else if (left_intra.value()) {
  384. if (above_single.value()) {
  385. context = 4 * (above_ref_frame.value()[0] == LastFrame);
  386. } else {
  387. context = 1 + (above_ref_frame.value()[0] == LastFrame || above_ref_frame.value()[1] == LastFrame);
  388. }
  389. } else if (above_intra.value()) {
  390. if (left_single.value()) {
  391. context = 4 * (left_ref_frame.value()[0] == LastFrame);
  392. } else {
  393. context = 1 + (left_ref_frame.value()[0] == LastFrame || left_ref_frame.value()[1] == LastFrame);
  394. }
  395. } else {
  396. if (left_single.value() && above_single.value()) {
  397. context = 2 * (above_ref_frame.value()[0] == LastFrame) + 2 * (left_ref_frame.value()[0] == LastFrame);
  398. } else if (!left_single.value() && !above_single.value()) {
  399. auto above_is_last = above_ref_frame.value()[0] == LastFrame || above_ref_frame.value()[1] == LastFrame;
  400. auto left_is_last = left_ref_frame.value()[0] == LastFrame || left_ref_frame.value()[1] == LastFrame;
  401. context = 1 + (above_is_last || left_is_last);
  402. } else {
  403. auto rfs = above_single.value() ? above_ref_frame.value()[0] : left_ref_frame.value()[0];
  404. auto crf1 = above_single.value() ? left_ref_frame.value()[0] : above_ref_frame.value()[0];
  405. auto crf2 = above_single.value() ? left_ref_frame.value()[1] : above_ref_frame.value()[1];
  406. context = crf1 == LastFrame || crf2 == LastFrame;
  407. if (rfs == LastFrame)
  408. context += 3;
  409. }
  410. }
  411. } else if (above_single.has_value()) {
  412. if (above_intra.value()) {
  413. context = 2;
  414. } else {
  415. if (above_single.value()) {
  416. context = 4 * (above_ref_frame.value()[0] == LastFrame);
  417. } else {
  418. context = 1 + (above_ref_frame.value()[0] == LastFrame || above_ref_frame.value()[1] == LastFrame);
  419. }
  420. }
  421. } else if (left_single.has_value()) {
  422. if (left_intra.value()) {
  423. context = 2;
  424. } else {
  425. if (left_single.value()) {
  426. context = 4 * (left_ref_frame.value()[0] == LastFrame);
  427. } else {
  428. context = 1 + (left_ref_frame.value()[0] == LastFrame || left_ref_frame.value()[1] == LastFrame);
  429. }
  430. }
  431. } else {
  432. context = 2;
  433. }
  434. u8 probability = probability_table.single_ref_prob()[context][0];
  435. auto value = TRY(parse_tree_new<bool>(bit_stream, { binary_tree }, [&](u8) { return probability; }));
  436. increment_counter(counter.m_counts_single_ref[context][0][value]);
  437. return value;
  438. }
  439. ErrorOr<bool> TreeParser::parse_single_ref_part_2(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, Optional<bool> above_single, Optional<bool> left_single, Optional<bool> above_intra, Optional<bool> left_intra, Optional<ReferenceFramePair> above_ref_frame, Optional<ReferenceFramePair> left_ref_frame)
  440. {
  441. // FIXME: Above and left contexts should be in structs.
  442. // Probabilities
  443. u8 context;
  444. if (above_single.has_value() && left_single.has_value()) {
  445. if (above_intra.value() && left_intra.value()) {
  446. context = 2;
  447. } else if (left_intra.value()) {
  448. if (above_single.value()) {
  449. if (above_ref_frame.value()[0] == LastFrame) {
  450. context = 3;
  451. } else {
  452. context = 4 * (above_ref_frame.value()[0] == GoldenFrame);
  453. }
  454. } else {
  455. context = 1 + 2 * (above_ref_frame.value()[0] == GoldenFrame || above_ref_frame.value()[1] == GoldenFrame);
  456. }
  457. } else if (above_intra.value()) {
  458. if (left_single.value()) {
  459. if (left_ref_frame.value()[0] == LastFrame) {
  460. context = 3;
  461. } else {
  462. context = 4 * (left_ref_frame.value()[0] == GoldenFrame);
  463. }
  464. } else {
  465. context = 1 + 2 * (left_ref_frame.value()[0] == GoldenFrame || left_ref_frame.value()[1] == GoldenFrame);
  466. }
  467. } else {
  468. if (left_single.value() && above_single.value()) {
  469. auto above_last = above_ref_frame.value()[0] == LastFrame;
  470. auto left_last = left_ref_frame.value()[0] == LastFrame;
  471. if (above_last && left_last) {
  472. context = 3;
  473. } else if (above_last) {
  474. context = 4 * (left_ref_frame.value()[0] == GoldenFrame);
  475. } else if (left_last) {
  476. context = 4 * (above_ref_frame.value()[0] == GoldenFrame);
  477. } else {
  478. context = 2 * (above_ref_frame.value()[0] == GoldenFrame) + 2 * (left_ref_frame.value()[0] == GoldenFrame);
  479. }
  480. } else if (!left_single.value() && !above_single.value()) {
  481. if (above_ref_frame.value()[0] == left_ref_frame.value()[0] && above_ref_frame.value()[1] == left_ref_frame.value()[1]) {
  482. context = 3 * (above_ref_frame.value()[0] == GoldenFrame || above_ref_frame.value()[1] == GoldenFrame);
  483. } else {
  484. context = 2;
  485. }
  486. } else {
  487. auto rfs = above_single.value() ? above_ref_frame.value()[0] : left_ref_frame.value()[0];
  488. auto crf1 = above_single.value() ? left_ref_frame.value()[0] : above_ref_frame.value()[0];
  489. auto crf2 = above_single.value() ? left_ref_frame.value()[1] : above_ref_frame.value()[1];
  490. context = crf1 == GoldenFrame || crf2 == GoldenFrame;
  491. if (rfs == GoldenFrame) {
  492. context += 3;
  493. } else if (rfs != AltRefFrame) {
  494. context = 1 + (2 * context);
  495. }
  496. }
  497. }
  498. } else if (above_single.has_value()) {
  499. if (above_intra.value() || (above_ref_frame.value()[0] == LastFrame && above_single.value())) {
  500. context = 2;
  501. } else if (above_single.value()) {
  502. context = 4 * (above_ref_frame.value()[0] == GoldenFrame);
  503. } else {
  504. context = 3 * (above_ref_frame.value()[0] == GoldenFrame || above_ref_frame.value()[1] == GoldenFrame);
  505. }
  506. } else if (left_single.has_value()) {
  507. if (left_intra.value() || (left_ref_frame.value()[0] == LastFrame && left_single.value())) {
  508. context = 2;
  509. } else if (left_single.value()) {
  510. context = 4 * (left_ref_frame.value()[0] == GoldenFrame);
  511. } else {
  512. context = 3 * (left_ref_frame.value()[0] == GoldenFrame || left_ref_frame.value()[1] == GoldenFrame);
  513. }
  514. } else {
  515. context = 2;
  516. }
  517. u8 probability = probability_table.single_ref_prob()[context][1];
  518. auto value = TRY(parse_tree_new<bool>(bit_stream, { binary_tree }, [&](u8) { return probability; }));
  519. increment_counter(counter.m_counts_single_ref[context][1][value]);
  520. return value;
  521. }
  522. ErrorOr<MvJoint> TreeParser::parse_motion_vector_joint(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter)
  523. {
  524. auto value = TRY(parse_tree_new<MvJoint>(bit_stream, { mv_joint_tree }, [&](u8 node) { return probability_table.mv_joint_probs()[node]; }));
  525. increment_counter(counter.m_counts_mv_joint[value]);
  526. return value;
  527. }
  528. ErrorOr<bool> TreeParser::parse_motion_vector_sign(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, u8 component)
  529. {
  530. auto value = TRY(parse_tree_new<bool>(bit_stream, { binary_tree }, [&](u8) { return probability_table.mv_sign_prob()[component]; }));
  531. increment_counter(counter.m_counts_mv_sign[component][value]);
  532. return value;
  533. }
  534. ErrorOr<MvClass> TreeParser::parse_motion_vector_class(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, u8 component)
  535. {
  536. // Spec doesn't mention node, but the probabilities table has an extra dimension
  537. // so we will use node for that.
  538. auto value = TRY(parse_tree_new<MvClass>(bit_stream, { mv_class_tree }, [&](u8 node) { return probability_table.mv_class_probs()[component][node]; }));
  539. increment_counter(counter.m_counts_mv_class[component][value]);
  540. return value;
  541. }
  542. ErrorOr<bool> TreeParser::parse_motion_vector_class0_bit(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, u8 component)
  543. {
  544. auto value = TRY(parse_tree_new<bool>(bit_stream, { binary_tree }, [&](u8) { return probability_table.mv_class0_bit_prob()[component]; }));
  545. increment_counter(counter.m_counts_mv_class0_bit[component][value]);
  546. return value;
  547. }
  548. ErrorOr<u8> TreeParser::parse_motion_vector_class0_fr(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, u8 component, bool class_0_bit)
  549. {
  550. auto value = TRY(parse_tree_new<u8>(bit_stream, { mv_fr_tree }, [&](u8 node) { return probability_table.mv_class0_fr_probs()[component][class_0_bit][node]; }));
  551. increment_counter(counter.m_counts_mv_class0_fr[component][class_0_bit][value]);
  552. return value;
  553. }
  554. ErrorOr<bool> TreeParser::parse_motion_vector_class0_hp(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, u8 component, bool use_hp)
  555. {
  556. TreeParser::TreeSelection tree { 1 };
  557. if (use_hp)
  558. tree = { binary_tree };
  559. auto value = TRY(parse_tree_new<bool>(bit_stream, tree, [&](u8) { return probability_table.mv_class0_hp_prob()[component]; }));
  560. increment_counter(counter.m_counts_mv_class0_hp[component][value]);
  561. return value;
  562. }
  563. ErrorOr<bool> TreeParser::parse_motion_vector_bit(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, u8 component, u8 bit_index)
  564. {
  565. auto value = TRY(parse_tree_new<bool>(bit_stream, { binary_tree }, [&](u8) { return probability_table.mv_bits_prob()[component][bit_index]; }));
  566. increment_counter(counter.m_counts_mv_bits[component][bit_index][value]);
  567. return value;
  568. }
  569. ErrorOr<u8> TreeParser::parse_motion_vector_fr(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, u8 component)
  570. {
  571. auto value = TRY(parse_tree_new<u8>(bit_stream, { mv_fr_tree }, [&](u8 node) { return probability_table.mv_fr_probs()[component][node]; }));
  572. increment_counter(counter.m_counts_mv_fr[component][value]);
  573. return value;
  574. }
  575. ErrorOr<bool> TreeParser::parse_motion_vector_hp(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, u8 component, bool use_hp)
  576. {
  577. TreeParser::TreeSelection tree { 1 };
  578. if (use_hp)
  579. tree = { binary_tree };
  580. auto value = TRY(parse_tree_new<u8>(bit_stream, tree, [&](u8) { return probability_table.mv_hp_prob()[component]; }));
  581. increment_counter(counter.m_counts_mv_hp[component][value]);
  582. return value;
  583. }
  584. /*
  585. * 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
  586. */
  587. TreeParser::TreeSelection TreeParser::select_tree(SyntaxElementType type)
  588. {
  589. switch (type) {
  590. case SyntaxElementType::MoreCoefs:
  591. return { binary_tree };
  592. case SyntaxElementType::Token:
  593. return { token_tree };
  594. default:
  595. break;
  596. }
  597. VERIFY_NOT_REACHED();
  598. }
  599. /*
  600. * Select a probability with which to read a boolean when decoding a tree, as specified in section 9.3.2
  601. */
  602. u8 TreeParser::select_tree_probability(SyntaxElementType type, u8 node)
  603. {
  604. switch (type) {
  605. case SyntaxElementType::Token:
  606. return calculate_token_probability(node);
  607. case SyntaxElementType::MoreCoefs:
  608. return calculate_more_coefs_probability();
  609. default:
  610. break;
  611. }
  612. VERIFY_NOT_REACHED();
  613. }
  614. #define ABOVE_FRAME_0 m_decoder.m_above_ref_frame[0]
  615. #define ABOVE_FRAME_1 m_decoder.m_above_ref_frame[1]
  616. #define LEFT_FRAME_0 m_decoder.m_left_ref_frame[0]
  617. #define LEFT_FRAME_1 m_decoder.m_left_ref_frame[1]
  618. #define AVAIL_U m_decoder.m_available_u
  619. #define AVAIL_L m_decoder.m_available_l
  620. #define ABOVE_INTRA m_decoder.m_above_intra
  621. #define LEFT_INTRA m_decoder.m_left_intra
  622. #define ABOVE_SINGLE m_decoder.m_above_single
  623. #define LEFT_SINGLE m_decoder.m_left_single
  624. void TreeParser::set_tokens_variables(u8 band, u32 c, u32 plane, TXSize tx_size, u32 pos)
  625. {
  626. m_band = band;
  627. m_c = c;
  628. m_plane = plane;
  629. m_tx_size = tx_size;
  630. m_pos = pos;
  631. if (m_c == 0) {
  632. auto sx = m_plane > 0 ? m_decoder.m_subsampling_x : 0;
  633. auto sy = m_plane > 0 ? m_decoder.m_subsampling_y : 0;
  634. auto max_x = (2 * m_decoder.m_mi_cols) >> sx;
  635. auto max_y = (2 * m_decoder.m_mi_rows) >> sy;
  636. u8 numpts = 1 << m_tx_size;
  637. auto x4 = m_start_x >> 2;
  638. auto y4 = m_start_y >> 2;
  639. u32 above = 0;
  640. u32 left = 0;
  641. for (size_t i = 0; i < numpts; i++) {
  642. if (x4 + i < max_x)
  643. above |= m_decoder.m_above_nonzero_context[m_plane][x4 + i];
  644. if (y4 + i < max_y)
  645. left |= m_decoder.m_left_nonzero_context[m_plane][y4 + i];
  646. }
  647. m_ctx = above + left;
  648. } else {
  649. u32 neighbor_0, neighbor_1;
  650. auto n = 4 << m_tx_size;
  651. auto i = m_pos / n;
  652. auto j = m_pos % n;
  653. auto a = i > 0 ? (i - 1) * n + j : 0;
  654. auto a2 = i * n + j - 1;
  655. if (i > 0 && j > 0) {
  656. if (m_decoder.m_tx_type == DCT_ADST) {
  657. neighbor_0 = a;
  658. neighbor_1 = a;
  659. } else if (m_decoder.m_tx_type == ADST_DCT) {
  660. neighbor_0 = a2;
  661. neighbor_1 = a2;
  662. } else {
  663. neighbor_0 = a;
  664. neighbor_1 = a2;
  665. }
  666. } else if (i > 0) {
  667. neighbor_0 = a;
  668. neighbor_1 = a;
  669. } else {
  670. neighbor_0 = a2;
  671. neighbor_1 = a2;
  672. }
  673. m_ctx = (1 + m_decoder.m_token_cache[neighbor_0] + m_decoder.m_token_cache[neighbor_1]) >> 1;
  674. }
  675. }
  676. u8 TreeParser::calculate_more_coefs_probability()
  677. {
  678. return m_decoder.m_probability_tables->coef_probs()[m_tx_size][m_plane > 0][m_decoder.m_is_inter][m_band][m_ctx][0];
  679. }
  680. u8 TreeParser::calculate_token_probability(u8 node)
  681. {
  682. 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)];
  683. if (node < 2)
  684. return prob;
  685. auto x = (prob - 1) / 2;
  686. auto& pareto_table = m_decoder.m_probability_tables->pareto_table();
  687. if (prob & 1)
  688. return pareto_table[x][node - 2];
  689. return (pareto_table[x][node - 2] + pareto_table[x + 1][node - 2]) >> 1;
  690. }
  691. void TreeParser::count_syntax_element(SyntaxElementType type, int value)
  692. {
  693. auto increment = [](u8& count) {
  694. increment_counter(count);
  695. };
  696. switch (type) {
  697. case SyntaxElementType::Token:
  698. 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)]);
  699. return;
  700. case SyntaxElementType::MoreCoefs:
  701. 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]);
  702. return;
  703. default:
  704. break;
  705. }
  706. VERIFY_NOT_REACHED();
  707. }
  708. }