summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/video_core/command_classes/codecs/vp9_types.h61
1 files changed, 29 insertions, 32 deletions
diff --git a/src/video_core/command_classes/codecs/vp9_types.h b/src/video_core/command_classes/codecs/vp9_types.h
index 81ab4a0a1..3b1ed4b3a 100644
--- a/src/video_core/command_classes/codecs/vp9_types.h
+++ b/src/video_core/command_classes/codecs/vp9_types.h
@@ -22,7 +22,7 @@ struct Vp9FrameDimensions {
22}; 22};
23static_assert(sizeof(Vp9FrameDimensions) == 0x8, "Vp9 Vp9FrameDimensions is an invalid size"); 23static_assert(sizeof(Vp9FrameDimensions) == 0x8, "Vp9 Vp9FrameDimensions is an invalid size");
24 24
25enum FrameFlags : u32 { 25enum class FrameFlags : u32 {
26 IsKeyFrame = 1 << 0, 26 IsKeyFrame = 1 << 0,
27 LastFrameIsKeyFrame = 1 << 1, 27 LastFrameIsKeyFrame = 1 << 1,
28 FrameSizeChanged = 1 << 2, 28 FrameSizeChanged = 1 << 2,
@@ -30,6 +30,7 @@ enum FrameFlags : u32 {
30 LastShowFrame = 1 << 4, 30 LastShowFrame = 1 << 4,
31 IntraOnly = 1 << 5, 31 IntraOnly = 1 << 5,
32}; 32};
33DECLARE_ENUM_FLAG_OPERATORS(FrameFlags)
33 34
34enum class TxSize { 35enum class TxSize {
35 Tx4x4 = 0, // 4x4 transform 36 Tx4x4 = 0, // 4x4 transform
@@ -92,34 +93,34 @@ struct Vp9EntropyProbs {
92static_assert(sizeof(Vp9EntropyProbs) == 0x7B4, "Vp9EntropyProbs is an invalid size"); 93static_assert(sizeof(Vp9EntropyProbs) == 0x7B4, "Vp9EntropyProbs is an invalid size");
93 94
94struct Vp9PictureInfo { 95struct Vp9PictureInfo {
95 bool is_key_frame; 96 u32 bitstream_size;
96 bool intra_only; 97 std::array<u64, 4> frame_offsets;
97 bool last_frame_was_key;
98 bool error_resilient_mode;
99 bool last_frame_shown;
100 bool show_frame;
101 std::array<s8, 4> ref_frame_sign_bias; 98 std::array<s8, 4> ref_frame_sign_bias;
102 s32 base_q_index; 99 s32 base_q_index;
103 s32 y_dc_delta_q; 100 s32 y_dc_delta_q;
104 s32 uv_dc_delta_q; 101 s32 uv_dc_delta_q;
105 s32 uv_ac_delta_q; 102 s32 uv_ac_delta_q;
106 bool lossless;
107 s32 transform_mode; 103 s32 transform_mode;
108 bool allow_high_precision_mv;
109 s32 interp_filter; 104 s32 interp_filter;
110 s32 reference_mode; 105 s32 reference_mode;
111 s32 log2_tile_cols; 106 s32 log2_tile_cols;
112 s32 log2_tile_rows; 107 s32 log2_tile_rows;
113 bool segment_enabled;
114 bool mode_ref_delta_enabled;
115 std::array<s8, 4> ref_deltas; 108 std::array<s8, 4> ref_deltas;
116 std::array<s8, 2> mode_deltas; 109 std::array<s8, 2> mode_deltas;
117 Vp9EntropyProbs entropy; 110 Vp9EntropyProbs entropy;
118 Vp9FrameDimensions frame_size; 111 Vp9FrameDimensions frame_size;
119 u8 first_level; 112 u8 first_level;
120 u8 sharpness_level; 113 u8 sharpness_level;
121 u32 bitstream_size; 114 bool is_key_frame;
122 std::array<u64, 4> frame_offsets; 115 bool intra_only;
116 bool last_frame_was_key;
117 bool error_resilient_mode;
118 bool last_frame_shown;
119 bool show_frame;
120 bool lossless;
121 bool allow_high_precision_mv;
122 bool segment_enabled;
123 bool mode_ref_delta_enabled;
123}; 124};
124 125
125struct Vp9FrameContainer { 126struct Vp9FrameContainer {
@@ -135,7 +136,7 @@ struct PictureInfo {
135 Vp9FrameDimensions golden_frame_size; ///< 0x50 136 Vp9FrameDimensions golden_frame_size; ///< 0x50
136 Vp9FrameDimensions alt_frame_size; ///< 0x58 137 Vp9FrameDimensions alt_frame_size; ///< 0x58
137 Vp9FrameDimensions current_frame_size; ///< 0x60 138 Vp9FrameDimensions current_frame_size; ///< 0x60
138 u32 vp9_flags; ///< 0x68 139 FrameFlags vp9_flags; ///< 0x68
139 std::array<s8, 4> ref_frame_sign_bias; ///< 0x6C 140 std::array<s8, 4> ref_frame_sign_bias; ///< 0x6C
140 u8 first_level; ///< 0x70 141 u8 first_level; ///< 0x70
141 u8 sharpness_level; ///< 0x71 142 u8 sharpness_level; ///< 0x71
@@ -148,46 +149,43 @@ struct PictureInfo {
148 u8 allow_high_precision_mv; ///< 0x78 149 u8 allow_high_precision_mv; ///< 0x78
149 u8 interp_filter; ///< 0x79 150 u8 interp_filter; ///< 0x79
150 u8 reference_mode; ///< 0x7A 151 u8 reference_mode; ///< 0x7A
151 s8 comp_fixed_ref; ///< 0x7B 152 INSERT_PADDING_BYTES_NOINIT(3); ///< 0x7B
152 std::array<s8, 2> comp_var_ref; ///< 0x7C
153 u8 log2_tile_cols; ///< 0x7E 153 u8 log2_tile_cols; ///< 0x7E
154 u8 log2_tile_rows; ///< 0x7F 154 u8 log2_tile_rows; ///< 0x7F
155 Segmentation segmentation; ///< 0x80 155 Segmentation segmentation; ///< 0x80
156 LoopFilter loop_filter; ///< 0xE4 156 LoopFilter loop_filter; ///< 0xE4
157 INSERT_PADDING_BYTES_NOINIT(5); ///< 0xEB 157 INSERT_PADDING_BYTES_NOINIT(21); ///< 0xEB
158 u32 surface_params; ///< 0xF0
159 INSERT_PADDING_WORDS_NOINIT(3); ///< 0xF4
160 158
161 [[nodiscard]] Vp9PictureInfo Convert() const { 159 [[nodiscard]] Vp9PictureInfo Convert() const {
162 return { 160 return {
163 .is_key_frame = (vp9_flags & FrameFlags::IsKeyFrame) != 0, 161 .bitstream_size = bitstream_size,
164 .intra_only = (vp9_flags & FrameFlags::IntraOnly) != 0, 162 .frame_offsets{},
165 .last_frame_was_key = (vp9_flags & FrameFlags::LastFrameIsKeyFrame) != 0,
166 .frame_size_changed = (vp9_flags & FrameFlags::FrameSizeChanged) != 0,
167 .error_resilient_mode = (vp9_flags & FrameFlags::ErrorResilientMode) != 0,
168 .last_frame_shown = (vp9_flags & FrameFlags::LastShowFrame) != 0,
169 .show_frame = true,
170 .ref_frame_sign_bias = ref_frame_sign_bias, 163 .ref_frame_sign_bias = ref_frame_sign_bias,
171 .base_q_index = base_q_index, 164 .base_q_index = base_q_index,
172 .y_dc_delta_q = y_dc_delta_q, 165 .y_dc_delta_q = y_dc_delta_q,
173 .uv_dc_delta_q = uv_dc_delta_q, 166 .uv_dc_delta_q = uv_dc_delta_q,
174 .uv_ac_delta_q = uv_ac_delta_q, 167 .uv_ac_delta_q = uv_ac_delta_q,
175 .lossless = lossless != 0,
176 .transform_mode = tx_mode, 168 .transform_mode = tx_mode,
177 .allow_high_precision_mv = allow_high_precision_mv != 0,
178 .interp_filter = interp_filter, 169 .interp_filter = interp_filter,
179 .reference_mode = reference_mode, 170 .reference_mode = reference_mode,
180 .log2_tile_cols = log2_tile_cols, 171 .log2_tile_cols = log2_tile_cols,
181 .log2_tile_rows = log2_tile_rows, 172 .log2_tile_rows = log2_tile_rows,
182 .segment_enabled = segmentation.enabled != 0,
183 .ref_deltas = loop_filter.ref_deltas, 173 .ref_deltas = loop_filter.ref_deltas,
184 .mode_deltas = loop_filter.mode_deltas, 174 .mode_deltas = loop_filter.mode_deltas,
185 .entropy{}, 175 .entropy{},
186 .frame_size = current_frame_size, 176 .frame_size = current_frame_size,
187 .first_level = first_level, 177 .first_level = first_level,
188 .sharpness_level = sharpness_level, 178 .sharpness_level = sharpness_level,
189 .bitstream_size = bitstream_size, 179 .is_key_frame = True(vp9_flags & FrameFlags::IsKeyFrame),
190 .frame_offsets{}, 180 .intra_only = True(vp9_flags & FrameFlags::IntraOnly),
181 .last_frame_was_key = True(vp9_flags & FrameFlags::LastFrameIsKeyFrame),
182 .error_resilient_mode = True(vp9_flags & FrameFlags::ErrorResilientMode),
183 .last_frame_shown = True(vp9_flags & FrameFlags::LastShowFrame),
184 .show_frame = true,
185 .lossless = lossless != 0,
186 .allow_high_precision_mv = allow_high_precision_mv != 0,
187 .segment_enabled = segmentation.enabled != 0,
188 .mode_ref_delta_enabled = loop_filter.mode_ref_delta_enabled != 0,
191 }; 189 };
192 } 190 }
193}; 191};
@@ -292,7 +290,6 @@ ASSERT_POSITION(last_frame_size, 0x48);
292ASSERT_POSITION(first_level, 0x70); 290ASSERT_POSITION(first_level, 0x70);
293ASSERT_POSITION(segmentation, 0x80); 291ASSERT_POSITION(segmentation, 0x80);
294ASSERT_POSITION(loop_filter, 0xE4); 292ASSERT_POSITION(loop_filter, 0xE4);
295ASSERT_POSITION(surface_params, 0xF0);
296#undef ASSERT_POSITION 293#undef ASSERT_POSITION
297 294
298#define ASSERT_POSITION(field_name, position) \ 295#define ASSERT_POSITION(field_name, position) \