use crate::bindings;
pub struct VP9PicFields(bindings::_VADecPictureParameterBufferVP9__bindgen_ty_1);
impl VP9PicFields {
    #[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,
            },
        })
    }
    pub fn inner(&mut self) -> &bindings::_VADecPictureParameterBufferVP9__bindgen_ty_1 {
        &self.0
    }
}
pub struct PictureParameterBufferVP9(Box<bindings::VADecPictureParameterBufferVP9>);
impl PictureParameterBufferVP9 {
    #[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()
    }
    pub fn inner(&self) -> &bindings::VADecPictureParameterBufferVP9 {
        self.0.as_ref()
    }
}
pub struct VP9SegmentFlags(bindings::_VASegmentParameterVP9__bindgen_ty_1);
impl VP9SegmentFlags {
    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(),
            },
        })
    }
    pub fn inner(&mut self) -> &bindings::_VASegmentParameterVP9__bindgen_ty_1 {
        &self.0
    }
}
pub struct SegmentParameterVP9(bindings::VASegmentParameterVP9);
impl SegmentParameterVP9 {
    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(),
        })
    }
}
pub struct SliceParameterBufferVP9(Box<bindings::VASliceParameterBufferVP9>);
impl SliceParameterBufferVP9 {
    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()
    }
    pub fn inner(&self) -> &bindings::VASliceParameterBufferVP9 {
        self.0.as_ref()
    }
}