1 /* 2 * Copyright (c) 2021-2024, 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_aqm_feature.h 24 //! \brief Defines the common interface for encode aqm feature 25 //! 26 #ifndef __ENCODE_AQM_FEATURE_H__ 27 #define __ENCODE_AQM_FEATURE_H__ 28 29 #include <queue> 30 31 #include "media_feature.h" 32 #include "encode_allocator.h" 33 #include "codec_hw_next.h" 34 #include "codechal_debug.h" 35 #include "encode_basic_feature.h" 36 #include "mhw_vdbox_aqm_itf.h" 37 #include "encode_mem_compression.h" 38 #if _MEDIA_RESERVED 39 #include "encode_aqm_feature_ext.h" 40 #endif 41 42 #define ENCODE_VDENC_MAX_TILE_NUM 4096 43 44 namespace encode 45 { 46 class EncodeAqmFeature : public MediaFeature, public mhw::vdbox::aqm::Itf::ParSetting 47 { 48 public: 49 EncodeAqmFeature(MediaFeatureManager *featureManager, 50 EncodeAllocator * allocator, 51 CodechalHwInterfaceNext * hwInterface, 52 void * constSettings); 53 54 virtual ~EncodeAqmFeature(); 55 56 virtual MOS_STATUS Update(void *params) override; 57 58 MHW_SETPAR_DECL_HDR(AQM_PIPE_BUF_ADDR_STATE); 59 MHW_SETPAR_DECL_HDR(AQM_PIC_STATE); 60 MHW_SETPAR_DECL_HDR(AQM_FRAME_START); 61 SetAQMMode(const uint8_t aqmMode)62 virtual void SetAQMMode(const uint8_t aqmMode) 63 { 64 m_aqmMode = aqmMode; 65 } 66 GetAQMMode()67 virtual uint8_t GetAQMMode() 68 { 69 return m_aqmMode; 70 } 71 SetCurrentPipe(const uint8_t currPipeNum)72 void SetCurrentPipe(const uint8_t currPipeNum) 73 { 74 m_currPipeNum = currPipeNum; 75 } 76 #if USE_CODECHAL_DEBUG_TOOL 77 virtual MOS_STATUS UpdateFrameDisplayOrder(const uint16_t pictureCodingType, const uint32_t framePOC, const uint32_t gopPicSize); 78 #endif 79 virtual MOS_STATUS ReportQualityInfoFrame(uint32_t statBufIdx, EncodeStatusReportData& statusReportData); 80 81 #if _MEDIA_RESERVED 82 #define AQM_FEATURE_HEADER_EXT 83 #include "encode_aqm_feature_ext.h" 84 #undef AQM_FEATURE_HEADER_EXT 85 #else 86 struct AQM_Ouput_Format 87 { 88 union 89 { 90 uint32_t DWord0; 91 struct 92 { 93 uint32_t SSEY; // [31:0] 94 }; 95 }; 96 97 //DW1 98 union 99 { 100 uint32_t DWord1; 101 struct 102 { 103 uint32_t SSEU; // [31:0] 104 }; 105 }; 106 107 //DW2 108 union 109 { 110 uint32_t DWord2; 111 struct 112 { 113 uint32_t SSEV; // [31:0] 114 }; 115 }; 116 uint32_t DWord[47]; 117 }; 118 #endif 119 120 protected: 121 //! 122 //! \enum AqmSurfaceId 123 //! Aqm surface ID 124 //! 125 enum AqmSurfaceId 126 { 127 reconPic = 0, //!< reconstructed picture 128 srcInputPic = 1, //!< input source picture 129 }; 130 131 enum LCU_SIZE 132 { 133 LCU_SIZE_16X16 = 0, 134 LCU_SIZE_32X32 = 1, 135 LCU_SIZE_64X64 = 2, 136 }; 137 138 enum CODECTYPE 139 { 140 CODECTYPE_AVC = 0, 141 CODECTYPE_HEVC = 1, 142 CODECTYPE_AV1 = 2, 143 CODECTYPE_VP9 = 3, 144 CODECTYPE_MP2 = 4, 145 }; 146 147 static const uint32_t AQMBlockSizeLog2 = 2; 148 static const uint32_t CL_SIZE_BYTES = 64; 149 static const uint32_t AQM_INDEX = 5; 150 151 virtual MOS_STATUS AllocateResources() override; 152 virtual MOS_STATUS FreeResources(); 153 154 uint32_t EncodeAqmFeatureFunction0(uint32_t frameWidth, uint32_t frameHeight, uint8_t index); 155 156 MOS_STATUS GetFrameMSE(AQM_Ouput_Format* pDataFrame, uint32_t(&MSE)[3]); 157 158 CodechalHwInterfaceNext *m_hwInterface = nullptr; 159 EncodeAllocator * m_allocator = nullptr; 160 EncodeBasicFeature * m_basicFeature = nullptr; //!< EncodeBasicFeature 161 bool m_AllocatedResources = false; 162 MOS_CONTEXT_HANDLE m_mosCtx = nullptr; 163 164 PMOS_RESOURCE EncodeAqmFeatureMember0[5] = {}; 165 uint32_t EncodeAqmFeatureMember1[5] = {}; 166 167 uint32_t EncodeAqmFeatureMember2 = 0; 168 uint32_t EncodeAqmFeatureMember3[5] = {}; 169 170 uint32_t m_numTiles = 1; //!< Total tile numbers 171 uint16_t m_tile_width[ENCODE_VDENC_MAX_TILE_NUM] = {}; 172 uint16_t m_tile_height[ENCODE_VDENC_MAX_TILE_NUM] = {}; 173 bool m_tileBasedEngine = false; 174 uint8_t m_aqmMode = 0; 175 uint8_t m_metricsDumpMode = 0; 176 177 uint8_t m_numRowStore = 1; 178 uint8_t m_currPipeNum = 0; 179 180 MOS_SURFACE m_rawSurface = {}; //!< Pointer to MOS_SURFACE of raw surface 181 MOS_SURFACE m_reconSurface = {}; //!< Pointer to MOS_SURFACE of reconstructed surface 182 183 #if USE_CODECHAL_DEBUG_TOOL 184 std::queue<uint32_t> m_frameIdxQueue; 185 uint32_t m_gopSizePrevious = 0; 186 uint32_t m_frameNumPrevious = 0; 187 #endif 188 189 MEDIA_CLASS_DEFINE_END(encode__EncodeAqmFeature) 190 }; 191 192 } // namespace encode 193 194 #endif // !__ENCODE_AQM_FEATURE_H__ 195