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