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 VP8 `VABuffer` types.
6 
7 use crate::bindings;
8 
9 /// Wrapper over the `pic_fields` bindgen field in `VAPictureParameterBufferVP8`.
10 pub struct VP8PicFields(bindings::_VAPictureParameterBufferVP8__bindgen_ty_1);
11 
12 impl VP8PicFields {
13     /// Creates the bindgen field
14     #[allow(clippy::too_many_arguments)]
new( key_frame: u32, version: u32, segmentation_enabled: u32, update_mb_segmentation_map: u32, update_segment_feature_data: u32, filter_type: u32, sharpness_level: u32, loop_filter_adj_enable: u32, mode_ref_lf_delta_update: u32, sign_bias_golden: u32, sign_bias_alternate: u32, mb_no_coeff_skip: u32, loop_filter_disable: u32, ) -> Self15     pub fn new(
16         key_frame: u32,
17         version: u32,
18         segmentation_enabled: u32,
19         update_mb_segmentation_map: u32,
20         update_segment_feature_data: u32,
21         filter_type: u32,
22         sharpness_level: u32,
23         loop_filter_adj_enable: u32,
24         mode_ref_lf_delta_update: u32,
25         sign_bias_golden: u32,
26         sign_bias_alternate: u32,
27         mb_no_coeff_skip: u32,
28         loop_filter_disable: u32,
29     ) -> Self {
30         let _bitfield_1 =
31             bindings::_VAPictureParameterBufferVP8__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
32                 key_frame,
33                 version,
34                 segmentation_enabled,
35                 update_mb_segmentation_map,
36                 update_segment_feature_data,
37                 filter_type,
38                 sharpness_level,
39                 loop_filter_adj_enable,
40                 mode_ref_lf_delta_update,
41                 sign_bias_golden,
42                 sign_bias_alternate,
43                 mb_no_coeff_skip,
44                 loop_filter_disable,
45             );
46 
47         Self(bindings::_VAPictureParameterBufferVP8__bindgen_ty_1 {
48             bits: bindings::_VAPictureParameterBufferVP8__bindgen_ty_1__bindgen_ty_1 {
49                 _bitfield_align_1: Default::default(),
50                 _bitfield_1,
51                 __bindgen_padding_0: Default::default(),
52             },
53         })
54     }
55 
56     /// Returns the inner FFI type. Useful for testing purposes.
inner(&self) -> &bindings::_VAPictureParameterBufferVP8__bindgen_ty_157     pub fn inner(&self) -> &bindings::_VAPictureParameterBufferVP8__bindgen_ty_1 {
58         &self.0
59     }
60 }
61 
62 /// Wrapper over the `VABoolCoderContextVPX` FFI type.
63 pub struct BoolCoderContextVPX(bindings::VABoolCoderContextVPX);
64 
65 impl BoolCoderContextVPX {
66     /// Creates the wrapper
new(range: u8, value: u8, count: u8) -> Self67     pub fn new(range: u8, value: u8, count: u8) -> Self {
68         Self(bindings::VABoolCoderContextVPX {
69             range,
70             value,
71             count,
72         })
73     }
74 }
75 
76 /// Wrapper over the `PictureParameterBufferVP8` FFI type.
77 pub struct PictureParameterBufferVP8(Box<bindings::VAPictureParameterBufferVP8>);
78 
79 impl PictureParameterBufferVP8 {
80     /// Creates the wrapper
81     #[allow(clippy::too_many_arguments)]
new( frame_width: u32, frame_height: u32, last_ref_frame: bindings::VASurfaceID, golden_ref_frame: bindings::VASurfaceID, alt_ref_frame: bindings::VASurfaceID, pic_fields: &VP8PicFields, mb_segment_tree_probs: [u8; 3usize], loop_filter_level: [u8; 4usize], loop_filter_deltas_ref_frame: [i8; 4usize], loop_filter_deltas_mode: [i8; 4usize], prob_skip_false: u8, prob_intra: u8, prob_last: u8, prob_gf: u8, y_mode_probs: [u8; 4usize], uv_mode_probs: [u8; 3usize], mv_probs: [[u8; 19usize]; 2usize], bool_coder_ctx: &BoolCoderContextVPX, ) -> Self82     pub fn new(
83         frame_width: u32,
84         frame_height: u32,
85         last_ref_frame: bindings::VASurfaceID,
86         golden_ref_frame: bindings::VASurfaceID,
87         alt_ref_frame: bindings::VASurfaceID,
88         pic_fields: &VP8PicFields,
89         mb_segment_tree_probs: [u8; 3usize],
90         loop_filter_level: [u8; 4usize],
91         loop_filter_deltas_ref_frame: [i8; 4usize],
92         loop_filter_deltas_mode: [i8; 4usize],
93         prob_skip_false: u8,
94         prob_intra: u8,
95         prob_last: u8,
96         prob_gf: u8,
97         y_mode_probs: [u8; 4usize],
98         uv_mode_probs: [u8; 3usize],
99         mv_probs: [[u8; 19usize]; 2usize],
100         bool_coder_ctx: &BoolCoderContextVPX,
101     ) -> Self {
102         let pic_fields = pic_fields.0;
103         let bool_coder_ctx = bool_coder_ctx.0;
104 
105         Self(Box::new(bindings::VAPictureParameterBufferVP8 {
106             frame_width,
107             frame_height,
108             last_ref_frame,
109             golden_ref_frame,
110             alt_ref_frame,
111             out_of_loop_frame: bindings::VA_INVALID_SURFACE,
112             pic_fields,
113             mb_segment_tree_probs,
114             loop_filter_level,
115             loop_filter_deltas_ref_frame,
116             loop_filter_deltas_mode,
117             prob_skip_false,
118             prob_intra,
119             prob_last,
120             prob_gf,
121             y_mode_probs,
122             uv_mode_probs,
123             mv_probs,
124             bool_coder_ctx,
125             va_reserved: Default::default(),
126         }))
127     }
128 
inner_mut(&mut self) -> &mut bindings::VAPictureParameterBufferVP8129     pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAPictureParameterBufferVP8 {
130         self.0.as_mut()
131     }
132 
133     /// Returns the inner FFI type. Useful for testing purposes.
inner(&self) -> &bindings::VAPictureParameterBufferVP8134     pub fn inner(&self) -> &bindings::VAPictureParameterBufferVP8 {
135         self.0.as_ref()
136     }
137 }
138 
139 /// Wrapper over the `VASliceParameterBufferVP8` FFI type.
140 pub struct SliceParameterBufferVP8(Box<bindings::VASliceParameterBufferVP8>);
141 
142 impl SliceParameterBufferVP8 {
143     /// Creates the wrapper.
new( slice_data_size: u32, slice_data_offset: u32, slice_data_flag: u32, macroblock_offset: u32, num_of_partitions: u8, partition_size: [u32; 9usize], ) -> Self144     pub fn new(
145         slice_data_size: u32,
146         slice_data_offset: u32,
147         slice_data_flag: u32,
148         macroblock_offset: u32,
149         num_of_partitions: u8,
150         partition_size: [u32; 9usize],
151     ) -> Self {
152         Self(Box::new(bindings::VASliceParameterBufferVP8 {
153             slice_data_size,
154             slice_data_offset,
155             slice_data_flag,
156             macroblock_offset,
157             num_of_partitions,
158             partition_size,
159             va_reserved: Default::default(),
160         }))
161     }
162 
inner_mut(&mut self) -> &mut bindings::VASliceParameterBufferVP8163     pub(crate) fn inner_mut(&mut self) -> &mut bindings::VASliceParameterBufferVP8 {
164         self.0.as_mut()
165     }
166 
167     /// Returns the inner FFI type. Useful for testing purposes.
inner(&self) -> &bindings::VASliceParameterBufferVP8168     pub fn inner(&self) -> &bindings::VASliceParameterBufferVP8 {
169         self.0.as_ref()
170     }
171 }
172 
173 /// Wrapper over the `VAIQMatrixBufferVP8` FFI type.
174 pub struct IQMatrixBufferVP8(Box<bindings::VAIQMatrixBufferVP8>);
175 
176 impl IQMatrixBufferVP8 {
177     /// Creates the wrapper.
new(quantization_index: [[u16; 6usize]; 4usize]) -> Self178     pub fn new(quantization_index: [[u16; 6usize]; 4usize]) -> Self {
179         Self(Box::new(bindings::VAIQMatrixBufferVP8 {
180             quantization_index,
181             va_reserved: Default::default(),
182         }))
183     }
184 
inner_mut(&mut self) -> &mut bindings::VAIQMatrixBufferVP8185     pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAIQMatrixBufferVP8 {
186         self.0.as_mut()
187     }
188 
189     /// Returns the inner FFI type. Useful for testing purposes.
inner(&self) -> &bindings::VAIQMatrixBufferVP8190     pub fn inner(&self) -> &bindings::VAIQMatrixBufferVP8 {
191         self.0.as_ref()
192     }
193 }
194 
195 /// Wrapper over the VAProbabilityDataBufferVP8 FFI type.
196 pub struct ProbabilityDataBufferVP8(Box<bindings::VAProbabilityDataBufferVP8>);
197 
198 impl ProbabilityDataBufferVP8 {
199     /// Creates the wrapper.
new(dct_coeff_probs: [[[[u8; 11usize]; 3usize]; 8usize]; 4usize]) -> Self200     pub fn new(dct_coeff_probs: [[[[u8; 11usize]; 3usize]; 8usize]; 4usize]) -> Self {
201         Self(Box::new(bindings::VAProbabilityDataBufferVP8 {
202             dct_coeff_probs,
203             va_reserved: Default::default(),
204         }))
205     }
206 
inner_mut(&mut self) -> &mut bindings::VAProbabilityDataBufferVP8207     pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAProbabilityDataBufferVP8 {
208         self.0.as_mut()
209     }
210 
211     /// Returns the inner FFI type. Useful for testing purposes.
inner(&self) -> &bindings::VAProbabilityDataBufferVP8212     pub fn inner(&self) -> &bindings::VAProbabilityDataBufferVP8 {
213         self.0.as_ref()
214     }
215 }
216 
217 pub struct EncSequenceParameterBufferVP8(Box<bindings::VAEncSequenceParameterBufferVP8>);
218 
219 impl EncSequenceParameterBufferVP8 {
220     #[allow(clippy::too_many_arguments)]
new( frame_width: u32, frame_height: u32, frame_width_scale: u32, frame_height_scale: u32, error_resilient: u32, kf_auto: u32, kf_min_dist: u32, kf_max_dist: u32, bits_per_second: u32, intra_period: u32, reference_frames: [bindings::VASurfaceID; 4usize], ) -> Self221     pub fn new(
222         frame_width: u32,
223         frame_height: u32,
224         frame_width_scale: u32,
225         frame_height_scale: u32,
226         error_resilient: u32,
227         kf_auto: u32,
228         kf_min_dist: u32,
229         kf_max_dist: u32,
230         bits_per_second: u32,
231         intra_period: u32,
232         reference_frames: [bindings::VASurfaceID; 4usize],
233     ) -> Self {
234         Self(Box::new(bindings::VAEncSequenceParameterBufferVP8 {
235             frame_width,
236             frame_height,
237             frame_width_scale,
238             frame_height_scale,
239             error_resilient,
240             kf_auto,
241             kf_min_dist,
242             kf_max_dist,
243             bits_per_second,
244             intra_period,
245             reference_frames,
246             va_reserved: Default::default(),
247         }))
248     }
249 
inner_mut(&mut self) -> &mut bindings::VAEncSequenceParameterBufferVP8250     pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAEncSequenceParameterBufferVP8 {
251         &mut self.0
252     }
253 }
254 
255 pub struct VP8EncRefFlags(bindings::_VAEncPictureParameterBufferVP8__bindgen_ty_1);
256 
257 impl VP8EncRefFlags {
new( force_kf: u32, no_ref_last: u32, no_ref_gf: u32, no_ref_arf: u32, temporal_id: u32, first_ref: u32, second_ref: u32, ) -> Self258     pub fn new(
259         force_kf: u32,
260         no_ref_last: u32,
261         no_ref_gf: u32,
262         no_ref_arf: u32,
263         temporal_id: u32,
264         first_ref: u32,
265         second_ref: u32,
266     ) -> Self {
267         let _bitfield_1 =
268             bindings::_VAEncPictureParameterBufferVP8__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
269                 force_kf,
270                 no_ref_last,
271                 no_ref_gf,
272                 no_ref_arf,
273                 temporal_id,
274                 first_ref,
275                 second_ref,
276                 Default::default(),
277             );
278 
279         Self(bindings::_VAEncPictureParameterBufferVP8__bindgen_ty_1 {
280             bits: bindings::_VAEncPictureParameterBufferVP8__bindgen_ty_1__bindgen_ty_1 {
281                 _bitfield_align_1: Default::default(),
282                 _bitfield_1,
283             },
284         })
285     }
286 }
287 
288 pub struct VP8EncPicFlags(bindings::_VAEncPictureParameterBufferVP8__bindgen_ty_2);
289 
290 impl VP8EncPicFlags {
291     #[allow(clippy::too_many_arguments)]
new( frame_type: u32, version: u32, show_frame: u32, color_space: u32, recon_filter_type: u32, loop_filter_type: u32, auto_partitions: u32, num_token_partitions: u32, clamping_type: u32, segmentation_enabled: u32, update_mb_segmentation_map: u32, update_segment_feature_data: u32, loop_filter_adj_enable: u32, refresh_entropy_probs: u32, refresh_golden_frame: u32, refresh_alternate_frame: u32, refresh_last: u32, copy_buffer_to_golden: u32, copy_buffer_to_alternate: u32, sign_bias_golden: u32, sign_bias_alternate: u32, mb_no_coeff_skip: u32, forced_lf_adjustment: u32, ) -> Self292     pub fn new(
293         frame_type: u32,
294         version: u32,
295         show_frame: u32,
296         color_space: u32,
297         recon_filter_type: u32,
298         loop_filter_type: u32,
299         auto_partitions: u32,
300         num_token_partitions: u32,
301         clamping_type: u32,
302         segmentation_enabled: u32,
303         update_mb_segmentation_map: u32,
304         update_segment_feature_data: u32,
305         loop_filter_adj_enable: u32,
306         refresh_entropy_probs: u32,
307         refresh_golden_frame: u32,
308         refresh_alternate_frame: u32,
309         refresh_last: u32,
310         copy_buffer_to_golden: u32,
311         copy_buffer_to_alternate: u32,
312         sign_bias_golden: u32,
313         sign_bias_alternate: u32,
314         mb_no_coeff_skip: u32,
315         forced_lf_adjustment: u32,
316     ) -> Self {
317         let _bitfield_1 =
318             bindings::_VAEncPictureParameterBufferVP8__bindgen_ty_2__bindgen_ty_1::new_bitfield_1(
319                 frame_type,
320                 version,
321                 show_frame,
322                 color_space,
323                 recon_filter_type,
324                 loop_filter_type,
325                 auto_partitions,
326                 num_token_partitions,
327                 clamping_type,
328                 segmentation_enabled,
329                 update_mb_segmentation_map,
330                 update_segment_feature_data,
331                 loop_filter_adj_enable,
332                 refresh_entropy_probs,
333                 refresh_golden_frame,
334                 refresh_alternate_frame,
335                 refresh_last,
336                 copy_buffer_to_golden,
337                 copy_buffer_to_alternate,
338                 sign_bias_golden,
339                 sign_bias_alternate,
340                 mb_no_coeff_skip,
341                 forced_lf_adjustment,
342                 Default::default(),
343             );
344 
345         Self(bindings::_VAEncPictureParameterBufferVP8__bindgen_ty_2 {
346             bits: bindings::_VAEncPictureParameterBufferVP8__bindgen_ty_2__bindgen_ty_1 {
347                 _bitfield_align_1: Default::default(),
348                 _bitfield_1,
349             },
350         })
351     }
352 }
353 
354 pub struct EncPictureParameterBufferVP8(Box<bindings::VAEncPictureParameterBufferVP8>);
355 
356 impl EncPictureParameterBufferVP8 {
357     #[allow(clippy::too_many_arguments)]
new( reconstructed_frame: bindings::VASurfaceID, ref_last_frame: bindings::VASurfaceID, ref_gf_frame: bindings::VASurfaceID, ref_arf_frame: bindings::VASurfaceID, coded_buf: bindings::VABufferID, ref_flags: &VP8EncRefFlags, pic_flags: &VP8EncPicFlags, loop_filter_level: [i8; 4usize], ref_lf_delta: [i8; 4usize], mode_lf_delta: [i8; 4usize], sharpness_level: u8, clamp_qindex_high: u8, clamp_qindex_low: u8, ) -> Self358     pub fn new(
359         reconstructed_frame: bindings::VASurfaceID,
360         ref_last_frame: bindings::VASurfaceID,
361         ref_gf_frame: bindings::VASurfaceID,
362         ref_arf_frame: bindings::VASurfaceID,
363         coded_buf: bindings::VABufferID,
364         ref_flags: &VP8EncRefFlags,
365         pic_flags: &VP8EncPicFlags,
366         loop_filter_level: [i8; 4usize],
367         ref_lf_delta: [i8; 4usize],
368         mode_lf_delta: [i8; 4usize],
369         sharpness_level: u8,
370         clamp_qindex_high: u8,
371         clamp_qindex_low: u8,
372     ) -> Self {
373         let ref_flags = ref_flags.0;
374         let pic_flags = pic_flags.0;
375 
376         Self(Box::new(bindings::VAEncPictureParameterBufferVP8 {
377             reconstructed_frame,
378             ref_last_frame,
379             ref_gf_frame,
380             ref_arf_frame,
381             coded_buf,
382             ref_flags,
383             pic_flags,
384             loop_filter_level,
385             ref_lf_delta,
386             mode_lf_delta,
387             sharpness_level,
388             clamp_qindex_high,
389             clamp_qindex_low,
390             va_reserved: Default::default(),
391         }))
392     }
393 
inner_mut(&mut self) -> &mut bindings::VAEncPictureParameterBufferVP8394     pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAEncPictureParameterBufferVP8 {
395         &mut self.0
396     }
397 }
398