diff --git a/Userland/Libraries/LibVideo/VP9/Enums.h b/Userland/Libraries/LibVideo/VP9/Enums.h index f639cc38bf..a46c4c41bc 100644 --- a/Userland/Libraries/LibVideo/VP9/Enums.h +++ b/Userland/Libraries/LibVideo/VP9/Enums.h @@ -113,10 +113,9 @@ enum class PredictionMode : u8 { }; enum MvJoint : u8 { - MvJointZero = 0, - MvJointHnzvz = 1, - MvJointHzvnz = 2, - MvJointHnzvnz = 3, + MotionVectorAllZero = 0, + MotionVectorNonZeroColumn = 1, + MotionVectorNonZeroRow = 2, }; enum MvClass : u8 { diff --git a/Userland/Libraries/LibVideo/VP9/LookupTables.h b/Userland/Libraries/LibVideo/VP9/LookupTables.h index b0a3fcde6e..ff14b95275 100644 --- a/Userland/Libraries/LibVideo/VP9/LookupTables.h +++ b/Userland/Libraries/LibVideo/VP9/LookupTables.h @@ -142,9 +142,9 @@ static constexpr int interp_filter_tree[4] = { -EightTapSmooth, -EightTapSharp }; static constexpr int mv_joint_tree[6] = { - -MvJointZero, 2, - -MvJointHnzvz, 4, - -MvJointHzvnz, -MvJointHnzvnz + -MotionVectorAllZero, 2, + -MotionVectorNonZeroColumn, 4, + -MotionVectorNonZeroRow, -(MotionVectorNonZeroColumn | MotionVectorNonZeroRow) }; static constexpr int mv_class_tree[20] = { -MvClass0, 2, diff --git a/Userland/Libraries/LibVideo/VP9/Parser.cpp b/Userland/Libraries/LibVideo/VP9/Parser.cpp index 8bd4a8d053..3da0601ef6 100644 --- a/Userland/Libraries/LibVideo/VP9/Parser.cpp +++ b/Userland/Libraries/LibVideo/VP9/Parser.cpp @@ -1276,14 +1276,14 @@ static bool should_use_high_precision_motion_vector(MotionVector const& delta_ve DecoderErrorOr Parser::read_motion_vector(BlockContext const& block_context, BlockMotionVectorCandidates const& candidates, ReferenceIndex reference_index) { m_use_hp = block_context.frame_context.high_precision_motion_vectors_allowed && should_use_high_precision_motion_vector(candidates[reference_index].best_vector); - MotionVector diff_mv; - auto mv_joint = TRY_READ(TreeParser::parse_motion_vector_joint(*m_bit_stream, *m_probability_tables, *m_syntax_element_counter)); - if (mv_joint == MvJointHzvnz || mv_joint == MvJointHnzvnz) - diff_mv.set_row(TRY(read_single_motion_vector_component(0))); - if (mv_joint == MvJointHnzvz || mv_joint == MvJointHnzvnz) - diff_mv.set_column(TRY(read_single_motion_vector_component(1))); + MotionVector delta_vector; + auto joint = TRY_READ(TreeParser::parse_motion_vector_joint(*m_bit_stream, *m_probability_tables, *m_syntax_element_counter)); + if ((joint & MotionVectorNonZeroRow) != 0) + delta_vector.set_row(TRY(read_single_motion_vector_component(0))); + if ((joint & MotionVectorNonZeroColumn) != 0) + delta_vector.set_column(TRY(read_single_motion_vector_component(1))); - return candidates[reference_index].best_vector + diff_mv; + return candidates[reference_index].best_vector + delta_vector; } // read_mv_component( comp ) in the spec.