mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 00:47:45 +00:00
LibVideo/VP9: Use a bitwise enum for motion vector joint selection
The motion vector joints enum is set up so that the first bit indicates that a vector should have a non-zero value in the column, and the second bit indicates a non-zero value for the row. Taking advantage of this makes the code a bit more legible.
This commit is contained in:
parent
f4761dab09
commit
d82dc14bd9
3 changed files with 13 additions and 14 deletions
|
@ -113,10 +113,9 @@ enum class PredictionMode : u8 {
|
||||||
};
|
};
|
||||||
|
|
||||||
enum MvJoint : u8 {
|
enum MvJoint : u8 {
|
||||||
MvJointZero = 0,
|
MotionVectorAllZero = 0,
|
||||||
MvJointHnzvz = 1,
|
MotionVectorNonZeroColumn = 1,
|
||||||
MvJointHzvnz = 2,
|
MotionVectorNonZeroRow = 2,
|
||||||
MvJointHnzvnz = 3,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum MvClass : u8 {
|
enum MvClass : u8 {
|
||||||
|
|
|
@ -142,9 +142,9 @@ static constexpr int interp_filter_tree[4] = {
|
||||||
-EightTapSmooth, -EightTapSharp
|
-EightTapSmooth, -EightTapSharp
|
||||||
};
|
};
|
||||||
static constexpr int mv_joint_tree[6] = {
|
static constexpr int mv_joint_tree[6] = {
|
||||||
-MvJointZero, 2,
|
-MotionVectorAllZero, 2,
|
||||||
-MvJointHnzvz, 4,
|
-MotionVectorNonZeroColumn, 4,
|
||||||
-MvJointHzvnz, -MvJointHnzvnz
|
-MotionVectorNonZeroRow, -(MotionVectorNonZeroColumn | MotionVectorNonZeroRow)
|
||||||
};
|
};
|
||||||
static constexpr int mv_class_tree[20] = {
|
static constexpr int mv_class_tree[20] = {
|
||||||
-MvClass0, 2,
|
-MvClass0, 2,
|
||||||
|
|
|
@ -1276,14 +1276,14 @@ static bool should_use_high_precision_motion_vector(MotionVector const& delta_ve
|
||||||
DecoderErrorOr<MotionVector> Parser::read_motion_vector(BlockContext const& block_context, BlockMotionVectorCandidates const& candidates, ReferenceIndex reference_index)
|
DecoderErrorOr<MotionVector> 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);
|
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;
|
MotionVector delta_vector;
|
||||||
auto mv_joint = TRY_READ(TreeParser::parse_motion_vector_joint(*m_bit_stream, *m_probability_tables, *m_syntax_element_counter));
|
auto 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)
|
if ((joint & MotionVectorNonZeroRow) != 0)
|
||||||
diff_mv.set_row(TRY(read_single_motion_vector_component(0)));
|
delta_vector.set_row(TRY(read_single_motion_vector_component(0)));
|
||||||
if (mv_joint == MvJointHnzvz || mv_joint == MvJointHnzvnz)
|
if ((joint & MotionVectorNonZeroColumn) != 0)
|
||||||
diff_mv.set_column(TRY(read_single_motion_vector_component(1)));
|
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.
|
// read_mv_component( comp ) in the spec.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue