libva 0.1.4

Safe bindings over libva
// 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 VP8 `VABuffer` types.

use crate::bindings;

/// Wrapper over the `pic_fields` bindgen field in `VAPictureParameterBufferVP8`.
pub struct VP8PicFields(bindings::_VAPictureParameterBufferVP8__bindgen_ty_1);

impl VP8PicFields {
    /// Creates the bindgen field
    #[allow(clippy::too_many_arguments)]
    pub fn new(
        key_frame: u32,
        version: u32,
        segmentation_enabled: u32,
        update_mb_segmentation_map: u32,
        update_segment_feature_data: u32,
        filter_type: u32,
        sharpness_level: u32,
        loop_filter_adj_enable: u32,
        mode_ref_lf_delta_update: u32,
        sign_bias_golden: u32,
        sign_bias_alternate: u32,
        mb_no_coeff_skip: u32,
        loop_filter_disable: u32,
    ) -> Self {
        let _bitfield_1 =
            bindings::_VAPictureParameterBufferVP8__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
                key_frame,
                version,
                segmentation_enabled,
                update_mb_segmentation_map,
                update_segment_feature_data,
                filter_type,
                sharpness_level,
                loop_filter_adj_enable,
                mode_ref_lf_delta_update,
                sign_bias_golden,
                sign_bias_alternate,
                mb_no_coeff_skip,
                loop_filter_disable,
            );

        Self(bindings::_VAPictureParameterBufferVP8__bindgen_ty_1 {
            bits: bindings::_VAPictureParameterBufferVP8__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(&self) -> &bindings::_VAPictureParameterBufferVP8__bindgen_ty_1 {
        &self.0
    }
}

/// Wrapper over the `VABoolCoderContextVPX` FFI type.
pub struct BoolCoderContextVPX(bindings::VABoolCoderContextVPX);

impl BoolCoderContextVPX {
    /// Creates the wrapper
    pub fn new(range: u8, value: u8, count: u8) -> Self {
        Self(bindings::VABoolCoderContextVPX {
            range,
            value,
            count,
        })
    }
}

/// Wrapper over the `PictureParameterBufferVP8` FFI type.
pub struct PictureParameterBufferVP8(Box<bindings::VAPictureParameterBufferVP8>);

impl PictureParameterBufferVP8 {
    /// Creates the wrapper
    #[allow(clippy::too_many_arguments)]
    pub fn new(
        frame_width: u32,
        frame_height: u32,
        last_ref_frame: bindings::VASurfaceID,
        golden_ref_frame: bindings::VASurfaceID,
        alt_ref_frame: bindings::VASurfaceID,
        pic_fields: &VP8PicFields,
        mb_segment_tree_probs: [u8; 3usize],
        loop_filter_level: [u8; 4usize],
        loop_filter_deltas_ref_frame: [i8; 4usize],
        loop_filter_deltas_mode: [i8; 4usize],
        prob_skip_false: u8,
        prob_intra: u8,
        prob_last: u8,
        prob_gf: u8,
        y_mode_probs: [u8; 4usize],
        uv_mode_probs: [u8; 3usize],
        mv_probs: [[u8; 19usize]; 2usize],
        bool_coder_ctx: &BoolCoderContextVPX,
    ) -> Self {
        let pic_fields = pic_fields.0;
        let bool_coder_ctx = bool_coder_ctx.0;

        Self(Box::new(bindings::VAPictureParameterBufferVP8 {
            frame_width,
            frame_height,
            last_ref_frame,
            golden_ref_frame,
            alt_ref_frame,
            out_of_loop_frame: bindings::VA_INVALID_SURFACE,
            pic_fields,
            mb_segment_tree_probs,
            loop_filter_level,
            loop_filter_deltas_ref_frame,
            loop_filter_deltas_mode,
            prob_skip_false,
            prob_intra,
            prob_last,
            prob_gf,
            y_mode_probs,
            uv_mode_probs,
            mv_probs,
            bool_coder_ctx,
            va_reserved: Default::default(),
        }))
    }

    pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAPictureParameterBufferVP8 {
        self.0.as_mut()
    }

    /// Returns the inner FFI type. Useful for testing purposes.
    pub fn inner(&self) -> &bindings::VAPictureParameterBufferVP8 {
        self.0.as_ref()
    }
}

/// Wrapper over the `VASliceParameterBufferVP8` FFI type.
pub struct SliceParameterBufferVP8(Box<bindings::VASliceParameterBufferVP8>);

impl SliceParameterBufferVP8 {
    /// Creates the wrapper.
    pub fn new(
        slice_data_size: u32,
        slice_data_offset: u32,
        slice_data_flag: u32,
        macroblock_offset: u32,
        num_of_partitions: u8,
        partition_size: [u32; 9usize],
    ) -> Self {
        Self(Box::new(bindings::VASliceParameterBufferVP8 {
            slice_data_size,
            slice_data_offset,
            slice_data_flag,
            macroblock_offset,
            num_of_partitions,
            partition_size,
            va_reserved: Default::default(),
        }))
    }

    pub(crate) fn inner_mut(&mut self) -> &mut bindings::VASliceParameterBufferVP8 {
        self.0.as_mut()
    }

    /// Returns the inner FFI type. Useful for testing purposes.
    pub fn inner(&self) -> &bindings::VASliceParameterBufferVP8 {
        self.0.as_ref()
    }
}

/// Wrapper over the `VAIQMatrixBufferVP8` FFI type.
pub struct IQMatrixBufferVP8(Box<bindings::VAIQMatrixBufferVP8>);

impl IQMatrixBufferVP8 {
    /// Creates the wrapper.
    pub fn new(quantization_index: [[u16; 6usize]; 4usize]) -> Self {
        Self(Box::new(bindings::VAIQMatrixBufferVP8 {
            quantization_index,
            va_reserved: Default::default(),
        }))
    }

    pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAIQMatrixBufferVP8 {
        self.0.as_mut()
    }

    /// Returns the inner FFI type. Useful for testing purposes.
    pub fn inner(&self) -> &bindings::VAIQMatrixBufferVP8 {
        self.0.as_ref()
    }
}

/// Wrapper over the VAProbabilityDataBufferVP8 FFI type.
pub struct ProbabilityDataBufferVP8(Box<bindings::VAProbabilityDataBufferVP8>);

impl ProbabilityDataBufferVP8 {
    /// Creates the wrapper.
    pub fn new(dct_coeff_probs: [[[[u8; 11usize]; 3usize]; 8usize]; 4usize]) -> Self {
        Self(Box::new(bindings::VAProbabilityDataBufferVP8 {
            dct_coeff_probs,
            va_reserved: Default::default(),
        }))
    }

    pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAProbabilityDataBufferVP8 {
        self.0.as_mut()
    }

    /// Returns the inner FFI type. Useful for testing purposes.
    pub fn inner(&self) -> &bindings::VAProbabilityDataBufferVP8 {
        self.0.as_ref()
    }
}

pub struct EncSequenceParameterBufferVP8(Box<bindings::VAEncSequenceParameterBufferVP8>);

impl EncSequenceParameterBufferVP8 {
    #[allow(clippy::too_many_arguments)]
    pub fn new(
        frame_width: u32,
        frame_height: u32,
        frame_width_scale: u32,
        frame_height_scale: u32,
        error_resilient: u32,
        kf_auto: u32,
        kf_min_dist: u32,
        kf_max_dist: u32,
        bits_per_second: u32,
        intra_period: u32,
        reference_frames: [bindings::VASurfaceID; 4usize],
    ) -> Self {
        Self(Box::new(bindings::VAEncSequenceParameterBufferVP8 {
            frame_width,
            frame_height,
            frame_width_scale,
            frame_height_scale,
            error_resilient,
            kf_auto,
            kf_min_dist,
            kf_max_dist,
            bits_per_second,
            intra_period,
            reference_frames,
            va_reserved: Default::default(),
        }))
    }

    pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAEncSequenceParameterBufferVP8 {
        &mut self.0
    }
}

pub struct VP8EncRefFlags(bindings::_VAEncPictureParameterBufferVP8__bindgen_ty_1);

impl VP8EncRefFlags {
    pub fn new(
        force_kf: u32,
        no_ref_last: u32,
        no_ref_gf: u32,
        no_ref_arf: u32,
        temporal_id: u32,
        first_ref: u32,
        second_ref: u32,
    ) -> Self {
        let _bitfield_1 =
            bindings::_VAEncPictureParameterBufferVP8__bindgen_ty_1__bindgen_ty_1::new_bitfield_1(
                force_kf,
                no_ref_last,
                no_ref_gf,
                no_ref_arf,
                temporal_id,
                first_ref,
                second_ref,
                Default::default(),
            );

        Self(bindings::_VAEncPictureParameterBufferVP8__bindgen_ty_1 {
            bits: bindings::_VAEncPictureParameterBufferVP8__bindgen_ty_1__bindgen_ty_1 {
                _bitfield_align_1: Default::default(),
                _bitfield_1,
            },
        })
    }
}

pub struct VP8EncPicFlags(bindings::_VAEncPictureParameterBufferVP8__bindgen_ty_2);

impl VP8EncPicFlags {
    #[allow(clippy::too_many_arguments)]
    pub fn new(
        frame_type: u32,
        version: u32,
        show_frame: u32,
        color_space: u32,
        recon_filter_type: u32,
        loop_filter_type: u32,
        auto_partitions: u32,
        num_token_partitions: u32,
        clamping_type: u32,
        segmentation_enabled: u32,
        update_mb_segmentation_map: u32,
        update_segment_feature_data: u32,
        loop_filter_adj_enable: u32,
        refresh_entropy_probs: u32,
        refresh_golden_frame: u32,
        refresh_alternate_frame: u32,
        refresh_last: u32,
        copy_buffer_to_golden: u32,
        copy_buffer_to_alternate: u32,
        sign_bias_golden: u32,
        sign_bias_alternate: u32,
        mb_no_coeff_skip: u32,
        forced_lf_adjustment: u32,
    ) -> Self {
        let _bitfield_1 =
            bindings::_VAEncPictureParameterBufferVP8__bindgen_ty_2__bindgen_ty_1::new_bitfield_1(
                frame_type,
                version,
                show_frame,
                color_space,
                recon_filter_type,
                loop_filter_type,
                auto_partitions,
                num_token_partitions,
                clamping_type,
                segmentation_enabled,
                update_mb_segmentation_map,
                update_segment_feature_data,
                loop_filter_adj_enable,
                refresh_entropy_probs,
                refresh_golden_frame,
                refresh_alternate_frame,
                refresh_last,
                copy_buffer_to_golden,
                copy_buffer_to_alternate,
                sign_bias_golden,
                sign_bias_alternate,
                mb_no_coeff_skip,
                forced_lf_adjustment,
                Default::default(),
            );

        Self(bindings::_VAEncPictureParameterBufferVP8__bindgen_ty_2 {
            bits: bindings::_VAEncPictureParameterBufferVP8__bindgen_ty_2__bindgen_ty_1 {
                _bitfield_align_1: Default::default(),
                _bitfield_1,
            },
        })
    }
}

pub struct EncPictureParameterBufferVP8(Box<bindings::VAEncPictureParameterBufferVP8>);

impl EncPictureParameterBufferVP8 {
    #[allow(clippy::too_many_arguments)]
    pub fn new(
        reconstructed_frame: bindings::VASurfaceID,
        ref_last_frame: bindings::VASurfaceID,
        ref_gf_frame: bindings::VASurfaceID,
        ref_arf_frame: bindings::VASurfaceID,
        coded_buf: bindings::VABufferID,
        ref_flags: &VP8EncRefFlags,
        pic_flags: &VP8EncPicFlags,
        loop_filter_level: [i8; 4usize],
        ref_lf_delta: [i8; 4usize],
        mode_lf_delta: [i8; 4usize],
        sharpness_level: u8,
        clamp_qindex_high: u8,
        clamp_qindex_low: u8,
    ) -> Self {
        let ref_flags = ref_flags.0;
        let pic_flags = pic_flags.0;

        Self(Box::new(bindings::VAEncPictureParameterBufferVP8 {
            reconstructed_frame,
            ref_last_frame,
            ref_gf_frame,
            ref_arf_frame,
            coded_buf,
            ref_flags,
            pic_flags,
            loop_filter_level,
            ref_lf_delta,
            mode_lf_delta,
            sharpness_level,
            clamp_qindex_high,
            clamp_qindex_low,
            va_reserved: Default::default(),
        }))
    }

    pub(crate) fn inner_mut(&mut self) -> &mut bindings::VAEncPictureParameterBufferVP8 {
        &mut self.0
    }
}