Skip to main content

moq_vaapi/buffer/
vp9.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 VP9 `VABuffer` types.
6
7use crate::bindings;
8
9/// Wrapper over the `pic_fields` bindgen field in `VAPictureParameterBufferVP9`.
10pub struct VP9PicFields(bindings::_VADecPictureParameterBufferVP9__bindgen_ty_1);
11
12impl VP9PicFields {
13	/// Creates the bindgen field
14	#[allow(clippy::too_many_arguments)]
15	pub fn new(
16		subsampling_x: u32,
17		subsampling_y: u32,
18		frame_type: u32,
19		show_frame: u32,
20		error_resilient_mode: u32,
21		intra_only: u32,
22		allow_high_precision_mv: u32,
23		mcomp_filter_type: u32,
24		frame_parallel_decoding_mode: u32,
25		reset_frame_context: u32,
26		refresh_frame_context: u32,
27		frame_context_idx: u32,
28		segmentation_enabled: u32,
29		segmentation_temporal_update: u32,
30		segmentation_update_map: u32,
31		last_ref_frame: u32,
32		last_ref_frame_sign_bias: u32,
33		golden_ref_frame: u32,
34		golden_ref_frame_sign_bias: u32,
35		alt_ref_frame: u32,
36		alt_ref_frame_sign_bias: u32,
37		lossless_flag: u32,
38	) -> Self {
39		let _bitfield_1 = bindings::_VADecPictureParameterBufferVP9__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
40			subsampling_x,
41			subsampling_y,
42			frame_type,
43			show_frame,
44			error_resilient_mode,
45			intra_only,
46			allow_high_precision_mv,
47			mcomp_filter_type,
48			frame_parallel_decoding_mode,
49			reset_frame_context,
50			refresh_frame_context,
51			frame_context_idx,
52			segmentation_enabled,
53			segmentation_temporal_update,
54			segmentation_update_map,
55			last_ref_frame,
56			last_ref_frame_sign_bias,
57			golden_ref_frame,
58			golden_ref_frame_sign_bias,
59			alt_ref_frame,
60			alt_ref_frame_sign_bias,
61			lossless_flag,
62		);
63
64		Self(bindings::_VADecPictureParameterBufferVP9__bindgen_ty_1 {
65			bits: bindings::_VADecPictureParameterBufferVP9__bindgen_ty_1__bindgen_ty_1 {
66				_bitfield_align_1: Default::default(),
67				_bitfield_1,
68			},
69		})
70	}
71
72	/// Returns the inner FFI type. Useful for testing purposes.
73	pub fn inner(&mut self) -> &bindings::_VADecPictureParameterBufferVP9__bindgen_ty_1 {
74		&self.0
75	}
76}
77
78/// Wrapper over the `PictureParameterBufferVP9` FFI type.
79pub struct PictureParameterBufferVP9(Box<bindings::VADecPictureParameterBufferVP9>);
80
81impl PictureParameterBufferVP9 {
82	/// Creates the wrapper
83	#[allow(clippy::too_many_arguments)]
84	pub fn new(
85		frame_width: u16,
86		frame_height: u16,
87		reference_frames: [bindings::VASurfaceID; 8],
88		pic_fields: &VP9PicFields,
89		filter_level: u8,
90		sharpness_level: u8,
91		log2_tile_rows: u8,
92		log2_tile_columns: u8,
93		frame_header_length_in_bytes: u8,
94		first_partition_size: u16,
95		mb_segment_tree_probs: [u8; 7usize],
96		segment_pred_probs: [u8; 3usize],
97		profile: u8,
98		bit_depth: u8,
99	) -> Self {
100		let pic_fields = pic_fields.0;
101
102		Self(Box::new(bindings::VADecPictureParameterBufferVP9 {
103			frame_width,
104			frame_height,
105			reference_frames,
106			pic_fields,
107			filter_level,
108			sharpness_level,
109			log2_tile_rows,
110			log2_tile_columns,
111			frame_header_length_in_bytes,
112			first_partition_size,
113			mb_segment_tree_probs,
114			segment_pred_probs,
115			profile,
116			bit_depth,
117			va_reserved: Default::default(),
118		}))
119	}
120
121	pub(crate) fn inner_mut(&mut self) -> &mut bindings::VADecPictureParameterBufferVP9 {
122		self.0.as_mut()
123	}
124
125	/// Returns the inner FFI type. Useful for testing purposes.
126	pub fn inner(&self) -> &bindings::VADecPictureParameterBufferVP9 {
127		self.0.as_ref()
128	}
129}
130
131/// Wrapper over the `segment_flags` bindgen field in `VASegmentParameterVP9`.
132pub struct VP9SegmentFlags(bindings::_VASegmentParameterVP9__bindgen_ty_1);
133
134impl VP9SegmentFlags {
135	/// Creates the wrapper.
136	pub fn new(segment_reference_enabled: u16, segment_reference: u16, segment_reference_skipped: u16) -> Self {
137		let _bitfield_1 = bindings::_VASegmentParameterVP9__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
138			segment_reference_enabled,
139			segment_reference,
140			segment_reference_skipped,
141		);
142
143		Self(bindings::_VASegmentParameterVP9__bindgen_ty_1 {
144			fields: bindings::_VASegmentParameterVP9__bindgen_ty_1__bindgen_ty_1 {
145				_bitfield_align_1: Default::default(),
146				_bitfield_1,
147				__bindgen_padding_0: Default::default(),
148			},
149		})
150	}
151
152	/// Returns the inner FFI type. Useful for testing purposes.
153	pub fn inner(&mut self) -> &bindings::_VASegmentParameterVP9__bindgen_ty_1 {
154		&self.0
155	}
156}
157
158/// Wrapper over the `VASegmentParameterVP9` FFI type.
159pub struct SegmentParameterVP9(bindings::VASegmentParameterVP9);
160
161impl SegmentParameterVP9 {
162	/// Creates the wrapper.
163	pub fn new(
164		segment_flags: &VP9SegmentFlags,
165		filter_level: [[u8; 2usize]; 4usize],
166		luma_ac_quant_scale: i16,
167		luma_dc_quant_scale: i16,
168		chroma_ac_quant_scale: i16,
169		chroma_dc_quant_scale: i16,
170	) -> Self {
171		let segment_flags = segment_flags.0;
172
173		Self(bindings::VASegmentParameterVP9 {
174			segment_flags,
175			filter_level,
176			luma_ac_quant_scale,
177			luma_dc_quant_scale,
178			chroma_ac_quant_scale,
179			chroma_dc_quant_scale,
180			va_reserved: Default::default(),
181		})
182	}
183}
184
185/// Wrapper over the `VASliceParameterBufferVP9` FFI type.
186pub struct SliceParameterBufferVP9(Box<bindings::VASliceParameterBufferVP9>);
187
188impl SliceParameterBufferVP9 {
189	/// Creates the wrapper.
190	pub fn new(
191		slice_data_size: u32,
192		slice_data_offset: u32,
193		slice_data_flag: u32,
194		seg_param: [SegmentParameterVP9; 8usize],
195	) -> Self {
196		let seg_param = seg_param.map(|param| param.0);
197
198		Self(Box::new(bindings::VASliceParameterBufferVP9 {
199			slice_data_size,
200			slice_data_offset,
201			slice_data_flag,
202			seg_param,
203			va_reserved: Default::default(),
204		}))
205	}
206
207	pub(crate) fn inner_mut(&mut self) -> &mut bindings::VASliceParameterBufferVP9 {
208		self.0.as_mut()
209	}
210
211	/// Returns the inner FFI type. Useful for testing purposes.
212	pub fn inner(&self) -> &bindings::VASliceParameterBufferVP9 {
213		self.0.as_ref()
214	}
215}
216
217pub struct CodedBufferVP9Status(Box<bindings::VACodedBufferVP9Status>);
218
219impl CodedBufferVP9Status {
220	pub fn new(
221		base_qp_index: u16,
222		loop_filter_level: u8,
223		long_term_indication: u8,
224		next_frame_width: u16,
225		next_frame_height: u16,
226	) -> Self {
227		Self(Box::new(bindings::VACodedBufferVP9Status {
228			base_qp_index,
229			loop_filter_level,
230			long_term_indication,
231			next_frame_width,
232			next_frame_height,
233			va_reserved: Default::default(),
234		}))
235	}
236}
237
238pub struct EncSequenceParameterBufferVP9(Box<bindings::VAEncSequenceParameterBufferVP9>);
239
240impl EncSequenceParameterBufferVP9 {
241	pub fn new(
242		max_frame_width: u32,
243		max_frame_height: u32,
244		kf_auto: u32,
245		kf_min_dist: u32,
246		kf_max_dist: u32,
247		bits_per_second: u32,
248		intra_period: u32,
249	) -> Self {
250		Self(Box::new(bindings::VAEncSequenceParameterBufferVP9 {
251			max_frame_width,
252			max_frame_height,
253			kf_auto,
254			kf_min_dist,
255			kf_max_dist,
256			bits_per_second,
257			intra_period,
258			va_reserved: Default::default(),
259		}))
260	}
261
262	pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAEncSequenceParameterBufferVP9 {
263		&mut self.0
264	}
265}
266
267pub struct VP9EncRefFlags(bindings::_VAEncPictureParameterBufferVP9__bindgen_ty_1);
268
269impl VP9EncRefFlags {
270	#[allow(clippy::too_many_arguments)]
271	pub fn new(
272		force_kf: u32,
273		ref_frame_ctrl_l0: u32,
274		ref_frame_ctrl_l1: u32,
275		ref_last_idx: u32,
276		ref_last_sign_bias: u32,
277		ref_gf_idx: u32,
278		ref_gf_sign_bias: u32,
279		ref_arf_idx: u32,
280		ref_arf_sign_bias: u32,
281		temporal_id: u32,
282	) -> Self {
283		let _bitfield_1 = bindings::_VAEncPictureParameterBufferVP9__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
284			force_kf,
285			ref_frame_ctrl_l0,
286			ref_frame_ctrl_l1,
287			ref_last_idx,
288			ref_last_sign_bias,
289			ref_gf_idx,
290			ref_gf_sign_bias,
291			ref_arf_idx,
292			ref_arf_sign_bias,
293			temporal_id,
294			Default::default(),
295		);
296
297		Self(bindings::_VAEncPictureParameterBufferVP9__bindgen_ty_1 {
298			bits: bindings::_VAEncPictureParameterBufferVP9__bindgen_ty_1__bindgen_ty_1 {
299				_bitfield_align_1: Default::default(),
300				_bitfield_1,
301			},
302		})
303	}
304}
305
306pub struct VP9EncPicFlags(bindings::_VAEncPictureParameterBufferVP9__bindgen_ty_2);
307
308impl VP9EncPicFlags {
309	#[allow(clippy::too_many_arguments)]
310	pub fn new(
311		frame_type: u32,
312		show_frame: u32,
313		error_resilient_mode: u32,
314		intra_only: u32,
315		allow_high_precision_mv: u32,
316		mcomp_filter_type: u32,
317		frame_parallel_decoding_mode: u32,
318		reset_frame_context: u32,
319		refresh_frame_context: u32,
320		frame_context_idx: u32,
321		segmentation_enabled: u32,
322		segmentation_temporal_update: u32,
323		segmentation_update_map: u32,
324		lossless_mode: u32,
325		comp_prediction_mode: u32,
326		auto_segmentation: u32,
327		super_frame_flag: u32,
328	) -> Self {
329		let _bitfield_1 = bindings::_VAEncPictureParameterBufferVP9__bindgen_ty_2__bindgen_ty_1::new_bitfield_1(
330			frame_type,
331			show_frame,
332			error_resilient_mode,
333			intra_only,
334			allow_high_precision_mv,
335			mcomp_filter_type,
336			frame_parallel_decoding_mode,
337			reset_frame_context,
338			refresh_frame_context,
339			frame_context_idx,
340			segmentation_enabled,
341			segmentation_temporal_update,
342			segmentation_update_map,
343			lossless_mode,
344			comp_prediction_mode,
345			auto_segmentation,
346			super_frame_flag,
347			Default::default(),
348		);
349
350		Self(bindings::_VAEncPictureParameterBufferVP9__bindgen_ty_2 {
351			bits: bindings::_VAEncPictureParameterBufferVP9__bindgen_ty_2__bindgen_ty_1 {
352				_bitfield_align_1: Default::default(),
353				_bitfield_1,
354			},
355		})
356	}
357}
358
359pub struct EncPictureParameterBufferVP9(Box<bindings::VAEncPictureParameterBufferVP9>);
360
361impl EncPictureParameterBufferVP9 {
362	#[allow(clippy::too_many_arguments)]
363	pub fn new(
364		frame_width_src: u32,
365		frame_height_src: u32,
366		frame_width_dst: u32,
367		frame_height_dst: u32,
368		reconstructed_frame: bindings::VASurfaceID,
369		reference_frames: [bindings::VASurfaceID; 8usize],
370		coded_buf: bindings::VABufferID,
371		ref_flags: &VP9EncRefFlags,
372		pic_flags: &VP9EncPicFlags,
373		refresh_frame_flags: u8,
374		luma_ac_qindex: u8,
375		luma_dc_qindex_delta: i8,
376		chroma_ac_qindex_delta: i8,
377		chroma_dc_qindex_delta: i8,
378		filter_level: u8,
379		sharpness_level: u8,
380		ref_lf_delta: [i8; 4usize],
381		mode_lf_delta: [i8; 2usize],
382		bit_offset_ref_lf_delta: u16,
383		bit_offset_mode_lf_delta: u16,
384		bit_offset_lf_level: u16,
385		bit_offset_qindex: u16,
386		bit_offset_first_partition_size: u16,
387		bit_offset_segmentation: u16,
388		bit_size_segmentation: u16,
389		log2_tile_rows: u8,
390		log2_tile_columns: u8,
391		skip_frame_flag: u8,
392		number_skip_frames: u8,
393		skip_frames_size: u32,
394	) -> Self {
395		let ref_flags = ref_flags.0;
396		let pic_flags = pic_flags.0;
397
398		Self(Box::new(bindings::VAEncPictureParameterBufferVP9 {
399			frame_width_src,
400			frame_height_src,
401			frame_width_dst,
402			frame_height_dst,
403			reconstructed_frame,
404			reference_frames,
405			coded_buf,
406			ref_flags,
407			pic_flags,
408			refresh_frame_flags,
409			luma_ac_qindex,
410			luma_dc_qindex_delta,
411			chroma_ac_qindex_delta,
412			chroma_dc_qindex_delta,
413			filter_level,
414			sharpness_level,
415			ref_lf_delta,
416			mode_lf_delta,
417			bit_offset_ref_lf_delta,
418			bit_offset_mode_lf_delta,
419			bit_offset_lf_level,
420			bit_offset_qindex,
421			bit_offset_first_partition_size,
422			bit_offset_segmentation,
423			bit_size_segmentation,
424			log2_tile_rows,
425			log2_tile_columns,
426			skip_frame_flag,
427			number_skip_frames,
428			skip_frames_size,
429			// Zero-fill `va_reserved` plus any fields newer libva headers add
430			// (e.g. `seg_id_block_size` / `va_reserved8` in libva 1.23), so this
431			// stays buildable across libva versions.
432			..Default::default()
433		}))
434	}
435
436	pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAEncPictureParameterBufferVP9 {
437		&mut self.0
438	}
439}