1 // Copyright 2024 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 `VAEncMisc*` types.
6 
7 use crate::bindings;
8 
9 #[repr(C)]
10 #[derive(Default)]
11 pub struct MiscEncParamBuffer<T> {
12     hdr: bindings::VAEncMiscParameterBuffer,
13     value: T,
14 }
15 
16 impl<T> MiscEncParamBuffer<T> {
new(type_: bindings::VAEncMiscParameterType::Type, value: T) -> Self17     fn new(type_: bindings::VAEncMiscParameterType::Type, value: T) -> Self {
18         Self {
19             hdr: bindings::_VAEncMiscParameterBuffer {
20                 type_,
21                 data: Default::default(),
22             },
23             value,
24         }
25     }
26 
new_boxed(type_: bindings::VAEncMiscParameterType::Type, value: T) -> Box<Self>27     fn new_boxed(type_: bindings::VAEncMiscParameterType::Type, value: T) -> Box<Self> {
28         Box::new(Self::new(type_, value))
29     }
30 }
31 
32 #[derive(Default)]
33 pub struct EncMiscParameterFrameRate(
34     Box<MiscEncParamBuffer<bindings::VAEncMiscParameterFrameRate>>,
35 );
36 
37 impl EncMiscParameterFrameRate {
new(framerate: u32, temporal_id: u32) -> Self38     pub fn new(framerate: u32, temporal_id: u32) -> Self {
39         let _bitfield_1 =
40             bindings::_VAEncMiscParameterFrameRate__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
41                 temporal_id,
42                 Default::default(),
43             );
44 
45         Self(MiscEncParamBuffer::new_boxed(
46             bindings::VAEncMiscParameterType::VAEncMiscParameterTypeFrameRate,
47             bindings::_VAEncMiscParameterFrameRate {
48                 framerate,
49                 framerate_flags: bindings::_VAEncMiscParameterFrameRate__bindgen_ty_1 {
50                     bits: bindings::_VAEncMiscParameterFrameRate__bindgen_ty_1__bindgen_ty_1 {
51                         _bitfield_align_1: Default::default(),
52                         _bitfield_1,
53                     },
54                 },
55                 ..Default::default()
56             },
57         ))
58     }
59 
inner(&self) -> &MiscEncParamBuffer<bindings::VAEncMiscParameterFrameRate>60     pub fn inner(&self) -> &MiscEncParamBuffer<bindings::VAEncMiscParameterFrameRate> {
61         &self.0
62     }
63 
inner_mut( &mut self, ) -> &mut MiscEncParamBuffer<bindings::VAEncMiscParameterFrameRate>64     pub(crate) fn inner_mut(
65         &mut self,
66     ) -> &mut MiscEncParamBuffer<bindings::VAEncMiscParameterFrameRate> {
67         &mut self.0
68     }
69 }
70 
71 #[derive(Default)]
72 pub struct RcFlags(bindings::_VAEncMiscParameterRateControl__bindgen_ty_1);
73 
74 impl RcFlags {
new( reset: u32, disable_frame_skip: u32, disable_bit_stuffing: u32, mb_rate_control: u32, temporal_id: u32, cfs_i_frames: u32, enable_parallel_brc: u32, enable_dynamic_scaling: u32, frame_tolerance_mode: u32, ) -> Self75     pub fn new(
76         reset: u32,
77         disable_frame_skip: u32,
78         disable_bit_stuffing: u32,
79         mb_rate_control: u32,
80         temporal_id: u32,
81         cfs_i_frames: u32,
82         enable_parallel_brc: u32,
83         enable_dynamic_scaling: u32,
84         frame_tolerance_mode: u32,
85     ) -> Self {
86         let _bitfield_1 =
87             bindings::_VAEncMiscParameterRateControl__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
88                 reset,
89                 disable_frame_skip,
90                 disable_bit_stuffing,
91                 mb_rate_control,
92                 temporal_id,
93                 cfs_i_frames,
94                 enable_parallel_brc,
95                 enable_dynamic_scaling,
96                 frame_tolerance_mode,
97                 Default::default(),
98             );
99 
100         Self(bindings::_VAEncMiscParameterRateControl__bindgen_ty_1 {
101             bits: bindings::_VAEncMiscParameterRateControl__bindgen_ty_1__bindgen_ty_1 {
102                 _bitfield_align_1: Default::default(),
103                 _bitfield_1,
104             },
105         })
106     }
107 }
108 
109 #[derive(Default)]
110 pub struct EncMiscParameterRateControl(
111     Box<MiscEncParamBuffer<bindings::VAEncMiscParameterRateControl>>,
112 );
113 
114 impl EncMiscParameterRateControl {
new( bits_per_second: u32, target_percentage: u32, window_size: u32, initial_qp: u32, min_qp: u32, basic_unit_size: u32, rc_flags: RcFlags, icq_quality_factor: u32, max_qp: u32, quality_factor: u32, target_frame_size: u32, ) -> Self115     pub fn new(
116         bits_per_second: u32,
117         target_percentage: u32,
118         window_size: u32,
119         initial_qp: u32,
120         min_qp: u32,
121         basic_unit_size: u32,
122         rc_flags: RcFlags,
123         icq_quality_factor: u32,
124         max_qp: u32,
125         quality_factor: u32,
126         target_frame_size: u32,
127     ) -> Self {
128         Self(MiscEncParamBuffer::new_boxed(
129             bindings::VAEncMiscParameterType::VAEncMiscParameterTypeRateControl,
130             bindings::VAEncMiscParameterRateControl {
131                 bits_per_second,
132                 target_percentage,
133                 window_size,
134                 initial_qp,
135                 min_qp,
136                 basic_unit_size,
137                 rc_flags: rc_flags.0,
138                 ICQ_quality_factor: icq_quality_factor,
139                 max_qp,
140                 quality_factor,
141                 target_frame_size,
142                 ..Default::default()
143             },
144         ))
145     }
146 
inner(&self) -> &MiscEncParamBuffer<bindings::VAEncMiscParameterRateControl>147     pub fn inner(&self) -> &MiscEncParamBuffer<bindings::VAEncMiscParameterRateControl> {
148         &self.0
149     }
150 
inner_mut( &mut self, ) -> &mut MiscEncParamBuffer<bindings::VAEncMiscParameterRateControl>151     pub(crate) fn inner_mut(
152         &mut self,
153     ) -> &mut MiscEncParamBuffer<bindings::VAEncMiscParameterRateControl> {
154         &mut self.0
155     }
156 }
157 
158 #[derive(Default)]
159 pub struct EncMiscParameterMaxSliceSize(
160     Box<MiscEncParamBuffer<bindings::VAEncMiscParameterMaxSliceSize>>,
161 );
162 
163 impl EncMiscParameterMaxSliceSize {
new(max_slice_size: u32) -> Self164     pub fn new(max_slice_size: u32) -> Self {
165         Self(MiscEncParamBuffer::new_boxed(
166             bindings::VAEncMiscParameterType::VAEncMiscParameterTypeMaxFrameSize,
167             bindings::VAEncMiscParameterMaxSliceSize {
168                 max_slice_size,
169                 ..Default::default()
170             },
171         ))
172     }
173 
inner(&self) -> &MiscEncParamBuffer<bindings::VAEncMiscParameterMaxSliceSize>174     pub fn inner(&self) -> &MiscEncParamBuffer<bindings::VAEncMiscParameterMaxSliceSize> {
175         &self.0
176     }
177 
inner_mut( &mut self, ) -> &mut MiscEncParamBuffer<bindings::VAEncMiscParameterMaxSliceSize>178     pub(crate) fn inner_mut(
179         &mut self,
180     ) -> &mut MiscEncParamBuffer<bindings::VAEncMiscParameterMaxSliceSize> {
181         &mut self.0
182     }
183 }
184 
185 #[derive(Default)]
186 pub struct EncMiscParameterBufferMaxFrameSize(
187     Box<MiscEncParamBuffer<bindings::VAEncMiscParameterBufferMaxFrameSize>>,
188 );
189 
190 impl EncMiscParameterBufferMaxFrameSize {
new(max_frame_size: u32) -> Self191     pub fn new(max_frame_size: u32) -> Self {
192         Self(MiscEncParamBuffer::new_boxed(
193             bindings::VAEncMiscParameterType::VAEncMiscParameterTypeMaxFrameSize,
194             bindings::VAEncMiscParameterBufferMaxFrameSize {
195                 type_: bindings::VAEncMiscParameterType::VAEncMiscParameterTypeMaxFrameSize,
196                 max_frame_size,
197                 ..Default::default()
198             },
199         ))
200     }
201 
inner(&self) -> &MiscEncParamBuffer<bindings::VAEncMiscParameterBufferMaxFrameSize>202     pub fn inner(&self) -> &MiscEncParamBuffer<bindings::VAEncMiscParameterBufferMaxFrameSize> {
203         &self.0
204     }
205 
inner_mut( &mut self, ) -> &mut MiscEncParamBuffer<bindings::VAEncMiscParameterBufferMaxFrameSize>206     pub(crate) fn inner_mut(
207         &mut self,
208     ) -> &mut MiscEncParamBuffer<bindings::VAEncMiscParameterBufferMaxFrameSize> {
209         &mut self.0
210     }
211 }
212 
213 #[derive(Default)]
214 pub struct EncMiscParameterSkipFrame(
215     Box<MiscEncParamBuffer<bindings::VAEncMiscParameterSkipFrame>>,
216 );
217 
218 impl EncMiscParameterSkipFrame {
new(skip_frame_flag: u8, num_skip_frames: u8, size_skip_frames: u32) -> Self219     pub fn new(skip_frame_flag: u8, num_skip_frames: u8, size_skip_frames: u32) -> Self {
220         Self(MiscEncParamBuffer::new_boxed(
221             bindings::VAEncMiscParameterType::VAEncMiscParameterTypeSkipFrame,
222             bindings::VAEncMiscParameterSkipFrame {
223                 skip_frame_flag,
224                 num_skip_frames,
225                 size_skip_frames,
226                 ..Default::default()
227             },
228         ))
229     }
230 
inner(&self) -> &MiscEncParamBuffer<bindings::VAEncMiscParameterSkipFrame>231     pub fn inner(&self) -> &MiscEncParamBuffer<bindings::VAEncMiscParameterSkipFrame> {
232         &self.0
233     }
234 
inner_mut( &mut self, ) -> &mut MiscEncParamBuffer<bindings::VAEncMiscParameterSkipFrame>235     pub(crate) fn inner_mut(
236         &mut self,
237     ) -> &mut MiscEncParamBuffer<bindings::VAEncMiscParameterSkipFrame> {
238         &mut self.0
239     }
240 }
241 
242 #[derive(Default)]
243 pub struct EncMiscParameterHRD(Box<MiscEncParamBuffer<bindings::VAEncMiscParameterHRD>>);
244 
245 impl EncMiscParameterHRD {
new(initial_buffer_fullness: u32, buffer_size: u32) -> Self246     pub fn new(initial_buffer_fullness: u32, buffer_size: u32) -> Self {
247         Self(MiscEncParamBuffer::new_boxed(
248             bindings::VAEncMiscParameterType::VAEncMiscParameterTypeHRD,
249             bindings::VAEncMiscParameterHRD {
250                 initial_buffer_fullness,
251                 buffer_size,
252                 ..Default::default()
253             },
254         ))
255     }
256 
inner(&self) -> &MiscEncParamBuffer<bindings::VAEncMiscParameterHRD>257     pub fn inner(&self) -> &MiscEncParamBuffer<bindings::VAEncMiscParameterHRD> {
258         &self.0
259     }
260 
inner_mut(&mut self) -> &mut MiscEncParamBuffer<bindings::VAEncMiscParameterHRD>261     pub(crate) fn inner_mut(&mut self) -> &mut MiscEncParamBuffer<bindings::VAEncMiscParameterHRD> {
262         &mut self.0
263     }
264 }
265 
266 #[derive(Default)]
267 pub struct EncMiscParameterBufferQualityLevel(
268     Box<MiscEncParamBuffer<bindings::VAEncMiscParameterBufferQualityLevel>>,
269 );
270 
271 impl EncMiscParameterBufferQualityLevel {
new(quality_level: u32) -> Self272     pub fn new(quality_level: u32) -> Self {
273         Self(MiscEncParamBuffer::new_boxed(
274             bindings::VAEncMiscParameterType::VAEncMiscParameterTypeQualityLevel,
275             bindings::VAEncMiscParameterBufferQualityLevel {
276                 quality_level,
277                 ..Default::default()
278             },
279         ))
280     }
281 
inner(&self) -> &MiscEncParamBuffer<bindings::VAEncMiscParameterBufferQualityLevel>282     pub fn inner(&self) -> &MiscEncParamBuffer<bindings::VAEncMiscParameterBufferQualityLevel> {
283         &self.0
284     }
285 
inner_mut( &mut self, ) -> &mut MiscEncParamBuffer<bindings::VAEncMiscParameterBufferQualityLevel>286     pub(crate) fn inner_mut(
287         &mut self,
288     ) -> &mut MiscEncParamBuffer<bindings::VAEncMiscParameterBufferQualityLevel> {
289         &mut self.0
290     }
291 }
292 
293 #[derive(Default)]
294 pub struct EncMiscParameterQuantization(
295     Box<MiscEncParamBuffer<bindings::VAEncMiscParameterQuantization>>,
296 );
297 
298 impl EncMiscParameterQuantization {
new( disable_trellis: bool, enable_trellis_i: bool, enable_trellis_p: bool, enable_trellis_b: bool, ) -> Self299     pub fn new(
300         disable_trellis: bool,
301         enable_trellis_i: bool,
302         enable_trellis_p: bool,
303         enable_trellis_b: bool,
304     ) -> Self {
305         let _bitfield_1 =
306             bindings::_VAEncMiscParameterQuantization__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
307                 disable_trellis as u32,
308                 enable_trellis_i as u32,
309                 enable_trellis_p as u32,
310                 enable_trellis_b as u32,
311                 Default::default(),
312             );
313 
314         Self(MiscEncParamBuffer::new_boxed(
315             bindings::VAEncMiscParameterType::VAEncMiscParameterTypeQuantization,
316             bindings::VAEncMiscParameterQuantization {
317                 quantization_flags: bindings::_VAEncMiscParameterQuantization__bindgen_ty_1 {
318                     bits: bindings::_VAEncMiscParameterQuantization__bindgen_ty_1__bindgen_ty_1 {
319                         _bitfield_align_1: Default::default(),
320                         _bitfield_1,
321                     },
322                 },
323                 ..Default::default()
324             },
325         ))
326     }
327 
inner(&self) -> &MiscEncParamBuffer<bindings::VAEncMiscParameterQuantization>328     pub fn inner(&self) -> &MiscEncParamBuffer<bindings::VAEncMiscParameterQuantization> {
329         &self.0
330     }
331 
inner_mut( &mut self, ) -> &mut MiscEncParamBuffer<bindings::VAEncMiscParameterQuantization>332     pub(crate) fn inner_mut(
333         &mut self,
334     ) -> &mut MiscEncParamBuffer<bindings::VAEncMiscParameterQuantization> {
335         &mut self.0
336     }
337 }
338