vp9_types: Minor refactor of VP9 info structs.

This commit is contained in:
ameerj 2021-08-25 21:42:43 -04:00
parent 3de38c9a70
commit eb2624ed65

View File

@ -22,7 +22,7 @@ struct Vp9FrameDimensions {
}; };
static_assert(sizeof(Vp9FrameDimensions) == 0x8, "Vp9 Vp9FrameDimensions is an invalid size"); static_assert(sizeof(Vp9FrameDimensions) == 0x8, "Vp9 Vp9FrameDimensions is an invalid size");
enum FrameFlags : u32 { enum class FrameFlags : u32 {
IsKeyFrame = 1 << 0, IsKeyFrame = 1 << 0,
LastFrameIsKeyFrame = 1 << 1, LastFrameIsKeyFrame = 1 << 1,
FrameSizeChanged = 1 << 2, FrameSizeChanged = 1 << 2,
@ -30,6 +30,7 @@ enum FrameFlags : u32 {
LastShowFrame = 1 << 4, LastShowFrame = 1 << 4,
IntraOnly = 1 << 5, IntraOnly = 1 << 5,
}; };
DECLARE_ENUM_FLAG_OPERATORS(FrameFlags)
enum class TxSize { enum class TxSize {
Tx4x4 = 0, // 4x4 transform Tx4x4 = 0, // 4x4 transform
@ -92,34 +93,34 @@ struct Vp9EntropyProbs {
static_assert(sizeof(Vp9EntropyProbs) == 0x7B4, "Vp9EntropyProbs is an invalid size"); static_assert(sizeof(Vp9EntropyProbs) == 0x7B4, "Vp9EntropyProbs is an invalid size");
struct Vp9PictureInfo { struct Vp9PictureInfo {
bool is_key_frame; u32 bitstream_size;
bool intra_only; std::array<u64, 4> frame_offsets;
bool last_frame_was_key;
bool error_resilient_mode;
bool last_frame_shown;
bool show_frame;
std::array<s8, 4> ref_frame_sign_bias; std::array<s8, 4> ref_frame_sign_bias;
s32 base_q_index; s32 base_q_index;
s32 y_dc_delta_q; s32 y_dc_delta_q;
s32 uv_dc_delta_q; s32 uv_dc_delta_q;
s32 uv_ac_delta_q; s32 uv_ac_delta_q;
bool lossless;
s32 transform_mode; s32 transform_mode;
bool allow_high_precision_mv;
s32 interp_filter; s32 interp_filter;
s32 reference_mode; s32 reference_mode;
s32 log2_tile_cols; s32 log2_tile_cols;
s32 log2_tile_rows; s32 log2_tile_rows;
bool segment_enabled;
bool mode_ref_delta_enabled;
std::array<s8, 4> ref_deltas; std::array<s8, 4> ref_deltas;
std::array<s8, 2> mode_deltas; std::array<s8, 2> mode_deltas;
Vp9EntropyProbs entropy; Vp9EntropyProbs entropy;
Vp9FrameDimensions frame_size; Vp9FrameDimensions frame_size;
u8 first_level; u8 first_level;
u8 sharpness_level; u8 sharpness_level;
u32 bitstream_size; bool is_key_frame;
std::array<u64, 4> frame_offsets; bool intra_only;
bool last_frame_was_key;
bool error_resilient_mode;
bool last_frame_shown;
bool show_frame;
bool lossless;
bool allow_high_precision_mv;
bool segment_enabled;
bool mode_ref_delta_enabled;
}; };
struct Vp9FrameContainer { struct Vp9FrameContainer {
@ -135,7 +136,7 @@ struct PictureInfo {
Vp9FrameDimensions golden_frame_size; ///< 0x50 Vp9FrameDimensions golden_frame_size; ///< 0x50
Vp9FrameDimensions alt_frame_size; ///< 0x58 Vp9FrameDimensions alt_frame_size; ///< 0x58
Vp9FrameDimensions current_frame_size; ///< 0x60 Vp9FrameDimensions current_frame_size; ///< 0x60
u32 vp9_flags; ///< 0x68 FrameFlags vp9_flags; ///< 0x68
std::array<s8, 4> ref_frame_sign_bias; ///< 0x6C std::array<s8, 4> ref_frame_sign_bias; ///< 0x6C
u8 first_level; ///< 0x70 u8 first_level; ///< 0x70
u8 sharpness_level; ///< 0x71 u8 sharpness_level; ///< 0x71
@ -148,46 +149,43 @@ struct PictureInfo {
u8 allow_high_precision_mv; ///< 0x78 u8 allow_high_precision_mv; ///< 0x78
u8 interp_filter; ///< 0x79 u8 interp_filter; ///< 0x79
u8 reference_mode; ///< 0x7A u8 reference_mode; ///< 0x7A
s8 comp_fixed_ref; ///< 0x7B INSERT_PADDING_BYTES_NOINIT(3); ///< 0x7B
std::array<s8, 2> comp_var_ref; ///< 0x7C
u8 log2_tile_cols; ///< 0x7E u8 log2_tile_cols; ///< 0x7E
u8 log2_tile_rows; ///< 0x7F u8 log2_tile_rows; ///< 0x7F
Segmentation segmentation; ///< 0x80 Segmentation segmentation; ///< 0x80
LoopFilter loop_filter; ///< 0xE4 LoopFilter loop_filter; ///< 0xE4
INSERT_PADDING_BYTES_NOINIT(5); ///< 0xEB INSERT_PADDING_BYTES_NOINIT(21); ///< 0xEB
u32 surface_params; ///< 0xF0
INSERT_PADDING_WORDS_NOINIT(3); ///< 0xF4
[[nodiscard]] Vp9PictureInfo Convert() const { [[nodiscard]] Vp9PictureInfo Convert() const {
return { return {
.is_key_frame = (vp9_flags & FrameFlags::IsKeyFrame) != 0, .bitstream_size = bitstream_size,
.intra_only = (vp9_flags & FrameFlags::IntraOnly) != 0, .frame_offsets{},
.last_frame_was_key = (vp9_flags & FrameFlags::LastFrameIsKeyFrame) != 0,
.frame_size_changed = (vp9_flags & FrameFlags::FrameSizeChanged) != 0,
.error_resilient_mode = (vp9_flags & FrameFlags::ErrorResilientMode) != 0,
.last_frame_shown = (vp9_flags & FrameFlags::LastShowFrame) != 0,
.show_frame = true,
.ref_frame_sign_bias = ref_frame_sign_bias, .ref_frame_sign_bias = ref_frame_sign_bias,
.base_q_index = base_q_index, .base_q_index = base_q_index,
.y_dc_delta_q = y_dc_delta_q, .y_dc_delta_q = y_dc_delta_q,
.uv_dc_delta_q = uv_dc_delta_q, .uv_dc_delta_q = uv_dc_delta_q,
.uv_ac_delta_q = uv_ac_delta_q, .uv_ac_delta_q = uv_ac_delta_q,
.lossless = lossless != 0,
.transform_mode = tx_mode, .transform_mode = tx_mode,
.allow_high_precision_mv = allow_high_precision_mv != 0,
.interp_filter = interp_filter, .interp_filter = interp_filter,
.reference_mode = reference_mode, .reference_mode = reference_mode,
.log2_tile_cols = log2_tile_cols, .log2_tile_cols = log2_tile_cols,
.log2_tile_rows = log2_tile_rows, .log2_tile_rows = log2_tile_rows,
.segment_enabled = segmentation.enabled != 0,
.ref_deltas = loop_filter.ref_deltas, .ref_deltas = loop_filter.ref_deltas,
.mode_deltas = loop_filter.mode_deltas, .mode_deltas = loop_filter.mode_deltas,
.entropy{}, .entropy{},
.frame_size = current_frame_size, .frame_size = current_frame_size,
.first_level = first_level, .first_level = first_level,
.sharpness_level = sharpness_level, .sharpness_level = sharpness_level,
.bitstream_size = bitstream_size, .is_key_frame = True(vp9_flags & FrameFlags::IsKeyFrame),
.frame_offsets{}, .intra_only = True(vp9_flags & FrameFlags::IntraOnly),
.last_frame_was_key = True(vp9_flags & FrameFlags::LastFrameIsKeyFrame),
.error_resilient_mode = True(vp9_flags & FrameFlags::ErrorResilientMode),
.last_frame_shown = True(vp9_flags & FrameFlags::LastShowFrame),
.show_frame = true,
.lossless = lossless != 0,
.allow_high_precision_mv = allow_high_precision_mv != 0,
.segment_enabled = segmentation.enabled != 0,
.mode_ref_delta_enabled = loop_filter.mode_ref_delta_enabled != 0,
}; };
} }
}; };
@ -292,7 +290,6 @@ ASSERT_POSITION(last_frame_size, 0x48);
ASSERT_POSITION(first_level, 0x70); ASSERT_POSITION(first_level, 0x70);
ASSERT_POSITION(segmentation, 0x80); ASSERT_POSITION(segmentation, 0x80);
ASSERT_POSITION(loop_filter, 0xE4); ASSERT_POSITION(loop_filter, 0xE4);
ASSERT_POSITION(surface_params, 0xF0);
#undef ASSERT_POSITION #undef ASSERT_POSITION
#define ASSERT_POSITION(field_name, position) \ #define ASSERT_POSITION(field_name, position) \