1 /* 2 * Copyright (c) 2021, 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 decode_huc_s2l_xe_m_base_packet.h 24 //! \brief Defines the implementation of huc S2L packet 25 //! 26 27 #ifndef __DECODE_HUC_S2L_XE_M_BASE_PACKET_H__ 28 #define __DECODE_HUC_S2L_XE_M_BASE_PACKET_H__ 29 30 #include "media_cmd_packet.h" 31 #include "decode_huc_g12_base.h" 32 #include "media_pipeline.h" 33 #include "codechal_hw.h" 34 #include "decode_utils.h" 35 #include "decode_hevc_pipeline.h" 36 #include "decode_hevc_basic_feature.h" 37 38 namespace decode 39 { 40 struct HucHevcS2lPicBssXe_M_Base 41 { 42 uint32_t pic_width_in_min_cbs_y; 43 uint32_t pic_height_in_min_cbs_y; 44 uint8_t log2_min_luma_coding_block_size_minus3; 45 uint8_t log2_diff_max_min_luma_coding_block_size; 46 uint16_t chroma_format_idc : 2; //!< range 0..3 47 uint16_t separate_colour_plane_flag : 1; 48 uint16_t bit_depth_luma_minus8 : 4; 49 uint16_t bit_depth_chroma_minus8 : 4; 50 uint16_t log2_max_pic_order_cnt_lsb_minus4 : 4; //!< range 0..12 51 uint16_t sample_adaptive_offset_enabled_flag : 1; 52 uint8_t num_short_term_ref_pic_sets; //!< range 0..64 53 uint8_t long_term_ref_pics_present_flag : 1; 54 uint8_t num_long_term_ref_pics_sps : 6; //!< range 0..32 55 uint8_t sps_temporal_mvp_enable_flag : 1; 56 57 uint8_t num_ref_idx_l0_default_active_minus1 : 4; //!< range 0..15 58 uint8_t num_ref_idx_l1_default_active_minus1 : 4; //!< range 0..15 59 int8_t pic_init_qp_minus26; //!< range -62..25 60 uint8_t dependent_slice_segments_enabled_flag : 1; 61 uint8_t cabac_init_present_flag : 1; 62 uint8_t pps_slice_chroma_qp_offsets_present_flag : 1; 63 uint8_t weighted_pred_flag : 1; 64 uint8_t weighted_bipred_flag : 1; 65 uint8_t output_flag_present_flag : 1; 66 uint8_t tiles_enabled_flag : 1; 67 uint8_t entropy_coding_sync_enabled_flag : 1; 68 uint8_t loop_filter_across_slices_enabled_flag : 1; 69 uint8_t deblocking_filter_override_enabled_flag : 1; 70 uint8_t pic_disable_deblocking_filter_flag : 1; 71 uint8_t lists_modification_present_flag : 1; 72 uint8_t slice_segment_header_extension_present_flag : 1; 73 uint8_t high_precision_offsets_enabled_flag : 1; 74 uint8_t chroma_qp_offset_list_enabled_flag : 1; 75 uint8_t : 1; 76 77 int32_t CurrPicOrderCntVal; 78 int32_t PicOrderCntValList[CODEC_MAX_NUM_REF_FRAME_HEVC]; 79 uint8_t RefPicSetStCurrBefore[8]; 80 uint8_t RefPicSetStCurrAfter[8]; 81 uint8_t RefPicSetLtCurr[8]; 82 uint16_t RefFieldPicFlag; 83 uint16_t RefBottomFieldFlag; 84 int8_t pps_beta_offset_div2; 85 int8_t pps_tc_offset_div2; 86 uint16_t StRPSBits; 87 88 uint8_t num_tile_columns_minus1; 89 uint8_t num_tile_rows_minus1; 90 uint16_t column_width[HEVC_NUM_MAX_TILE_COLUMN]; 91 uint16_t row_height[HEVC_NUM_MAX_TILE_ROW]; 92 93 uint16_t NumSlices; 94 uint8_t num_extra_slice_header_bits; 95 int8_t RefIdxMapping[CODEC_MAX_NUM_REF_FRAME_HEVC]; 96 97 struct 98 { 99 uint8_t reserve_0; 100 uint16_t reserve_1; 101 uint32_t reserve_2; 102 uint32_t reserve_3; 103 } reserve; 104 }; 105 106 struct HucHevcS2lSliceBssXe_M_Base 107 { 108 uint32_t BSNALunitDataLocation; 109 uint32_t SliceBytesInBuffer; 110 111 struct 112 { 113 uint32_t reserve_0; 114 uint32_t reserve_1; 115 uint32_t reserve_2; 116 uint32_t reserve_3; 117 } reserve; 118 }; 119 120 class HucS2lPktXe_M_Base : public DecodeHucBasic_G12_Base 121 { 122 public: HucS2lPktXe_M_Base(MediaPipeline * pipeline,MediaTask * task,CodechalHwInterface * hwInterface)123 HucS2lPktXe_M_Base(MediaPipeline *pipeline, MediaTask *task, CodechalHwInterface *hwInterface) 124 : DecodeHucBasic_G12_Base(pipeline, task, hwInterface) 125 { 126 if (pipeline != nullptr) 127 { 128 m_statusReport = pipeline->GetStatusReportInstance(); 129 m_hevcPipeline = dynamic_cast<HevcPipeline *>(pipeline); 130 } 131 } 132 ~HucS2lPktXe_M_Base()133 virtual ~HucS2lPktXe_M_Base() {} 134 135 //! 136 //! \brief Initialize the media packet, allocate required resources 137 //! \return MOS_STATUS 138 //! MOS_STATUS_SUCCESS if success, else fail reason 139 //! 140 virtual MOS_STATUS Init() override; 141 142 //! 143 //! \brief Prepare interal parameters, should be invoked for each frame 144 //! \return MOS_STATUS 145 //! MOS_STATUS_SUCCESS if success, else fail reason 146 //! 147 virtual MOS_STATUS Prepare() override; 148 149 //! 150 //! \brief Calculate Command Size 151 //! 152 //! \param [in, out] commandBufferSize 153 //! requested size 154 //! \param [in, out] requestedPatchListSize 155 //! requested size 156 //! \return MOS_STATUS 157 //! status 158 //! 159 virtual MOS_STATUS CalculateCommandSize( 160 uint32_t &commandBufferSize, 161 uint32_t &requestedPatchListSize) override; 162 163 //! 164 //! \brief Get Packet Name 165 //! \return std::string 166 //! GetPacketName()167 virtual std::string GetPacketName() override 168 { 169 return "S2L"; 170 } 171 172 protected: 173 //! 174 //! \brief Calculate Command Buffer Size 175 //! 176 //! \return uint32_t 177 //! Command buffer size calculated 178 //! 179 virtual uint32_t CalculateCommandBufferSize(); 180 181 //! 182 //! \brief Calculate Patch List Size 183 //! 184 //! \return uint32_t 185 //! Patchlist size calculated 186 //! 187 virtual uint32_t CalculatePatchListSize(); 188 189 virtual void SetImemParameters(MHW_VDBOX_HUC_IMEM_STATE_PARAMS &imemParams) override; 190 virtual MOS_STATUS AddHucImem(MOS_COMMAND_BUFFER &cmdBuffer) override; 191 192 virtual void SetHucPipeModeSelectParameters(MHW_VDBOX_PIPE_MODE_SELECT_PARAMS &pipeModeSelectParams) override; 193 194 virtual void SetDmemParameters(MHW_VDBOX_HUC_DMEM_STATE_PARAMS &dmemParams) override; 195 virtual MOS_STATUS AddHucDmem(MOS_COMMAND_BUFFER &cmdBuffer) override; 196 197 virtual void SetRegionParameters(MHW_VDBOX_HUC_VIRTUAL_ADDR_PARAMS &virtualAddrParams) override; 198 virtual MOS_STATUS AddHucRegion(MOS_COMMAND_BUFFER &cmdBuffer) override; 199 200 virtual void SetIndObjParameters(MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS &indObjParams) override; 201 virtual MOS_STATUS AddHucIndObj(MOS_COMMAND_BUFFER &cmdBuffer) override; 202 203 virtual void SetStreamObjectParameters(MHW_VDBOX_HUC_STREAM_OBJ_PARAMS &streamObjParams, 204 CODEC_HEVC_SLICE_PARAMS &sliceParams) override; 205 virtual MOS_STATUS AddHucStreamObject(MOS_COMMAND_BUFFER &cmdBuffer, CODEC_HEVC_SLICE_PARAMS &sliceParams) override; 206 207 virtual MOS_STATUS SetHucDmemPictureBss(HucHevcS2lPicBssXe_M_Base &hucHevcS2LPicBss); 208 virtual MOS_STATUS SetHucDmemSliceBss( 209 HucHevcS2lSliceBssXe_M_Base (&hucHevcS2LSliceBss)[CODECHAL_HEVC_MAX_NUM_SLICES_LVL_6]); 210 MOS_STATUS AddHucCpState(MOS_COMMAND_BUFFER &cmdBuffer, uint32_t index, CODEC_HEVC_SLICE_PARAMS &sliceParams); 211 212 #if USE_CODECHAL_DEBUG_TOOL 213 virtual MOS_STATUS DumpHucS2l(); 214 #endif 215 216 static constexpr uint32_t m_vdboxHucHevcS2lKernelDescriptor = 1; //!< Huc HEVC S2L kernel descriptor 217 218 HevcPipeline * m_hevcPipeline = nullptr; //!< Pointer to hevc pipeline 219 HevcBasicFeature * m_hevcBasicFeature = nullptr; //!< Pointer to hevc basic feature 220 PCODEC_HEVC_PIC_PARAMS m_hevcPicParams = nullptr; //!< Pointer to picture parameter 221 PCODEC_HEVC_EXT_PIC_PARAMS m_hevcRextPicParams = nullptr; //!< Extended pic params for Rext 222 PCODEC_HEVC_SLICE_PARAMS m_hevcSliceParams = nullptr; //!< Pointer to slice parameter 223 PCODEC_HEVC_SCC_PIC_PARAMS m_hevcSccPicParams = nullptr; //!< Pic params for SCC 224 225 MOS_BUFFER* m_s2lDmemBuffer = nullptr; //!< Resource of current DMEM buffer 226 uint32_t m_dmemBufferSize = 0; //!< Size of DMEM buffer 227 uint32_t m_dmemTransferSize = 0; //!< Transfer size of current DMEM buffer 228 229 uint32_t m_pictureStatesSize = 0; 230 uint32_t m_picturePatchListSize = 0; 231 uint32_t m_sliceStatesSize = 0; 232 uint32_t m_slicePatchListSize = 0; 233 }; 234 235 } // namespace decode 236 #endif 237