From 858915ab3ae9ed5fe9eb2be42a6452f3d464293a Mon Sep 17 00:00:00 2001 From: Zaggy1024 Date: Sun, 6 Nov 2022 19:37:59 -0600 Subject: [PATCH] LibVideo: Parameterize intra prediction mode parsing for VP9 --- Userland/Libraries/LibVideo/VP9/Parser.cpp | 4 +- .../Libraries/LibVideo/VP9/TreeParser.cpp | 51 ++++++++++--------- Userland/Libraries/LibVideo/VP9/TreeParser.h | 4 +- 3 files changed, 31 insertions(+), 28 deletions(-) diff --git a/Userland/Libraries/LibVideo/VP9/Parser.cpp b/Userland/Libraries/LibVideo/VP9/Parser.cpp index 8903f5023e..7a26b252b7 100644 --- a/Userland/Libraries/LibVideo/VP9/Parser.cpp +++ b/Userland/Libraries/LibVideo/VP9/Parser.cpp @@ -1182,7 +1182,7 @@ DecoderErrorOr Parser::intra_block_mode_info() m_ref_frame[0] = IntraFrame; m_ref_frame[1] = None; if (m_mi_size >= Block_8x8) { - m_y_mode = TRY_READ(m_tree_parser->parse_tree(SyntaxElementType::IntraMode)); + m_y_mode = TRY_READ(TreeParser::parse_intra_mode(*m_bit_stream, *m_probability_tables, *m_syntax_element_counter, m_mi_size)); for (auto& block_sub_mode : m_block_sub_modes) block_sub_mode = m_y_mode; } else { @@ -1191,7 +1191,7 @@ DecoderErrorOr Parser::intra_block_mode_info() PredictionMode sub_intra_mode; for (auto idy = 0; idy < 2; idy += m_num_4x4_h) { for (auto idx = 0; idx < 2; idx += m_num_4x4_w) { - sub_intra_mode = TRY_READ(m_tree_parser->parse_tree(SyntaxElementType::SubIntraMode)); + sub_intra_mode = TRY_READ(TreeParser::parse_sub_intra_mode(*m_bit_stream, *m_probability_tables, *m_syntax_element_counter)); for (auto y = 0; y < m_num_4x4_h; y++) { for (auto x = 0; x < m_num_4x4_w; x++) m_block_sub_modes[(idy + y) * 2 + idx + x] = sub_intra_mode; diff --git a/Userland/Libraries/LibVideo/VP9/TreeParser.cpp b/Userland/Libraries/LibVideo/VP9/TreeParser.cpp index bebf97d344..ff6e565c66 100644 --- a/Userland/Libraries/LibVideo/VP9/TreeParser.cpp +++ b/Userland/Libraries/LibVideo/VP9/TreeParser.cpp @@ -147,15 +147,39 @@ ErrorOr TreeParser::parse_default_uv_mode(BitStream& bit_stream, return value; } +ErrorOr TreeParser::parse_intra_mode(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, BlockSubsize mi_size) +{ + // Tree + TreeParser::TreeSelection tree = { intra_mode_tree }; + + // Probabilities + auto context = size_group_lookup[mi_size]; + u8 const* probabilities = probability_table.y_mode_probs()[context]; + + auto value = TRY(parse_tree_new(bit_stream, tree, [&](u8 node) { return probabilities[node]; })); + increment_counter(counter.m_counts_intra_mode[context][to_underlying(value)]); + return value; +} + +ErrorOr TreeParser::parse_sub_intra_mode(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter) +{ + // Tree + TreeParser::TreeSelection tree = { intra_mode_tree }; + + // Probabilities + u8 const* probabilities = probability_table.y_mode_probs()[0]; + + auto value = TRY(parse_tree_new(bit_stream, tree, [&](u8 node) { return probabilities[node]; })); + increment_counter(counter.m_counts_intra_mode[0][to_underlying(value)]); + return value; +} + /* * 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 */ TreeParser::TreeSelection TreeParser::select_tree(SyntaxElementType type) { switch (type) { - case SyntaxElementType::DefaultUVMode: - case SyntaxElementType::IntraMode: - case SyntaxElementType::SubIntraMode: case SyntaxElementType::UVMode: return { intra_mode_tree }; case SyntaxElementType::SegmentID: @@ -208,10 +232,6 @@ TreeParser::TreeSelection TreeParser::select_tree(SyntaxElementType type) u8 TreeParser::select_tree_probability(SyntaxElementType type, u8 node) { switch (type) { - case SyntaxElementType::IntraMode: - return calculate_intra_mode_probability(node); - case SyntaxElementType::SubIntraMode: - return calculate_sub_intra_mode_probability(node); case SyntaxElementType::UVMode: return calculate_uv_mode_probability(node); case SyntaxElementType::SegmentID: @@ -279,18 +299,6 @@ u8 TreeParser::select_tree_probability(SyntaxElementType type, u8 node) #define ABOVE_SINGLE m_decoder.m_above_single #define LEFT_SINGLE m_decoder.m_left_single -u8 TreeParser::calculate_intra_mode_probability(u8 node) -{ - m_ctx = size_group_lookup[m_decoder.m_mi_size]; - return m_decoder.m_probability_tables->y_mode_probs()[m_ctx][node]; -} - -u8 TreeParser::calculate_sub_intra_mode_probability(u8 node) -{ - m_ctx = 0; - return m_decoder.m_probability_tables->y_mode_probs()[m_ctx][node]; -} - u8 TreeParser::calculate_uv_mode_probability(u8 node) { m_ctx = to_underlying(m_decoder.m_y_mode); @@ -704,10 +712,6 @@ void TreeParser::count_syntax_element(SyntaxElementType type, int value) increment_counter(count); }; switch (type) { - case SyntaxElementType::IntraMode: - case SyntaxElementType::SubIntraMode: - increment(m_decoder.m_syntax_element_counter->m_counts_intra_mode[m_ctx][value]); - return; case SyntaxElementType::UVMode: increment(m_decoder.m_syntax_element_counter->m_counts_uv_mode[m_ctx][value]); return; @@ -775,7 +779,6 @@ void TreeParser::count_syntax_element(SyntaxElementType type, int value) case SyntaxElementType::MoreCoefs: 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]); return; - case SyntaxElementType::DefaultUVMode: case SyntaxElementType::SegmentID: case SyntaxElementType::SegIDPredicted: // No counting required diff --git a/Userland/Libraries/LibVideo/VP9/TreeParser.h b/Userland/Libraries/LibVideo/VP9/TreeParser.h index 411883ac0e..6a581b7fad 100644 --- a/Userland/Libraries/LibVideo/VP9/TreeParser.h +++ b/Userland/Libraries/LibVideo/VP9/TreeParser.h @@ -65,6 +65,8 @@ public: static ErrorOr parse_partition(BitStream&, ProbabilityTables const&, SyntaxElementCounter&, bool has_rows, bool has_columns, BlockSubsize block_subsize, u8 num_8x8, Vector const& above_partition_context, Vector const& left_partition_context, u32 row, u32 column, bool frame_is_intra); static ErrorOr parse_default_intra_mode(BitStream&, ProbabilityTables const&, BlockSubsize mi_size, Optional const&> above_context, Optional const&> left_context, PredictionMode block_sub_modes[4], u8 index_x, u8 index_y); static ErrorOr parse_default_uv_mode(BitStream&, ProbabilityTables const&, PredictionMode y_mode); + static ErrorOr parse_intra_mode(BitStream&, ProbabilityTables const&, SyntaxElementCounter&, BlockSubsize mi_size); + static ErrorOr parse_sub_intra_mode(BitStream&, ProbabilityTables const&, SyntaxElementCounter&); void set_default_intra_mode_variables(u8 idx, u8 idy) { @@ -98,8 +100,6 @@ public: } private: - u8 calculate_intra_mode_probability(u8 node); - u8 calculate_sub_intra_mode_probability(u8 node); u8 calculate_uv_mode_probability(u8 node); u8 calculate_segment_id_probability(u8 node); u8 calculate_skip_probability();