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