1 // Copyright 2022 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.
5 //! Wrappers and helpers around `VABuffer`s.
23 use crate::status::Status;
26 /// Wrapper type representing a buffer created with `vaCreateBuffer`.
29 id: bindings::VABufferID,
33 /// Creates a new buffer by wrapping a `vaCreateBuffer` call. This is just a helper for
34 /// [`Context::create_buffer`].
35 pub(crate) fn new(context: Rc<Context>, mut type_: BufferType) -> Result<Self> {
36 let mut buffer_id = 0;
38 let (ptr, size) = match type_ {
39 BufferType::PictureParameter(ref mut picture_param) => match picture_param {
40 PictureParameter::MPEG2(ref mut wrapper) => (
41 wrapper.inner_mut() as *mut _ as *mut std::ffi::c_void,
42 std::mem::size_of_val(wrapper.inner_mut()),
44 PictureParameter::VP8(ref mut wrapper) => (
45 wrapper.inner_mut() as *mut _ as *mut std::ffi::c_void,
46 std::mem::size_of_val(wrapper.inner_mut()),
48 PictureParameter::VP9(ref mut wrapper) => (
49 wrapper.inner_mut() as *mut _ as *mut std::ffi::c_void,
50 std::mem::size_of_val(wrapper.inner_mut()),
52 PictureParameter::H264(ref mut wrapper) => (
53 wrapper.inner_mut() as *mut _ as *mut std::ffi::c_void,
54 std::mem::size_of_val(wrapper.inner_mut()),
58 BufferType::SliceParameter(ref mut slice_param) => match slice_param {
59 SliceParameter::MPEG2(ref mut wrapper) => (
60 wrapper.inner_mut() as *mut _ as *mut std::ffi::c_void,
61 std::mem::size_of_val(wrapper.inner_mut()),
63 SliceParameter::VP8(ref mut wrapper) => (
64 wrapper.inner_mut() as *mut _ as *mut std::ffi::c_void,
65 std::mem::size_of_val(wrapper.inner_mut()),
67 SliceParameter::VP9(ref mut wrapper) => (
68 wrapper.inner_mut() as *mut _ as *mut std::ffi::c_void,
69 std::mem::size_of_val(wrapper.inner_mut()),
71 SliceParameter::H264(ref mut wrapper) => (
72 wrapper.inner_mut() as *mut _ as *mut std::ffi::c_void,
73 std::mem::size_of_val(wrapper.inner_mut()),
77 BufferType::IQMatrix(ref mut iq_matrix) => match iq_matrix {
78 IQMatrix::MPEG2(ref mut wrapper) => (
79 wrapper.inner_mut() as *mut _ as *mut std::ffi::c_void,
80 std::mem::size_of_val(wrapper.inner_mut()),
82 IQMatrix::VP8(ref mut wrapper) => (
83 wrapper.inner_mut() as *mut _ as *mut std::ffi::c_void,
84 std::mem::size_of_val(wrapper.inner_mut()),
86 IQMatrix::H264(ref mut wrapper) => (
87 wrapper.inner_mut() as *mut _ as *mut std::ffi::c_void,
88 std::mem::size_of_val(wrapper.inner_mut()),
92 BufferType::Probability(ref mut wrapper) => (
93 wrapper.inner_mut() as *mut _ as *mut std::ffi::c_void,
94 std::mem::size_of_val(wrapper.inner_mut()),
97 BufferType::SliceData(ref mut data) => {
98 (data.as_mut_ptr() as *mut std::ffi::c_void, data.len())
102 // Safe because `self` represents a valid `VAContext`. `ptr` and `size` are also ensured to
103 // be correct, as `ptr` is just a cast to `*c_void` from a Rust struct, and `size` is
104 // computed from `std::mem::size_of_val`.
106 bindings::vaCreateBuffer(
107 context.display().handle(),
124 /// Convenience function to return a `VABufferID` vector from a slice of `Buffer`s in order to
125 /// easily interface with the C API where a buffer array might be needed.
126 pub fn as_id_vec(buffers: &[Self]) -> Vec<bindings::VABufferID> {
127 buffers.iter().map(|buffer| buffer.id).collect()
131 impl Drop for Buffer {
133 // Safe because `self` represents a valid buffer, created with
136 Status(unsafe { bindings::vaDestroyBuffer(self.context.display().handle(), self.id) })
139 error!("vaDestroyBuffer failed: {}", status.unwrap_err());
144 /// Abstraction over `VABufferType`s.
145 pub enum BufferType {
146 /// Abstraction over `VAPictureParameterBufferType`. Needed for MPEG2, VP8, VP9, H264.
147 PictureParameter(PictureParameter),
148 /// Abstraction over `VASliceParameterBufferType`. Needed for MPEG2, VP8, VP9, H264.
149 SliceParameter(SliceParameter),
150 /// Abstraction over `VAIQMatrixBufferType`. Needed for VP8, H264.
152 /// Abstraction over `VAProbabilityDataBufferType`. Needed for VP8.
153 Probability(vp8::ProbabilityDataBufferVP8),
154 /// Abstraction over `VASliceDataBufferType`. Needed for VP9, H264.
159 /// Returns the inner FFI buffer type.
160 pub(crate) fn inner(&self) -> bindings::VABufferType::Type {
162 BufferType::PictureParameter(_) => bindings::VABufferType::VAPictureParameterBufferType,
163 BufferType::SliceParameter(_) => bindings::VABufferType::VASliceParameterBufferType,
164 BufferType::IQMatrix(_) => bindings::VABufferType::VAIQMatrixBufferType,
165 BufferType::Probability(_) => bindings::VABufferType::VAProbabilityBufferType,
166 BufferType::SliceData { .. } => bindings::VABufferType::VASliceDataBufferType,
171 /// Abstraction over the `PictureParameterBuffer` types we support.
172 pub enum PictureParameter {
173 /// Wrapper over VAPictureParameterBufferMPEG2.
174 MPEG2(mpeg2::PictureParameterBufferMPEG2),
175 /// Wrapper over VAPictureParameterBufferVP8.
176 VP8(vp8::PictureParameterBufferVP8),
177 /// Wrapper over VAPictureParameterBufferVP9.
178 VP9(vp9::PictureParameterBufferVP9),
179 /// Wrapper over VAPictureParameterBufferH264.
180 H264(h264::PictureParameterBufferH264),
183 /// Abstraction over the `SliceParameterBuffer` types we support
184 pub enum SliceParameter {
185 /// Wrapper over VASliceParameterBufferMPEG2
186 MPEG2(mpeg2::SliceParameterBufferMPEG2),
187 /// Wrapper over VASliceParameterBufferVP8
188 VP8(vp8::SliceParameterBufferVP8),
189 /// Wrapper over VASliceParameterBufferVP9
190 VP9(vp9::SliceParameterBufferVP9),
191 /// Wrapper over VASliceParameterBufferH264
192 H264(h264::SliceParameterBufferH264),
195 /// Abstraction over the `IQMatrixBuffer` types we support.
197 /// Abstraction over `VAIQMatrixBufferMPEG2`
198 MPEG2(mpeg2::IQMatrixBufferMPEG2),
199 /// Abstraction over `VAIQMatrixBufferVP8`
200 VP8(vp8::IQMatrixBufferVP8),
201 /// Abstraction over `VAIQMatrixBufferH264`
202 H264(h264::IQMatrixBufferH264),