1 // Copyright 2023 The ChromiumOS Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 //! Wrappers around H264 `VABuffer` types.
8 use crate::formats::H264PictureFlags;
10 /// Wrapper over the `VAPictureH264` FFI type.
11 pub struct PictureH264(bindings::VAPictureH264);
14 /// Creates the wrapper
16 picture_id: bindings::VASurfaceID,
18 flags: H264PictureFlags,
19 top_field_order_cnt: i32,
20 bottom_field_order_cnt: i32,
22 Self(bindings::VAPictureH264 {
26 TopFieldOrderCnt: top_field_order_cnt,
27 BottomFieldOrderCnt: bottom_field_order_cnt,
28 va_reserved: Default::default(),
33 /// Wrapper over the `seq_fields` bindgen field in `VAPictureParameterBufferH264`.
34 pub struct H264SeqFields(bindings::_VAPictureParameterBufferH264__bindgen_ty_1);
37 /// Creates the bindgen field
38 #[allow(clippy::too_many_arguments)]
40 chroma_format_idc: u32,
41 residual_colour_transform_flag: u32,
42 gaps_in_frame_num_value_allowed_flag: u32,
43 frame_mbs_only_flag: u32,
44 mb_adaptive_frame_field_flag: u32,
45 direct_8x8_inference_flag: u32,
46 min_luma_bi_pred_size8x8: u32,
47 log2_max_frame_num_minus4: u32,
48 pic_order_cnt_type: u32,
49 log2_max_pic_order_cnt_lsb_minus4: u32,
50 delta_pic_order_always_zero_flag: u32,
53 bindings::_VAPictureParameterBufferH264__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
55 residual_colour_transform_flag,
56 gaps_in_frame_num_value_allowed_flag,
58 mb_adaptive_frame_field_flag,
59 direct_8x8_inference_flag,
60 min_luma_bi_pred_size8x8,
61 log2_max_frame_num_minus4,
63 log2_max_pic_order_cnt_lsb_minus4,
64 delta_pic_order_always_zero_flag,
67 Self(bindings::_VAPictureParameterBufferH264__bindgen_ty_1 {
68 bits: bindings::_VAPictureParameterBufferH264__bindgen_ty_1__bindgen_ty_1 {
69 _bitfield_align_1: Default::default(),
71 __bindgen_padding_0: Default::default(),
76 /// Returns the inner FFI type. Useful for testing purposes.
77 pub fn inner(&mut self) -> &bindings::_VAPictureParameterBufferH264__bindgen_ty_1 {
82 /// Wrapper over the `pic_fields` bindgen field in `VAPictureParameterBufferH264`.
83 pub struct H264PicFields(bindings::_VAPictureParameterBufferH264__bindgen_ty_2);
86 /// Creates the bindgen field
87 #[allow(clippy::too_many_arguments)]
89 entropy_coding_mode_flag: u32,
90 weighted_pred_flag: u32,
91 weighted_bipred_idc: u32,
92 transform_8x8_mode_flag: u32,
94 constrained_intra_pred_flag: u32,
95 pic_order_present_flag: u32,
96 deblocking_filter_control_present_flag: u32,
97 redundant_pic_cnt_present_flag: u32,
98 reference_pic_flag: u32,
101 bindings::_VAPictureParameterBufferH264__bindgen_ty_2__bindgen_ty_1::new_bitfield_1(
102 entropy_coding_mode_flag,
105 transform_8x8_mode_flag,
107 constrained_intra_pred_flag,
108 pic_order_present_flag,
109 deblocking_filter_control_present_flag,
110 redundant_pic_cnt_present_flag,
114 Self(bindings::_VAPictureParameterBufferH264__bindgen_ty_2 {
115 bits: bindings::_VAPictureParameterBufferH264__bindgen_ty_2__bindgen_ty_1 {
116 _bitfield_align_1: Default::default(),
118 __bindgen_padding_0: Default::default(),
123 /// Returns the inner FFI type. Useful for testing purposes.
124 pub fn inner(&mut self) -> &bindings::_VAPictureParameterBufferH264__bindgen_ty_2 {
129 /// A wrapper over `VAPictureParameterBufferH264` FFI type
130 pub struct PictureParameterBufferH264(Box<bindings::VAPictureParameterBufferH264>);
132 impl PictureParameterBufferH264 {
133 /// Creates the wrapper
134 #[allow(clippy::too_many_arguments)]
136 curr_pic: PictureH264,
137 reference_frames: [PictureH264; 16],
138 picture_width_in_mbs_minus1: u16,
139 picture_height_in_mbs_minus1: u16,
140 bit_depth_luma_minus8: u8,
141 bit_depth_chroma_minus8: u8,
143 seq_fields: &H264SeqFields,
144 num_slice_groups_minus1: u8,
145 slice_group_map_type: u8,
146 slice_group_change_rate_minus1: u16,
147 pic_init_qp_minus26: i8,
148 pic_init_qs_minus26: i8,
149 chroma_qp_index_offset: i8,
150 second_chroma_qp_index_offset: i8,
151 pic_fields: &H264PicFields,
154 let reference_frames = (0..16usize)
155 .map(|i| reference_frames[i].0)
158 // try_into is guaranteed to work because the iterator and target array have the same
162 let seq_fields = seq_fields.0;
163 let pic_fields = pic_fields.0;
165 Self(Box::new(bindings::VAPictureParameterBufferH264 {
167 ReferenceFrames: reference_frames,
168 picture_width_in_mbs_minus1,
169 picture_height_in_mbs_minus1,
170 bit_depth_luma_minus8,
171 bit_depth_chroma_minus8,
174 num_slice_groups_minus1,
175 slice_group_map_type,
176 slice_group_change_rate_minus1,
179 chroma_qp_index_offset,
180 second_chroma_qp_index_offset,
183 va_reserved: Default::default(),
187 pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAPictureParameterBufferH264 {
191 /// Returns the inner FFI type. Useful for testing purposes.
192 pub fn inner(&self) -> &bindings::VAPictureParameterBufferH264 {
197 /// Wrapper over the `VASliceParameterBufferH264` FFI type.
198 pub struct SliceParameterBufferH264(Box<bindings::VASliceParameterBufferH264>);
200 impl SliceParameterBufferH264 {
201 /// Creates the wrapper
202 #[allow(clippy::too_many_arguments)]
204 slice_data_size: u32,
205 slice_data_offset: u32,
206 slice_data_flag: crate::formats::VASliceDataFlag,
207 slice_data_bit_offset: u16,
208 first_mb_in_slice: u16,
210 direct_spatial_mv_pred_flag: u8,
211 num_ref_idx_l0_active_minus1: u8,
212 num_ref_idx_l1_active_minus1: u8,
215 disable_deblocking_filter_idc: u8,
216 slice_alpha_c0_offset_div2: i8,
217 slice_beta_offset_div2: i8,
218 ref_pic_list_0: [PictureH264; 32usize],
219 ref_pic_list_1: [PictureH264; 32usize],
220 luma_log2_weight_denom: u8,
221 chroma_log2_weight_denom: u8,
222 luma_weight_l0_flag: u8,
223 luma_weight_l0: [i16; 32usize],
224 luma_offset_l0: [i16; 32usize],
225 chroma_weight_l0_flag: u8,
226 chroma_weight_l0: [[i16; 2usize]; 32usize],
227 chroma_offset_l0: [[i16; 2usize]; 32usize],
228 luma_weight_l1_flag: u8,
229 luma_weight_l1: [i16; 32usize],
230 luma_offset_l1: [i16; 32usize],
231 chroma_weight_l1_flag: u8,
232 chroma_weight_l1: [[i16; 2usize]; 32usize],
233 chroma_offset_l1: [[i16; 2usize]; 32usize],
235 let ref_pic_list_0 = ref_pic_list_0.map(|pic| pic.0);
236 let ref_pic_list_1 = ref_pic_list_1.map(|pic| pic.0);
238 Self(Box::new(bindings::VASliceParameterBufferH264 {
241 slice_data_flag: slice_data_flag as u32,
242 slice_data_bit_offset,
245 direct_spatial_mv_pred_flag,
246 num_ref_idx_l0_active_minus1,
247 num_ref_idx_l1_active_minus1,
250 disable_deblocking_filter_idc,
251 slice_alpha_c0_offset_div2,
252 slice_beta_offset_div2,
253 RefPicList0: ref_pic_list_0,
254 RefPicList1: ref_pic_list_1,
255 luma_log2_weight_denom,
256 chroma_log2_weight_denom,
260 chroma_weight_l0_flag,
266 chroma_weight_l1_flag,
269 va_reserved: Default::default(),
273 pub(crate) fn inner_mut(&mut self) -> &mut bindings::VASliceParameterBufferH264 {
277 /// Returns the inner FFI type. Useful for testing purposes.
278 pub fn inner(&self) -> &bindings::VASliceParameterBufferH264 {
283 /// Wrapper over the `VAIQMatrixBufferH264` FFI type
284 pub struct IQMatrixBufferH264(Box<bindings::VAIQMatrixBufferH264>);
286 impl IQMatrixBufferH264 {
287 /// Creates the wrapper.
289 scaling_list4x4: [[u8; 16usize]; 6usize],
290 scaling_list8x8: [[u8; 64usize]; 2usize],
292 Self(Box::new(bindings::VAIQMatrixBufferH264 {
293 ScalingList4x4: scaling_list4x4,
294 ScalingList8x8: scaling_list8x8,
295 va_reserved: Default::default(),
299 pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAIQMatrixBufferH264 {
303 /// Returns the inner FFI type. Useful for testing purposes.
304 pub fn inner(&self) -> &bindings::VAIQMatrixBufferH264 {