1 /* 2 * Copyright (c) 2020-2023, 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_vp9_pak.h 24 //! \brief Defines the common interface for vp9 vdenc\pak features 25 //! 26 #ifndef __ENCODE_VP9_PAK_H__ 27 #define __ENCODE_VP9_PAK_H__ 28 29 #include "media_cmd_packet.h" 30 #include "encode_pipeline.h" 31 #include "encode_vp9_basic_feature.h" 32 #include "encode_vp9_pipeline.h" 33 34 #include "media_pipeline.h" 35 #include "encode_utils.h" 36 37 namespace encode 38 { 39 #define CODECHAL_ENCODE_VP9_MAX_NUM_HCP_PIPE 4 40 #define CODECHAL_VP9_ENCODE_RECYCLED_BUFFER_NUM (CODECHAL_ENCODE_RECYCLED_BUFFER_NUM * CODECHAL_ENCODE_VP9_MAX_NUM_HCP_PIPE) // for salability, need 1 buffer per pipe, 41 //! 42 //! \struct CU_DATA 43 //! \brief CU data 44 //! 45 struct CU_DATA 46 { 47 // DW0 48 uint32_t cu_size : 2; 49 uint32_t Res_DW0_2_3 : 2; 50 uint32_t cu_part_mode : 2; // 0=2Nx2N,1=2NxN,2=Nx2N,3=NxN(8x8 only) 51 uint32_t Res_DW0_6_7 : 2; 52 uint32_t intra_chroma_mode0 : 4; // 0=DC,1=V,2=H,3=TM,4=D45,5=D135,6=D117,7=D153,8=D207,9=D63 53 uint32_t Res_DW0_12_15 : 4; 54 uint32_t intra_chroma_mode1 : 4; // 0=DC,1=V,2=H,3=TM,4=D45,5=D135,6=D117,7=D153,8=D207,9=D63 55 uint32_t cu_pred_mode0 : 1; // 1=Intra,0=Inter 56 uint32_t cu_pred_mode1 : 1; 57 uint32_t Res_DW0_23_22 : 2; 58 uint32_t interpred_comp0 : 1; // 0=single,1=compound 59 uint32_t interpred_comp1 : 1; 60 uint32_t Res_DW0_31_26 : 6; 61 62 //DW1 63 uint32_t intra_mode0 : 4; // 0=DC,1=V,2=H,3=TM,4=D45,5=D135,6=D117,7=D153,8=D207,9=D63 64 uint32_t Res_DW1_4_7 : 4; 65 uint32_t intra_mode1 : 4; // 0=DC,1=V,2=H,3=TM,4=D45,5=D135,6=D117,7=D153,8=D207,9=D63 66 uint32_t Res_DW1_12_15 : 4; 67 uint32_t intra_mode2 : 4; // 0=DC,1=V,2=H,3=TM,4=D45,5=D135,6=D117,7=D153,8=D207,9=D63 68 uint32_t Res_DW1_20_23 : 4; 69 uint32_t intra_mode3 : 4; // 0=DC,1=V,2=H,3=TM,4=D45,5=D135,6=D117,7=D153,8=D207,9=D63 70 uint32_t Res_DW1_28_31 : 4; 71 72 //DW2 73 int16_t mvx_l0_part0 : 16; 74 int16_t mvy_l0_part0 : 16; 75 76 //DW3 77 int16_t mvx_l0_part1 : 16; 78 int16_t mvy_l0_part1 : 16; 79 80 //DW4 81 int16_t mvx_l0_part2 : 16; 82 int16_t mvy_l0_part2 : 16; 83 84 //DW5 85 int16_t mvx_l0_part3 : 16; 86 int16_t mvy_l0_part3 : 16; 87 88 //DW6 89 int16_t mvx_l1_part0 : 16; 90 int16_t mvy_l1_part0 : 16; 91 92 //DW7 93 int16_t mvx_l1_part1 : 16; 94 int16_t mvy_l1_part1 : 16; 95 96 //DW8 97 int16_t mvx_l1_part2 : 16; 98 int16_t mvy_l1_part2 : 16; 99 100 //DW9 101 int16_t mvx_l1_part3 : 16; 102 int16_t mvy_l1_part3 : 16; 103 104 //DW10 105 uint32_t refframe_part0_l0 : 2; // 0=intra,1=last,2=golden,3=altref 106 uint32_t Res_DW10_2_3 : 2; 107 uint32_t refframe_part1_l0 : 2; // 0=intra,1=last,2=golden,3=altref 108 uint32_t Res_DW10_6_7 : 2; 109 uint32_t refframe_part0_l1 : 2; // 0=intra,1=last,2=golden,3=altref 110 uint32_t Res_DW10_10_11 : 2; 111 uint32_t refframe_part1_l1 : 2; // 0=intra,1=last,2=golden,3=altref 112 uint32_t Res_DW10_14_15 : 2; 113 uint32_t round_part0 : 3; 114 uint32_t Res_DW10_19 : 1; 115 uint32_t round_part1 : 3; 116 uint32_t Res_DW10_23_31 : 9; 117 118 //DW11 119 uint32_t tu_size0 : 2; 120 uint32_t tu_size1 : 2; 121 uint32_t Res_DW11_4_13 : 10; 122 uint32_t segidx_pred0 : 1; 123 uint32_t segidx_pred1 : 1; 124 uint32_t segidx_part0 : 3; 125 uint32_t segidx_part1 : 3; 126 uint32_t mc_filtertype_part0 : 2; 127 uint32_t mc_filtertype_part1 : 2; 128 uint32_t Res_DW11_26_31 : 6; 129 130 uint32_t Res_DW12 : 32; 131 132 uint32_t Res_DW13 : 32; 133 134 uint32_t Res_DW14 : 32; 135 136 uint32_t Res_DW15 : 32; 137 138 }; 139 C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(CU_DATA)) == 16); 140 141 class Vp9EncodePak : public MediaFeature, 142 public mhw::vdbox::huc::Itf::ParSetting, 143 public mhw::vdbox::hcp::Itf::ParSetting, 144 public mhw::vdbox::vdenc::Itf::ParSetting 145 { 146 public: 147 //! 148 //! \brief Vp9EncodePak feature constructor 149 //! 150 //! \param [in] featureManager 151 //! Pointer to MediaFeatureManager 152 //! \param [in] allocator 153 //! Pointer to EncodeAllocator 154 //! \param [in] hwInterface 155 //! Pointer to CodechalHwInterface 156 //! \param [in] constSettings 157 //! Pointer to const settings 158 //! 159 Vp9EncodePak( 160 MediaFeatureManager *featureManager, 161 EncodeAllocator *allocator, 162 CodechalHwInterfaceNext *hwInterface, 163 void *constSettings); 164 165 //! 166 //! \brief Vp9EncodePak feature destructor 167 //! ~Vp9EncodePak()168 virtual ~Vp9EncodePak() {} 169 170 //! 171 //! \brief Init vdenc pak features related parameter 172 //! \param [in] settings 173 //! Pointer to settings 174 //! \return MOS_STATUS 175 //! MOS_STATUS_SUCCESS if success, else fail reason 176 //! 177 MOS_STATUS Init(void *settings) override; 178 179 //! 180 //! \brief Update vdenc pak features related parameter 181 //! \param [in] params 182 //! Pointer to parameters 183 //! \return MOS_STATUS 184 //! MOS_STATUS_SUCCESS if success, else fail reason 185 //! 186 MOS_STATUS Update(void *params) override; 187 188 //! 189 //! \brief Set regions for brc update 190 //! \param [in] params 191 //! Pointer to parameters 192 //! \param [in] currPass 193 //! current pass 194 //! \return MOS_STATUS 195 //! MOS_STATUS_SUCCESS if success, else fail reason 196 //! 197 MOS_STATUS SetRegionsForBrcUpdate( 198 mhw::vdbox::huc::HUC_VIRTUAL_ADDR_STATE_PAR ¶ms, 199 uint32_t currPass) const; 200 201 //! 202 //! \brief Set regions for huc prob 203 //! \param [in] params 204 //! Pointer to parameters 205 //! \param [in] currPass 206 //! current pass 207 //! \return MOS_STATUS 208 //! MOS_STATUS_SUCCESS if success, else fail reason 209 //! 210 MOS_STATUS SetRegionsForHucProb( 211 mhw::vdbox::huc::HUC_VIRTUAL_ADDR_STATE_PAR ¶ms, 212 uint32_t currPass) const; 213 214 //! 215 //! \brief Construct pic state batch buffer 216 //! \param [in] pipeline 217 //! Pointer to the pipeline 218 //! \return MOS_STATUS 219 //! MOS_STATUS_SUCCESS if success, else fail reason 220 //! 221 MOS_STATUS ConstructPicStateBatchBuffer( 222 EncodePipeline *pipeline); 223 224 //! 225 //! \brief Construct pak insert object batch buffer 226 //! \return MOS_STATUS 227 //! MOS_STATUS_SUCCESS if success, else fail reason 228 //! 229 MOS_STATUS ConstructPakInsertObjBatchBuffer(); 230 231 //! 232 //! \brief Set huc pak insert object batch buffer 233 //! \param [in, out] secondLevelBatchBuffer 234 //! Pointer to huc pak insert object batch buffer 235 //! \return MOS_STATUS 236 //! MOS_STATUS_SUCCESS if success, else fail reason 237 //! 238 MOS_STATUS SetHucPakInsertObjBatchBuffer( 239 MHW_BATCH_BUFFER &secondLevelBatchBuffer); 240 241 //! 242 //! \brief Set vdenc second level batch buffer 243 //! \param [in] currPass 244 //! Current pass 245 //! \param [in, out] secondLevelBatchBuffer 246 //! Second level batch buffer 247 //! \return MOS_STATUS 248 //! MOS_STATUS_SUCCESS if success, else fail reason 249 //! 250 virtual MOS_STATUS SetVdencSecondLevelBatchBuffer( 251 uint32_t currPass, 252 MHW_BATCH_BUFFER &secondLevelBatchBuffer); 253 254 //! 255 //! \brief Get vdenc picture state second level batch buffer size 256 //! \param [out] size 257 //! Vdenc picture state second level batch buffer size 258 //! \return MOS_STATUS 259 //! MOS_STATUS_SUCCESS if success, else fail reason 260 //! 261 virtual MOS_STATUS GetVdencPictureState2ndLevelBatchBufferSize( 262 uint32_t &size); 263 264 //! 265 //! \brief Update parameters 266 //! \return MOS_STATUS 267 //! MOS_STATUS_SUCCESS if success, else fail reason 268 //! 269 virtual MOS_STATUS UpdateParameters(); 270 271 //! 272 //! \brief Pak construct picture state batch buffer 273 //! 274 //! \param [in] picStateBuffer 275 //! Pointer to MOS surface 276 //! 277 //! \return MOS_STATUS 278 //! MOS_STATUS_SUCCESS if success, else fail reason 279 //! 280 MOS_STATUS PakConstructPicStateBatchBuffer( 281 PMOS_RESOURCE picStateBuffer); 282 283 //! 284 //! \brief Get compressed header buffer 285 //! \return Pointer to the buffer 286 //! 287 PMOS_RESOURCE GetCompressedHeaderBuffer(); 288 289 //! 290 //! \brief MHW parameters declaration 291 //! 292 MHW_SETPAR_DECL_HDR(HCP_PAK_INSERT_OBJECT); 293 MHW_SETPAR_DECL_HDR(HCP_IND_OBJ_BASE_ADDR_STATE); 294 MHW_SETPAR_DECL_HDR(HCP_PIPE_BUF_ADDR_STATE); 295 296 protected: 297 298 //! \brief Allocate feature related resources 299 //! \return MOS_STATUS 300 //! MOS_STATUS_SUCCESS if success, else fail reason 301 //! 302 MOS_STATUS AllocateResources() override; 303 304 //! 305 //! \brief Prepare PAK object and CU record for dynamic scaling 306 //! \return MOS_STATUS 307 //! MOS_STATUS_SUCCESS if success, else fail reason 308 //! 309 MOS_STATUS PreparePakObjAndCuRecord(); 310 311 //! 312 //! \brief Add the VDenc CMD1 command. 313 //! \param [in] cmdBuffer 314 //! The command buffer which is allocated by caller 315 //! \return MOS_STATUS 316 //! MOS_STATUS_SUCCESS if success, else fail reason 317 //! 318 virtual MOS_STATUS AddVdencCmd1Command( 319 MOS_COMMAND_BUFFER &cmdBuffer); 320 321 //! 322 //! \brief Add the VDenc CMD2 command. 323 //! \param [in] cmdBuffer 324 //! The command buffer which is allocated by caller 325 //! \return MOS_STATUS 326 //! MOS_STATUS_SUCCESS if success, else fail reason 327 //! 328 MOS_STATUS AddVdencCmd2Command( 329 MOS_COMMAND_BUFFER &cmdBuffer); 330 331 //! 332 //! \brief Calculate QP Lambda values 333 //! \param sadQpLambda 334 //! SAD QP Lambda value 335 //! \param rdQpLambda 336 //! RD QP Lambda value 337 //! \return MOS_STATUS 338 //! MOS_STATUS_SUCCESS if success, else fail reason 339 //! 340 void CalculateQpLambdaValues(double &sadQpLambda, double &rdQpLambda); 341 342 CodechalHwInterfaceNext * m_hwInterface = nullptr; 343 EncodeAllocator * m_allocator = nullptr; 344 Vp9BasicFeature * m_basicFeature = nullptr; 345 346 std::shared_ptr<mhw::vdbox::hcp::Itf> m_hcpInterfaceNew = nullptr; 347 std::shared_ptr<mhw::vdbox::vdenc::Itf> m_vdencInterfaceNew = nullptr; 348 std::shared_ptr<mhw::mi::Itf> m_miItf = nullptr; 349 350 // Picture state resources 351 bool m_picState2ndLevelBBConstructed[3]; //!< Indicated picture state 2nd level batch buffer has been contructed 352 uint32_t m_vdencPicStateSecondLevelBatchBufferSize = 0; //!< VDENC picture state second level batch buffer size 353 uint16_t m_vdencPictureState2ndLevelBBIndex = 0; 354 uint16_t m_lastVdencPictureState2ndLevelBBIndex = 0; 355 356 MOS_RESOURCE m_resVdencPictureState2ndLevelBatchBufferRead[3][CODECHAL_VP9_ENCODE_RECYCLED_BUFFER_NUM] = {0}; 357 MOS_RESOURCE m_resVdencPictureState2ndLevelBatchBufferWrite[CODECHAL_VP9_ENCODE_RECYCLED_BUFFER_NUM] = {0}; 358 359 // Vdenc/Pak resources 360 MOS_RESOURCE m_resHucPakInsertUncompressedHeaderReadBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM] = {0}; //!< Huc VP9 pak insert uncompressed header read buffer 361 MOS_RESOURCE m_resHucPakInsertUncompressedHeaderWriteBuffer = {0}; //!< Huc VP9 pak insert uncompressed header write buffer 362 363 MOS_RESOURCE m_resCompressedHeaderBuffer = {0}; //!< Compressed heander buffer 364 MOS_RESOURCE m_resVdencDataExtensionBuffer = {0}; //!< Data extension buffer 365 366 // PAK resources 367 PMOS_RESOURCE m_resMetadataLineBuffer = nullptr; //!< Metadata line data buffer 368 PMOS_RESOURCE m_resMetadataTileLineBuffer = nullptr; //!< Metadata tile line data buffer 369 PMOS_RESOURCE m_resMetadataTileColumnBuffer = nullptr; //!< Metadata tile column data buffer 370 371 // DYS 372 MOS_RESOURCE m_resVdencDysPictureState2ndLevelBatchBuffer = {0}; 373 374 MEDIA_CLASS_DEFINE_END(encode__Vp9EncodePak) 375 }; 376 377 } // namespace encode 378 379 #endif // __ENCODE_VP9_PAK_H__