]> git.nihav.org Git - nihav-player.git/blob - nihed-cros-libva/src/buffer/mpeg2.rs
videplayer: fix a crash during laggy playback
[nihav-player.git] / nihed-cros-libva / src / buffer / mpeg2.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 MPEG2 `VABuffer` types.
6
7 use crate::bindings;
8
9 /// Wrapper over the `picture_coding_extension` bindgen field in `VAPictureParameterBufferMPEG2`.
10 pub struct MPEG2PictureCodingExtension(bindings::_VAPictureParameterBufferMPEG2__bindgen_ty_1);
11
12 impl MPEG2PictureCodingExtension {
13 /// Creates the bindgen field.
14 #[allow(clippy::too_many_arguments)]
15 pub fn new(
16 intra_dc_precision: u32,
17 picture_structure: u32,
18 top_field_first: u32,
19 frame_pred_frame_dct: u32,
20 concealment_motion_vectors: u32,
21 q_scale_type: u32,
22 intra_vlc_format: u32,
23 alternate_scan: u32,
24 repeat_first_field: u32,
25 progressive_frame: u32,
26 is_first_field: u32,
27 ) -> Self {
28 let _bitfield_1 =
29 bindings::_VAPictureParameterBufferMPEG2__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
30 intra_dc_precision,
31 picture_structure,
32 top_field_first,
33 frame_pred_frame_dct,
34 concealment_motion_vectors,
35 q_scale_type,
36 intra_vlc_format,
37 alternate_scan,
38 repeat_first_field,
39 progressive_frame,
40 is_first_field,
41 );
42
43 Self(bindings::_VAPictureParameterBufferMPEG2__bindgen_ty_1 {
44 bits: bindings::_VAPictureParameterBufferMPEG2__bindgen_ty_1__bindgen_ty_1 {
45 _bitfield_align_1: Default::default(),
46 _bitfield_1,
47 __bindgen_padding_0: Default::default(),
48 },
49 })
50 }
51
52 /// Returns the inner FFI type. Useful for testing purposes.
53 pub fn inner(&mut self) -> &bindings::_VAPictureParameterBufferMPEG2__bindgen_ty_1 {
54 &self.0
55 }
56 }
57
58 /// Wrapper over the `PictureParameterBufferMPEG2` FFI type.
59 pub struct PictureParameterBufferMPEG2(Box<bindings::VAPictureParameterBufferMPEG2>);
60
61 impl PictureParameterBufferMPEG2 {
62 /// Creates the wrapper.
63 pub fn new(
64 horizontal_size: u16,
65 vertical_size: u16,
66 forward_reference_picture: bindings::VASurfaceID,
67 backward_reference_picture: bindings::VASurfaceID,
68 picture_coding_type: i32,
69 f_code: i32,
70 picture_coding_extension: &MPEG2PictureCodingExtension,
71 ) -> Self {
72 let picture_coding_extension = picture_coding_extension.0;
73
74 Self(Box::new(bindings::VAPictureParameterBufferMPEG2 {
75 horizontal_size,
76 vertical_size,
77 forward_reference_picture,
78 backward_reference_picture,
79 picture_coding_type,
80 f_code,
81 picture_coding_extension,
82 va_reserved: Default::default(),
83 }))
84 }
85
86 pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAPictureParameterBufferMPEG2 {
87 self.0.as_mut()
88 }
89
90 /// Returns the inner FFI type. Useful for testing purposes.
91 pub fn inner(&mut self) -> &bindings::VAPictureParameterBufferMPEG2 {
92 self.0.as_ref()
93 }
94 }
95
96 /// Wrapper over the `VASliceParameterBufferMPEG2` FFI type.
97 pub struct SliceParameterBufferMPEG2(Box<bindings::VASliceParameterBufferMPEG2>);
98
99 impl SliceParameterBufferMPEG2 {
100 /// Creates the wrapper.
101 #[allow(clippy::too_many_arguments)]
102 pub fn new(
103 slice_data_size: u32,
104 slice_data_offset: u32,
105 slice_data_flag: u32,
106 macroblock_offset: u32,
107 slice_horizontal_position: u32,
108 slice_vertical_position: u32,
109 quantiser_scale_code: i32,
110 intra_slice_flag: i32,
111 ) -> Self {
112 Self(Box::new(bindings::VASliceParameterBufferMPEG2 {
113 slice_data_size,
114 slice_data_offset,
115 slice_data_flag,
116 macroblock_offset,
117 slice_horizontal_position,
118 slice_vertical_position,
119 quantiser_scale_code,
120 intra_slice_flag,
121 va_reserved: Default::default(),
122 }))
123 }
124
125 pub(crate) fn inner_mut(&mut self) -> &mut bindings::VASliceParameterBufferMPEG2 {
126 self.0.as_mut()
127 }
128
129 /// Returns the inner FFI type. Useful for testing purposes.
130 pub fn inner(&self) -> &bindings::VASliceParameterBufferMPEG2 {
131 self.0.as_ref()
132 }
133 }
134
135 /// Wrapper over the `VAIQMatrixBufferMPEG2` FFI type.
136 pub struct IQMatrixBufferMPEG2(Box<bindings::VAIQMatrixBufferMPEG2>);
137
138 impl IQMatrixBufferMPEG2 {
139 /// Creates the wrapper.
140 #[allow(clippy::too_many_arguments)]
141 pub fn new(
142 load_intra_quantiser_matrix: i32,
143 load_non_intra_quantiser_matrix: i32,
144 load_chroma_intra_quantiser_matrix: i32,
145 load_chroma_non_intra_quantiser_matrix: i32,
146 intra_quantiser_matrix: [u8; 64usize],
147 non_intra_quantiser_matrix: [u8; 64usize],
148 chroma_intra_quantiser_matrix: [u8; 64usize],
149 chroma_non_intra_quantiser_matrix: [u8; 64usize],
150 ) -> Self {
151 Self(Box::new(bindings::VAIQMatrixBufferMPEG2 {
152 load_intra_quantiser_matrix,
153 load_non_intra_quantiser_matrix,
154 load_chroma_intra_quantiser_matrix,
155 load_chroma_non_intra_quantiser_matrix,
156 intra_quantiser_matrix,
157 non_intra_quantiser_matrix,
158 chroma_intra_quantiser_matrix,
159 chroma_non_intra_quantiser_matrix,
160 va_reserved: Default::default(),
161 }))
162 }
163
164 pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAIQMatrixBufferMPEG2 {
165 self.0.as_mut()
166 }
167
168 /// Returns the inner FFI type. Useful for testing purposes.
169 pub fn inner(&self) -> &bindings::VAIQMatrixBufferMPEG2 {
170 self.0.as_ref()
171 }
172 }