start work on nihed-cros-libva
[nihav-player.git] / nihed-cros-libva / src / buffer / vp9.rs
diff --git a/nihed-cros-libva/src/buffer/vp9.rs b/nihed-cros-libva/src/buffer/vp9.rs
new file mode 100644 (file)
index 0000000..c100c9b
--- /dev/null
@@ -0,0 +1,221 @@
+// Copyright 2023 The ChromiumOS Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+//! Wrappers around VP9 `VABuffer` types.
+
+use crate::bindings;
+
+/// Wrapper over the `pic_fields` bindgen field in `VAPictureParameterBufferVP9`.
+pub struct VP9PicFields(bindings::_VADecPictureParameterBufferVP9__bindgen_ty_1);
+
+impl VP9PicFields {
+    /// Creates the bindgen field
+    #[allow(clippy::too_many_arguments)]
+    pub fn 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,
+    ) -> Self {
+        let _bitfield_1 =
+            bindings::_VADecPictureParameterBufferVP9__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
+                subsampling_x,
+                subsampling_y,
+                frame_type,
+                show_frame,
+                error_resilient_mode,
+                intra_only,
+                allow_high_precision_mv,
+                mcomp_filter_type,
+                frame_parallel_decoding_mode,
+                reset_frame_context,
+                refresh_frame_context,
+                frame_context_idx,
+                segmentation_enabled,
+                segmentation_temporal_update,
+                segmentation_update_map,
+                last_ref_frame,
+                last_ref_frame_sign_bias,
+                golden_ref_frame,
+                golden_ref_frame_sign_bias,
+                alt_ref_frame,
+                alt_ref_frame_sign_bias,
+                lossless_flag,
+            );
+
+        Self(bindings::_VADecPictureParameterBufferVP9__bindgen_ty_1 {
+            bits: bindings::_VADecPictureParameterBufferVP9__bindgen_ty_1__bindgen_ty_1 {
+                _bitfield_align_1: Default::default(),
+                _bitfield_1,
+            },
+        })
+    }
+
+    /// Returns the inner FFI type. Useful for testing purposes.
+    pub fn inner(&mut self) -> &bindings::_VADecPictureParameterBufferVP9__bindgen_ty_1 {
+        &self.0
+    }
+}
+
+/// Wrapper over the `PictureParameterBufferVP9` FFI type.
+pub struct PictureParameterBufferVP9(Box<bindings::VADecPictureParameterBufferVP9>);
+
+impl PictureParameterBufferVP9 {
+    /// Creates the wrapper
+    #[allow(clippy::too_many_arguments)]
+    pub fn 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,
+    ) -> Self {
+        let pic_fields = pic_fields.0;
+
+        Self(Box::new(bindings::VADecPictureParameterBufferVP9 {
+            frame_width,
+            frame_height,
+            reference_frames,
+            pic_fields,
+            filter_level,
+            sharpness_level,
+            log2_tile_rows,
+            log2_tile_columns,
+            frame_header_length_in_bytes,
+            first_partition_size,
+            mb_segment_tree_probs,
+            segment_pred_probs,
+            profile,
+            bit_depth,
+            va_reserved: Default::default(),
+        }))
+    }
+
+    pub(crate) fn inner_mut(&mut self) -> &mut bindings::VADecPictureParameterBufferVP9 {
+        self.0.as_mut()
+    }
+
+    /// Returns the inner FFI type. Useful for testing purposes.
+    pub fn inner(&self) -> &bindings::VADecPictureParameterBufferVP9 {
+        self.0.as_ref()
+    }
+}
+
+/// Wrapper over the `segment_flags` bindgen field in `VASegmentParameterVP9`.
+pub struct VP9SegmentFlags(bindings::_VASegmentParameterVP9__bindgen_ty_1);
+
+impl VP9SegmentFlags {
+    /// Creates the wrapper.
+    pub fn new(
+        segment_reference_enabled: u16,
+        segment_reference: u16,
+        segment_reference_skipped: u16,
+    ) -> Self {
+        let _bitfield_1 =
+            bindings::_VASegmentParameterVP9__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
+                segment_reference_enabled,
+                segment_reference,
+                segment_reference_skipped,
+            );
+
+        Self(bindings::_VASegmentParameterVP9__bindgen_ty_1 {
+            fields: bindings::_VASegmentParameterVP9__bindgen_ty_1__bindgen_ty_1 {
+                _bitfield_align_1: Default::default(),
+                _bitfield_1,
+                __bindgen_padding_0: Default::default(),
+            },
+        })
+    }
+
+    /// Returns the inner FFI type. Useful for testing purposes.
+    pub fn inner(&mut self) -> &bindings::_VASegmentParameterVP9__bindgen_ty_1 {
+        &self.0
+    }
+}
+
+/// Wrapper over the `VASegmentParameterVP9` FFI type.
+pub struct SegmentParameterVP9(bindings::VASegmentParameterVP9);
+
+impl SegmentParameterVP9 {
+    /// Creates the wrapper.
+    pub fn 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,
+    ) -> Self {
+        let segment_flags = segment_flags.0;
+
+        Self(bindings::VASegmentParameterVP9 {
+            segment_flags,
+            filter_level,
+            luma_ac_quant_scale,
+            luma_dc_quant_scale,
+            chroma_ac_quant_scale,
+            chroma_dc_quant_scale,
+            va_reserved: Default::default(),
+        })
+    }
+}
+
+/// Wrapper over the `VASliceParameterBufferVP9` FFI type.
+pub struct SliceParameterBufferVP9(Box<bindings::VASliceParameterBufferVP9>);
+
+impl SliceParameterBufferVP9 {
+    /// Creates the wrapper.
+    pub fn new(
+        slice_data_size: u32,
+        slice_data_offset: u32,
+        slice_data_flag: u32,
+        seg_param: [SegmentParameterVP9; 8usize],
+    ) -> Self {
+        let seg_param = seg_param.map(|param| param.0);
+
+        Self(Box::new(bindings::VASliceParameterBufferVP9 {
+            slice_data_size,
+            slice_data_offset,
+            slice_data_flag,
+            seg_param,
+            va_reserved: Default::default(),
+        }))
+    }
+
+    pub(crate) fn inner_mut(&mut self) -> &mut bindings::VASliceParameterBufferVP9 {
+        self.0.as_mut()
+    }
+
+    /// Returns the inner FFI type. Useful for testing purposes.
+    pub fn inner(&self) -> &bindings::VASliceParameterBufferVP9 {
+        self.0.as_ref()
+    }
+}