/* * * 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 __H264D_SYNTAX_H__ #define __H264D_SYNTAX_H__ #include "h264_syntax.h" #include "dxva_syntax.h" /* H.264/AVC-specific structures */ /* H.264/AVC picture entry data structure */ typedef struct _DXVA_PicEntry_H264 { union { struct { RK_U8 Index7Bits : 7; RK_U8 AssociatedFlag : 1; }; RK_U8 bPicEntry; }; } DXVA_PicEntry_H264, *LPDXVA_PicEntry_H264; /* 1 byte */ /* H.264/AVC picture parameters structure */ typedef struct _DXVA_PicParams_H264 { RK_U16 wFrameWidthInMbsMinus1; RK_U16 wFrameHeightInMbsMinus1; DXVA_PicEntry_H264 CurrPic; /* flag is bot field flag */ RK_U8 num_ref_frames; union { struct { RK_U16 field_pic_flag : 1; RK_U16 MbaffFrameFlag : 1; RK_U16 residual_colour_transform_flag : 1; RK_U16 sp_for_switch_flag : 1; RK_U16 chroma_format_idc : 2; RK_U16 RefPicFlag : 1; RK_U16 constrained_intra_pred_flag : 1; RK_U16 weighted_pred_flag : 1; RK_U16 weighted_bipred_idc : 2; RK_U16 MbsConsecutiveFlag : 1; RK_U16 frame_mbs_only_flag : 1; RK_U16 transform_8x8_mode_flag : 1; RK_U16 MinLumaBipredSize8x8Flag : 1; RK_U16 IntraPicFlag : 1; }; RK_U16 wBitFields; }; RK_U8 bit_depth_luma_minus8; RK_U8 bit_depth_chroma_minus8; RK_U16 Reserved16Bits; RK_U32 StatusReportFeedbackNumber; DXVA_PicEntry_H264 RefFrameList[16]; /* flag LT */ RK_S32 CurrFieldOrderCnt[2]; RK_S32 FieldOrderCntList[16][2]; RK_S8 pic_init_qs_minus26; RK_S8 chroma_qp_index_offset; /* also used for QScb */ RK_S8 second_chroma_qp_index_offset; /* also for QScr */ RK_U8 ContinuationFlag; /* remainder for parsing */ RK_S8 pic_init_qp_minus26; RK_U8 num_ref_idx_l0_active_minus1; RK_U8 num_ref_idx_l1_active_minus1; RK_U8 Reserved8BitsA; RK_U16 FrameNumList[16]; RK_U32 UsedForReferenceFlags; RK_U16 NonExistingFrameFlags; RK_U16 frame_num; RK_U8 log2_max_frame_num_minus4; RK_U8 pic_order_cnt_type; RK_U8 log2_max_pic_order_cnt_lsb_minus4; RK_U8 delta_pic_order_always_zero_flag; RK_U8 direct_8x8_inference_flag; RK_U8 entropy_coding_mode_flag; RK_U8 pic_order_present_flag; RK_U8 num_slice_groups_minus1; RK_U8 slice_group_map_type; RK_U8 deblocking_filter_control_present_flag; RK_U8 redundant_pic_cnt_present_flag; RK_U8 Reserved8BitsB; RK_U16 slice_group_change_rate_minus1; //RK_U8 SliceGroupMap[810]; /* 4b/sgmu, Size BT.601 */ } DXVA_PicParams_H264, *LPDXVA_PicParams_H264; /* H.264/AVC quantization weighting matrix data structure */ typedef struct _DXVA_Qmatrix_H264 { RK_U8 bScalingLists4x4[6][16]; RK_U8 bScalingLists8x8[6][64]; } DXVA_Qmatrix_H264, *LPDXVA_Qmatrix_H264; /* H.264/AVC slice control data structure - short form */ typedef struct _DXVA_Slice_H264_Short { RK_U32 BSNALunitDataLocation; /* type 1..5 */ RK_U32 SliceBytesInBuffer; /* for off-host parse */ RK_U16 wBadSliceChopping; /* for off-host parse */ } DXVA_Slice_H264_Short, *LPDXVA_Slice_H264_Short; /* H.264/AVC picture entry data structure - long form */ typedef struct _DXVA_Slice_H264_Long { RK_U32 BSNALunitDataLocation; /* type 1..5 */ RK_U32 SliceBytesInBuffer; /* for off-host parse */ RK_U16 wBadSliceChopping; /* for off-host parse */ RK_U16 first_mb_in_slice; RK_U16 NumMbsForSlice; RK_U8 slice_type; RK_U8 num_ref_idx_l0_active_minus1; RK_U8 num_ref_idx_l1_active_minus1; DXVA_PicEntry_H264 RefPicList[3][32]; /* L0 & L1 */ #if 0 RK_U16 BitOffsetToSliceData; /* after CABAC alignment */ RK_U8 luma_log2_weight_denom; RK_U8 chroma_log2_weight_denom; RK_S8 slice_alpha_c0_offset_div2; RK_S8 slice_beta_offset_div2; RK_U8 Reserved8Bits; RK_S16 Weights[2][32][3][2]; /* L0 & L1; Y, Cb, Cr */ RK_S8 slice_qs_delta; /* rest off-host parse */ RK_S8 slice_qp_delta; #endif RK_U8 redundant_pic_cnt; RK_U8 direct_spatial_mv_pred_flag; RK_U8 cabac_init_idc; RK_U8 disable_deblocking_filter_idc; RK_U16 slice_id; /* add parameter for setting hardware */ RK_U32 active_sps_id; RK_U32 active_pps_id; RK_U32 idr_pic_id; RK_U32 idr_flag; RK_U32 drpm_used_bitlen; RK_U32 poc_used_bitlen; RK_U32 nal_ref_idc; RK_U32 profileIdc; } DXVA_Slice_H264_Long, *LPDXVA_Slice_H264_Long; /* H.264/AVC macro block control command data structure */ typedef struct _DXVA_MBctrl_H264 { union { struct { RK_U32 bSliceID : 8; /* 1 byte */ RK_U32 MbType5Bits : 5; RK_U32 IntraMbFlag : 1; RK_U32 mb_field_decoding_flag : 1; RK_U32 transform_size_8x8_flag : 1; /* 2 bytes */ RK_U32 HostResidDiff : 1; RK_U32 DcBlockCodedCrFlag : 1; RK_U32 DcBlockCodedCbFlag : 1; RK_U32 DcBlockCodedYFlag : 1; RK_U32 FilterInternalEdgesFlag : 1; RK_U32 FilterLeftMbEdgeFlag : 1; RK_U32 FilterTopMbEdgeFlag : 1; RK_U32 ReservedBit : 1; RK_U32 bMvQuantity : 8; /* 4 bytes */ }; RK_U32 dwMBtype; /* 4 bytes so far */ }; RK_U16 CurrMbAddr; /* 6 bytes so far */ RK_U16 wPatternCode[3];/* YCbCr, 16 4x4 blks, 1b each */ /* 12 bytes so far */ RK_U8 bQpPrime[3]; /* Y, Cb, Cr, need just 7b QpY */ RK_U8 bMBresidDataQuantity; RK_U32 dwMBdataLocation; /* offset into resid buffer */ /* 20 bytes so far */ union { struct { /* start here for Intra MB's (9 useful bytes in branch) */ RK_U16 LumaIntraPredModes[4];/* 16 blocks, 4b each */ /* 28 bytes so far */ union { struct { RK_U8 intra_chroma_pred_mode : 2; RK_U8 IntraPredAvailFlags : 5; RK_U8 ReservedIntraBit : 1; }; RK_U8 bMbIntraStruct; /* 29 bytes so far */ }; RK_U8 ReservedIntra24Bits[3]; /* 32 bytes total */ }; struct { /* start here for non-Intra MB's (12 bytes in branch) */ RK_U8 bSubMbShapes; /* 4 subMbs, 2b each */ RK_U8 bSubMbPredModes; /* 4 subMBs, 2b each */ /* 22 bytes so far */ RK_U16 wMvBuffOffset; /* offset into MV buffer */ RK_U8 bRefPicSelect[2][4]; /* 32 bytes total */ }; }; } DXVA_MBctrl_H264, *LPDXVA_MBctrl_H264; /* H.264/AVC IndexA and IndexB data structure */ typedef struct _DXVA_DeblockIndexAB_H264 { RK_U8 bIndexAinternal; /* 6b - could get from MB CC */ RK_U8 bIndexBinternal; /* 6b - could get from MB CC */ RK_U8 bIndexAleft0; RK_U8 bIndexBleft0; RK_U8 bIndexAleft1; RK_U8 bIndexBleft1; RK_U8 bIndexAtop0; RK_U8 bIndexBtop0; RK_U8 bIndexAtop1; RK_U8 bIndexBtop1; } DXVA_DeblockIndexAB_H264, *LPDXVA_DeblockIndexAB_H264; /* 10 bytes in struct */ /* H.264/AVC deblocking filter control data structure */ typedef struct _DXVA_Deblock_H264 { RK_U16 CurrMbAddr; /* dup info */ /* 2 bytes so far */ union { struct { RK_U8 ReservedBit : 1; RK_U8 FieldModeCurrentMbFlag : 1; /* dup info */ RK_U8 FieldModeLeftMbFlag : 1; RK_U8 FieldModeAboveMbFlag : 1; RK_U8 FilterInternal8x8EdgesFlag : 1; RK_U8 FilterInternal4x4EdgesFlag : 1; RK_U8 FilterLeftMbEdgeFlag : 1; RK_U8 FilterTopMbEdgeFlag : 1; }; RK_U8 FirstByte; }; RK_U8 Reserved8Bits; /* 4 bytes so far */ RK_U8 bbSinternalLeftVert; /* 2 bits per bS */ RK_U8 bbSinternalMidVert; RK_U8 bbSinternalRightVert; RK_U8 bbSinternalTopHorz; /* 8 bytes so far */ RK_U8 bbSinternalMidHorz; RK_U8 bbSinternalBotHorz; /* 10 bytes so far */ RK_U16 wbSLeft0; /* 4 bits per bS (1 wasted) */ RK_U16 wbSLeft1; /* 4 bits per bS (1 wasted) */ RK_U16 wbSTop0; /* 4 bits per bS (1 wasted) */ RK_U16 wbSTop1; /* 4b (2 wasted) 18 bytes so far*/ DXVA_DeblockIndexAB_H264 IndexAB[3]; /* Y, Cb, Cr */ } DXVA_Deblock_H264, *LPDXVA_Deblock_H264;/* 48 bytes */ /* H.264/AVC film grain characteristics data structure */ typedef struct _DXVA_FilmGrainCharacteristics { RK_U16 wFrameWidthInMbsMinus1; RK_U16 wFrameHeightInMbsMinus1; DXVA_PicEntry_H264 InPic; /* flag is bot field flag */ DXVA_PicEntry_H264 OutPic; /* flag is field pic flag */ RK_U16 PicOrderCnt_offset; RK_S32 CurrPicOrderCnt; RK_U32 StatusReportFeedbackNumber; RK_U8 model_id; RK_U8 separate_colour_description_present_flag; RK_U8 film_grain_bit_depth_luma_minus8; RK_U8 film_grain_bit_depth_chroma_minus8; RK_U8 film_grain_full_range_flag; RK_U8 film_grain_colour_primaries; RK_U8 film_grain_transfer_characteristics; RK_U8 film_grain_matrix_coefficients; RK_U8 blending_mode_id; RK_U8 log2_scale_factor; RK_U8 comp_model_present_flag[4]; RK_U8 num_intensity_intervals_minus1[4]; RK_U8 num_model_values_minus1[4]; RK_U8 intensity_interval_lower_bound[3][16]; RK_U8 intensity_interval_upper_bound[3][16]; RK_S16 comp_model_value[3][16][8]; } DXVA_FilmGrainChar_H264, *LPDXVA_FilmGrainChar_H264; /* H.264/AVC status reporting data structure */ typedef struct _DXVA_Status_H264 { RK_U32 StatusReportFeedbackNumber; DXVA_PicEntry_H264 CurrPic; /* flag is bot field flag */ RK_U8 field_pic_flag; RK_U8 bDXVA_Func; RK_U8 bBufType; RK_U8 bStatus; RK_U8 bReserved8Bits; RK_U16 wNumMbsAffected; } DXVA_Status_H264, *LPDXVA_Status_H264; /* H.264 MVC picture parameters structure */ typedef struct _DXVA_PicParams_H264_MVC { RK_U16 wFrameWidthInMbsMinus1; RK_U16 wFrameHeightInMbsMinus1; DXVA_PicEntry_H264 CurrPic; /* flag is bot field flag */ RK_U8 num_ref_frames; union { struct { RK_U16 field_pic_flag : 1; RK_U16 MbaffFrameFlag : 1; RK_U16 residual_colour_transform_flag : 1; RK_U16 sp_for_switch_flag : 1; RK_U16 chroma_format_idc : 2; RK_U16 RefPicFlag : 1; RK_U16 constrained_intra_pred_flag : 1; RK_U16 weighted_pred_flag : 1; RK_U16 weighted_bipred_idc : 2; RK_U16 MbsConsecutiveFlag : 1; RK_U16 frame_mbs_only_flag : 1; RK_U16 transform_8x8_mode_flag : 1; RK_U16 MinLumaBipredSize8x8Flag : 1; RK_U16 IntraPicFlag : 1; }; RK_U16 wBitFields; }; RK_U8 bit_depth_luma_minus8; RK_U8 bit_depth_chroma_minus8; RK_U16 Reserved16Bits; RK_U32 StatusReportFeedbackNumber; DXVA_PicEntry_H264 RefFrameList[16]; /* flag LT */ RK_S32 CurrFieldOrderCnt[2]; RK_S32 FieldOrderCntList[16][2]; RK_S8 pic_init_qs_minus26; RK_S8 chroma_qp_index_offset; /* also used for QScb */ RK_S8 second_chroma_qp_index_offset; /* also for QScr */ RK_U8 ContinuationFlag; /* remainder for parsing */ RK_S8 pic_init_qp_minus26; RK_U8 num_ref_idx_l0_active_minus1; RK_U8 num_ref_idx_l1_active_minus1; RK_U8 Reserved8BitsA; RK_U16 FrameNumList[16]; RK_U16 LongTermPicNumList[16]; RK_U32 UsedForReferenceFlags; RK_U16 NonExistingFrameFlags; RK_U16 frame_num; RK_U8 log2_max_frame_num_minus4; RK_U8 pic_order_cnt_type; RK_U8 log2_max_pic_order_cnt_lsb_minus4; RK_U8 delta_pic_order_always_zero_flag; RK_U8 direct_8x8_inference_flag; RK_U8 entropy_coding_mode_flag; RK_U8 pic_order_present_flag; RK_U8 num_slice_groups_minus1; RK_U8 slice_group_map_type; RK_U8 deblocking_filter_control_present_flag; RK_U8 redundant_pic_cnt_present_flag; RK_U8 Reserved8BitsB; /* SliceGroupMap is not needed for MVC, as MVC is for high profile only */ RK_U16 slice_group_change_rate_minus1; /* Following are H.264 MVC Specific parameters */ RK_U8 num_views_minus1; RK_U16 view_id[16]; RK_U8 num_anchor_refs_l0[16]; RK_U16 anchor_ref_l0[16][16]; RK_U8 num_anchor_refs_l1[16]; RK_U16 anchor_ref_l1[16][16]; RK_U8 num_non_anchor_refs_l0[16]; RK_U16 non_anchor_ref_l0[16][16]; RK_U8 num_non_anchor_refs_l1[16]; RK_U16 non_anchor_ref_l1[16][16]; RK_U16 curr_view_id; RK_U8 anchor_pic_flag; RK_U8 inter_view_flag; RK_U16 ViewIDList[16]; //!< add in Rock-Chip RKVDEC IP RK_U16 curr_layer_id; RK_U16 RefPicColmvUsedFlags; RK_U16 RefPicFiledFlags; RK_U8 RefPicLayerIdList[16]; RK_U8 scaleing_list_enable_flag; RK_U16 UsedForInTerviewflags; //!< extensive RK_U32 spspps_update; ////!< for fpga test //USHORT seq_parameter_set_id; //USHORT pps_seq_parameter_set_id; //USHORT profile_idc; //UCHAR constraint_set3_flag; //UCHAR qpprime_y_zero_transform_bypass_flag; //UCHAR mvc_extension_enable; } DXVA_PicParams_H264_MVC, *LPDXVA_PicParams_H264_MVC; typedef struct h264d_syntax_t { RK_U32 num; DXVA2_DecodeBufferDesc *buf; } H264dSyntax_t; #endif /*__H264D_SYNTAX_H__*/