Skip to main content

moq_vaapi/buffer/
av1.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 AV1 `VABuffer` types.
6
7use crate::bindings;
8
9/// Wrapper over the `seq_fields` bindgen field in `VADecPictureParameterBufferAV1`.
10pub struct AV1SeqFields(bindings::_VADecPictureParameterBufferAV1__bindgen_ty_1);
11
12impl AV1SeqFields {
13	/// Creates the bindgen field
14	#[allow(clippy::too_many_arguments)]
15	pub fn new(
16		still_picture: u32,
17		use_128x128_superblock: u32,
18		enable_filter_intra: u32,
19		enable_intra_edge_filter: u32,
20		enable_interintra_compound: u32,
21		enable_masked_compound: u32,
22		enable_dual_filter: u32,
23		enable_order_hint: u32,
24		enable_jnt_comp: u32,
25		enable_cdef: u32,
26		mono_chrome: u32,
27		color_range: u32,
28		subsampling_x: u32,
29		subsampling_y: u32,
30		chroma_sample_position: u32,
31		film_grain_params_present: u32,
32	) -> Self {
33		let _bitfield_1 = bindings::_VADecPictureParameterBufferAV1__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
34			still_picture,
35			use_128x128_superblock,
36			enable_filter_intra,
37			enable_intra_edge_filter,
38			enable_interintra_compound,
39			enable_masked_compound,
40			enable_dual_filter,
41			enable_order_hint,
42			enable_jnt_comp,
43			enable_cdef,
44			mono_chrome,
45			color_range,
46			subsampling_x,
47			subsampling_y,
48			chroma_sample_position,
49			film_grain_params_present,
50			0,
51		);
52
53		Self(bindings::_VADecPictureParameterBufferAV1__bindgen_ty_1 {
54			fields: bindings::_VADecPictureParameterBufferAV1__bindgen_ty_1__bindgen_ty_1 {
55				_bitfield_align_1: Default::default(),
56				_bitfield_1,
57			},
58		})
59	}
60}
61
62/// Wrapper over the `segment_info_fields` bindgen field in `VASegmentationStructAV1`.
63pub struct AV1SegmentInfoFields(bindings::_VASegmentationStructAV1__bindgen_ty_1);
64
65impl AV1SegmentInfoFields {
66	/// Creates the bindgen field
67	pub fn new(enabled: u32, update_map: u32, temporal_update: u32, update_data: u32) -> Self {
68		let _bitfield_1 = bindings::_VASegmentationStructAV1__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
69			enabled,
70			update_map,
71			temporal_update,
72			update_data,
73			0,
74		);
75
76		Self(bindings::_VASegmentationStructAV1__bindgen_ty_1 {
77			bits: bindings::_VASegmentationStructAV1__bindgen_ty_1__bindgen_ty_1 {
78				_bitfield_align_1: Default::default(),
79				_bitfield_1,
80			},
81		})
82	}
83}
84
85/// Wrapper over the `seg_info` bindgen field in `VADecPictureParameterBufferAV1`.
86pub struct AV1Segmentation(bindings::VASegmentationStructAV1);
87
88impl AV1Segmentation {
89	/// Creates the bindgen field
90	pub fn new(
91		segment_info_fields: &AV1SegmentInfoFields,
92		feature_data: [[i16; 8usize]; 8usize],
93		feature_mask: [u8; 8usize],
94	) -> Self {
95		let segment_info_fields = segment_info_fields.0;
96		Self(bindings::VASegmentationStructAV1 {
97			segment_info_fields,
98			feature_data,
99			feature_mask,
100			va_reserved: Default::default(),
101		})
102	}
103}
104
105/// Wrapper over the `film_grain_fields` bindgen field in `VADecPictureParameterBufferAV1`.
106pub struct AV1FilmGrainFields(bindings::_VAFilmGrainStructAV1__bindgen_ty_1);
107
108impl AV1FilmGrainFields {
109	/// Creates the bindgen field
110	#[allow(clippy::too_many_arguments)]
111	pub fn new(
112		apply_grain: u32,
113		chroma_scaling_from_luma: u32,
114		grain_scaling_minus_8: u32,
115		ar_coeff_lag: u32,
116		ar_coeff_shift_minus_6: u32,
117		grain_scale_shift: u32,
118		overlap_flag: u32,
119		clip_to_restricted_range: u32,
120	) -> Self {
121		let _bitfield_1 = bindings::_VAFilmGrainStructAV1__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
122			apply_grain,
123			chroma_scaling_from_luma,
124			grain_scaling_minus_8,
125			ar_coeff_lag,
126			ar_coeff_shift_minus_6,
127			grain_scale_shift,
128			overlap_flag,
129			clip_to_restricted_range,
130			0,
131		);
132		Self(bindings::_VAFilmGrainStructAV1__bindgen_ty_1 {
133			bits: bindings::_VAFilmGrainStructAV1__bindgen_ty_1__bindgen_ty_1 {
134				_bitfield_align_1: Default::default(),
135				_bitfield_1,
136			},
137		})
138	}
139}
140
141/// Wrapper over the `film_grain_info` bindgen field in `VADecPictureParameterBufferAV1`.
142pub struct AV1FilmGrain(bindings::VAFilmGrainStructAV1);
143
144impl AV1FilmGrain {
145	/// Creates the wrapper
146	#[allow(clippy::too_many_arguments)]
147	pub fn new(
148		film_grain_info_fields: &AV1FilmGrainFields,
149		grain_seed: u16,
150		num_y_points: u8,
151		point_y_value: [u8; 14usize],
152		point_y_scaling: [u8; 14usize],
153		num_cb_points: u8,
154		point_cb_value: [u8; 10usize],
155		point_cb_scaling: [u8; 10usize],
156		num_cr_points: u8,
157		point_cr_value: [u8; 10usize],
158		point_cr_scaling: [u8; 10usize],
159		ar_coeffs_y: [i8; 24usize],
160		ar_coeffs_cb: [i8; 25usize],
161		ar_coeffs_cr: [i8; 25usize],
162		cb_mult: u8,
163		cb_luma_mult: u8,
164		cb_offset: u16,
165		cr_mult: u8,
166		cr_luma_mult: u8,
167		cr_offset: u16,
168	) -> Self {
169		let film_grain_info_fields = film_grain_info_fields.0;
170		Self(bindings::VAFilmGrainStructAV1 {
171			film_grain_info_fields,
172			grain_seed,
173			num_y_points,
174			point_y_value,
175			point_y_scaling,
176			num_cb_points,
177			point_cb_value,
178			point_cb_scaling,
179			num_cr_points,
180			point_cr_value,
181			point_cr_scaling,
182			ar_coeffs_y,
183			ar_coeffs_cb,
184			ar_coeffs_cr,
185			cb_mult,
186			cb_luma_mult,
187			cb_offset,
188			cr_mult,
189			cr_luma_mult,
190			cr_offset,
191			va_reserved: Default::default(),
192		})
193	}
194}
195
196/// Wrapper over the `pic_info_fields` bindgen field in `VADecPictureParameterBufferAV1`.
197pub struct AV1PicInfoFields(bindings::_VADecPictureParameterBufferAV1__bindgen_ty_2);
198
199impl AV1PicInfoFields {
200	/// Creates the wrapper
201	#[allow(clippy::too_many_arguments)]
202	pub fn new(
203		frame_type: u32,
204		show_frame: u32,
205		showable_frame: u32,
206		error_resilient_mode: u32,
207		disable_cdf_update: u32,
208		allow_screen_content_tools: u32,
209		force_integer_mv: u32,
210		allow_intrabc: u32,
211		use_superres: u32,
212		allow_high_precision_mv: u32,
213		is_motion_mode_switchable: u32,
214		use_ref_frame_mvs: u32,
215		disable_frame_end_update_cdf: u32,
216		uniform_tile_spacing_flag: u32,
217		allow_warped_motion: u32,
218		large_scale_tile: u32,
219	) -> Self {
220		let _bitfield_1 = bindings::_VADecPictureParameterBufferAV1__bindgen_ty_2__bindgen_ty_1::new_bitfield_1(
221			frame_type,
222			show_frame,
223			showable_frame,
224			error_resilient_mode,
225			disable_cdf_update,
226			allow_screen_content_tools,
227			force_integer_mv,
228			allow_intrabc,
229			use_superres,
230			allow_high_precision_mv,
231			is_motion_mode_switchable,
232			use_ref_frame_mvs,
233			disable_frame_end_update_cdf,
234			uniform_tile_spacing_flag,
235			allow_warped_motion,
236			large_scale_tile,
237			0,
238		);
239		Self(bindings::_VADecPictureParameterBufferAV1__bindgen_ty_2 {
240			bits: bindings::_VADecPictureParameterBufferAV1__bindgen_ty_2__bindgen_ty_1 {
241				_bitfield_align_1: Default::default(),
242				_bitfield_1,
243			},
244		})
245	}
246}
247
248/// Wrapper over the `loop_filter_fields` bindgen field in `VADecPictureParameterBufferAV1`.
249pub struct AV1LoopFilterFields(bindings::_VADecPictureParameterBufferAV1__bindgen_ty_3);
250
251impl AV1LoopFilterFields {
252	/// Creates the wrapper
253	pub fn new(sharpness_level: u8, mode_ref_delta_enabled: u8, mode_ref_delta_update: u8) -> Self {
254		let _bitfield_1 = bindings::_VADecPictureParameterBufferAV1__bindgen_ty_3__bindgen_ty_1::new_bitfield_1(
255			sharpness_level,
256			mode_ref_delta_enabled,
257			mode_ref_delta_update,
258			0,
259		);
260		Self(bindings::_VADecPictureParameterBufferAV1__bindgen_ty_3 {
261			bits: bindings::_VADecPictureParameterBufferAV1__bindgen_ty_3__bindgen_ty_1 {
262				_bitfield_align_1: Default::default(),
263				_bitfield_1,
264			},
265		})
266	}
267}
268
269/// Wrapper over the `wm` bindgen field in `VADecPictureParameterBufferAV1`.
270pub struct AV1WarpedMotionParams(bindings::VAWarpedMotionParamsAV1);
271
272impl AV1WarpedMotionParams {
273	/// Creates the wrapper
274	pub fn new(wmtype: bindings::VAAV1TransformationType::Type, wmmat: [i32; 8], invalid: u8) -> Self {
275		Self(bindings::VAWarpedMotionParamsAV1 {
276			wmtype,
277			wmmat,
278			invalid,
279			va_reserved: Default::default(),
280		})
281	}
282}
283
284/// Wrapper over the `loop_restoration_fields` bindgen field in `VADecPictureParameterBufferAV1`.
285pub struct AV1LoopRestorationFields(bindings::_VADecPictureParameterBufferAV1__bindgen_ty_6);
286
287impl AV1LoopRestorationFields {
288	/// Creates the wrapper
289	pub fn new(
290		yframe_restoration_type: u16,
291		cbframe_restoration_type: u16,
292		crframe_restoration_type: u16,
293		lr_unit_shift: u16,
294		lr_uv_shift: u16,
295	) -> Self {
296		let _bitfield_1 = bindings::_VADecPictureParameterBufferAV1__bindgen_ty_6__bindgen_ty_1::new_bitfield_1(
297			yframe_restoration_type,
298			cbframe_restoration_type,
299			crframe_restoration_type,
300			lr_unit_shift,
301			lr_uv_shift,
302			0,
303		);
304		Self(bindings::_VADecPictureParameterBufferAV1__bindgen_ty_6 {
305			bits: bindings::_VADecPictureParameterBufferAV1__bindgen_ty_6__bindgen_ty_1 {
306				_bitfield_align_1: Default::default(),
307				_bitfield_1,
308			},
309		})
310	}
311}
312
313/// Wrapper over the `mode_control_fields` bindgen field in `VADecPictureParameterBufferAV1`.
314pub struct AV1ModeControlFields(bindings::_VADecPictureParameterBufferAV1__bindgen_ty_5);
315
316impl AV1ModeControlFields {
317	/// Creates the wrapper
318	#[allow(clippy::too_many_arguments)]
319	pub fn new(
320		delta_q_present_flag: u32,
321		log2_delta_q_res: u32,
322		delta_lf_present_flag: u32,
323		log2_delta_lf_res: u32,
324		delta_lf_multi: u32,
325		tx_mode: u32,
326		reference_select: u32,
327		reduced_tx_set_used: u32,
328		skip_mode_present: u32,
329	) -> Self {
330		let _bitfield_1 = bindings::_VADecPictureParameterBufferAV1__bindgen_ty_5__bindgen_ty_1::new_bitfield_1(
331			delta_q_present_flag,
332			log2_delta_q_res,
333			delta_lf_present_flag,
334			log2_delta_lf_res,
335			delta_lf_multi,
336			tx_mode,
337			reference_select,
338			reduced_tx_set_used,
339			skip_mode_present,
340			0,
341		);
342		Self(bindings::_VADecPictureParameterBufferAV1__bindgen_ty_5 {
343			bits: bindings::_VADecPictureParameterBufferAV1__bindgen_ty_5__bindgen_ty_1 {
344				_bitfield_align_1: Default::default(),
345				_bitfield_1,
346			},
347		})
348	}
349}
350
351/// Wrapper over the `qmatrix_fields` bindgen field in `VADecPictureParameterBufferAV1`.
352pub struct AV1QMatrixFields(bindings::_VADecPictureParameterBufferAV1__bindgen_ty_4);
353
354impl AV1QMatrixFields {
355	/// Creates the wrapper
356	pub fn new(using_qmatrix: u16, qm_y: u16, qm_u: u16, qm_v: u16) -> Self {
357		let _bitfield_1 = bindings::_VADecPictureParameterBufferAV1__bindgen_ty_4__bindgen_ty_1::new_bitfield_1(
358			using_qmatrix,
359			qm_y,
360			qm_u,
361			qm_v,
362			0,
363		);
364		Self(bindings::_VADecPictureParameterBufferAV1__bindgen_ty_4 {
365			bits: bindings::_VADecPictureParameterBufferAV1__bindgen_ty_4__bindgen_ty_1 {
366				_bitfield_align_1: Default::default(),
367				_bitfield_1,
368			},
369		})
370	}
371}
372
373/// A wrapper over `VADecPictureParameterBufferAV1` FFI type
374pub struct PictureParameterBufferAV1(Box<bindings::VADecPictureParameterBufferAV1>);
375
376impl PictureParameterBufferAV1 {
377	/// Creates the wrapper
378	#[allow(clippy::too_many_arguments)]
379	pub fn new(
380		profile: u8,
381		order_hint_bits_minus_1: u8,
382		bit_depth_idx: u8,
383		matrix_coefficients: u8,
384		seq_info_fields: &AV1SeqFields,
385		current_frame: bindings::VASurfaceID,
386		current_display_picture: bindings::VASurfaceID,
387		mut anchor_frames_list: Vec<bindings::VASurfaceID>,
388		frame_width_minus1: u16,
389		frame_height_minus1: u16,
390		output_frame_width_in_tiles_minus_1: u16,
391		output_frame_height_in_tiles_minus_1: u16,
392		ref_frame_map: [bindings::VASurfaceID; 8usize],
393		ref_frame_idx: [u8; 7usize],
394		primary_ref_frame: u8,
395		order_hint: u8,
396		seg_info: &AV1Segmentation,
397		film_grain_info: &AV1FilmGrain,
398		tile_cols: u8,
399		tile_rows: u8,
400		width_in_sbs_minus_1: [u16; 63usize],
401		height_in_sbs_minus_1: [u16; 63usize],
402		tile_count_minus_1: u16,
403		context_update_tile_id: u16,
404		pic_info_fields: &AV1PicInfoFields,
405		superres_scale_denominator: u8,
406		interp_filter: u8,
407		filter_level: [u8; 2usize],
408		filter_level_u: u8,
409		filter_level_v: u8,
410		loop_filter_info_fields: &AV1LoopFilterFields,
411		ref_deltas: [i8; 8usize],
412		mode_deltas: [i8; 2usize],
413		base_qindex: u8,
414		y_dc_delta_q: i8,
415		u_dc_delta_q: i8,
416		u_ac_delta_q: i8,
417		v_dc_delta_q: i8,
418		v_ac_delta_q: i8,
419		qmatrix_fields: &AV1QMatrixFields,
420		mode_control_fields: &AV1ModeControlFields,
421		cdef_damping_minus_3: u8,
422		cdef_bits: u8,
423		cdef_y_strengths: [u8; 8usize],
424		cdef_uv_strengths: [u8; 8usize],
425		loop_restoration_fields: &AV1LoopRestorationFields,
426		wm: &[AV1WarpedMotionParams; 7usize],
427	) -> Self {
428		let seq_info_fields = seq_info_fields.0;
429		let seg_info = seg_info.0;
430		let pic_info_fields = pic_info_fields.0;
431		let loop_filter_info_fields = loop_filter_info_fields.0;
432		let qmatrix_fields = qmatrix_fields.0;
433		let mode_control_fields = mode_control_fields.0;
434
435		let anchor_frames_num = anchor_frames_list.len() as u8;
436		let anchor_frames_list = anchor_frames_list.as_mut_ptr();
437
438		let film_grain_info = film_grain_info.0;
439		let loop_restoration_fields = loop_restoration_fields.0;
440
441		// Will not panic, as the arrays are the same size.
442		let wm = wm.iter().map(|wm| wm.0).collect::<Vec<_>>().try_into().unwrap();
443
444		Self(Box::new(bindings::VADecPictureParameterBufferAV1 {
445			profile,
446			order_hint_bits_minus_1,
447			bit_depth_idx,
448			matrix_coefficients,
449			seq_info_fields,
450			current_frame,
451			current_display_picture,
452			anchor_frames_num,
453			anchor_frames_list,
454			frame_width_minus1,
455			frame_height_minus1,
456			output_frame_width_in_tiles_minus_1,
457			output_frame_height_in_tiles_minus_1,
458			ref_frame_map,
459			ref_frame_idx,
460			primary_ref_frame,
461			order_hint,
462			seg_info,
463			film_grain_info,
464			tile_cols,
465			tile_rows,
466			width_in_sbs_minus_1,
467			height_in_sbs_minus_1,
468			tile_count_minus_1,
469			context_update_tile_id,
470			pic_info_fields,
471			superres_scale_denominator,
472			interp_filter,
473			filter_level,
474			filter_level_u,
475			filter_level_v,
476			loop_filter_info_fields,
477			ref_deltas,
478			mode_deltas,
479			base_qindex,
480			y_dc_delta_q,
481			u_dc_delta_q,
482			u_ac_delta_q,
483			v_dc_delta_q,
484			v_ac_delta_q,
485			qmatrix_fields,
486			mode_control_fields,
487			cdef_damping_minus_3,
488			cdef_bits,
489			cdef_y_strengths,
490			cdef_uv_strengths,
491			loop_restoration_fields,
492			wm,
493			va_reserved: Default::default(),
494		}))
495	}
496
497	pub(crate) fn inner_mut(&mut self) -> &mut bindings::VADecPictureParameterBufferAV1 {
498		self.0.as_mut()
499	}
500}
501
502/// A wrapper over an array of the `VASliceParameterBufferAV1` FFI type. This
503/// allows for passing all tile parameters in a single call if multiple tiles
504/// are present in the tile group.
505#[derive(Default)]
506pub struct SliceParameterBufferAV1(Vec<bindings::VASliceParameterBufferAV1>);
507
508impl SliceParameterBufferAV1 {
509	/// Creates the wrapper
510	pub fn new() -> Self {
511		Default::default()
512	}
513
514	/// Adds a slice parameter to the wrapper
515	#[allow(clippy::too_many_arguments)]
516	pub fn add_slice_parameter(
517		&mut self,
518		slice_data_size: u32,
519		slice_data_offset: u32,
520		slice_data_flag: u32,
521		tile_row: u16,
522		tile_column: u16,
523		tg_start: u16,
524		tg_end: u16,
525		anchor_frame_idx: u8,
526		tile_idx_in_tile_list: u16,
527	) {
528		self.0.push(bindings::VASliceParameterBufferAV1 {
529			slice_data_size,
530			slice_data_offset,
531			slice_data_flag,
532			tile_row,
533			tile_column,
534			tg_start,
535			tg_end,
536			anchor_frame_idx,
537			tile_idx_in_tile_list,
538			va_reserved: Default::default(),
539		});
540	}
541
542	pub(crate) fn inner_mut(&mut self) -> &mut Vec<bindings::VASliceParameterBufferAV1> {
543		self.0.as_mut()
544	}
545}
546
547pub struct AV1EncSeqFields(bindings::_VAEncSequenceParameterBufferAV1__bindgen_ty_1);
548
549impl AV1EncSeqFields {
550	pub fn new(
551		still_picture: bool,
552		use_128x128_superblock: bool,
553		enable_filter_intra: bool,
554		enable_intra_edge_filter: bool,
555		enable_interintra_compound: bool,
556		enable_masked_compound: bool,
557		enable_warped_motion: bool,
558		enable_dual_filter: bool,
559		enable_order_hint: bool,
560		enable_jnt_comp: bool,
561		enable_ref_frame_mvs: bool,
562		enable_superres: bool,
563		enable_cdef: bool,
564		enable_restoration: bool,
565		bit_depth_minus8: u32,
566		subsampling_x: bool,
567		subsampling_y: bool,
568		mono_chrome: bool,
569	) -> Self {
570		let still_picture = still_picture as u32;
571		let use_128x128_superblock = use_128x128_superblock as u32;
572		let enable_filter_intra = enable_filter_intra as u32;
573		let enable_intra_edge_filter = enable_intra_edge_filter as u32;
574		let enable_interintra_compound = enable_interintra_compound as u32;
575		let enable_masked_compound = enable_masked_compound as u32;
576		let enable_warped_motion = enable_warped_motion as u32;
577		let enable_dual_filter = enable_dual_filter as u32;
578		let enable_order_hint = enable_order_hint as u32;
579		let enable_jnt_comp = enable_jnt_comp as u32;
580		let enable_ref_frame_mvs = enable_ref_frame_mvs as u32;
581		let enable_superres = enable_superres as u32;
582		let enable_cdef = enable_cdef as u32;
583		let enable_restoration = enable_restoration as u32;
584		let subsampling_x = subsampling_x as u32;
585		let subsampling_y = subsampling_y as u32;
586		let mono_chrome = mono_chrome as u32;
587
588		let _bitfield_1 = bindings::_VAEncSequenceParameterBufferAV1__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
589			still_picture,
590			use_128x128_superblock,
591			enable_filter_intra,
592			enable_intra_edge_filter,
593			enable_interintra_compound,
594			enable_masked_compound,
595			enable_warped_motion,
596			enable_dual_filter,
597			enable_order_hint,
598			enable_jnt_comp,
599			enable_ref_frame_mvs,
600			enable_superres,
601			enable_cdef,
602			enable_restoration,
603			#[cfg(libva_1_15_or_higher)]
604			bit_depth_minus8,
605			#[cfg(libva_1_15_or_higher)]
606			subsampling_x,
607			#[cfg(libva_1_15_or_higher)]
608			subsampling_y,
609			#[cfg(libva_1_19_or_higher)]
610			mono_chrome,
611			Default::default(),
612		);
613
614		Self(bindings::_VAEncSequenceParameterBufferAV1__bindgen_ty_1 {
615			bits: bindings::_VAEncSequenceParameterBufferAV1__bindgen_ty_1__bindgen_ty_1 {
616				_bitfield_align_1: Default::default(),
617				_bitfield_1,
618			},
619		})
620	}
621}
622
623#[derive(Default)]
624pub struct EncSequenceParameterBufferAV1(Box<bindings::VAEncSequenceParameterBufferAV1>);
625
626impl EncSequenceParameterBufferAV1 {
627	pub fn new(
628		seq_profile: u8,
629		seq_level_idx: u8,
630		seq_tier: u8,
631		hierarchical_flag: u8,
632		intra_period: u32,
633		ip_period: u32,
634		bits_per_second: u32,
635		seq_fields: &AV1EncSeqFields,
636		order_hint_bits_minus_1: u8,
637	) -> Self {
638		let seq_fields = seq_fields.0;
639
640		Self(Box::new(bindings::_VAEncSequenceParameterBufferAV1 {
641			seq_profile,
642			seq_level_idx,
643			seq_tier,
644			#[cfg(libva_1_16_or_higher)]
645			hierarchical_flag,
646			intra_period,
647			ip_period,
648			bits_per_second,
649			seq_fields,
650			order_hint_bits_minus_1,
651			..Default::default()
652		}))
653	}
654
655	pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAEncSequenceParameterBufferAV1 {
656		&mut self.0
657	}
658}
659
660#[derive(Default)]
661pub struct RefFrameCtrlAV1(bindings::VARefFrameCtrlAV1);
662
663impl RefFrameCtrlAV1 {
664	pub fn new(
665		search_idx0: u32,
666		search_idx1: u32,
667		search_idx2: u32,
668		search_idx3: u32,
669		search_idx4: u32,
670		search_idx5: u32,
671		search_idx6: u32,
672	) -> Self {
673		let _bitfield_1 = bindings::VARefFrameCtrlAV1__bindgen_ty_1::new_bitfield_1(
674			search_idx0,
675			search_idx1,
676			search_idx2,
677			search_idx3,
678			search_idx4,
679			search_idx5,
680			search_idx6,
681			Default::default(),
682		);
683
684		Self(bindings::VARefFrameCtrlAV1 {
685			fields: bindings::VARefFrameCtrlAV1__bindgen_ty_1 {
686				_bitfield_align_1: Default::default(),
687				_bitfield_1,
688			},
689		})
690	}
691}
692
693#[derive(Default)]
694pub struct AV1EncPictureFlags(bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_1);
695
696impl AV1EncPictureFlags {
697	pub fn new(
698		frame_type: u32,
699		error_resilient_mode: bool,
700		disable_cdf_update: bool,
701		use_superres: bool,
702		allow_high_precision_mv: bool,
703		use_ref_frame_mvs: bool,
704		disable_frame_end_update_cdf: bool,
705		reduced_tx_set: bool,
706		enable_frame_obu: bool,
707		long_term_reference: bool,
708		disable_frame_recon: bool,
709		allow_intrabc: bool,
710		palette_mode_enable: bool,
711		allow_screen_content_tools: bool,
712		force_integer_mv: bool,
713	) -> Self {
714		let error_resilient_mode = error_resilient_mode as u32;
715		let disable_cdf_update = disable_cdf_update as u32;
716		let use_superres = use_superres as u32;
717		let allow_high_precision_mv = allow_high_precision_mv as u32;
718		let use_ref_frame_mvs = use_ref_frame_mvs as u32;
719		let disable_frame_end_update_cdf = disable_frame_end_update_cdf as u32;
720		let reduced_tx_set = reduced_tx_set as u32;
721		let enable_frame_obu = enable_frame_obu as u32;
722		let long_term_reference = long_term_reference as u32;
723		let disable_frame_recon = disable_frame_recon as u32;
724		let allow_intrabc = allow_intrabc as u32;
725		let palette_mode_enable = palette_mode_enable as u32;
726		#[cfg(libva_1_21_or_higher)]
727		let allow_screen_content_tools = allow_screen_content_tools as u32;
728		#[cfg(libva_1_21_or_higher)]
729		let force_integer_mv = force_integer_mv as u32;
730
731		let _bitfield_1 = {
732			bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
733				frame_type,
734				error_resilient_mode,
735				disable_cdf_update,
736				use_superres,
737				allow_high_precision_mv,
738				use_ref_frame_mvs,
739				disable_frame_end_update_cdf,
740				reduced_tx_set,
741				enable_frame_obu,
742				long_term_reference,
743				disable_frame_recon,
744				allow_intrabc,
745				palette_mode_enable,
746				#[cfg(libva_1_21_or_higher)]
747				allow_screen_content_tools,
748				#[cfg(libva_1_21_or_higher)]
749				force_integer_mv,
750				Default::default(),
751			)
752		};
753		Self(bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_1 {
754			bits: bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_1__bindgen_ty_1 {
755				_bitfield_align_1: Default::default(),
756				_bitfield_1,
757			},
758		})
759	}
760}
761
762#[derive(Default)]
763pub struct AV1EncLoopFilterFlags(bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_2);
764
765impl AV1EncLoopFilterFlags {
766	pub fn new(sharpness_level: u8, mode_ref_delta_enabled: bool, mode_ref_delta_update: bool) -> Self {
767		let mode_ref_delta_enabled = mode_ref_delta_enabled as u8;
768		let mode_ref_delta_update = mode_ref_delta_update as u8;
769
770		let _bitfield_1 = bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_2__bindgen_ty_1::new_bitfield_1(
771			sharpness_level,
772			mode_ref_delta_enabled,
773			mode_ref_delta_update,
774			Default::default(),
775		);
776
777		Self(bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_2 {
778			bits: bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_2__bindgen_ty_1 {
779				_bitfield_align_1: Default::default(),
780				_bitfield_1,
781			},
782		})
783	}
784}
785
786#[derive(Default)]
787pub struct AV1EncQMatrixFlags(bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_3);
788
789impl AV1EncQMatrixFlags {
790	pub fn new(using_qmatrix: bool, qm_y: u16, qm_u: u16, qm_v: u16) -> Self {
791		let using_qmatrix = using_qmatrix as u16;
792
793		let _bitfield_1 = bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_3__bindgen_ty_1::new_bitfield_1(
794			using_qmatrix,
795			qm_y,
796			qm_u,
797			qm_v,
798			Default::default(),
799		);
800
801		Self(bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_3 {
802			bits: bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_3__bindgen_ty_1 {
803				_bitfield_1,
804				_bitfield_align_1: Default::default(),
805			},
806		})
807	}
808}
809
810#[derive(Default)]
811pub struct AV1EncModeControlFlags(bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_4);
812
813impl AV1EncModeControlFlags {
814	pub fn new(
815		delta_q_present: bool,
816		delta_q_res: u32,
817		delta_lf_present: bool,
818		delta_lf_res: u32,
819		delta_lf_multi: bool,
820		tx_mode: u32,
821		reference_mode: u32,
822		skip_mode_present: bool,
823	) -> Self {
824		let delta_q_present = delta_q_present as u32;
825		let delta_lf_present = delta_lf_present as u32;
826		let delta_lf_multi = delta_lf_multi as u32;
827		let skip_mode_present = skip_mode_present as u32;
828
829		let _bitfield_1 = bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_4__bindgen_ty_1::new_bitfield_1(
830			delta_q_present,
831			delta_q_res,
832			delta_lf_present,
833			delta_lf_res,
834			delta_lf_multi,
835			tx_mode,
836			reference_mode,
837			skip_mode_present,
838			Default::default(),
839		);
840
841		Self(bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_4 {
842			bits: bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_4__bindgen_ty_1 {
843				_bitfield_align_1: Default::default(),
844				_bitfield_1,
845			},
846		})
847	}
848}
849
850#[derive(Default)]
851pub struct EncSegParamFlagsAV1(bindings::_VAEncSegParamAV1__bindgen_ty_1);
852
853impl EncSegParamFlagsAV1 {
854	pub fn new(segmentation_enabled: bool, segmentation_update_map: bool, segmentation_temporal_update: bool) -> Self {
855		let segmentation_enabled = segmentation_enabled as u8;
856		let segmentation_update_map = segmentation_update_map as u8;
857		let segmentation_temporal_update = segmentation_temporal_update as u8;
858
859		let _bitfield_1 = bindings::_VAEncSegParamAV1__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
860			segmentation_enabled,
861			segmentation_update_map,
862			segmentation_temporal_update,
863			Default::default(),
864		);
865
866		Self(bindings::_VAEncSegParamAV1__bindgen_ty_1 {
867			bits: bindings::_VAEncSegParamAV1__bindgen_ty_1__bindgen_ty_1 {
868				_bitfield_align_1: Default::default(),
869				_bitfield_1,
870			},
871		})
872	}
873}
874
875#[derive(Default)]
876pub struct EncSegParamAV1(bindings::VAEncSegParamAV1);
877
878impl EncSegParamAV1 {
879	pub fn new(
880		seg_flags: &EncSegParamFlagsAV1,
881		segment_number: u8,
882		feature_data: [[i16; 8usize]; 8usize],
883		feature_mask: [u8; 8usize],
884	) -> Self {
885		let seg_flags = seg_flags.0;
886
887		Self(bindings::_VAEncSegParamAV1 {
888			seg_flags,
889			segment_number,
890			feature_data,
891			feature_mask,
892			va_reserved: Default::default(),
893		})
894	}
895}
896
897pub struct AV1EncLoopRestorationFlags(bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_5);
898
899impl AV1EncLoopRestorationFlags {
900	pub fn new(
901		yframe_restoration_type: u16,
902		cbframe_restoration_type: u16,
903		crframe_restoration_type: u16,
904		lr_unit_shift: u16,
905		lr_uv_shift: bool,
906	) -> Self {
907		let lr_uv_shift = lr_uv_shift as u16;
908
909		let _bitfield_1 = bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_5__bindgen_ty_1::new_bitfield_1(
910			yframe_restoration_type,
911			cbframe_restoration_type,
912			crframe_restoration_type,
913			lr_unit_shift,
914			lr_uv_shift,
915			Default::default(),
916		);
917
918		Self(bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_5 {
919			bits: bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_5__bindgen_ty_1 {
920				_bitfield_align_1: Default::default(),
921				_bitfield_1,
922			},
923		})
924	}
925}
926
927#[derive(Default, Copy, Clone)]
928pub struct EncWarpedMotionParamsAV1(bindings::VAEncWarpedMotionParamsAV1);
929
930impl EncWarpedMotionParamsAV1 {
931	pub fn new(wmtype: bindings::VAEncTransformationTypeAV1::Type, wmmat: [i32; 8usize], invalid: u8) -> Self {
932		Self(bindings::_VAEncWarpedMotionParamsAV1 {
933			wmtype,
934			wmmat,
935			invalid,
936			va_reserved: Default::default(),
937		})
938	}
939}
940
941pub struct AV1EncTileGroupObuHdrInfo(bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_6);
942
943impl AV1EncTileGroupObuHdrInfo {
944	pub fn new(obu_extension_flag: bool, obu_has_size_field: bool, temporal_id: u8, spatial_id: u8) -> Self {
945		let obu_extension_flag = obu_extension_flag as u8;
946		let obu_has_size_field = obu_has_size_field as u8;
947
948		let _bitfield_1 = bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_6__bindgen_ty_1::new_bitfield_1(
949			obu_extension_flag,
950			obu_has_size_field,
951			temporal_id,
952			spatial_id,
953			Default::default(),
954		);
955
956		Self(bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_6 {
957			bits: bindings::_VAEncPictureParameterBufferAV1__bindgen_ty_6__bindgen_ty_1 {
958				_bitfield_align_1: Default::default(),
959				_bitfield_1,
960			},
961		})
962	}
963}
964
965#[derive(Default)]
966pub struct EncPictureParameterBufferAV1(Box<bindings::VAEncPictureParameterBufferAV1>);
967
968impl EncPictureParameterBufferAV1 {
969	pub fn new(
970		frame_width_minus_1: u16,
971		frame_height_minus_1: u16,
972		reconstructed_frame: bindings::VASurfaceID,
973		coded_buf: bindings::VABufferID,
974		reference_frames: [bindings::VASurfaceID; 8usize],
975		ref_frame_idx: [u8; 7usize],
976		hierarchical_level_plus1: u8,
977		primary_ref_frame: u8,
978		order_hint: u8,
979		refresh_frame_flags: u8,
980		ref_frame_ctrl_l0: &RefFrameCtrlAV1,
981		ref_frame_ctrl_l1: &RefFrameCtrlAV1,
982		picture_flags: &AV1EncPictureFlags,
983		seg_id_block_size: u8,
984		num_tile_groups_minus1: u8,
985		temporal_id: u8,
986		filter_level: [u8; 2usize],
987		filter_level_u: u8,
988		filter_level_v: u8,
989		loop_filter_flags: &AV1EncLoopFilterFlags,
990		superres_scale_denominator: u8,
991		interpolation_filter: u8,
992		ref_deltas: [i8; 8usize],
993		mode_deltas: [i8; 2usize],
994		base_qindex: u8,
995		y_dc_delta_q: i8,
996		u_dc_delta_q: i8,
997		u_ac_delta_q: i8,
998		v_dc_delta_q: i8,
999		v_ac_delta_q: i8,
1000		min_base_qindex: u8,
1001		max_base_qindex: u8,
1002		qmatrix_flags: &AV1EncQMatrixFlags,
1003		mode_control_flags: &AV1EncModeControlFlags,
1004		segments: &EncSegParamAV1,
1005		tile_cols: u8,
1006		tile_rows: u8,
1007		width_in_sbs_minus_1: [u16; 63usize],
1008		height_in_sbs_minus_1: [u16; 63usize],
1009		context_update_tile_id: u16,
1010		cdef_damping_minus_3: u8,
1011		cdef_bits: u8,
1012		cdef_y_strengths: [u8; 8usize],
1013		cdef_uv_strengths: [u8; 8usize],
1014		loop_restoration_flags: &AV1EncLoopRestorationFlags,
1015		wm: [EncWarpedMotionParamsAV1; 7usize],
1016		bit_offset_qindex: u32,
1017		bit_offset_segmentation: u32,
1018		bit_offset_loopfilter_params: u32,
1019		bit_offset_cdef_params: u32,
1020		size_in_bits_cdef_params: u32,
1021		byte_offset_frame_hdr_obu_size: u32,
1022		size_in_bits_frame_hdr_obu: u32,
1023		tile_group_obu_hdr_info: &AV1EncTileGroupObuHdrInfo,
1024		number_skip_frames: u8,
1025		skip_frames_reduced_size: i32,
1026	) -> Self {
1027		let ref_frame_ctrl_l0 = ref_frame_ctrl_l0.0;
1028		let ref_frame_ctrl_l1 = ref_frame_ctrl_l1.0;
1029		let picture_flags = picture_flags.0;
1030		let loop_filter_flags = loop_filter_flags.0;
1031		let qmatrix_flags = qmatrix_flags.0;
1032		let mode_control_flags = mode_control_flags.0;
1033		let segments = segments.0;
1034		let loop_restoration_flags = loop_restoration_flags.0;
1035		let wm = wm.map(|e| e.0);
1036		let tile_group_obu_hdr_info = tile_group_obu_hdr_info.0;
1037
1038		Self(Box::new(bindings::_VAEncPictureParameterBufferAV1 {
1039			frame_width_minus_1,
1040			frame_height_minus_1,
1041			reconstructed_frame,
1042			coded_buf,
1043			reference_frames,
1044			ref_frame_idx,
1045			#[cfg(libva_1_19_or_higher)]
1046			hierarchical_level_plus1,
1047			primary_ref_frame,
1048			order_hint,
1049			#[cfg(libva_1_15_or_higher)]
1050			refresh_frame_flags,
1051			ref_frame_ctrl_l0,
1052			ref_frame_ctrl_l1,
1053			picture_flags,
1054			seg_id_block_size,
1055			num_tile_groups_minus1,
1056			temporal_id,
1057			filter_level,
1058			filter_level_u,
1059			filter_level_v,
1060			loop_filter_flags,
1061			superres_scale_denominator,
1062			interpolation_filter,
1063			ref_deltas,
1064			mode_deltas,
1065			base_qindex,
1066			y_dc_delta_q,
1067			u_dc_delta_q,
1068			u_ac_delta_q,
1069			v_dc_delta_q,
1070			v_ac_delta_q,
1071			min_base_qindex,
1072			max_base_qindex,
1073			qmatrix_flags,
1074			mode_control_flags,
1075			segments,
1076			tile_cols,
1077			tile_rows,
1078			width_in_sbs_minus_1,
1079			height_in_sbs_minus_1,
1080			context_update_tile_id,
1081			cdef_damping_minus_3,
1082			cdef_bits,
1083			cdef_y_strengths,
1084			cdef_uv_strengths,
1085			loop_restoration_flags,
1086			wm,
1087			bit_offset_qindex,
1088			bit_offset_segmentation,
1089			bit_offset_loopfilter_params,
1090			bit_offset_cdef_params,
1091			size_in_bits_cdef_params,
1092			byte_offset_frame_hdr_obu_size,
1093			size_in_bits_frame_hdr_obu,
1094			tile_group_obu_hdr_info,
1095			number_skip_frames,
1096			skip_frames_reduced_size,
1097			..Default::default()
1098		}))
1099	}
1100
1101	pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAEncPictureParameterBufferAV1 {
1102		&mut self.0
1103	}
1104}
1105
1106pub struct EncTileGroupBufferAV1(Box<bindings::VAEncTileGroupBufferAV1>);
1107
1108impl EncTileGroupBufferAV1 {
1109	pub fn new(tg_start: u8, tg_end: u8) -> Self {
1110		Self(Box::new(bindings::VAEncTileGroupBufferAV1 {
1111			tg_start,
1112			tg_end,
1113			va_reserved: Default::default(),
1114		}))
1115	}
1116
1117	pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAEncTileGroupBufferAV1 {
1118		&mut self.0
1119	}
1120}