1 /* 2 * Copyright (c) 2017-2020, 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 codechal_vdenc_avc_g12.h 24 //! \brief This file defines the base C++ class/interface for G12 AVC VDENC 25 //! encoding to be used across CODECHAL components. 26 //! 27 28 #ifndef __CODECHAL_VDENC_AVC_G12_H__ 29 #define __CODECHAL_VDENC_AVC_G12_H__ 30 31 #include "codechal_vdenc_avc.h" 32 #include "codechal_encode_singlepipe_virtualengine.h" 33 34 class CodechalVdencAvcStateG12 : public CodechalVdencAvcState 35 { 36 public: 37 uint8_t m_qpModulationStrength = 0; //!< Current QP modulation strength 38 bool m_isFirstDeltaQP = true; //!< check if it is first time 39 40 PCODECHAL_ENCODE_SINGLEPIPE_VIRTUALENGINE_STATE m_sinlgePipeVeState; //!< single pipe virtual engine state 41 //! 42 //! \brief Constructor 43 //! 44 CodechalVdencAvcStateG12( 45 CodechalHwInterface * hwInterface, 46 CodechalDebugInterface *debugInterface, 47 PCODECHAL_STANDARD_INFO standardInfo); 48 49 //! 50 //! \brief Destructor 51 //! 52 virtual ~CodechalVdencAvcStateG12(); 53 54 bool CheckSupportedFormat(PMOS_SURFACE surface) override; AdjustNumRefIdx(uint32_t & numRefIdxL0Minus1,uint32_t & numRefIdxL1Minus1)55 virtual void AdjustNumRefIdx(uint32_t &numRefIdxL0Minus1, uint32_t &numRefIdxL1Minus1) 56 { 57 numRefIdxL0Minus1 = m_avcSliceParams->num_ref_idx_l0_active_minus1; 58 numRefIdxL1Minus1 = m_avcSliceParams->num_ref_idx_l1_active_minus1; 59 } 60 61 virtual void InitializeDataMember() override; 62 63 MOS_STATUS InitializeState() override; 64 65 virtual MOS_STATUS AllocateResources() override; 66 67 MOS_STATUS SetSequenceStructs() override; 68 69 MOS_STATUS SetPictureStructs() override; 70 71 MOS_STATUS ExecutePictureLevel() override; 72 73 MOS_STATUS GetTrellisQuantization( 74 PCODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS params, 75 PCODECHAL_ENCODE_AVC_TQ_PARAMS trellisQuantParams) override; 76 77 virtual MOS_STATUS AddHucOutputRegistersHandling( 78 MmioRegistersHuc* mmioRegisters, 79 PMOS_COMMAND_BUFFER cmdBuffer, 80 bool addToEncodeStatus) override; 81 82 virtual MOS_STATUS InsertConditionalBBEndWithHucErrorStatus(PMOS_COMMAND_BUFFER cmdBuffer); 83 HuCBrcDummyStreamObject(PMOS_COMMAND_BUFFER cmdBuffer)84 MOS_STATUS HuCBrcDummyStreamObject(PMOS_COMMAND_BUFFER cmdBuffer) override { return MOS_STATUS_SUCCESS; } 85 86 MOS_STATUS SetDmemHuCBrcInitReset() override; 87 88 virtual MOS_STATUS DeltaQPUpdate(uint8_t QpModulationStrength); 89 90 MOS_STATUS SetDmemHuCBrcUpdate() override; 91 92 MOS_STATUS LoadMvCost(uint8_t qp) override; 93 94 MOS_STATUS LoadHmeMvCost(uint8_t qp) override; 95 96 MOS_STATUS LoadHmeMvCostTable( 97 PCODEC_AVC_ENCODE_SEQUENCE_PARAMS seqParams, 98 uint8_t hmeMvCostTable[8][42]) override; 99 100 MOS_STATUS SubmitCommandBuffer( 101 PMOS_COMMAND_BUFFER cmdBuffer, 102 bool bNullRendering) override; 103 104 MOS_STATUS InitKernelStateSFD() override; 105 106 MOS_STATUS Initialize(CodechalSetting * settings) override; 107 108 virtual bool ProcessRoiDeltaQp() override; 109 110 virtual bool IsMBBRCControlEnabled() override; 111 112 MOS_STATUS AddVdencWalkerStateCmd( 113 PMOS_COMMAND_BUFFER cmdBuffer) override; 114 115 MOS_STATUS SendPrologWithFrameTracking( 116 PMOS_COMMAND_BUFFER cmdBuffer, 117 bool frameTracking, 118 MHW_MI_MMIOREGISTERS *mmioRegister = nullptr) override; 119 120 MOS_STATUS InitMmcState() override; 121 122 virtual MOS_STATUS CheckResChangeAndCsc() override; 123 124 //! 125 //! \brief Create MHW_VDBOX_STATE_CMDSIZE_PARAMS 126 //! 127 //! \return PMHW_VDBOX_STATE_CMDSIZE_PARAMS 128 //! 129 PMHW_VDBOX_STATE_CMDSIZE_PARAMS CreateMhwVdboxStateCmdsizeParams() override; 130 131 //! 132 //! \brief Create PMHW_VDBOX_AVC_IMG_PARAMS. 133 //! 134 //! \return PMHW_VDBOX_AVC_IMG_PARAMS 135 //! 136 PMHW_VDBOX_AVC_IMG_PARAMS CreateMhwVdboxAvcImgParams() override; 137 138 //! 139 //! \brief Create PMHW_VDBOX_VDENC_WALKER_STATE_PARAMS. 140 //! 141 //! \return PMHW_VDBOX_VDENC_WALKER_STATE_PARAMS 142 //! 143 PMHW_VDBOX_VDENC_WALKER_STATE_PARAMS CreateMhwVdboxVdencWalkerStateParams() override; 144 145 MOS_STATUS InitKernelStateMe() override; 146 147 MOS_STATUS ExecuteMeKernel() override; 148 149 MOS_STATUS UpdateCmdBufAttribute( 150 PMOS_COMMAND_BUFFER cmdBuffer, 151 bool renderEngineInUse) override; 152 153 MOS_STATUS AddMediaVfeCmd( 154 PMOS_COMMAND_BUFFER cmdBuffer, 155 SendKernelCmdsParams *params) override; 156 157 //! 158 //! \brief Set up params for gpu context creation 159 //! \return MOS_STATUS 160 //! MOS_STATUS_SUCCESS if success, else fail reason 161 //! 162 virtual MOS_STATUS SetGpuCtxCreatOption() override; 163 //! 164 //! \brief Set And Populate VE Hint parameters 165 //! \details Set Virtual Engine hint parameter and populate it to primary cmd buffer attributes 166 //! \param [in] cmdBuffer 167 //! Pointer to primary cmd buffer 168 //! \return MOS_STATUS 169 //! MOS_STATUS_SUCCESS if success, else fail reason 170 //! 171 MOS_STATUS SetAndPopulateVEHintParams( 172 PMOS_COMMAND_BUFFER cmdBuffer); 173 174 //! 175 //! \brief Set VDENC StreamIn QP Surface state 176 //! 177 //! \param [in] vdencStreamIn 178 //! StreamIn Surface Resource. 179 //! 180 //! \return MOS_STATUS 181 //! MOS_STATUS_SUCCESS if success, else fail reason 182 //! 183 virtual MOS_STATUS SetupMBQPStreamIn(PMOS_RESOURCE vdencStreamIn); 184 185 //! 186 //! \brief Encode User Feature Key Report. 187 //! \details Report user feature values set by encode. 188 //! 189 //! \return MOS_STATUS 190 //! MOS_STATUS_SUCCESS if success 191 //! 192 virtual MOS_STATUS UserFeatureKeyReport() override; 193 194 virtual void SetBufferToStorePakStatistics() override; 195 196 virtual MOS_STATUS AddMiStoreForHWOutputToHucDmem(PMOS_COMMAND_BUFFER cmdBuffer) override; 197 198 protected: 199 class SfdCurbe; 200 struct BrcInitDmem; 201 struct BrcUpdateDmem; 202 bool m_vdencUltraModeEnable = false; //!< Enable VDEnc ultra mode 203 bool m_forcedTCBRC = false; //!< TCBRC forced instead of LowDelayBRC 204 205 MOS_STATUS CalculateVdencCommandsSize() override; 206 virtual void SetMfxAvcImgStateParams(MHW_VDBOX_AVC_IMG_PARAMS& param) override; 207 208 private: 209 static const uint32_t m_mvCostSkipBiasQPel[3][8]; 210 static const uint32_t m_hmeCostDisplayRemote[8][CODEC_AVC_NUM_QP]; 211 static const uint32_t m_hmeCost[8][CODEC_AVC_NUM_QP]; 212 static const int8_t m_brcInitDistQpDeltaI8[4]; 213 static const int8_t m_brcInitDistQpDeltaI8LowDelay[4]; 214 static const uint32_t m_singlePassMinFrameWidth = 3840; 215 static const uint32_t m_singlePassMinFrameHeight = 2160; 216 static const uint32_t m_singlePassMinFramePer100s = 6000; 217 uint8_t* m_pMBQPShadowBuffer = nullptr; 218 uint32_t m_uiMBQPShadowBufferSize = 0; 219 220 MOS_RESOURCE m_resPakOutputViaMmioBuffer = {}; //!< Buffer for PAK statistics output via MMIO 221 222 protected: 223 224 void SetMfxPipeModeSelectParams( 225 const CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS& genericParam, 226 MHW_VDBOX_PIPE_MODE_SELECT_PARAMS& param) override; 227 228 virtual void CopyMBQPDataToStreamIn(CODECHAL_VDENC_STREAMIN_STATE* pData, uint8_t* pInputData); 229 GetAdaptiveRoundingNumSlices()230 virtual uint16_t GetAdaptiveRoundingNumSlices() { return 0; } 231 232 #if USE_CODECHAL_DEBUG_TOOL 233 protected: 234 virtual MOS_STATUS PopulateBrcInitParam( 235 void *cmd) override; 236 237 virtual MOS_STATUS PopulateBrcUpdateParam( 238 void *cmd) override; 239 240 virtual MOS_STATUS PopulateEncParam( 241 uint8_t meMethod, 242 void *cmd) override; 243 244 virtual MOS_STATUS PopulatePakParam( 245 PMOS_COMMAND_BUFFER cmdBuffer, 246 PMHW_BATCH_BUFFER secondLevelBatchBuffer) override; 247 248 virtual MOS_STATUS ModifyEncodedFrameSizeWithFakeHeaderSize( PMOS_COMMAND_BUFFER cmdBuffer) override; 249 250 MOS_STATUS DumpParsedBRCInitDmem( 251 struct BrcInitDmem* dmem); 252 253 MOS_STATUS DumpParsedBRCUpdateDmem( 254 struct BrcUpdateDmem* dmem); 255 #endif 256 }; 257 258 #endif // __CODECHAL_VDENC_AVC_G12_H__ 259