ProbabilityTables.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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. #pragma once
  8. #include <AK/Array.h>
  9. #include <AK/Types.h>
  10. #include "Symbols.h"
  11. namespace Video::VP9 {
  12. typedef u8 ParetoTable[128][8];
  13. typedef u8 KfPartitionProbs[PARTITION_CONTEXTS][PARTITION_TYPES - 1];
  14. typedef u8 KfYModeProbs[INTRA_MODES][INTRA_MODES][INTRA_MODES - 1];
  15. typedef u8 KfUVModeProbs[INTRA_MODES][INTRA_MODES - 1];
  16. typedef u8 PartitionProbs[PARTITION_CONTEXTS][PARTITION_TYPES - 1];
  17. typedef u8 YModeProbs[BLOCK_SIZE_GROUPS][INTRA_MODES - 1];
  18. typedef u8 UVModeProbs[INTRA_MODES][INTRA_MODES - 1];
  19. typedef u8 SkipProb[SKIP_CONTEXTS];
  20. typedef u8 IsInterProb[IS_INTER_CONTEXTS];
  21. typedef u8 CompModeProb[COMP_MODE_CONTEXTS];
  22. typedef u8 CompRefProb[REF_CONTEXTS];
  23. typedef u8 SingleRefProb[REF_CONTEXTS][2];
  24. typedef u8 MvSignProb[2];
  25. typedef u8 MvBitsProb[2][MV_OFFSET_BITS];
  26. typedef u8 MvClass0BitProb[2];
  27. typedef u8 TxProbs[TX_SIZES][TX_SIZE_CONTEXTS][TX_SIZES - 1];
  28. typedef u8 InterModeProbs[INTER_MODE_CONTEXTS][INTER_MODES - 1];
  29. typedef u8 InterpFilterProbs[INTERP_FILTER_CONTEXTS][SWITCHABLE_FILTERS - 1];
  30. typedef u8 MvJointProbs[3];
  31. typedef u8 MvClassProbs[2][MV_CLASSES - 1];
  32. typedef u8 MvClass0FrProbs[2][CLASS0_SIZE][3];
  33. typedef u8 MvClass0HpProbs[2];
  34. typedef u8 MvFrProbs[2][3];
  35. typedef u8 MvHpProb[2];
  36. typedef u8 CoefProbs[TX_SIZES][BLOCK_TYPES][REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS][UNCONSTRAINED_NODES];
  37. class ProbabilityTables final {
  38. public:
  39. void save_probs(u8 index);
  40. void reset_probs();
  41. void load_probs(u8 index);
  42. void load_probs2(u8 index);
  43. ParetoTable const& pareto_table() const;
  44. KfPartitionProbs const& kf_partition_probs() const;
  45. KfYModeProbs const& kf_y_mode_probs() const;
  46. KfUVModeProbs const& kf_uv_mode_prob() const;
  47. PartitionProbs& partition_probs() { return m_current_probability_table.partition_probs; }
  48. PartitionProbs const& partition_probs() const { return m_current_probability_table.partition_probs; }
  49. YModeProbs& y_mode_probs() { return m_current_probability_table.y_mode_probs; }
  50. YModeProbs const& y_mode_probs() const { return m_current_probability_table.y_mode_probs; }
  51. UVModeProbs& uv_mode_probs() { return m_current_probability_table.uv_mode_probs; }
  52. UVModeProbs const& uv_mode_probs() const { return m_current_probability_table.uv_mode_probs; }
  53. SkipProb& skip_prob() { return m_current_probability_table.skip_prob; }
  54. SkipProb const& skip_prob() const { return m_current_probability_table.skip_prob; }
  55. IsInterProb& is_inter_prob() { return m_current_probability_table.is_inter_prob; }
  56. IsInterProb const& is_inter_prob() const { return m_current_probability_table.is_inter_prob; }
  57. CompModeProb& comp_mode_prob() { return m_current_probability_table.comp_mode_prob; }
  58. CompModeProb const& comp_mode_prob() const { return m_current_probability_table.comp_mode_prob; }
  59. CompRefProb& comp_ref_prob() { return m_current_probability_table.comp_ref_prob; }
  60. CompRefProb const& comp_ref_prob() const { return m_current_probability_table.comp_ref_prob; }
  61. SingleRefProb& single_ref_prob() { return m_current_probability_table.single_ref_prob; }
  62. SingleRefProb const& single_ref_prob() const { return m_current_probability_table.single_ref_prob; }
  63. MvSignProb& mv_sign_prob() { return m_current_probability_table.mv_sign_prob; }
  64. MvSignProb const& mv_sign_prob() const { return m_current_probability_table.mv_sign_prob; }
  65. MvBitsProb& mv_bits_prob() { return m_current_probability_table.mv_bits_prob; }
  66. MvBitsProb const& mv_bits_prob() const { return m_current_probability_table.mv_bits_prob; }
  67. MvClass0BitProb& mv_class0_bit_prob() { return m_current_probability_table.mv_class0_bit_prob; }
  68. MvClass0BitProb const& mv_class0_bit_prob() const { return m_current_probability_table.mv_class0_bit_prob; }
  69. TxProbs& tx_probs() { return m_current_probability_table.tx_probs; }
  70. TxProbs const& tx_probs() const { return m_current_probability_table.tx_probs; }
  71. InterModeProbs& inter_mode_probs() { return m_current_probability_table.inter_mode_probs; }
  72. InterModeProbs const& inter_mode_probs() const { return m_current_probability_table.inter_mode_probs; }
  73. InterpFilterProbs& interp_filter_probs() { return m_current_probability_table.interp_filter_probs; }
  74. InterpFilterProbs const& interp_filter_probs() const { return m_current_probability_table.interp_filter_probs; }
  75. MvJointProbs& mv_joint_probs() { return m_current_probability_table.mv_joint_probs; }
  76. MvJointProbs const& mv_joint_probs() const { return m_current_probability_table.mv_joint_probs; }
  77. MvClassProbs& mv_class_probs() { return m_current_probability_table.mv_class_probs; }
  78. MvClassProbs const& mv_class_probs() const { return m_current_probability_table.mv_class_probs; }
  79. MvClass0FrProbs& mv_class0_fr_probs() { return m_current_probability_table.mv_class0_fr_probs; }
  80. MvClass0FrProbs const& mv_class0_fr_probs() const { return m_current_probability_table.mv_class0_fr_probs; }
  81. MvClass0HpProbs& mv_class0_hp_prob() { return m_current_probability_table.mv_class0_hp_prob; }
  82. MvClass0HpProbs const& mv_class0_hp_prob() const { return m_current_probability_table.mv_class0_hp_prob; }
  83. MvFrProbs& mv_fr_probs() { return m_current_probability_table.mv_fr_probs; }
  84. MvFrProbs const& mv_fr_probs() const { return m_current_probability_table.mv_fr_probs; }
  85. MvHpProb& mv_hp_prob() { return m_current_probability_table.mv_hp_prob; }
  86. MvHpProb const& mv_hp_prob() const { return m_current_probability_table.mv_hp_prob; }
  87. CoefProbs& coef_probs() { return m_current_probability_table.coef_probs; }
  88. CoefProbs const& coef_probs() const { return m_current_probability_table.coef_probs; }
  89. private:
  90. struct ProbabilityTable {
  91. PartitionProbs partition_probs;
  92. YModeProbs y_mode_probs;
  93. UVModeProbs uv_mode_probs;
  94. SkipProb skip_prob;
  95. IsInterProb is_inter_prob;
  96. CompModeProb comp_mode_prob;
  97. CompRefProb comp_ref_prob;
  98. SingleRefProb single_ref_prob;
  99. MvSignProb mv_sign_prob;
  100. MvBitsProb mv_bits_prob;
  101. MvClass0BitProb mv_class0_bit_prob;
  102. TxProbs tx_probs;
  103. InterModeProbs inter_mode_probs;
  104. InterpFilterProbs interp_filter_probs;
  105. MvJointProbs mv_joint_probs;
  106. MvClassProbs mv_class_probs;
  107. MvClass0FrProbs mv_class0_fr_probs;
  108. MvClass0HpProbs mv_class0_hp_prob;
  109. MvFrProbs mv_fr_probs;
  110. MvHpProb mv_hp_prob;
  111. CoefProbs coef_probs;
  112. };
  113. Array<ProbabilityTable, 4> m_saved_probability_tables;
  114. ProbabilityTable m_current_probability_table;
  115. };
  116. }