/*
 *
 * Copyright 2015 Rockchip Electronics Co. LTD
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef _VP9D_SYNTAX_H_
#define _VP9D_SYNTAX_H_

typedef unsigned long       DWORD;
typedef unsigned char       BYTE;
typedef unsigned short      WORD;
typedef unsigned long       ULONG;
typedef unsigned short      USHORT;
typedef unsigned char       UCHAR;
typedef unsigned int        UINT;
typedef unsigned int        UINT32;

typedef signed   int        BOOL;
typedef signed   int        INT;
typedef signed   char       CHAR;
typedef signed   short      SHORT;
typedef signed   long       LONG;
typedef void               *PVOID;

typedef struct _DXVA_PicEntry_VPx {
    union {
        struct {
            UCHAR Index7Bits     : 7;
            UCHAR AssociatedFlag : 1;
        };
        UCHAR bPicEntry;
    };
} DXVA_PicEntry_VPx, *LPDXVA_PicEntry_Vpx;

typedef struct _segmentation_VP9 {
    union {
        struct {
            UCHAR enabled : 1;
            UCHAR update_map : 1;
            UCHAR temporal_update : 1;
            UCHAR abs_delta : 1;
            UCHAR ReservedSegmentFlags4Bits : 4;
        };
        UCHAR wSegmentInfoFlags;
    };
    UCHAR tree_probs[7];
    UCHAR pred_probs[3];
    SHORT feature_data[8][4];
    UCHAR feature_mask[8];
} DXVA_segmentation_VP9;

typedef struct {
    RK_U8 y_mode[4][9];
    RK_U8 uv_mode[10][9];
    RK_U8 filter[4][2];
    RK_U8 mv_mode[7][3];
    RK_U8 intra[4];
    RK_U8 comp[5];
    RK_U8 single_ref[5][2];
    RK_U8 comp_ref[5];
    RK_U8 tx32p[2][3];
    RK_U8 tx16p[2][2];
    RK_U8 tx8p[2];
    RK_U8 skip[3];
    RK_U8 mv_joint[3];
    struct {
        RK_U8 sign;
        RK_U8 classes[10];
        RK_U8 class0;
        RK_U8 bits[10];
        RK_U8 class0_fp[2][3];
        RK_U8 fp[3];
        RK_U8 class0_hp;
        RK_U8 hp;
    } mv_comp[2];
    RK_U8 partition[4][4][3];
} DXVA_prob_vp9;

typedef struct _DXVA_PicParams_VP9 {
    DXVA_PicEntry_VPx CurrPic;
    UCHAR profile;
    union {
        struct {
            USHORT frame_type : 1;
            USHORT show_frame : 1;
            USHORT error_resilient_mode : 1;
            USHORT subsampling_x : 1;
            USHORT subsampling_y : 1;
            USHORT extra_plane : 1;
            USHORT refresh_frame_context : 1;
            USHORT intra_only : 1;
            USHORT frame_context_idx : 2;
            USHORT reset_frame_context : 2;
            USHORT allow_high_precision_mv : 1;
            USHORT parallelmode            : 1;
            USHORT show_existing_frame : 1;
        };
        USHORT wFormatAndPictureInfoFlags;
    };
    UINT width;
    UINT height;
    UCHAR BitDepthMinus8Luma;
    UCHAR BitDepthMinus8Chroma;
    UCHAR interp_filter;
    UCHAR Reserved8Bits;
    DXVA_PicEntry_VPx ref_frame_map[8];
    UINT ref_frame_coded_width[8];
    UINT ref_frame_coded_height[8];
    DXVA_PicEntry_VPx frame_refs[3];
    CHAR ref_frame_sign_bias[4];
    CHAR filter_level;
    CHAR sharpness_level;
    union {
        struct {
            UCHAR mode_ref_delta_enabled : 1;
            UCHAR mode_ref_delta_update : 1;
            UCHAR use_prev_in_find_mv_refs : 1;
            UCHAR ReservedControlInfo5Bits : 5;
        };
        UCHAR wControlInfoFlags;
    };
    CHAR ref_deltas[4];
    CHAR mode_deltas[2];
    SHORT base_qindex;
    CHAR y_dc_delta_q;
    CHAR uv_dc_delta_q;
    CHAR uv_ac_delta_q;
    DXVA_segmentation_VP9 stVP9Segments;
    UCHAR log2_tile_cols;
    UCHAR log2_tile_rows;
    USHORT uncompressed_header_size_byte_aligned;
    USHORT first_partition_size;
    USHORT Reserved16Bits;
    USHORT Reserved32Bits;
    UINT StatusReportFeedbackNumber;
    struct {
        UCHAR y_mode[4][9];
        UCHAR uv_mode[10][9];
        UCHAR filter[4][2];
        UCHAR mv_mode[7][3];
        UCHAR intra[4];
        UCHAR comp[5];
        UCHAR single_ref[5][2];
        UCHAR comp_ref[5];
        UCHAR tx32p[2][3];
        UCHAR tx16p[2][2];
        UCHAR tx8p[2];
        UCHAR skip[3];
        UCHAR mv_joint[3];
        struct {
            UCHAR sign;
            UCHAR classes[10];
            UCHAR class0;
            UCHAR bits[10];
            UCHAR class0_fp[2][3];
            UCHAR fp[3];
            UCHAR class0_hp;
            UCHAR hp;
        } mv_comp[2];
        UCHAR partition[4][4][3];
        UCHAR coef[4][2][2][6][6][3];
    } prob;
    struct {
        UINT partition[4][4][4];
        UINT skip[3][2];
        UINT intra[4][2];
        UINT tx32p[2][4];
        UINT tx16p[2][4];
        UINT tx8p[2][2];
        UINT y_mode[4][10];
        UINT uv_mode[10][10];
        UINT comp[5][2];
        UINT comp_ref[5][2];
        UINT single_ref[5][2][2];
        UINT mv_mode[7][4];
        UINT filter[4][3];
        UINT mv_joint[4];
        UINT sign[2][2];
        UINT classes[2][12]; // orign classes[12]
        UINT class0[2][2];
        UINT bits[2][10][2];
        UINT class0_fp[2][2][4];
        UINT fp[2][4];
        UINT class0_hp[2][2];
        UINT hp[2][2];
        UINT coef[4][2][2][6][6][3];
        UINT eob[4][2][2][6][6][2];
    } counts;
    struct {
        DXVA_prob_vp9 p_flag;
        DXVA_prob_vp9 p_delta;
        RK_U8 coef_flag[4][2][2][6][6][3];
        RK_U8 coef_delta[4][2][2][6][6][3];
    } prob_flag_delta;
    USHORT mvscale[3][2];
    CHAR txmode;
    CHAR refmode;
} DXVA_PicParams_VP9, *LPDXVA_PicParams_VP9;

typedef struct _DXVA_Slice_VPx_Short {
    UINT BSNALunitDataLocation;
    UINT SliceByteInBuffer;
    USHORT wBadSliceChopping;
} DXVA_Slice_VPx_Short, *LPDXVA_Slice_VPx_Short;

#endif

