TreeParser.cpp 25 KB

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