1 /* 2 * Copyright (c) 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 encode_preenc_basic_feature.h 24 //! \brief Defines the common interface for encode preenc basic feature 25 //! 26 #ifndef __ENCODE_PREENC_BASIC_FEATURE_H__ 27 #define __ENCODE_PREENC_BASIC_FEATURE_H__ 28 29 #include "encode_basic_feature.h" 30 #include "codec_def_encode_hevc.h" 31 #include "encode_hevc_dfs.h" 32 #include "mhw_vdbox_vdenc_itf.h" 33 #include "mhw_vdbox_hcp_itf.h" 34 #include "encode_mem_compression.h" 35 #include "encode_preenc_const_settings.h" 36 #include "codechal_debug.h" 37 #include "encode_preenc_defs.h" 38 #if _MEDIA_RESERVED 39 #include "encode_preenc_basic_feature_ext.h" 40 #endif // _MEDIA_RESERVED 41 42 namespace encode 43 { 44 class PreEncBasicFeature : public EncodeBasicFeature, public mhw::vdbox::vdenc::Itf::ParSetting, public mhw::vdbox::hcp::Itf::ParSetting 45 { 46 public: 47 PreEncBasicFeature(MediaFeatureManager *featureManager, 48 EncodeAllocator * allocator, 49 CodechalHwInterfaceNext * hwInterface, 50 TrackedBuffer * trackedBuf, 51 RecycleResource * recycleBuf, EncodeBasicFeature(allocator,hwInterface,trackedBuf,recycleBuf)52 void * constSettings = nullptr) : EncodeBasicFeature(allocator, hwInterface, trackedBuf, recycleBuf) 53 { 54 m_hcpItf = std::static_pointer_cast<mhw::vdbox::hcp::Itf>(hwInterface->GetHcpInterfaceNext()); 55 ENCODE_CHK_NULL_NO_STATUS_RETURN(m_hcpItf); 56 m_preEncConstSettings = MOS_New(EncodePreEncConstSettings); 57 }; 58 59 virtual ~PreEncBasicFeature(); 60 GetProfileLevelMaxFrameSize()61 virtual uint32_t GetProfileLevelMaxFrameSize() override { return 0; }; 62 63 virtual MOS_STATUS Init(void *setting) override; 64 65 virtual MOS_STATUS Update(void *params) override; 66 GetRefList()67 PCODEC_REF_LIST *GetRefList() { return m_preEncConfig.RefList; }; 68 GetRefIdxMapping()69 int8_t *GetRefIdxMapping() { return m_refIdxMapping; }; 70 GetPictureCodingType()71 uint16_t GetPictureCodingType() { return m_pictureCodingType; }; 72 IsLowDelay()73 bool IsLowDelay() const { return m_lowDelay; }; 74 75 virtual MOS_STATUS CalculatePreEncInfo(uint32_t width, uint32_t height, PreEncInfo &preEncInfo); 76 77 virtual MOS_STATUS GetPreEncInfo(PreEncInfo &preEncInfo); 78 79 MOS_STATUS EncodePreencBasicFuntion0(PMOS_RESOURCE& Buffer0, PMOS_RESOURCE& Buffer1); 80 IsEnabled(bool & enabled)81 virtual MOS_STATUS IsEnabled(bool &enabled) 82 { 83 enabled = m_enabled; 84 return MOS_STATUS_SUCCESS; 85 } 86 GetEncodeMode(uint32_t & encodeMode)87 MOS_STATUS GetEncodeMode(uint32_t &encodeMode) 88 { 89 encodeMode = m_encodeMode; 90 return MOS_STATUS_SUCCESS; 91 } 92 93 #if USE_CODECHAL_DEBUG_TOOL 94 MOS_STATUS EncodePreencBasicFuntion1(); 95 96 FILE *pfile0 = nullptr; 97 FILE *pfile1 = nullptr; 98 #endif 99 100 MHW_SETPAR_DECL_HDR(VDENC_PIPE_MODE_SELECT); 101 102 MHW_SETPAR_DECL_HDR(VDENC_SRC_SURFACE_STATE); 103 104 MHW_SETPAR_DECL_HDR(VDENC_REF_SURFACE_STATE); 105 106 MHW_SETPAR_DECL_HDR(VDENC_DS_REF_SURFACE_STATE); 107 108 MHW_SETPAR_DECL_HDR(VDENC_PIPE_BUF_ADDR_STATE); 109 110 MHW_SETPAR_DECL_HDR(VDENC_CMD1); 111 112 MHW_SETPAR_DECL_HDR(VDENC_CMD2); 113 114 MHW_SETPAR_DECL_HDR(VDENC_WALKER_STATE); 115 116 MHW_SETPAR_DECL_HDR(VDENC_HEVC_VP9_TILE_SLICE_STATE); 117 118 MHW_SETPAR_DECL_HDR(VDENC_WEIGHTSOFFSETS_STATE); 119 120 MHW_SETPAR_DECL_HDR(HCP_PIC_STATE); 121 122 MHW_SETPAR_DECL_HDR(HEVC_VP9_RDOQ_STATE); 123 124 MHW_SETPAR_DECL_HDR(HCP_PIPE_BUF_ADDR_STATE); 125 126 MHW_SETPAR_DECL_HDR(HCP_PIPE_MODE_SELECT); 127 128 MHW_SETPAR_DECL_HDR(HCP_SLICE_STATE); 129 130 MHW_SETPAR_DECL_HDR(HCP_SURFACE_STATE); 131 132 EncodeMemComp *m_mmcState = nullptr; 133 134 static constexpr uint32_t m_maxLCUSize = 64; //!< Max LCU size 64 135 136 CODECHAL_HEVC_IQ_MATRIX_PARAMS m_hevcIqMatrixParams = {}; //!< Pointer to IQ matrix parameter 137 138 CODEC_PRE_ENC_PARAMS m_preEncConfig = {}; 139 140 PMOS_SURFACE m_rawDsSurface = nullptr; 141 PMOS_SURFACE m_preEncRawSurface = nullptr; 142 143 protected: 144 virtual MOS_STATUS PreparePreEncConfig(void *params) = 0; 145 146 bool IsCurrentUsedAsRef(uint8_t idx) const; 147 148 virtual MOS_STATUS UpdateTrackedBufferParameters() override; 149 virtual MOS_STATUS GetTrackedBuffers() override; 150 virtual MOS_STATUS AllocateResources() override; 151 virtual MOS_STATUS GetRecycleBuffers(); 152 virtual MOS_STATUS InitPreEncSize(); 153 154 MOS_STATUS SetSliceStructs(); 155 MOS_STATUS SetPictureStructs(); 156 MOS_STATUS ValidateLowDelayBFrame(); 157 MOS_STATUS ValidateSameRefInL0L1(); 158 159 int8_t m_refIdxMapping[CODEC_MAX_NUM_REF_FRAME_HEVC] = {}; //!< Reference Index mapping 160 bool m_currUsedRefPic[CODEC_MAX_NUM_REF_FRAME_HEVC] = {}; //!< Reference picture usage array 161 bool m_lowDelay = false; //!< Low delay flag 162 bool m_sameRefList = false; //!< Flag to specify if ref list L0 and L1 are same 163 PreEncInfo m_preEncInfo = {}; 164 165 //Deblocking 166 bool m_SliceDeblockingFilterDisabled = false; 167 uint32_t m_SliceTcOffsetDiv2 = 0; 168 uint32_t m_SliceBettaOffsetDiv2 = 0; 169 PMOS_RESOURCE m_resDeblockingFilterTileRowStoreScratchBuffer = nullptr; //!< De-blocking filter tile row store Scratch data buffer 170 PMOS_RESOURCE m_resDeblockingFilterColumnRowStoreScratchBuffer = nullptr; //!< De-blocking filter column row Store scratch data buffer 171 PMOS_RESOURCE m_resDeblockingFilterRowStoreScratchBuffer = nullptr; //!< Handle of De-block row store surface 172 173 uint32_t rawCTUBits = 0; 174 uint8_t m_QP = 22; 175 176 uint32_t m_encodeMode = 0; 177 uint8_t EncodePreencBasicMember0 = 0; 178 uint8_t EncodePreencBasicMember1 = 0; 179 uint32_t EncodePreencBasicMember2 = 0; 180 uint8_t EncodePreencBasicMember5 = 0; 181 uint8_t EncodePreencBasicMember6 = 0; 182 uint32_t m_preEncSrcWidth = 0; 183 uint32_t m_preEncSrcHeight = 0; 184 185 PMOS_RESOURCE EncodePreencBasicMember3 = nullptr; 186 PMOS_RESOURCE EncodePreencBasicMember4 = nullptr; 187 188 EncodePreEncConstSettings *m_preEncConstSettings = nullptr; 189 190 std::shared_ptr<mhw::vdbox::hcp::Itf> m_hcpItf = nullptr; 191 192 MEDIA_CLASS_DEFINE_END(encode__PreEncBasicFeature) 193 }; 194 } // namespace encode 195 196 #endif // !__ENCODE_PREENC_BASIC_FEATURE_H__ 197