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.
4 
5 //! Wrappers around H264 `VABuffer` types.
6 
7 use crate::bindings;
8 
9 /// Wrapper over the `VAPictureH264` FFI type.
10 pub struct PictureH264(bindings::VAPictureH264);
11 
12 impl PictureH264 {
13     /// Creates the wrapper
new( picture_id: bindings::VASurfaceID, frame_idx: u32, flags: u32, top_field_order_cnt: i32, bottom_field_order_cnt: i32, ) -> Self14     pub fn new(
15         picture_id: bindings::VASurfaceID,
16         frame_idx: u32,
17         flags: u32,
18         top_field_order_cnt: i32,
19         bottom_field_order_cnt: i32,
20     ) -> Self {
21         Self(bindings::VAPictureH264 {
22             picture_id,
23             frame_idx,
24             flags,
25             TopFieldOrderCnt: top_field_order_cnt,
26             BottomFieldOrderCnt: bottom_field_order_cnt,
27             va_reserved: Default::default(),
28         })
29     }
30 }
31 
32 /// Wrapper over the `seq_fields` bindgen field in `VAPictureParameterBufferH264`.
33 pub struct H264SeqFields(bindings::_VAPictureParameterBufferH264__bindgen_ty_1);
34 
35 impl H264SeqFields {
36     /// Creates the bindgen field
37     #[allow(clippy::too_many_arguments)]
new( chroma_format_idc: u32, residual_colour_transform_flag: u32, gaps_in_frame_num_value_allowed_flag: u32, frame_mbs_only_flag: u32, mb_adaptive_frame_field_flag: u32, direct_8x8_inference_flag: u32, min_luma_bi_pred_size8x8: u32, log2_max_frame_num_minus4: u32, pic_order_cnt_type: u32, log2_max_pic_order_cnt_lsb_minus4: u32, delta_pic_order_always_zero_flag: u32, ) -> Self38     pub fn new(
39         chroma_format_idc: u32,
40         residual_colour_transform_flag: u32,
41         gaps_in_frame_num_value_allowed_flag: u32,
42         frame_mbs_only_flag: u32,
43         mb_adaptive_frame_field_flag: u32,
44         direct_8x8_inference_flag: u32,
45         min_luma_bi_pred_size8x8: u32,
46         log2_max_frame_num_minus4: u32,
47         pic_order_cnt_type: u32,
48         log2_max_pic_order_cnt_lsb_minus4: u32,
49         delta_pic_order_always_zero_flag: u32,
50     ) -> Self {
51         let _bitfield_1 =
52             bindings::_VAPictureParameterBufferH264__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
53                 chroma_format_idc,
54                 residual_colour_transform_flag,
55                 gaps_in_frame_num_value_allowed_flag,
56                 frame_mbs_only_flag,
57                 mb_adaptive_frame_field_flag,
58                 direct_8x8_inference_flag,
59                 min_luma_bi_pred_size8x8,
60                 log2_max_frame_num_minus4,
61                 pic_order_cnt_type,
62                 log2_max_pic_order_cnt_lsb_minus4,
63                 delta_pic_order_always_zero_flag,
64             );
65 
66         Self(bindings::_VAPictureParameterBufferH264__bindgen_ty_1 {
67             bits: bindings::_VAPictureParameterBufferH264__bindgen_ty_1__bindgen_ty_1 {
68                 _bitfield_align_1: Default::default(),
69                 _bitfield_1,
70                 __bindgen_padding_0: Default::default(),
71             },
72         })
73     }
74 
75     /// Returns the inner FFI type. Useful for testing purposes.
inner(&mut self) -> &bindings::_VAPictureParameterBufferH264__bindgen_ty_176     pub fn inner(&mut self) -> &bindings::_VAPictureParameterBufferH264__bindgen_ty_1 {
77         &self.0
78     }
79 }
80 
81 /// Wrapper over the `pic_fields` bindgen field in `VAPictureParameterBufferH264`.
82 pub struct H264PicFields(bindings::_VAPictureParameterBufferH264__bindgen_ty_2);
83 
84 impl H264PicFields {
85     /// Creates the bindgen field
86     #[allow(clippy::too_many_arguments)]
new( entropy_coding_mode_flag: u32, weighted_pred_flag: u32, weighted_bipred_idc: u32, transform_8x8_mode_flag: u32, field_pic_flag: u32, constrained_intra_pred_flag: u32, pic_order_present_flag: u32, deblocking_filter_control_present_flag: u32, redundant_pic_cnt_present_flag: u32, reference_pic_flag: u32, ) -> Self87     pub fn new(
88         entropy_coding_mode_flag: u32,
89         weighted_pred_flag: u32,
90         weighted_bipred_idc: u32,
91         transform_8x8_mode_flag: u32,
92         field_pic_flag: u32,
93         constrained_intra_pred_flag: u32,
94         pic_order_present_flag: u32,
95         deblocking_filter_control_present_flag: u32,
96         redundant_pic_cnt_present_flag: u32,
97         reference_pic_flag: u32,
98     ) -> Self {
99         let _bitfield_1 =
100             bindings::_VAPictureParameterBufferH264__bindgen_ty_2__bindgen_ty_1::new_bitfield_1(
101                 entropy_coding_mode_flag,
102                 weighted_pred_flag,
103                 weighted_bipred_idc,
104                 transform_8x8_mode_flag,
105                 field_pic_flag,
106                 constrained_intra_pred_flag,
107                 pic_order_present_flag,
108                 deblocking_filter_control_present_flag,
109                 redundant_pic_cnt_present_flag,
110                 reference_pic_flag,
111             );
112 
113         Self(bindings::_VAPictureParameterBufferH264__bindgen_ty_2 {
114             bits: bindings::_VAPictureParameterBufferH264__bindgen_ty_2__bindgen_ty_1 {
115                 _bitfield_align_1: Default::default(),
116                 _bitfield_1,
117                 __bindgen_padding_0: Default::default(),
118             },
119         })
120     }
121 
122     /// Returns the inner FFI type. Useful for testing purposes.
inner(&mut self) -> &bindings::_VAPictureParameterBufferH264__bindgen_ty_2123     pub fn inner(&mut self) -> &bindings::_VAPictureParameterBufferH264__bindgen_ty_2 {
124         &self.0
125     }
126 }
127 
128 /// A wrapper over `VAPictureParameterBufferH264` FFI type
129 pub struct PictureParameterBufferH264(Box<bindings::VAPictureParameterBufferH264>);
130 
131 impl PictureParameterBufferH264 {
132     /// Creates the wrapper
133     #[allow(clippy::too_many_arguments)]
new( curr_pic: PictureH264, reference_frames: [PictureH264; 16], picture_width_in_mbs_minus1: u16, picture_height_in_mbs_minus1: u16, bit_depth_luma_minus8: u8, bit_depth_chroma_minus8: u8, num_ref_frames: u8, seq_fields: &H264SeqFields, num_slice_groups_minus1: u8, slice_group_map_type: u8, slice_group_change_rate_minus1: u16, pic_init_qp_minus26: i8, pic_init_qs_minus26: i8, chroma_qp_index_offset: i8, second_chroma_qp_index_offset: i8, pic_fields: &H264PicFields, frame_num: u16, ) -> Self134     pub fn new(
135         curr_pic: PictureH264,
136         reference_frames: [PictureH264; 16],
137         picture_width_in_mbs_minus1: u16,
138         picture_height_in_mbs_minus1: u16,
139         bit_depth_luma_minus8: u8,
140         bit_depth_chroma_minus8: u8,
141         num_ref_frames: u8,
142         seq_fields: &H264SeqFields,
143         num_slice_groups_minus1: u8,
144         slice_group_map_type: u8,
145         slice_group_change_rate_minus1: u16,
146         pic_init_qp_minus26: i8,
147         pic_init_qs_minus26: i8,
148         chroma_qp_index_offset: i8,
149         second_chroma_qp_index_offset: i8,
150         pic_fields: &H264PicFields,
151         frame_num: u16,
152     ) -> Self {
153         let reference_frames = (0..16usize)
154             .map(|i| reference_frames[i].0)
155             .collect::<Vec<_>>()
156             .try_into()
157             // try_into is guaranteed to work because the iterator and target array have the same
158             // size.
159             .unwrap();
160 
161         let seq_fields = seq_fields.0;
162         let pic_fields = pic_fields.0;
163 
164         Self(Box::new(bindings::VAPictureParameterBufferH264 {
165             CurrPic: curr_pic.0,
166             ReferenceFrames: reference_frames,
167             picture_width_in_mbs_minus1,
168             picture_height_in_mbs_minus1,
169             bit_depth_luma_minus8,
170             bit_depth_chroma_minus8,
171             num_ref_frames,
172             seq_fields,
173             num_slice_groups_minus1,
174             slice_group_map_type,
175             slice_group_change_rate_minus1,
176             pic_init_qp_minus26,
177             pic_init_qs_minus26,
178             chroma_qp_index_offset,
179             second_chroma_qp_index_offset,
180             pic_fields,
181             frame_num,
182             va_reserved: Default::default(),
183         }))
184     }
185 
inner_mut(&mut self) -> &mut bindings::VAPictureParameterBufferH264186     pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAPictureParameterBufferH264 {
187         self.0.as_mut()
188     }
189 
190     /// Returns the inner FFI type. Useful for testing purposes.
inner(&self) -> &bindings::VAPictureParameterBufferH264191     pub fn inner(&self) -> &bindings::VAPictureParameterBufferH264 {
192         self.0.as_ref()
193     }
194 }
195 
196 /// Wrapper over the `VASliceParameterBufferH264` FFI type.
197 pub struct SliceParameterBufferH264(Vec<bindings::VASliceParameterBufferH264>);
198 
199 impl SliceParameterBufferH264 {
new_array() -> Self200     pub fn new_array() -> Self {
201         Self(Vec::new())
202     }
203 
204     /// Creates the wrapper
205     #[allow(clippy::too_many_arguments)]
new( slice_data_size: u32, slice_data_offset: u32, slice_data_flag: u32, slice_data_bit_offset: u16, first_mb_in_slice: u16, slice_type: u8, direct_spatial_mv_pred_flag: u8, num_ref_idx_l0_active_minus1: u8, num_ref_idx_l1_active_minus1: u8, cabac_init_idc: u8, slice_qp_delta: i8, disable_deblocking_filter_idc: u8, slice_alpha_c0_offset_div2: i8, slice_beta_offset_div2: i8, ref_pic_list_0: [PictureH264; 32usize], ref_pic_list_1: [PictureH264; 32usize], luma_log2_weight_denom: u8, chroma_log2_weight_denom: u8, luma_weight_l0_flag: u8, luma_weight_l0: [i16; 32usize], luma_offset_l0: [i16; 32usize], chroma_weight_l0_flag: u8, chroma_weight_l0: [[i16; 2usize]; 32usize], chroma_offset_l0: [[i16; 2usize]; 32usize], luma_weight_l1_flag: u8, luma_weight_l1: [i16; 32usize], luma_offset_l1: [i16; 32usize], chroma_weight_l1_flag: u8, chroma_weight_l1: [[i16; 2usize]; 32usize], chroma_offset_l1: [[i16; 2usize]; 32usize], ) -> Self206     pub fn new(
207         slice_data_size: u32,
208         slice_data_offset: u32,
209         slice_data_flag: u32,
210         slice_data_bit_offset: u16,
211         first_mb_in_slice: u16,
212         slice_type: u8,
213         direct_spatial_mv_pred_flag: u8,
214         num_ref_idx_l0_active_minus1: u8,
215         num_ref_idx_l1_active_minus1: u8,
216         cabac_init_idc: u8,
217         slice_qp_delta: i8,
218         disable_deblocking_filter_idc: u8,
219         slice_alpha_c0_offset_div2: i8,
220         slice_beta_offset_div2: i8,
221         ref_pic_list_0: [PictureH264; 32usize],
222         ref_pic_list_1: [PictureH264; 32usize],
223         luma_log2_weight_denom: u8,
224         chroma_log2_weight_denom: u8,
225         luma_weight_l0_flag: u8,
226         luma_weight_l0: [i16; 32usize],
227         luma_offset_l0: [i16; 32usize],
228         chroma_weight_l0_flag: u8,
229         chroma_weight_l0: [[i16; 2usize]; 32usize],
230         chroma_offset_l0: [[i16; 2usize]; 32usize],
231         luma_weight_l1_flag: u8,
232         luma_weight_l1: [i16; 32usize],
233         luma_offset_l1: [i16; 32usize],
234         chroma_weight_l1_flag: u8,
235         chroma_weight_l1: [[i16; 2usize]; 32usize],
236         chroma_offset_l1: [[i16; 2usize]; 32usize],
237     ) -> Self {
238         let mut array = Self::new_array();
239 
240         array.add_slice_parameter(
241             slice_data_size,
242             slice_data_offset,
243             slice_data_flag,
244             slice_data_bit_offset,
245             first_mb_in_slice,
246             slice_type,
247             direct_spatial_mv_pred_flag,
248             num_ref_idx_l0_active_minus1,
249             num_ref_idx_l1_active_minus1,
250             cabac_init_idc,
251             slice_qp_delta,
252             disable_deblocking_filter_idc,
253             slice_alpha_c0_offset_div2,
254             slice_beta_offset_div2,
255             ref_pic_list_0,
256             ref_pic_list_1,
257             luma_log2_weight_denom,
258             chroma_log2_weight_denom,
259             luma_weight_l0_flag,
260             luma_weight_l0,
261             luma_offset_l0,
262             chroma_weight_l0_flag,
263             chroma_weight_l0,
264             chroma_offset_l0,
265             luma_weight_l1_flag,
266             luma_weight_l1,
267             luma_offset_l1,
268             chroma_weight_l1_flag,
269             chroma_weight_l1,
270             chroma_offset_l1,
271         );
272 
273         array
274     }
275 
276     /// Creates the wrapper
277     #[allow(clippy::too_many_arguments)]
add_slice_parameter( &mut self, slice_data_size: u32, slice_data_offset: u32, slice_data_flag: u32, slice_data_bit_offset: u16, first_mb_in_slice: u16, slice_type: u8, direct_spatial_mv_pred_flag: u8, num_ref_idx_l0_active_minus1: u8, num_ref_idx_l1_active_minus1: u8, cabac_init_idc: u8, slice_qp_delta: i8, disable_deblocking_filter_idc: u8, slice_alpha_c0_offset_div2: i8, slice_beta_offset_div2: i8, ref_pic_list_0: [PictureH264; 32usize], ref_pic_list_1: [PictureH264; 32usize], luma_log2_weight_denom: u8, chroma_log2_weight_denom: u8, luma_weight_l0_flag: u8, luma_weight_l0: [i16; 32usize], luma_offset_l0: [i16; 32usize], chroma_weight_l0_flag: u8, chroma_weight_l0: [[i16; 2usize]; 32usize], chroma_offset_l0: [[i16; 2usize]; 32usize], luma_weight_l1_flag: u8, luma_weight_l1: [i16; 32usize], luma_offset_l1: [i16; 32usize], chroma_weight_l1_flag: u8, chroma_weight_l1: [[i16; 2usize]; 32usize], chroma_offset_l1: [[i16; 2usize]; 32usize], )278     pub fn add_slice_parameter(
279         &mut self,
280         slice_data_size: u32,
281         slice_data_offset: u32,
282         slice_data_flag: u32,
283         slice_data_bit_offset: u16,
284         first_mb_in_slice: u16,
285         slice_type: u8,
286         direct_spatial_mv_pred_flag: u8,
287         num_ref_idx_l0_active_minus1: u8,
288         num_ref_idx_l1_active_minus1: u8,
289         cabac_init_idc: u8,
290         slice_qp_delta: i8,
291         disable_deblocking_filter_idc: u8,
292         slice_alpha_c0_offset_div2: i8,
293         slice_beta_offset_div2: i8,
294         ref_pic_list_0: [PictureH264; 32usize],
295         ref_pic_list_1: [PictureH264; 32usize],
296         luma_log2_weight_denom: u8,
297         chroma_log2_weight_denom: u8,
298         luma_weight_l0_flag: u8,
299         luma_weight_l0: [i16; 32usize],
300         luma_offset_l0: [i16; 32usize],
301         chroma_weight_l0_flag: u8,
302         chroma_weight_l0: [[i16; 2usize]; 32usize],
303         chroma_offset_l0: [[i16; 2usize]; 32usize],
304         luma_weight_l1_flag: u8,
305         luma_weight_l1: [i16; 32usize],
306         luma_offset_l1: [i16; 32usize],
307         chroma_weight_l1_flag: u8,
308         chroma_weight_l1: [[i16; 2usize]; 32usize],
309         chroma_offset_l1: [[i16; 2usize]; 32usize],
310     ) {
311         let ref_pic_list_0 = ref_pic_list_0.map(|pic| pic.0);
312         let ref_pic_list_1 = ref_pic_list_1.map(|pic| pic.0);
313 
314         let buf = bindings::VASliceParameterBufferH264 {
315             slice_data_size,
316             slice_data_offset,
317             slice_data_flag,
318             slice_data_bit_offset,
319             first_mb_in_slice,
320             slice_type,
321             direct_spatial_mv_pred_flag,
322             num_ref_idx_l0_active_minus1,
323             num_ref_idx_l1_active_minus1,
324             cabac_init_idc,
325             slice_qp_delta,
326             disable_deblocking_filter_idc,
327             slice_alpha_c0_offset_div2,
328             slice_beta_offset_div2,
329             RefPicList0: ref_pic_list_0,
330             RefPicList1: ref_pic_list_1,
331             luma_log2_weight_denom,
332             chroma_log2_weight_denom,
333             luma_weight_l0_flag,
334             luma_weight_l0,
335             luma_offset_l0,
336             chroma_weight_l0_flag,
337             chroma_weight_l0,
338             chroma_offset_l0,
339             luma_weight_l1_flag,
340             luma_weight_l1,
341             luma_offset_l1,
342             chroma_weight_l1_flag,
343             chroma_weight_l1,
344             chroma_offset_l1,
345             va_reserved: Default::default(),
346         };
347 
348         self.0.push(buf);
349     }
350 
inner_mut(&mut self) -> &mut Vec<bindings::VASliceParameterBufferH264>351     pub(crate) fn inner_mut(&mut self) -> &mut Vec<bindings::VASliceParameterBufferH264> {
352         &mut self.0
353     }
354 
355     /// Returns the inner FFI type. Useful for testing purposes.
inner(&self) -> &Vec<bindings::VASliceParameterBufferH264>356     pub fn inner(&self) -> &Vec<bindings::VASliceParameterBufferH264> {
357         &self.0
358     }
359 }
360 
361 /// Wrapper over the `VAIQMatrixBufferH264` FFI type
362 pub struct IQMatrixBufferH264(Box<bindings::VAIQMatrixBufferH264>);
363 
364 impl IQMatrixBufferH264 {
365     /// Creates the wrapper.
new( scaling_list4x4: [[u8; 16usize]; 6usize], scaling_list8x8: [[u8; 64usize]; 2usize], ) -> Self366     pub fn new(
367         scaling_list4x4: [[u8; 16usize]; 6usize],
368         scaling_list8x8: [[u8; 64usize]; 2usize],
369     ) -> Self {
370         Self(Box::new(bindings::VAIQMatrixBufferH264 {
371             ScalingList4x4: scaling_list4x4,
372             ScalingList8x8: scaling_list8x8,
373             va_reserved: Default::default(),
374         }))
375     }
376 
inner_mut(&mut self) -> &mut bindings::VAIQMatrixBufferH264377     pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAIQMatrixBufferH264 {
378         self.0.as_mut()
379     }
380 
381     /// Returns the inner FFI type. Useful for testing purposes.
inner(&self) -> &bindings::VAIQMatrixBufferH264382     pub fn inner(&self) -> &bindings::VAIQMatrixBufferH264 {
383         self.0.as_ref()
384     }
385 }
386 
387 /// Wrapper over the `seq_fields` bindgen field in `VAEncSequenceParameterBufferH264`
388 pub struct H264EncSeqFields(bindings::_VAEncSequenceParameterBufferH264__bindgen_ty_1);
389 
390 impl H264EncSeqFields {
391     #[allow(clippy::too_many_arguments)]
new( chroma_format_idc: u32, frame_mbs_only_flag: u32, mb_adaptive_frame_field_flag: u32, seq_scaling_matrix_present_flag: u32, direct_8x8_inference_flag: u32, log2_max_frame_num_minus4: u32, pic_order_cnt_type: u32, log2_max_pic_order_cnt_lsb_minus4: u32, delta_pic_order_always_zero_flag: u32, ) -> Self392     pub fn new(
393         chroma_format_idc: u32,
394         frame_mbs_only_flag: u32,
395         mb_adaptive_frame_field_flag: u32,
396         seq_scaling_matrix_present_flag: u32,
397         direct_8x8_inference_flag: u32,
398         log2_max_frame_num_minus4: u32,
399         pic_order_cnt_type: u32,
400         log2_max_pic_order_cnt_lsb_minus4: u32,
401         delta_pic_order_always_zero_flag: u32,
402     ) -> Self {
403         let _bitfield_1 =
404             bindings::_VAEncSequenceParameterBufferH264__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
405                 chroma_format_idc,
406                 frame_mbs_only_flag,
407                 mb_adaptive_frame_field_flag,
408                 seq_scaling_matrix_present_flag,
409                 direct_8x8_inference_flag,
410                 log2_max_frame_num_minus4,
411                 pic_order_cnt_type,
412                 log2_max_pic_order_cnt_lsb_minus4,
413                 delta_pic_order_always_zero_flag,
414             );
415 
416         Self(bindings::_VAEncSequenceParameterBufferH264__bindgen_ty_1 {
417             bits: bindings::_VAEncSequenceParameterBufferH264__bindgen_ty_1__bindgen_ty_1 {
418                 _bitfield_align_1: Default::default(),
419                 _bitfield_1,
420                 __bindgen_padding_0: Default::default(),
421             },
422         })
423     }
424 
inner(&self) -> &bindings::_VAEncSequenceParameterBufferH264__bindgen_ty_1425     pub fn inner(&self) -> &bindings::_VAEncSequenceParameterBufferH264__bindgen_ty_1 {
426         &self.0
427     }
428 }
429 
430 #[derive(Default)]
431 pub struct H264VuiFields(bindings::_VAEncSequenceParameterBufferH264__bindgen_ty_2);
432 
433 impl H264VuiFields {
434     #[allow(clippy::too_many_arguments)]
new( aspect_ratio_info_present_flag: u32, timing_info_present_flag: u32, bitstream_restriction_flag: u32, log2_max_mv_length_horizontal: u32, log2_max_mv_length_vertical: u32, fixed_frame_rate_flag: u32, low_delay_hrd_flag: u32, motion_vectors_over_pic_boundaries_flag: u32, ) -> Self435     pub fn new(
436         aspect_ratio_info_present_flag: u32,
437         timing_info_present_flag: u32,
438         bitstream_restriction_flag: u32,
439         log2_max_mv_length_horizontal: u32,
440         log2_max_mv_length_vertical: u32,
441         fixed_frame_rate_flag: u32,
442         low_delay_hrd_flag: u32,
443         motion_vectors_over_pic_boundaries_flag: u32,
444     ) -> Self {
445         let _bitfield_1 =
446             bindings::_VAEncSequenceParameterBufferH264__bindgen_ty_2__bindgen_ty_1::new_bitfield_1(
447                 aspect_ratio_info_present_flag,
448                 timing_info_present_flag,
449                 bitstream_restriction_flag,
450                 log2_max_mv_length_horizontal,
451                 log2_max_mv_length_vertical,
452                 fixed_frame_rate_flag,
453                 low_delay_hrd_flag,
454                 motion_vectors_over_pic_boundaries_flag,
455                 Default::default(),
456             );
457 
458         Self(bindings::_VAEncSequenceParameterBufferH264__bindgen_ty_2 {
459             bits: bindings::_VAEncSequenceParameterBufferH264__bindgen_ty_2__bindgen_ty_1 {
460                 _bitfield_align_1: Default::default(),
461                 _bitfield_1,
462             },
463         })
464     }
465 }
466 
467 #[derive(Default)]
468 pub struct H264EncFrameCropOffsets {
469     pub left: u32,
470     pub right: u32,
471     pub top: u32,
472     pub bottom: u32,
473 }
474 
475 impl H264EncFrameCropOffsets {
new( frame_crop_left_offset: u32, frame_crop_right_offset: u32, frame_crop_top_offset: u32, frame_crop_bottom_offset: u32, ) -> Self476     pub fn new(
477         frame_crop_left_offset: u32,
478         frame_crop_right_offset: u32,
479         frame_crop_top_offset: u32,
480         frame_crop_bottom_offset: u32,
481     ) -> Self {
482         Self {
483             left: frame_crop_left_offset,
484             right: frame_crop_right_offset,
485             top: frame_crop_top_offset,
486             bottom: frame_crop_bottom_offset,
487         }
488     }
489 }
490 
491 pub struct EncSequenceParameterBufferH264(Box<bindings::VAEncSequenceParameterBufferH264>);
492 
493 impl EncSequenceParameterBufferH264 {
494     #[allow(clippy::too_many_arguments)]
new( seq_parameter_set_id: u8, level_idc: u8, intra_period: u32, intra_idr_period: u32, ip_period: u32, bits_per_second: u32, max_num_ref_frames: u32, picture_width_in_mbs: u16, picture_height_in_mbs: u16, seq_fields: &H264EncSeqFields, bit_depth_luma_minus8: u8, bit_depth_chroma_minus8: u8, num_ref_frames_in_pic_order_cnt_cycle: u8, offset_for_non_ref_pic: i32, offset_for_top_to_bottom_field: i32, offset_for_ref_frame: [i32; 256usize], frame_crop: Option<H264EncFrameCropOffsets>, vui_fields: Option<H264VuiFields>, aspect_ratio_idc: u8, sar_width: u32, sar_height: u32, num_units_in_tick: u32, time_scale: u32, ) -> Self495     pub fn new(
496         seq_parameter_set_id: u8,
497         level_idc: u8,
498         intra_period: u32,
499         intra_idr_period: u32,
500         ip_period: u32,
501         bits_per_second: u32,
502         max_num_ref_frames: u32,
503         picture_width_in_mbs: u16,
504         picture_height_in_mbs: u16,
505         seq_fields: &H264EncSeqFields,
506         bit_depth_luma_minus8: u8,
507         bit_depth_chroma_minus8: u8,
508         num_ref_frames_in_pic_order_cnt_cycle: u8,
509         offset_for_non_ref_pic: i32,
510         offset_for_top_to_bottom_field: i32,
511         offset_for_ref_frame: [i32; 256usize],
512         frame_crop: Option<H264EncFrameCropOffsets>,
513         vui_fields: Option<H264VuiFields>,
514         aspect_ratio_idc: u8,
515         sar_width: u32,
516         sar_height: u32,
517         num_units_in_tick: u32,
518         time_scale: u32,
519     ) -> Self {
520         let seq_fields = seq_fields.0;
521 
522         let frame_cropping_flag = if frame_crop.is_some() { 1 } else { 0 };
523         let frame_crop = frame_crop.unwrap_or_default();
524 
525         let frame_crop_left_offset = frame_crop.left;
526         let frame_crop_right_offset = frame_crop.right;
527         let frame_crop_top_offset = frame_crop.top;
528         let frame_crop_bottom_offset = frame_crop.bottom;
529 
530         let vui_parameters_present_flag = if vui_fields.is_some() { 1 } else { 0 };
531         let vui_fields = vui_fields.unwrap_or_default().0;
532 
533         Self(Box::new(bindings::VAEncSequenceParameterBufferH264 {
534             seq_parameter_set_id,
535             level_idc,
536             intra_period,
537             intra_idr_period,
538             ip_period,
539             bits_per_second,
540             max_num_ref_frames,
541             picture_width_in_mbs,
542             picture_height_in_mbs,
543             seq_fields,
544             bit_depth_luma_minus8,
545             bit_depth_chroma_minus8,
546             num_ref_frames_in_pic_order_cnt_cycle,
547             offset_for_non_ref_pic,
548             offset_for_top_to_bottom_field,
549             offset_for_ref_frame,
550             frame_cropping_flag,
551             frame_crop_left_offset,
552             frame_crop_right_offset,
553             frame_crop_top_offset,
554             frame_crop_bottom_offset,
555             vui_parameters_present_flag,
556             vui_fields,
557             aspect_ratio_idc,
558             sar_width,
559             sar_height,
560             num_units_in_tick,
561             time_scale,
562             ..Default::default()
563         }))
564     }
565 
inner_mut(&mut self) -> &mut bindings::VAEncSequenceParameterBufferH264566     pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAEncSequenceParameterBufferH264 {
567         self.0.as_mut()
568     }
569 }
570 
571 pub struct H264EncPicFields(bindings::_VAEncPictureParameterBufferH264__bindgen_ty_1);
572 
573 impl H264EncPicFields {
574     #[allow(clippy::too_many_arguments)]
new( idr_pic_flag: u32, reference_pic_flag: u32, entropy_coding_mode_flag: u32, weighted_pred_flag: u32, weighted_bipred_idc: u32, constrained_intra_pred_flag: u32, transform_8x8_mode_flag: u32, deblocking_filter_control_present_flag: u32, redundant_pic_cnt_present_flag: u32, pic_order_present_flag: u32, pic_scaling_matrix_present_flag: u32, ) -> Self575     pub fn new(
576         idr_pic_flag: u32,
577         reference_pic_flag: u32,
578         entropy_coding_mode_flag: u32,
579         weighted_pred_flag: u32,
580         weighted_bipred_idc: u32,
581         constrained_intra_pred_flag: u32,
582         transform_8x8_mode_flag: u32,
583         deblocking_filter_control_present_flag: u32,
584         redundant_pic_cnt_present_flag: u32,
585         pic_order_present_flag: u32,
586         pic_scaling_matrix_present_flag: u32,
587     ) -> Self {
588         let _bitfield_1 =
589             bindings::_VAEncPictureParameterBufferH264__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
590                 idr_pic_flag,
591                 reference_pic_flag,
592                 entropy_coding_mode_flag,
593                 weighted_pred_flag,
594                 weighted_bipred_idc,
595                 constrained_intra_pred_flag,
596                 transform_8x8_mode_flag,
597                 deblocking_filter_control_present_flag,
598                 redundant_pic_cnt_present_flag,
599                 pic_order_present_flag,
600                 pic_scaling_matrix_present_flag,
601             );
602 
603         Self(bindings::_VAEncPictureParameterBufferH264__bindgen_ty_1 {
604             bits: bindings::_VAEncPictureParameterBufferH264__bindgen_ty_1__bindgen_ty_1 {
605                 _bitfield_align_1: Default::default(),
606                 _bitfield_1,
607                 __bindgen_padding_0: Default::default(),
608             },
609         })
610     }
611 }
612 
613 pub struct EncPictureParameterBufferH264(Box<bindings::VAEncPictureParameterBufferH264>);
614 
615 impl EncPictureParameterBufferH264 {
616     #[allow(clippy::too_many_arguments)]
new( curr_pic: PictureH264, reference_frames: [PictureH264; 16usize], coded_buf: bindings::VABufferID, pic_parameter_set_id: u8, seq_parameter_set_id: u8, last_picture: u8, frame_num: u16, pic_init_qp: u8, num_ref_idx_l0_active_minus1: u8, num_ref_idx_l1_active_minus1: u8, chroma_qp_index_offset: i8, second_chroma_qp_index_offset: i8, pic_fields: &H264EncPicFields, ) -> Self617     pub fn new(
618         curr_pic: PictureH264,
619         reference_frames: [PictureH264; 16usize],
620         coded_buf: bindings::VABufferID,
621         pic_parameter_set_id: u8,
622         seq_parameter_set_id: u8,
623         last_picture: u8,
624         frame_num: u16,
625         pic_init_qp: u8,
626         num_ref_idx_l0_active_minus1: u8,
627         num_ref_idx_l1_active_minus1: u8,
628         chroma_qp_index_offset: i8,
629         second_chroma_qp_index_offset: i8,
630         pic_fields: &H264EncPicFields,
631     ) -> Self {
632         let reference_frames = (0..16usize)
633             .map(|i| reference_frames[i].0)
634             .collect::<Vec<_>>()
635             .try_into()
636             // try_into is guaranteed to work because the iterator and target array have the same
637             // size.
638             .unwrap();
639 
640         let pic_fields = pic_fields.0;
641 
642         Self(Box::new(bindings::_VAEncPictureParameterBufferH264 {
643             CurrPic: curr_pic.0,
644             ReferenceFrames: reference_frames,
645             coded_buf,
646             pic_parameter_set_id,
647             seq_parameter_set_id,
648             last_picture,
649             frame_num,
650             pic_init_qp,
651             num_ref_idx_l0_active_minus1,
652             num_ref_idx_l1_active_minus1,
653             chroma_qp_index_offset,
654             second_chroma_qp_index_offset,
655             pic_fields,
656             ..Default::default()
657         }))
658     }
659 
inner_mut(&mut self) -> &mut bindings::VAEncPictureParameterBufferH264660     pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAEncPictureParameterBufferH264 {
661         self.0.as_mut()
662     }
663 }
664 
665 pub struct EncSliceParameterBufferH264(Box<bindings::VAEncSliceParameterBufferH264>);
666 
667 impl EncSliceParameterBufferH264 {
668     #[allow(clippy::too_many_arguments)]
new( macroblock_address: u32, num_macroblocks: u32, macroblock_info: bindings::VABufferID, slice_type: u8, pic_parameter_set_id: u8, idr_pic_id: u16, pic_order_cnt_lsb: u16, delta_pic_order_cnt_bottom: i32, delta_pic_order_cnt: [i32; 2usize], direct_spatial_mv_pred_flag: u8, num_ref_idx_active_override_flag: u8, num_ref_idx_l0_active_minus1: u8, num_ref_idx_l1_active_minus1: u8, ref_pic_list_0: [PictureH264; 32usize], ref_pic_list_1: [PictureH264; 32usize], luma_log2_weight_denom: u8, chroma_log2_weight_denom: u8, luma_weight_l0_flag: u8, luma_weight_l0: [i16; 32usize], luma_offset_l0: [i16; 32usize], chroma_weight_l0_flag: u8, chroma_weight_l0: [[i16; 2usize]; 32usize], chroma_offset_l0: [[i16; 2usize]; 32usize], luma_weight_l1_flag: u8, luma_weight_l1: [i16; 32usize], luma_offset_l1: [i16; 32usize], chroma_weight_l1_flag: u8, chroma_weight_l1: [[i16; 2usize]; 32usize], chroma_offset_l1: [[i16; 2usize]; 32usize], cabac_init_idc: u8, slice_qp_delta: i8, disable_deblocking_filter_idc: u8, slice_alpha_c0_offset_div2: i8, slice_beta_offset_div2: i8, ) -> Self669     pub fn new(
670         macroblock_address: u32,
671         num_macroblocks: u32,
672         macroblock_info: bindings::VABufferID,
673         slice_type: u8,
674         pic_parameter_set_id: u8,
675         idr_pic_id: u16,
676         pic_order_cnt_lsb: u16,
677         delta_pic_order_cnt_bottom: i32,
678         delta_pic_order_cnt: [i32; 2usize],
679         direct_spatial_mv_pred_flag: u8,
680         num_ref_idx_active_override_flag: u8,
681         num_ref_idx_l0_active_minus1: u8,
682         num_ref_idx_l1_active_minus1: u8,
683         ref_pic_list_0: [PictureH264; 32usize],
684         ref_pic_list_1: [PictureH264; 32usize],
685         luma_log2_weight_denom: u8,
686         chroma_log2_weight_denom: u8,
687         luma_weight_l0_flag: u8,
688         luma_weight_l0: [i16; 32usize],
689         luma_offset_l0: [i16; 32usize],
690         chroma_weight_l0_flag: u8,
691         chroma_weight_l0: [[i16; 2usize]; 32usize],
692         chroma_offset_l0: [[i16; 2usize]; 32usize],
693         luma_weight_l1_flag: u8,
694         luma_weight_l1: [i16; 32usize],
695         luma_offset_l1: [i16; 32usize],
696         chroma_weight_l1_flag: u8,
697         chroma_weight_l1: [[i16; 2usize]; 32usize],
698         chroma_offset_l1: [[i16; 2usize]; 32usize],
699         cabac_init_idc: u8,
700         slice_qp_delta: i8,
701         disable_deblocking_filter_idc: u8,
702         slice_alpha_c0_offset_div2: i8,
703         slice_beta_offset_div2: i8,
704     ) -> Self {
705         let ref_pic_list_0 = ref_pic_list_0.map(|pic| pic.0);
706         let ref_pic_list_1 = ref_pic_list_1.map(|pic| pic.0);
707 
708         Self(Box::new(bindings::VAEncSliceParameterBufferH264 {
709             macroblock_address,
710             num_macroblocks,
711             macroblock_info,
712             slice_type,
713             pic_parameter_set_id,
714             idr_pic_id,
715             pic_order_cnt_lsb,
716             delta_pic_order_cnt_bottom,
717             delta_pic_order_cnt,
718             direct_spatial_mv_pred_flag,
719             num_ref_idx_active_override_flag,
720             num_ref_idx_l0_active_minus1,
721             num_ref_idx_l1_active_minus1,
722             RefPicList0: ref_pic_list_0,
723             RefPicList1: ref_pic_list_1,
724             luma_log2_weight_denom,
725             chroma_log2_weight_denom,
726             luma_weight_l0_flag,
727             luma_weight_l0,
728             luma_offset_l0,
729             chroma_weight_l0_flag,
730             chroma_weight_l0,
731             chroma_offset_l0,
732             luma_weight_l1_flag,
733             luma_weight_l1,
734             luma_offset_l1,
735             chroma_weight_l1_flag,
736             chroma_weight_l1,
737             chroma_offset_l1,
738             cabac_init_idc,
739             slice_qp_delta,
740             disable_deblocking_filter_idc,
741             slice_alpha_c0_offset_div2,
742             slice_beta_offset_div2,
743             ..Default::default()
744         }))
745     }
746 
inner_mut(&mut self) -> &mut bindings::VAEncSliceParameterBufferH264747     pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAEncSliceParameterBufferH264 {
748         self.0.as_mut()
749     }
750 
751     /// Returns the inner FFI type. Useful for testing purposes.
inner(&self) -> &bindings::VAEncSliceParameterBufferH264752     pub fn inner(&self) -> &bindings::VAEncSliceParameterBufferH264 {
753         self.0.as_ref()
754     }
755 }
756 
757 pub struct H264EncMacroblockInfo(bindings::_VAEncMacroblockParameterBufferH264__bindgen_ty_1);
758 
759 impl H264EncMacroblockInfo {
new_intra(pred_avail_override_flag: u32, pred_avail_flags: u32) -> Self760     pub fn new_intra(pred_avail_override_flag: u32, pred_avail_flags: u32) -> Self {
761         let _bitfield_1 =
762             bindings::_VAEncMacroblockParameterBufferH264__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(pred_avail_override_flag, pred_avail_flags);
763 
764         Self(bindings::_VAEncMacroblockParameterBufferH264__bindgen_ty_1 {
765             intra_fields: bindings::_VAEncMacroblockParameterBufferH264__bindgen_ty_1__bindgen_ty_1 {
766                 bits:  bindings::_VAEncMacroblockParameterBufferH264__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1  {
767                     _bitfield_align_1: Default::default(),
768                     _bitfield_1,
769                     __bindgen_padding_0: Default::default(),
770                 }
771             }
772         })
773     }
774 
new_inter() -> Self775     pub fn new_inter() -> Self {
776         Self(bindings::_VAEncMacroblockParameterBufferH264__bindgen_ty_1 {
777             inter_fields: bindings::_VAEncMacroblockParameterBufferH264__bindgen_ty_1__bindgen_ty_2 {
778                 bits:  bindings::_VAEncMacroblockParameterBufferH264__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1  {
779                     reserved: Default::default()
780                 }
781             }
782         })
783     }
784 }
785 
786 pub struct EncMacroblockParameterBufferH264(Box<bindings::VAEncMacroblockParameterBufferH264>);
787 
788 impl EncMacroblockParameterBufferH264 {
new(qp: u8, info: &H264EncMacroblockInfo) -> Self789     pub fn new(qp: u8, info: &H264EncMacroblockInfo) -> Self {
790         let info = info.0;
791 
792         Self(Box::new(bindings::VAEncMacroblockParameterBufferH264 {
793             qp,
794             info,
795             ..Default::default()
796         }))
797     }
798 
inner_mut(&mut self) -> &mut bindings::VAEncMacroblockParameterBufferH264799     pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAEncMacroblockParameterBufferH264 {
800         self.0.as_mut()
801     }
802 
803     /// Returns the inner FFI type. Useful for testing purposes.
inner(&self) -> &bindings::VAEncMacroblockParameterBufferH264804     pub fn inner(&self) -> &bindings::VAEncMacroblockParameterBufferH264 {
805         self.0.as_ref()
806     }
807 }
808