From fce7639c905486f0fd98082abc46f90f6b62e078 Mon Sep 17 00:00:00 2001 From: Zaggy1024 Date: Sun, 6 Nov 2022 15:27:50 -0600 Subject: [PATCH] LibVideo: Put motion vector or reference frame pairs in a struct Since these two types are often passed around as a pair, it's easier to handle them with a simple pair struct, at least for now. Once things are fully being passed around as parameters wherever possible, it may be good to change this type for something more generalized. --- Userland/Libraries/LibVideo/VP9/Context.h | 33 +++++++++++++++++++++++ Userland/Libraries/LibVideo/VP9/Parser.h | 31 ++++++++++----------- 2 files changed, 49 insertions(+), 15 deletions(-) create mode 100644 Userland/Libraries/LibVideo/VP9/Context.h diff --git a/Userland/Libraries/LibVideo/VP9/Context.h b/Userland/Libraries/LibVideo/VP9/Context.h new file mode 100644 index 0000000000..758ce39e04 --- /dev/null +++ b/Userland/Libraries/LibVideo/VP9/Context.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021, Hunter Salyer + * Copyright (c) 2022, Gregory Bertilson + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include "Enums.h" +#include "MotionVector.h" + +namespace Video::VP9 { + +template +struct Pair { + T a; + T b; + + T& operator[](size_t index) + { + if (index == 0) + return a; + if (index == 1) + return b; + VERIFY_NOT_REACHED(); + } +}; + +typedef Pair ReferenceFramePair; +typedef Pair MotionVectorPair; + +} diff --git a/Userland/Libraries/LibVideo/VP9/Parser.h b/Userland/Libraries/LibVideo/VP9/Parser.h index d86751d052..b8a8299e92 100644 --- a/Userland/Libraries/LibVideo/VP9/Parser.h +++ b/Userland/Libraries/LibVideo/VP9/Parser.h @@ -16,6 +16,7 @@ #include #include "BitStream.h" +#include "Context.h" #include "LookupTables.h" #include "MotionVector.h" #include "ProbabilityTables.h" @@ -233,7 +234,7 @@ private: // The column to use for getting partition tree probability lookups. u32 m_col { 0 }; TXSize m_tx_size { TX_4x4 }; - ReferenceFrameType m_ref_frame[2]; + ReferenceFramePair m_ref_frame; bool m_is_inter { false }; bool m_is_compound { false }; PredictionMode m_default_intra_mode { PredictionMode::DcPred }; @@ -243,18 +244,18 @@ private: u8 m_num_4x4_h { 0 }; PredictionMode m_uv_mode { 0 }; // FIXME: Is u8 the right size? Vector> m_sub_modes; - ReferenceFrameType m_left_ref_frame[2]; - ReferenceFrameType m_above_ref_frame[2]; + ReferenceFramePair m_left_ref_frame; + ReferenceFramePair m_above_ref_frame; bool m_left_intra { false }; bool m_above_intra { false }; bool m_left_single { false }; bool m_above_single { false }; // The current block's interpolation filter. InterpolationFilter m_interp_filter { EightTap }; - MotionVector m_mv[2]; - MotionVector m_near_mv[2]; - MotionVector m_nearest_mv[2]; - MotionVector m_best_mv[2]; + MotionVectorPair m_mv; + MotionVectorPair m_near_mv; + MotionVectorPair m_nearest_mv; + MotionVectorPair m_best_mv; // FIXME: Move these to a struct to store together in one array. Gfx::Size m_ref_frame_size[NUM_REF_FRAMES]; bool m_ref_subsampling_x[NUM_REF_FRAMES]; @@ -271,7 +272,7 @@ private: TXMode m_tx_mode; ReferenceMode m_reference_mode; ReferenceFrameType m_comp_fixed_ref; - ReferenceFrameType m_comp_var_ref[2]; + ReferenceFramePair m_comp_var_ref; MotionVector m_block_mvs[2][4]; Vector m_prev_segment_ids; @@ -280,15 +281,15 @@ private: Vector m_mi_sizes; Vector m_y_modes; Vector m_segment_ids; - Vector> m_ref_frames; - Vector> m_prev_ref_frames; - Vector> m_mvs; - Vector> m_prev_mvs; - MotionVector m_candidate_mv[2]; - ReferenceFrameType m_candidate_frame[2]; + Vector m_ref_frames; + Vector m_prev_ref_frames; + Vector m_mvs; + Vector m_prev_mvs; + MotionVectorPair m_candidate_mv; + ReferenceFramePair m_candidate_frame; Vector, 2>> m_sub_mvs; u8 m_ref_mv_count { 0 }; - MotionVector m_ref_list_mv[2]; + MotionVectorPair m_ref_list_mv; bool m_use_prev_frame_mvs; Vector m_interp_filters; // Indexed by ReferenceFrame enum.