diff --git a/Userland/Libraries/LibVideo/VP9/Parser.cpp b/Userland/Libraries/LibVideo/VP9/Parser.cpp index d028f7ceb2..8220a6a13f 100644 --- a/Userland/Libraries/LibVideo/VP9/Parser.cpp +++ b/Userland/Libraries/LibVideo/VP9/Parser.cpp @@ -1064,7 +1064,7 @@ DecoderErrorOr Parser::intra_frame_mode_info() DecoderErrorOr Parser::intra_segment_id() { if (m_segmentation_enabled && m_segmentation_update_map) - m_segment_id = TRY_READ(m_tree_parser->parse_tree(SyntaxElementType::SegmentID)); + m_segment_id = TRY_READ(TreeParser::parse_segment_id(*m_bit_stream, m_segmentation_tree_probs)); else m_segment_id = 0; return {}; @@ -1128,15 +1128,15 @@ DecoderErrorOr Parser::inter_segment_id() return {}; } if (!m_segmentation_temporal_update) { - m_segment_id = TRY_READ(m_tree_parser->parse_tree(SyntaxElementType::SegmentID)); + m_segment_id = TRY_READ(TreeParser::parse_segment_id(*m_bit_stream, m_segmentation_tree_probs)); return {}; } - auto seg_id_predicted = TRY_READ(m_tree_parser->parse_tree(SyntaxElementType::SegIDPredicted)); + auto seg_id_predicted = TRY_READ(TreeParser::parse_segment_id_predicted(*m_bit_stream, m_segmentation_pred_prob, m_left_seg_pred_context[m_mi_row], m_above_seg_pred_context[m_mi_col])); if (seg_id_predicted) m_segment_id = predicted_segment_id; else - m_segment_id = TRY_READ(m_tree_parser->parse_tree(SyntaxElementType::SegmentID)); + m_segment_id = TRY_READ(TreeParser::parse_segment_id(*m_bit_stream, m_segmentation_tree_probs)); for (size_t i = 0; i < num_8x8_blocks_wide_lookup[m_mi_size]; i++) { auto index = m_mi_col + i; diff --git a/Userland/Libraries/LibVideo/VP9/TreeParser.cpp b/Userland/Libraries/LibVideo/VP9/TreeParser.cpp index ded25f3f74..123a3ad00c 100644 --- a/Userland/Libraries/LibVideo/VP9/TreeParser.cpp +++ b/Userland/Libraries/LibVideo/VP9/TreeParser.cpp @@ -187,6 +187,21 @@ ErrorOr TreeParser::parse_uv_mode(BitStream& bit_stream, Probabi return value; } +ErrorOr TreeParser::parse_segment_id(BitStream& bit_stream, u8 const probabilities[7]) +{ + auto value = TRY(parse_tree_new(bit_stream, { segment_tree }, [&](u8 node) { return probabilities[node]; })); + // Segment ID is not counted. + return value; +} + +ErrorOr TreeParser::parse_segment_id_predicted(BitStream& bit_stream, u8 const probabilities[3], u8 above_seg_pred_context, u8 left_seg_pred_context) +{ + auto context = left_seg_pred_context + above_seg_pred_context; + auto value = TRY(parse_tree_new(bit_stream, { binary_tree }, [&](u8) { return probabilities[context]; })); + // Segment ID prediction is not counted. + return value; +} + ErrorOr TreeParser::parse_inter_mode(BitStream& bit_stream, ProbabilityTables const& probability_table, SyntaxElementCounter& counter, u8 mode_context_for_ref_frame_0) { // Tree @@ -235,10 +250,7 @@ ErrorOr TreeParser::parse_interpolation_filter(BitStream& b TreeParser::TreeSelection TreeParser::select_tree(SyntaxElementType type) { switch (type) { - case SyntaxElementType::SegmentID: - return { segment_tree }; case SyntaxElementType::Skip: - case SyntaxElementType::SegIDPredicted: case SyntaxElementType::IsInter: case SyntaxElementType::CompMode: case SyntaxElementType::CompRef: @@ -281,12 +293,8 @@ TreeParser::TreeSelection TreeParser::select_tree(SyntaxElementType type) u8 TreeParser::select_tree_probability(SyntaxElementType type, u8 node) { switch (type) { - case SyntaxElementType::SegmentID: - return calculate_segment_id_probability(node); case SyntaxElementType::Skip: return calculate_skip_probability(); - case SyntaxElementType::SegIDPredicted: - return calculate_seg_id_predicted_probability(); case SyntaxElementType::IsInter: return calculate_is_inter_probability(); case SyntaxElementType::CompMode: @@ -342,11 +350,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_segment_id_probability(u8 node) -{ - return m_decoder.m_segmentation_tree_probs[node]; -} - u8 TreeParser::calculate_skip_probability() { m_ctx = 0; @@ -357,12 +360,6 @@ u8 TreeParser::calculate_skip_probability() return m_decoder.m_probability_tables->skip_prob()[m_ctx]; } -u8 TreeParser::calculate_seg_id_predicted_probability() -{ - 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]; - return m_decoder.m_segmentation_pred_prob[m_ctx]; -} - u8 TreeParser::calculate_is_inter_probability() { if (AVAIL_U && AVAIL_L) { @@ -779,10 +776,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::SegmentID: - case SyntaxElementType::SegIDPredicted: - // No counting required - return; default: break; } diff --git a/Userland/Libraries/LibVideo/VP9/TreeParser.h b/Userland/Libraries/LibVideo/VP9/TreeParser.h index eb52226ca1..1747d32b28 100644 --- a/Userland/Libraries/LibVideo/VP9/TreeParser.h +++ b/Userland/Libraries/LibVideo/VP9/TreeParser.h @@ -68,6 +68,8 @@ public: static ErrorOr parse_intra_mode(BitStream&, ProbabilityTables const&, SyntaxElementCounter&, BlockSubsize mi_size); static ErrorOr parse_sub_intra_mode(BitStream&, ProbabilityTables const&, SyntaxElementCounter&); static ErrorOr parse_uv_mode(BitStream&, ProbabilityTables const&, SyntaxElementCounter&, PredictionMode y_mode); + static ErrorOr parse_segment_id(BitStream&, u8 const probabilities[7]); + static ErrorOr parse_segment_id_predicted(BitStream&, u8 const probabilities[3], u8 above_seg_pred_context, u8 left_seg_pred_context); static ErrorOr parse_inter_mode(BitStream&, ProbabilityTables const&, SyntaxElementCounter&, u8 mode_context_for_ref_frame_0); static ErrorOr parse_interpolation_filter(BitStream&, ProbabilityTables const&, SyntaxElementCounter&, Optional above_ref_frame, Optional left_ref_frame, Optional above_interpolation_filter, Optional left_interpolation_filter); @@ -103,9 +105,7 @@ public: } private: - u8 calculate_segment_id_probability(u8 node); u8 calculate_skip_probability(); - u8 calculate_seg_id_predicted_probability(); u8 calculate_is_inter_probability(); u8 calculate_comp_mode_probability(); u8 calculate_comp_ref_probability();