Skip to main content

moq_vaapi/buffer/
h264.rs

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