1 /* 2 * Copyright (c) 2017, Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included 12 * in all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 21 */ 22 //! 23 //! \file codec_def_decode_avc.h 24 //! \brief Defines decode AVC types and macros shared by CodecHal, MHW, and DDI layer 25 //! \details Applies to AVC decode only. Should not contain any DDI specific code. 26 //! 27 #ifndef __CODEC_DEF_DECODE_AVC_H__ 28 #define __CODEC_DEF_DECODE_AVC_H__ 29 30 #include "codec_def_common_avc.h" 31 32 //Check whether interview prediction is used through POC 33 #define CodecHal_IsInterviewPred(currPic, currPoc, avcRefListIdx) ( ((avcRefListIdx)!=(currPic).FrameIdx) && \ 34 (!CodecHal_PictureIsTopField(currPic) && (ppAvcRefList[avcRefListIdx]->iFieldOrderCnt[1] == (currPoc)[1]) || \ 35 !CodecHal_PictureIsBottomField(currPic) && (ppAvcRefList[avcRefListIdx]->iFieldOrderCnt[0] == (currPoc)[0])) && \ 36 ((currPic).FrameIdx != 0x7f)) 37 38 typedef struct _CODEC_AVC_DMV_LIST 39 { 40 uint8_t ucFrameId; 41 bool bInUse; 42 bool bReUse; 43 } CODEC_AVC_DMV_LIST, *PCODEC_AVC_DMV_LIST; 44 45 //! 46 //! \enum AvcChromaFormatIdc 47 //! \brief AVC chroma format Idc 48 //! 49 enum AvcChromaFormatIdc 50 { 51 avcChromaFormatMono = 0, 52 avcChromaFormat420 = 1, 53 avcChromaFormat422 = 2, 54 avcChromaFormat444 = 3, 55 }; 56 57 // H.264 Picture Parameters Buffer 58 typedef struct _CODEC_AVC_PIC_PARAMS 59 { 60 /*! \brief Uncompressed destination surface of the frame for the current decoded picture. 61 * 62 * The long_term_ref_flag has no meaning. The valid value range for Curr.FrameIdx is [0..126]. Value 127 or 0x7F can be treated as an invalid surface index. 63 */ 64 CODEC_PICTURE CurrPic; 65 /*! \brief FrameIdx for each entry specifies the surface index for all pictures that are or will be referred to by the current or future pictures. 66 * 67 * The valid entries are indexed from 0 to 126, inclusive. The PicFlags of non-valid entries (including the picture of the entry which is not referred by current picture or future pictures) should take value PICTURE_INVALID. A PicFlags setting of PICTURE_LONG_TERM_REFERENCE indicates if the picture is a long term reference or not. 68 * NOTE: for interlace (field) pictures, the FrameIdx field of two RefFrameList entries may have same value and point to same reference surface. And in this case, application should allocate buffer size with double picture height to hold the whole picture. 69 */ 70 CODEC_PICTURE RefFrameList[CODEC_AVC_MAX_NUM_REF_FRAME]; 71 72 uint16_t pic_width_in_mbs_minus1; //!< Same as AVC syntax element. 73 /*! \brief The height of the frame in MBs minus 1. 74 * 75 * Derived from pic_height_in_map_units_minus1: pic_height_in_map_units_minus1 << uint16_t(frame_mbs_only_flag == 0) 76 */ 77 uint16_t pic_height_in_mbs_minus1; 78 uint8_t bit_depth_luma_minus8; //!< Same as AVC syntax element. 79 uint8_t bit_depth_chroma_minus8; //!< Same as AVC syntax element. 80 uint8_t num_ref_frames; //!< Same as AVC syntax element. 81 /*! \brief Contains the picture order counts (POC) for the current frame 82 * 83 * If field_pic_flag is 0: 84 * \n - CurrFieldOrderCnt[0] contains the top field order count for the current picture 85 * \n - CurrFieldOrderCnt[1] contains the bottom field order count for the current picture 86 * \n If field_pic_flag is 1 and CurrPic.PicFlags indicates that this is a top field: 87 * \n - CurrFieldOrderCnt[0] contains the top field order count for the current picture 88 * \n - CurrFieldOrderCnt[1] 89 * \n If field_pic_flag is 1 and CurrPic.PicFlags indicates that this is a bottom field: 90 * \n - CurrFieldOrderCnt[0] should be 0 or ignored 91 * \n - CurrFieldOrderCnt[1] contains the bottom field order count for the current picture 92 */ 93 int32_t CurrFieldOrderCnt[2]; 94 /*! \brief Contains the POCs for the reference frames in RefFrameList. 95 * 96 * For each entry FieldOrderCntList[i][j]: 97 * \n - i: the picture index 98 * \n - j: 0 specifies the top field order count and 1 specifies the bottom field order count 99 * \n If a entry i in RefFrameList is not relevant (it is not used for reference) or valid, the entry FieldOrderCount[i][0 and 1] should be 0. 100 */ 101 int32_t FieldOrderCntList[16][2]; 102 103 union 104 { 105 struct 106 { 107 uint32_t chroma_format_idc : 2; //!< Same as AVC syntax element. 108 uint32_t residual_colour_transform_flag : 1; //!< Same as AVC syntax element. 109 uint32_t frame_mbs_only_flag : 1; //!< Same as AVC syntax element. 110 uint32_t mb_adaptive_frame_field_flag : 1; //!< Same as AVC syntax element. 111 uint32_t direct_8x8_inference_flag : 1; //!< Same as AVC syntax element. 112 uint32_t : 1; 113 uint32_t log2_max_frame_num_minus4 : 4; //!< Same as AVC syntax element. 114 uint32_t pic_order_cnt_type : 2; //!< Same as AVC syntax element. 115 uint32_t log2_max_pic_order_cnt_lsb_minus4 : 4; //!< Same as AVC syntax element. 116 uint32_t delta_pic_order_always_zero_flag : 1; //!< Same as AVC syntax element. 117 }; 118 uint32_t value; 119 } seq_fields; 120 121 uint8_t num_slice_groups_minus1; //!< Same as AVC syntax element. 122 uint8_t slice_group_map_type; //!< Same as AVC syntax element. 123 uint16_t slice_group_change_rate_minus1; //!< Same as AVC syntax element. 124 char pic_init_qp_minus26; //!< Same as AVC syntax element. 125 char chroma_qp_index_offset; //!< Same as AVC syntax element. 126 char second_chroma_qp_index_offset; //!< Same as AVC syntax element. 127 128 union 129 { 130 struct 131 { 132 uint32_t entropy_coding_mode_flag : 1; //!< Same as AVC syntax element. 133 uint32_t weighted_pred_flag : 1; //!< Same as AVC syntax element. 134 uint32_t weighted_bipred_idc : 2; //!< Same as AVC syntax element. 135 uint32_t transform_8x8_mode_flag : 1; //!< Same as AVC syntax element. 136 uint32_t field_pic_flag : 1; //!< Same as AVC syntax element. 137 uint32_t constrained_intra_pred_flag : 1; //!< Same as AVC syntax element. 138 uint32_t pic_order_present_flag : 1; //!< Same as AVC syntax element. 139 uint32_t deblocking_filter_control_present_flag : 1; //!< Same as AVC syntax element. 140 uint32_t redundant_pic_cnt_present_flag : 1; //!< Same as AVC syntax element. 141 uint32_t reference_pic_flag : 1; //!< Same as AVC syntax element. 142 uint32_t IntraPicFlag : 1; //!< All MBs in frame use intra prediction mode. 143 }; 144 uint32_t value; 145 } pic_fields; 146 147 // Short format specific 148 uint8_t num_ref_idx_l0_active_minus1; //!< Same as AVC syntax element. 149 uint8_t num_ref_idx_l1_active_minus1; //!< Same as AVC syntax element. 150 /*! \brief Contains the value of FrameNum or LongTermRefIdx depending on the PicFlags for the frame. 151 * 152 * Each entry in FrameNumList has a corresponding entry in RefFrameList, if an entry in RefFrameList is not relevant (it is not used for reference) or valid, the entry in FrameNumList should be 0. 153 */ 154 uint16_t FrameNumList[16]; 155 /*! \brief Denotes "non-existing" frames as defined in the AVC specification. 156 * 157 * The flag is accessed by: Flag(i) = (NonExistingFrameFlags >> i) & 1. If Flag(i) is 1, frame i is marked as "non-existing", otherwise the frame is existing. 158 */ 159 uint16_t NonExistingFrameFlags; 160 /*! \brief Denotes "used for reference" frames as defined in the AVC specification. 161 * 162 * The flag is accessed by: 163 * \n - FlagTop(i) = (UsedForReferenceFlags >> (2 * i)) & 1 164 * \n - FlagBottom(i) = (UsedForReferenceFlags >> (2 * i + 1)) & 1 165 * \n If FlagTop(i) is 1, the top field or frame numger i is marked as "used for reference"; if FlagBottom(i) is 1 then then bottom field of frame i is marked as "used for reference". If either is 0 then the frame is not marked as "used for reference". 166 */ 167 uint32_t UsedForReferenceFlags; 168 uint16_t frame_num; //!< Same as AVC syntax element. 169 170 /*! \brief Arbitrary number set by the host decoder to use as a tag in the status report feedback data. 171 * 172 * The value should not equal 0, and should be different in each call to Execute. 173 */ 174 uint32_t StatusReportFeedbackNumber; 175 } CODEC_AVC_PIC_PARAMS, *PCODEC_AVC_PIC_PARAMS; 176 177 // H.264 Decode Slice Parameter Buffer (Long/Short format) 178 typedef struct _CODEC_AVC_SLICE_PARAMS 179 { 180 uint32_t slice_data_size; //!< Number of bytes in the bitstream buffer for this slice. 181 uint32_t slice_data_offset; //!< The offset to the NAL start code for this slice. 182 183 // Long format specific 184 uint16_t slice_data_bit_offset; //!< Bit offset from NAL start code to the beginning of slice data. 185 uint16_t first_mb_in_slice; //!< Same as AVC syntax element. 186 uint16_t NumMbsForSlice; //!< Number of MBs in the bitstream associated with this slice. 187 uint8_t slice_type; //!< Same as AVC syntax element. 188 uint8_t direct_spatial_mv_pred_flag; //!< Same as AVC syntax element. 189 uint8_t num_ref_idx_l0_active_minus1; //!< Same as AVC syntax element. 190 uint8_t num_ref_idx_l1_active_minus1; //!< Same as AVC syntax element. 191 uint8_t cabac_init_idc; //!< Same as AVC syntax element. 192 char slice_qp_delta; //!< Same as AVC syntax element. 193 uint8_t disable_deblocking_filter_idc; //!< Same as AVC syntax element. 194 char slice_alpha_c0_offset_div2; //!< Same as AVC syntax element. 195 char slice_beta_offset_div2; //!< Same as AVC syntax element. 196 /*! \brief Specifies the reference picture lists 0 and 1 197 * 198 * Contains field/frame information concerning the reference in PicFlags. RefPicList[i][j]: 199 * \n - i: the reference picture list (0 or 1) 200 * \n - j: if the PicFlags are not PICTURE_INVALID, the index variable j is a reference to entry j in teh reference picture list. 201 */ 202 CODEC_PICTURE RefPicList[2][32]; 203 uint8_t luma_log2_weight_denom; //!< Same as AVC syntax element. 204 uint8_t chroma_log2_weight_denom; //!< Same as AVC syntax element. 205 /*! \brief Specifies the weights and offsets used for explicit mode weighted prediction. 206 * 207 * Weigths[i][j][k][m]: 208 * \n - i: the reference picture list (0 or 1) 209 * \n - j: reference to entry j in RefPicList (has range [0...31]) 210 * \n - k: the YUV component (0 = luma, 1 = Cb chroma, 2 = Cr chroma) 211 * \n - m: the weight or offset used in the weighted prediction process (0 = weight, 1 = offset) 212 */ 213 int16_t Weights[2][32][3][2]; 214 uint16_t slice_id; //!< Same as AVC syntax element. 215 uint16_t first_mb_in_next_slice; //!< If there is a subsequent slice, specifies first_mb_in_slice for the next slice, otherwise is 0. 216 } CODEC_AVC_SLICE_PARAMS, *PCODEC_AVC_SLICE_PARAMS; 217 218 typedef struct _CODEC_AVC_SF_SLICE_PARAMS 219 { 220 uint32_t slice_data_size; //!< Number of bytes in the bitstream buffer for this slice. 221 uint32_t slice_data_offset; //!< The offset to the NAL start code for this slice. 222 } CODEC_AVC_SF_SLICE_PARAMS, *PCODEC_AVC_SF_SLICE_PARAMS; 223 224 // AVC MVC Extension Picture Parameter Set 225 // (sent along with regular _CODEC_AVC_PIC_PARAMS) 226 typedef struct _CODEC_MVC_EXT_PIC_PARAMS 227 { 228 uint16_t CurrViewID; 229 uint8_t anchor_pic_flag; 230 uint8_t inter_view_flag; 231 uint8_t NumInterViewRefsL0; 232 uint8_t NumInterViewRefsL1; 233 union 234 { 235 uint8_t bPicFlags; 236 struct 237 { 238 uint8_t SwitchToAVC : 1; 239 uint8_t Reserved7Bits : 7; 240 }; 241 }; 242 uint8_t Reserved8Bits; 243 uint16_t ViewIDList[16]; 244 uint16_t InterViewRefList[2][16]; 245 } CODEC_MVC_EXT_PIC_PARAMS, *PCODEC_MVC_EXT_PIC_PARAMS; 246 247 #endif // __CODEC_DEF_DECODE_AVC_H__ 248