/* * Copyright (c) 2021, Hunter Salyer * Copyright (c) 2022, Gregory Bertilson * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include "Symbols.h" namespace Video::VP9 { typedef u8 ParetoTable[128][8]; typedef u8 KfPartitionProbs[PARTITION_CONTEXTS][PARTITION_TYPES - 1]; typedef u8 KfYModeProbs[INTRA_MODES][INTRA_MODES][INTRA_MODES - 1]; typedef u8 KfUVModeProbs[INTRA_MODES][INTRA_MODES - 1]; typedef u8 PartitionProbs[PARTITION_CONTEXTS][PARTITION_TYPES - 1]; typedef u8 YModeProbs[BLOCK_SIZE_GROUPS][INTRA_MODES - 1]; typedef u8 UVModeProbs[INTRA_MODES][INTRA_MODES - 1]; typedef u8 SkipProb[SKIP_CONTEXTS]; typedef u8 IsInterProb[IS_INTER_CONTEXTS]; typedef u8 CompModeProb[COMP_MODE_CONTEXTS]; typedef u8 CompRefProb[REF_CONTEXTS]; typedef u8 SingleRefProb[REF_CONTEXTS][2]; typedef u8 MvSignProb[2]; typedef u8 MvBitsProb[2][MV_OFFSET_BITS]; typedef u8 MvClass0BitProb[2]; typedef u8 TxProbs[TX_SIZES][TX_SIZE_CONTEXTS][TX_SIZES - 1]; typedef u8 InterModeProbs[INTER_MODE_CONTEXTS][INTER_MODES - 1]; typedef u8 InterpFilterProbs[INTERP_FILTER_CONTEXTS][SWITCHABLE_FILTERS - 1]; typedef u8 MvJointProbs[3]; typedef u8 MvClassProbs[2][MV_CLASSES - 1]; typedef u8 MvClass0FrProbs[2][CLASS0_SIZE][3]; typedef u8 MvClass0HpProbs[2]; typedef u8 MvFrProbs[2][3]; typedef u8 MvHpProb[2]; typedef u8 CoefProbs[TX_SIZES][BLOCK_TYPES][REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS][UNCONSTRAINED_NODES]; class ProbabilityTables final { public: void save_probs(u8 index); void reset_probs(); void load_probs(u8 index); void load_probs2(u8 index); ParetoTable const& pareto_table() const; KfPartitionProbs const& kf_partition_probs() const; KfYModeProbs const& kf_y_mode_probs() const; KfUVModeProbs const& kf_uv_mode_prob() const; PartitionProbs& partition_probs() { return m_current_probability_table.partition_probs; } PartitionProbs const& partition_probs() const { return m_current_probability_table.partition_probs; } YModeProbs& y_mode_probs() { return m_current_probability_table.y_mode_probs; } YModeProbs const& y_mode_probs() const { return m_current_probability_table.y_mode_probs; } UVModeProbs& uv_mode_probs() { return m_current_probability_table.uv_mode_probs; } UVModeProbs const& uv_mode_probs() const { return m_current_probability_table.uv_mode_probs; } SkipProb& skip_prob() { return m_current_probability_table.skip_prob; } SkipProb const& skip_prob() const { return m_current_probability_table.skip_prob; } IsInterProb& is_inter_prob() { return m_current_probability_table.is_inter_prob; } IsInterProb const& is_inter_prob() const { return m_current_probability_table.is_inter_prob; } CompModeProb& comp_mode_prob() { return m_current_probability_table.comp_mode_prob; } CompModeProb const& comp_mode_prob() const { return m_current_probability_table.comp_mode_prob; } CompRefProb& comp_ref_prob() { return m_current_probability_table.comp_ref_prob; } CompRefProb const& comp_ref_prob() const { return m_current_probability_table.comp_ref_prob; } SingleRefProb& single_ref_prob() { return m_current_probability_table.single_ref_prob; } SingleRefProb const& single_ref_prob() const { return m_current_probability_table.single_ref_prob; } MvSignProb& mv_sign_prob() { return m_current_probability_table.mv_sign_prob; } MvSignProb const& mv_sign_prob() const { return m_current_probability_table.mv_sign_prob; } MvBitsProb& mv_bits_prob() { return m_current_probability_table.mv_bits_prob; } MvBitsProb const& mv_bits_prob() const { return m_current_probability_table.mv_bits_prob; } MvClass0BitProb& mv_class0_bit_prob() { return m_current_probability_table.mv_class0_bit_prob; } MvClass0BitProb const& mv_class0_bit_prob() const { return m_current_probability_table.mv_class0_bit_prob; } TxProbs& tx_probs() { return m_current_probability_table.tx_probs; } TxProbs const& tx_probs() const { return m_current_probability_table.tx_probs; } InterModeProbs& inter_mode_probs() { return m_current_probability_table.inter_mode_probs; } InterModeProbs const& inter_mode_probs() const { return m_current_probability_table.inter_mode_probs; } InterpFilterProbs& interp_filter_probs() { return m_current_probability_table.interp_filter_probs; } InterpFilterProbs const& interp_filter_probs() const { return m_current_probability_table.interp_filter_probs; } MvJointProbs& mv_joint_probs() { return m_current_probability_table.mv_joint_probs; } MvJointProbs const& mv_joint_probs() const { return m_current_probability_table.mv_joint_probs; } MvClassProbs& mv_class_probs() { return m_current_probability_table.mv_class_probs; } MvClassProbs const& mv_class_probs() const { return m_current_probability_table.mv_class_probs; } MvClass0FrProbs& mv_class0_fr_probs() { return m_current_probability_table.mv_class0_fr_probs; } MvClass0FrProbs const& mv_class0_fr_probs() const { return m_current_probability_table.mv_class0_fr_probs; } MvClass0HpProbs& mv_class0_hp_prob() { return m_current_probability_table.mv_class0_hp_prob; } MvClass0HpProbs const& mv_class0_hp_prob() const { return m_current_probability_table.mv_class0_hp_prob; } MvFrProbs& mv_fr_probs() { return m_current_probability_table.mv_fr_probs; } MvFrProbs const& mv_fr_probs() const { return m_current_probability_table.mv_fr_probs; } MvHpProb& mv_hp_prob() { return m_current_probability_table.mv_hp_prob; } MvHpProb const& mv_hp_prob() const { return m_current_probability_table.mv_hp_prob; } CoefProbs& coef_probs() { return m_current_probability_table.coef_probs; } CoefProbs const& coef_probs() const { return m_current_probability_table.coef_probs; } private: struct ProbabilityTable { PartitionProbs partition_probs; YModeProbs y_mode_probs; UVModeProbs uv_mode_probs; SkipProb skip_prob; IsInterProb is_inter_prob; CompModeProb comp_mode_prob; CompRefProb comp_ref_prob; SingleRefProb single_ref_prob; MvSignProb mv_sign_prob; MvBitsProb mv_bits_prob; MvClass0BitProb mv_class0_bit_prob; TxProbs tx_probs; InterModeProbs inter_mode_probs; InterpFilterProbs interp_filter_probs; MvJointProbs mv_joint_probs; MvClassProbs mv_class_probs; MvClass0FrProbs mv_class0_fr_probs; MvClass0HpProbs mv_class0_hp_prob; MvFrProbs mv_fr_probs; MvHpProb mv_hp_prob; CoefProbs coef_probs; }; Array m_saved_probability_tables; ProbabilityTable m_current_probability_table; }; }