1 /* 2 * Copyright (c) 2017, 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_hevc.h 24 //! \brief Defines base class for HEVC VDEnc encoder. 25 //! 26 27 #ifndef __CODECHAL_VDENC_HEVC_H__ 28 #define __CODECHAL_VDENC_HEVC_H__ 29 30 #include "codechal_encode_hevc_base.h" 31 #include "codechal_mmc_encode_hevc.h" 32 #include "codechal_huc_cmd_initializer.h" 33 34 //! 35 //! \struct CodechalVdencHevcPakInfo 36 //! \brief Codechal Vdenc HEVC Pak info 37 //! 38 struct CodechalVdencHevcPakInfo 39 { 40 uint32_t FrameByteCount; 41 uint8_t PAKPassNum; 42 }; 43 44 using pCodechalVdencHevcPakInfo = CodechalVdencHevcPakInfo*; 45 46 //! 47 //! \struct CodechalVdencHevcLaStats 48 //! \brief Codechal Vdenc HEVC lookahead info for BRC 49 //! 50 struct CodechalVdencHevcLaStats 51 { 52 uint32_t sad; 53 uint32_t frameByteCount; 54 uint32_t headerBitCount; 55 uint32_t intraCuCount; 56 uint32_t reserved[4]; 57 }; 58 59 //! 60 //! \struct CodechalVdencHevcLaData 61 //! \brief Codechal encode lookahead analysis output data structure 62 //! 63 struct CodechalVdencHevcLaData 64 { 65 uint32_t reserved0[1]; 66 uint32_t targetFrameSize; 67 uint32_t targetBufferFulness; 68 uint32_t reserved1[2]; 69 union 70 { 71 struct 72 { 73 uint32_t cqmHint : 8; //!< Custom quantization matrix hint. 0x00 - flat matrix; 0x01 - CQM; 0xFF - invalid hint; other values are reserved. 74 uint32_t reserved2 : 24; 75 }; 76 uint32_t encodeHints; 77 }; 78 uint32_t pyramidDeltaQP; 79 uint8_t adaptive_rounding; 80 uint8_t miniGopSize; 81 uint32_t reserved3[8]; 82 }; 83 84 //! 85 //! \struct DeltaQpForROI 86 //! \brief This struct is defined for BRC Update HUC kernel 87 //! region 10 - Delta Qp for ROI Buffer 88 //! 89 struct DeltaQpForROI 90 { 91 int8_t iDeltaQp; 92 }; 93 94 using PDeltaQpForROI = DeltaQpForROI*; 95 96 //! 97 //! \struct CodechalVdencHevcLaDmem 98 //! \brief This struct is defined for Lookahead HUC kernel DMEM 99 //! 100 struct CodechalVdencHevcLaDmem 101 { 102 uint32_t lookAheadFunc; // 0: init, 1 update 103 // for Init, valid only when lookAheadFunc = 0 104 uint32_t lengthAhead; // in the units of frames 105 uint32_t vbvBufferSize; // in the units of frames 106 uint32_t vbvInitialFullness; // in the units of frames 107 uint32_t cuCount; // normalized 8x8 CU count 108 uint32_t statsRecords; // # of statistic records 109 uint32_t avgFrameSizeInByte; // in the units of bytes 110 uint16_t minGop; 111 uint16_t maxGop; 112 uint16_t BGop; 113 uint16_t AGop; 114 uint16_t AGop_Threshold; 115 uint16_t PGop; 116 uint8_t downscaleRatio; // 0-no scale, 1-2x, 2-4x 117 uint8_t isIframeInsideBGOP; 118 uint8_t adaptiveIDR; 119 uint8_t GopOpt; //0 open GOP, 1 close GOP, 2 strict GOP 120 uint32_t mbr_ratio; 121 uint8_t la_dump_type; 122 uint8_t codec_type; 123 uint8_t RSVD[2]; 124 uint32_t enc_frame_width; 125 uint32_t enc_frame_height; 126 uint8_t RSVD1[4]; 127 // for Update, valid only when lookAheadFunc = 1 128 uint32_t validStatsRecords; // # of valid stats records 129 uint32_t offset; // offset in unit of entries 130 uint8_t cqmQpThreshold; // QP threshold for CQM enable/disable. If estimated QP > CQM_QP_threshold, kernel set HUC_LOOKAHEAD_DATA.enableCQM to 1. 131 uint8_t currentPass; 132 uint8_t RSVD2[54]; 133 }; 134 135 using PCodechalVdencHevcLaDmem = CodechalVdencHevcLaDmem *; 136 137 //! 138 //! \class CodechalVdencHevcState 139 //! \brief HEVC VDEnc encoder base class 140 //! \details This class defines the base class for HEVC VDEnc encoder, it includes 141 //! common member fields, functions, interfaces etc shared by all GENs. 142 //! Gen specific definitions, features should be put into their corresponding classes. 143 //! 144 class CodechalVdencHevcState : public CodechalEncodeHevcBase 145 { 146 public: 147 //! 148 //! \struct HevcVdencBrcBuffers 149 //! \brief Hevc Vdenc brc buffers 150 //! 151 struct HevcVdencBrcBuffers 152 { 153 MOS_RESOURCE resBrcPakStatisticBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; 154 uint32_t uiCurrBrcPakStasIdxForRead; 155 uint32_t uiCurrBrcPakStasIdxForWrite; 156 }; 157 158 static constexpr uint8_t m_numMaxVdencL0Ref = 3; //!< Max number of reference frame list0 159 static constexpr uint8_t m_numMaxVdencL1Ref = 3; //!< Max number of reference frame list1 160 static constexpr uint32_t m_brcPakStatsBufSize = 512; //!< Pak statistic buffer size 161 static constexpr uint32_t m_brcStatsBufSize = 1216; //!< BRC Statistic buf size: 48DWs (3CLs) of HMDC Frame Stats + 256 DWs (16CLs) of Histogram Stats = 1216 bytes 162 static constexpr uint32_t m_brcHistoryBufSize = 6080; //!< BRC history buffer size 163 static constexpr uint32_t m_brcDebugBufSize = 0x1000; //!< BRC debug buffer size 164 static constexpr uint32_t m_LaHistoryBufSize = 8192; //!< Lookahead history buffer size 165 static constexpr uint32_t m_weightHistSize = 1024; //!< Weight Histogram (part of VDEnc Statistic): 256 DWs (16CLs) of Histogram Stats = 1024 166 static constexpr uint32_t m_roiStreamInBufferSize = 65536 * CODECHAL_CACHELINE_SIZE; //!< ROI Streamin buffer size (part of BRC Update) 167 static constexpr uint32_t m_deltaQpBufferSize = 65536; //!< DeltaQp buffer size (part of BRC Update) 168 static constexpr uint32_t m_brcLooaheadStatsBufferSize = m_numLaDataEntry * sizeof(CodechalVdencHevcLaStats); //!< Lookahead statistics buffer size 169 static constexpr uint32_t m_brcLooaheadDataBufferSize = m_numLaDataEntry * sizeof(CodechalVdencHevcLaData); //!< Lookahead data buffer size 170 static constexpr uint32_t m_vdboxHucHevcBrcInitKernelDescriptor = 8;//!< Huc HEVC Brc init kernel descriptor 171 static constexpr uint32_t m_vdboxHucHevcBrcUpdateKernelDescriptor = 9;//!< Huc HEVC Brc update kernel descriptor 172 static constexpr uint32_t m_vdboxHucHevcBrcLowdelayKernelDescriptor = 10;//!< Huc HEVC Brc low delay kernel descriptor 173 static constexpr uint32_t m_vdboxHucHevcLaAnalysisKernelDescriptor = 16;//!< Huc lookahead analysis kernel descriptor 174 175 //!< \cond SKIP_DOXYGEN 176 // HuC tables 177 // Note: These const values are same for all Gen now. 178 // In case they become diff later, then need to move declaration to each Gen's derived class 179 static const uint8_t m_estRateThreshP0[7]; 180 static const uint8_t m_estRateThreshB0[7]; 181 static const uint8_t m_estRateThreshI0[7]; 182 static const int8_t m_instRateThreshP0[4]; 183 static const int8_t m_instRateThreshB0[4]; 184 static const int8_t m_instRateThreshI0[4]; 185 static const uint16_t m_startGAdjFrame[4]; 186 static const uint8_t m_startGAdjMult[5]; 187 static const uint8_t m_startGAdjDiv[5]; 188 static const uint8_t m_rateRatioThreshold[7]; 189 static const uint8_t m_rateRatioThresholdQP[8]; 190 static const uint32_t m_hucModeCostsIFrame[364]; 191 static const uint32_t m_hucModeCostsPbFrame[364]; 192 static const uint16_t m_sadQpLambdaI[52]; 193 static const uint16_t m_sadQpLambdaI_VQI[52]; 194 static const uint16_t m_sadQpLambdaP[52]; 195 static const uint16_t m_rdQpLambdaI[52]; 196 static const uint16_t m_rdQpLambdaP[52]; 197 static const uint8_t m_penaltyForIntraNonDC32x32PredMode[52]; 198 static const uint8_t m_penaltyForIntraNonDC32x32PredMode_VQI[52]; 199 //! \endcond 200 201 bool m_hevcVdencAcqpEnabled = false; //!< ACQP enable flag 202 bool m_hevcRdoqAdaptationEnabled = false; //!< RDOQ adaptation enable flag 203 bool m_hevcVdencRoundingEnabled = false; //!< Rounding enable flag 204 bool m_vdencPakObjCmdStreamOutEnabled = false; //!< Pakobj stream out enable flag 205 bool m_vdencHucUsed = false; //!< HUC usage flag 206 bool m_hevcVdencWeightedPredEnabled = false; //!< Weighted pred enable flag 207 bool m_vdencHuCConditional2ndPass = false; //!< HuC conditional 2nd pass enable flag 208 bool m_vdencNativeROIEnabled = false; //!< Native ROI enable flag 209 bool m_pakOnlyPass = false; //!< flag to signal VDEnc+PAK vs. PAK only 210 bool m_hevcVisualQualityImprovement = false; //!< VQI enable flag 211 bool m_enableMotionAdaptive = false; //!< Motion adaptive enable flag 212 bool m_brcAdaptiveRegionBoostSupported = false; //!< ARB in BRC mode supported flag. 213 bool m_brcAdaptiveRegionBoostEnable = false; //!< ARB in BRC mode enable flag. 214 215 //Resources for VDEnc 216 MOS_RESOURCE m_sliceCountBuffer; //!< Slice count buffer 217 MOS_RESOURCE m_vdencModeTimerBuffer; //!< VDEnc mode timer buffer 218 MOS_RESOURCE m_resSliceReport[CODECHAL_ENCODE_STATUS_NUM]; //!< Slice size report buffer to be saved across passes 219 uint8_t m_maxNumROI = CODECHAL_ENCODE_HEVC_MAX_NUM_ROI; //!< VDEnc maximum number of ROI supported 220 uint8_t m_maxNumNativeROI = ENCODE_VDENC_HEVC_MAX_STREAMINROI_G10; //!< Number of native ROI supported by VDEnc HW 221 uint8_t m_imgStateImePredictors = 8; //!< Number of predictors for IME 222 uint32_t m_currGopIFramePOC = -1; //!< PoC for I frame in current GoP 223 224 // BRC 225 HevcVdencBrcBuffers m_vdencBrcBuffers = {}; //!< VDEnc Brc buffers 226 MOS_RESOURCE m_dataFromPicsBuffer = {}; //!< Data Buffer of Current and Reference Pictures for Weighted Prediction 227 MOS_RESOURCE m_vdencDeltaQpBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM] = {}; //!< VDEnc delta QP buffer 228 MOS_RESOURCE m_vdencOutputROIStreaminBuffer = {}; //!< VDEnc Output ROI Streamin Buffer 229 MOS_RESOURCE m_vdencBrcUpdateDmemBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM][CODECHAL_VDENC_BRC_NUM_OF_PASSES_FOR_TILE_REPLAY] = {}; //!< VDEnc BrcUpdate DMEM buffer 230 MOS_RESOURCE m_vdencBrcInitDmemBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM] = {}; //!< VDEnc BrcInit DMEM buffer 231 MOS_RESOURCE m_vdencBrcConstDataBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM] = {}; //!< VDEnc brc constant data buffer 232 MOS_RESOURCE m_vdencBrcHistoryBuffer = {}; //!< VDEnc brc history buffer 233 MOS_RESOURCE m_vdencReadBatchBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM][CODECHAL_VDENC_BRC_NUM_OF_PASSES] = {}; //!< VDEnc read batch buffer 234 MOS_RESOURCE m_vdencGroup3BatchBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM][CODECHAL_VDENC_BRC_NUM_OF_PASSES] = {}; //!< VDEnc read batch buffer for Group3 235 MOS_RESOURCE m_vdencBrcDbgBuffer = {}; //!< VDEnc brc debug buffer 236 uint32_t m_deltaQpRoiBufferSize = 0; //!< VDEnc DeltaQp for ROI buffer size 237 uint32_t m_brcRoiBufferSize = 0; //!< BRC ROI input buffer size 238 MHW_VDBOX_HUC_VIRTUAL_ADDR_PARAMS m_virtualAddrParams = {}; //!< BRC virtual address parameter 239 240 // Batch Buffer for VDEnc 241 MHW_BATCH_BUFFER m_vdenc2ndLevelBatchBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM] = {}; //!< VDEnc 2nd level batch buffer 242 uint32_t m_vdenc2ndLevelBatchBufferSize[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM] = {0}; 243 uint32_t m_vdencBatchBufferPerSliceVarSize[ENCODE_HEVC_VDENC_NUM_MAX_SLICES] = { 0 }; //!< VDEnc batch buffer slice size array 244 uint32_t m_1stPakInsertObjectCmdSize = 0; //!< Size of 1st PAK_INSERT_OBJ cmd 245 uint32_t m_hcpWeightOffsetStateCmdSize = 0; //!< Size of HCP_WEIGHT_OFFSET_STATE cmd 246 uint32_t m_hcpSliceStateCmdSize = 0; //!< Size of HCP_SLICE_STATE cmd 247 uint32_t m_vdencWeightOffsetStateCmdSize = 0; //!< Size of VDENC_WEIGHT_OFFSET_STATE cmd 248 uint32_t m_miBatchBufferEndCmdSize = 0; //!< Size of MI_BATCH_BUFFER_END cmd 249 uint32_t m_picStateCmdStartInBytes = 0; //!< Offset of PIC_STATE cmd in batch buffer 250 uint32_t m_cmd2StartInBytes = 0; 251 uint32_t m_vdencBrcInitDmemBufferSize = 0; //!< Offset of BRC init DMEM buffer 252 uint32_t m_vdencBrcUpdateDmemBufferSize = 0; //!< Offset of BRC update DMEM buffer 253 uint32_t m_vdencBrcConstDataBufferSize = 0; //!< Offset of BRC const data buffer 254 unsigned char m_virtualEngineBbIndex = 0; //!< Virtual engine batch buffer index 255 256 // Tile related 257 uint32_t m_maxTileNumber = 1; //!< max tile number, equal to 1 for Gen10 258 259 PCODECHAL_CMD_INITIALIZER m_hucCmdInitializer = nullptr; 260 261 MOS_RESOURCE m_resDelayMinus = {0}; 262 uint32_t m_numDelay = 0; 263 264 // Lookahead 265 MOS_RESOURCE m_vdencLaStatsBuffer; //!< VDEnc statistics buffer for lookahead 266 MOS_RESOURCE m_vdencLaDataBuffer; //!< lookahead data buffer, output of lookahead analysis 267 MOS_RESOURCE m_vdencLaInitDmemBuffer = {}; //!< VDEnc Lookahead Init DMEM buffer 268 MOS_RESOURCE m_vdencLaUpdateDmemBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM][CODECHAL_LPLA_NUM_OF_PASSES] = {}; //!< VDEnc Lookahead Update DMEM buffer 269 MOS_RESOURCE m_vdencLaHistoryBuffer = {}; //!< VDEnc lookahead history buffer 270 bool m_lookaheadPass = false; //!< Indicate if current pass is lookahead pass or encode pass 271 bool m_lookaheadInit = true; //!< Lookahead init flag 272 bool m_lookaheadReport = false; //!< Lookahead report valid flag 273 bool m_lookaheadAdaptiveI = false; //!< Adaptive I flag for lookahead 274 uint32_t m_vdencLaInitDmemBufferSize = 0; //!< Offset of Lookahead init DMEM buffer 275 uint32_t m_vdencLaUpdateDmemBufferSize = 0; //!< Offset of Lookahead update DMEM buffer 276 uint32_t m_numValidLaRecords = 0; //!< Number of valid lookahead records 277 uint32_t m_intraInterval = 0; //!< Frame count since last I frame 278 int32_t m_bufferFulnessError = 0; //!< VBV buffer fulness error between unit of bits (used by driver) and unit of frame (used by LA analsis kernel) 279 uint8_t m_cqmQpThreshold = 40; //!< QP threshold for CQM enable/disable. Used by lookahead analysis kernel. 280 HMODULE m_swLaMode = nullptr; //!< Software lookahead analysis mode 281 282 protected: 283 //! 284 //! \brief Constructor 285 //! 286 CodechalVdencHevcState(CodechalHwInterface* hwInterface, 287 CodechalDebugInterface* debugInterface, 288 PCODECHAL_STANDARD_INFO standardInfo); 289 290 public: 291 //! 292 //! \brief Destructor 293 //! ~CodechalVdencHevcState()294 virtual ~CodechalVdencHevcState() {}; 295 296 //! 297 //! \brief Setup ROI stream-in resource for BRC and ACQP mode 298 //! 299 //! \param [in,out] streamIn 300 //! Pointer to ROI stream-in resource 301 //! \param [in,out] deltaQpBuffer 302 //! Pointer to ROI DeltaQp buffer 303 //! 304 //! \return MOS_STATUS 305 //! MOS_STATUS_SUCCESS if success, else fail reason 306 //! 307 virtual MOS_STATUS SetupBRCROIStreamIn(PMOS_RESOURCE streamIn, PMOS_RESOURCE deltaQpBuffer); 308 309 //! 310 //! \brief Setup ROI stream-in resource for CQP mode 311 //! 312 //! \param [in,out] streamIn 313 //! Pointer to ROI stream-in resource 314 //! 315 //! \return MOS_STATUS 316 //! MOS_STATUS_SUCCESS if success, else fail reason 317 //! 318 virtual MOS_STATUS SetupROIStreamIn(PMOS_RESOURCE streamIn); 319 //! 320 //! \brief Setup mb Qp stream-in resource 321 //! 322 //! \param [in,out] streamIn 323 //! Pointer to mb Qp stream-in resource 324 //! 325 //! \return MOS_STATUS 326 //! MOS_STATUS_SUCCESS if success, else fail reason 327 //! 328 virtual MOS_STATUS SetupMbQpStreamIn(PMOS_RESOURCE streamIn); 329 330 //! 331 //! \brief Setup dirty rectangle stream-in resource 332 //! 333 //! \param [in,out] streamIn 334 //! Pointer to dirty rectangle stream-in resource 335 //! 336 //! \return MOS_STATUS 337 //! MOS_STATUS_SUCCESS if success, else fail reason 338 //! 339 virtual MOS_STATUS SetupDirtyRectStreamIn(PMOS_RESOURCE streamIn); 340 341 //! 342 //! \brief Prepare VDEnc stream-in data 343 //! 344 //! \return MOS_STATUS 345 //! MOS_STATUS_SUCCESS if success, else fail reason 346 //! 347 virtual MOS_STATUS PrepareVDEncStreamInData(); 348 349 //! 350 //! \brief Setup stream-in data per region 351 //! 352 //! \param [in] streamInWidth, top, bottom, left, right 353 //! streamInWidth, region corner locations, 354 //! \param [in] streaminParams 355 //! pointer to MHW_VDBOX_VDENC_STREAMIN_STATE_PARAMS 356 //! \param [out] streaminData 357 //! pointer to streaminData 358 //! 359 //! \return void 360 //! 361 virtual void SetStreaminDataPerRegion( 362 uint32_t streamInWidth, 363 uint32_t top, 364 uint32_t bottom, 365 uint32_t left, 366 uint32_t right, 367 PMHW_VDBOX_VDENC_STREAMIN_STATE_PARAMS streaminParams, 368 void* streaminData); 369 370 //! 371 //! \brief Setup stream-in data per region 372 //! 373 //! \param [in] streamInWidth, top, bottom, left, right 374 //! streamInWidth, region corner locations 375 //! \param [in] regionId 376 //! region ID 377 //! \param [out] deltaQpMap 378 //! pointer to DeltaQpForROI 379 //! 380 //! \return void 381 //! 382 virtual void SetBrcRoiDeltaQpMap( 383 uint32_t streamInWidth, 384 uint32_t top, 385 uint32_t bottom, 386 uint32_t left, 387 uint32_t right, 388 uint8_t regionId, 389 PDeltaQpForROI deltaQpMap); 390 391 //! 392 //! \brief Setup stream-in surface for a dirty rectangle 393 //! 394 //! \param [in] streamInWidth, top, bottom, left, right, maxcu 395 //! StreamInWidth, dirtyRect corner locations, maxCuSize 396 //! \param [out] streaminData 397 //! Pointer to streaminData 398 //! 399 //! \return void 400 //! 401 virtual void StreaminSetDirtyRectRegion( 402 uint32_t streamInWidth, 403 uint32_t top, 404 uint32_t bottom, 405 uint32_t left, 406 uint32_t right, 407 uint8_t maxcu, 408 void* streaminData); 409 410 //! 411 //! \brief Calculate X/Y offsets for zigzag scan within 64 LCU 412 //! 413 //! \param [in] streamInWidth 414 //! StreamInWidth, location of top left corner 415 //! \param [in] x 416 //! Position X 417 //! \param [in] y 418 //! Position Y 419 //! \param [out] offset 420 //! Offsets into the stream-in surface 421 //! \param [out] xyOffset 422 //! XY Offsets into the stream-in surface 423 //! 424 //! \return void 425 //! 426 virtual void StreaminZigZagToLinearMap( 427 uint32_t streamInWidth, 428 uint32_t x, 429 uint32_t y, 430 uint32_t* offset, 431 uint32_t* xyOffset); 432 433 //! 434 //! \brief Setup stream-in for border of non-64 aligned region 435 //! 436 //! \param [in] streamInWidth, top, bottom, left, right 437 //! StreamInWidth, dirtyRect corner locations 438 //! \param [out] streaminData 439 //! Pointer to streaminData 440 //! 441 //! \return void 442 //! 443 virtual void StreaminSetBorderNon64AlignStaticRegion( 444 uint32_t streamInWidth, 445 uint32_t top, 446 uint32_t bottom, 447 uint32_t left, 448 uint32_t right, 449 void* streaminData); 450 451 //! 452 //! \brief Write out stream-in data for each LCU 453 //! 454 //! \param [in] streaminParams 455 //! Params to write into stream in surface 456 //! \param [out] streaminData 457 //! Pointer to streaminData 458 //! 459 //! \return void 460 //! SetStreaminDataPerLcu(PMHW_VDBOX_VDENC_STREAMIN_STATE_PARAMS streaminParams,void * streaminData)461 virtual void SetStreaminDataPerLcu( 462 PMHW_VDBOX_VDENC_STREAMIN_STATE_PARAMS streaminParams, 463 void* streaminData) 464 { 465 return; 466 } 467 468 //! 469 //! \brief Add commands in input SLB buffer for HuC Initializer CQP 470 //! 471 //! \param [in,out] batchBuffer 472 //! Pointer to SLB buffer which commands are added 473 //! 474 //! \return MOS_STATUS 475 //! MOS_STATUS_SUCCESS if success, else fail reason 476 //! ConstructBatchBufferHuCCQP(PMOS_RESOURCE batchBuffer)477 virtual MOS_STATUS ConstructBatchBufferHuCCQP(PMOS_RESOURCE batchBuffer) 478 { 479 return MOS_STATUS_SUCCESS; 480 } 481 482 //! 483 //! \brief Add commands in input SLB buffer for HuC BRC (including ACQP) 484 //! 485 //! \param [in,out] batchBuffer 486 //! Pointer to SLB buffer which commands are added 487 //! 488 //! \return MOS_STATUS 489 //! MOS_STATUS_SUCCESS if success, else fail reason 490 //! ConstructBatchBufferHuCBRC(PMOS_RESOURCE batchBuffer)491 virtual MOS_STATUS ConstructBatchBufferHuCBRC(PMOS_RESOURCE batchBuffer) 492 { 493 return MOS_STATUS_SUCCESS; 494 } 495 496 //! 497 //! \brief Setup DMEM for HuC BRC init/reset 498 //! 499 //! \return MOS_STATUS 500 //! MOS_STATUS_SUCCESS if success, else fail reason 501 //! SetDmemHuCBrcInitReset()502 virtual MOS_STATUS SetDmemHuCBrcInitReset() 503 { 504 return MOS_STATUS_SUCCESS; 505 } 506 507 //! 508 //! \brief Setup constant data for HuC BRC update 509 //! 510 //! \return MOS_STATUS 511 //! MOS_STATUS_SUCCESS if success, else fail reason 512 //! SetConstDataHuCBrcUpdate()513 virtual MOS_STATUS SetConstDataHuCBrcUpdate() 514 { 515 return MOS_STATUS_SUCCESS; 516 } 517 518 //! 519 //! \brief Setup DMEM for HuC BRC update 520 //! 521 //! \return MOS_STATUS 522 //! MOS_STATUS_SUCCESS if success, else fail reason 523 //! SetDmemHuCBrcUpdate()524 virtual MOS_STATUS SetDmemHuCBrcUpdate() 525 { 526 return MOS_STATUS_SUCCESS; 527 } 528 529 //! 530 //! \brief Setup Virtual Address Regions for HuC BRC update 531 //! 532 //! \param [in] virtualAddrParams 533 //! Huc Virtual Address parameters 534 //! 535 //! \return MOS_STATUS 536 //! MOS_STATUS_SUCCESS if success, else fail reason 537 //! 538 virtual MOS_STATUS SetRegionsHuCBrcUpdate(PMHW_VDBOX_HUC_VIRTUAL_ADDR_PARAMS virtualAddrParams); 539 540 // HCP/PAK functions 541 542 //! 543 //! \brief Set VDENC_PIPE_MODE_SELECT parameters 544 //! 545 //! \param [in, out] pipeModeSelectParams 546 //! Pipe mode select parameters 547 //! 548 //! \return void 549 //! 550 virtual void SetVdencPipeModeSelectParams( 551 MHW_VDBOX_PIPE_MODE_SELECT_PARAMS& pipeModeSelectParams); 552 553 //! 554 //! \brief Set VDENC_SRC_SURFACE_STATE, VDENC_REF_SURFACE_STATE and 555 //! VDENC_DS_REF_SURFACE_STATE parameters 556 //! 557 //! \param [in, out] srcSurfaceParams 558 //! Source picture surface parameters 559 //! \param [in, out] reconSurfaceParams 560 //! Recon picture surface parameters 561 //! \param [in, out] ds8xSurfaceParams 562 //! 8x Down scaled reference surface parameters 563 //! \param [in, out] ds4xSurfaceParams 564 //! 4x Down scaled reference surface parameters 565 //! 566 //! \return void 567 //! 568 virtual void SetVdencSurfaceStateParams( 569 MHW_VDBOX_SURFACE_PARAMS& srcSurfaceParams, 570 MHW_VDBOX_SURFACE_PARAMS& reconSurfaceParams, 571 MHW_VDBOX_SURFACE_PARAMS& ds8xSurfaceParams, 572 MHW_VDBOX_SURFACE_PARAMS& ds4xSurfaceParams); 573 574 //! 575 //! \brief Set VDENC_PIPE_BUF_ADDR parameters 576 //! 577 //! \param [in, out] PipeBufAddrParams 578 //! Pipe buf addr parameters 579 //! 580 //! \return void 581 //! 582 virtual void SetVdencPipeBufAddrParams( 583 MHW_VDBOX_PIPE_BUF_ADDR_PARAMS& PipeBufAddrParams); 584 585 //! 586 //! \brief Add HCP_WEIGHT_OFFSET_STATE command to command buffer 587 //! 588 //! \param [in, out] cmdBuffer 589 //! Pointer to the command buffer 590 //! \param [in] hevcSlcParams 591 //! Pointer to HEVC slice parameters 592 //! 593 //! \return MOS_STATUS 594 //! MOS_STATUS_SUCCESS if success, else fail reason 595 //! 596 virtual MOS_STATUS AddHcpWeightOffsetStateCmd( 597 PMOS_COMMAND_BUFFER cmdBuffer, 598 PCODEC_HEVC_ENCODE_SLICE_PARAMS hevcSlcParams); 599 600 //! 601 //! \brief Add VDENC_WEIGHT_OFFSET_STATE command to command buffer 602 //! 603 //! \param [in, out] cmdBuffer 604 //! Pointer to the command buffer 605 //! \param [in] hevcSlcParams 606 //! Pointer to HEVC slice parameters 607 //! 608 //! \return MOS_STATUS 609 //! MOS_STATUS_SUCCESS if success, else fail reason 610 //! 611 virtual MOS_STATUS AddVdencWeightOffsetStateCmd( 612 PMOS_COMMAND_BUFFER cmdBuffer, 613 PCODEC_HEVC_ENCODE_SLICE_PARAMS hevcSlcParams); 614 615 //! 616 //! \brief Add VDENC_WALKER_STATE commands to command buffer 617 //! 618 //! \param [in, out] cmdBuffer 619 //! Pointer to the command buffer 620 //! \param [in] params 621 //! Pointer to MHW_VDBOX_HEVC_SLICE_STATE parameters 622 //! 623 //! \return MOS_STATUS 624 //! MOS_STATUS_SUCCESS if success, else fail reason 625 //! 626 virtual MOS_STATUS AddVdencWalkerStateCmd( 627 PMOS_COMMAND_BUFFER cmdBuffer, 628 PMHW_VDBOX_HEVC_SLICE_STATE params); 629 630 //! 631 //! \brief Read stats for BRC from PAK 632 //! 633 //! \param [in] cmdBuffer 634 //! Pointer to command buffer 635 //! 636 //! \return MOS_STATUS 637 //! MOS_STATUS_SUCCESS if success, else fail reason 638 //! 639 virtual MOS_STATUS ReadBrcPakStats(PMOS_COMMAND_BUFFER cmdBuffer); 640 641 //! 642 //! \brief Read stats from VDEnc and PAK for lookahead 643 //! 644 //! \param [in] cmdBuffer 645 //! Pointer to command buffer 646 //! 647 //! \return MOS_STATUS 648 //! MOS_STATUS_SUCCESS if success, else fail reason 649 //! 650 virtual MOS_STATUS StoreLookaheadStatistics(PMOS_COMMAND_BUFFER cmdBuffer); 651 652 //! 653 //! \brief Read stats from VDEnc for lookahead 654 //! 655 //! \param [in] cmdBuffer 656 //! Pointer to command buffer 657 //! 658 //! \return MOS_STATUS 659 //! MOS_STATUS_SUCCESS if success, else fail reason 660 //! 661 virtual MOS_STATUS StoreVdencStatistics(PMOS_COMMAND_BUFFER cmdBuffer); 662 663 //! 664 //! \brief Read slice size info from PAK 665 //! 666 //! \param [in] cmdBuffer 667 //! Pointer to command buffer 668 //! 669 //! \return MOS_STATUS 670 //! MOS_STATUS_SUCCESS if success, else fail reason 671 //! 672 virtual MOS_STATUS ReadSliceSize(PMOS_COMMAND_BUFFER cmdBuffer); 673 674 //! \brief Copies a page aligned chunk of memory using HuC 675 //! 676 //! \param [in] cmdBuffer 677 //! Pointer to command buffer 678 //! \param [in] Source/ Dest surfaces/ offsets page aligned 679 //! Pointer to surfaces 680 //! \param [in] copySize 681 //! Size in bytes of data to be copied 682 //! 683 //! \return MOS_STATUS 684 //! MOS_STATUS_SUCCESS if success, else fail reason 685 //! 686 virtual MOS_STATUS CopyDataBlock( 687 PMOS_COMMAND_BUFFER cmdBuffer, 688 PMOS_RESOURCE sourceSurface, 689 uint32_t sourceOffset, 690 PMOS_RESOURCE destSurface, 691 uint32_t destOffset, 692 uint32_t copySize); 693 //! 694 //! \brief Get maximal number of slices allowed for specific LevelId 695 //! 696 //! \param [in] levelIdc 697 //! Level Id 698 //! 699 //! \return Maximal number of slices allowed 700 //! 701 uint32_t GetMaxAllowedSlices(uint8_t levelIdc); 702 703 //! 704 //! \brief Specify if VDEnc+PAK or Pak only pass is used 705 //! 706 //! \return void 707 //! 708 void SetPakPassType(); 709 710 //! 711 //! \brief Invoke HuC BRC init/reset 712 //! 713 //! \return MOS_STATUS 714 //! MOS_STATUS_SUCCESS if success, else fail reason 715 //! 716 virtual MOS_STATUS HuCBrcInitReset(); 717 718 //! 719 //! \brief Invoke HuC BRC update 720 //! 721 //! \return MOS_STATUS 722 //! MOS_STATUS_SUCCESS if success, else fail reason 723 //! 724 virtual MOS_STATUS HuCBrcUpdate(); 725 726 //! 727 //! \brief Use dummy stream object for HuC BRC FW. 728 //! 729 //! \param [in] cmdBuffer 730 //! Command Buffer. 731 //! 732 //! \return MOS_STATUS 733 //! MOS_STATUS_SUCCESS if success, else fail reason 734 //! 735 MOS_STATUS HuCBrcDummyStreamObject(PMOS_COMMAND_BUFFER cmdBuffer); 736 737 //! 738 //! \brief Computer QP initialization value used for BRC 739 //! 740 //! \param [out] initQPIP 741 //! QP initialization value for I/P frame 742 //! \param [out] initQPB 743 //! QP initialization value for B frame 744 //! 745 //! \return void 746 //! 747 void ComputeVDEncInitQP(int32_t& initQPIP, int32_t& initQPB); 748 749 //! 750 //! \brief Add store HUC_STATUS2 register command in the command buffer 751 //! 752 //! \param [in] cmdBuffer 753 //! Pointer to the command buffer 754 //! 755 //! \return MOS_STATUS 756 //! MOS_STATUS_SUCCESS if success, else fail reason 757 //! 758 MOS_STATUS StoreHuCStatus2Register(PMOS_COMMAND_BUFFER cmdBuffer); 759 760 //! 761 //! \brief Add store HUC_ERROR_STATUS register command in the command buffer 762 //! 763 //! \param [in] mmioRegisters 764 //! Pointer to mmio huc register 765 //! \param [in] cmdBuffer 766 //! Pointer to the command buffer 767 //! \param [in] addToEnncodeStatus 768 //! Flag to indicate whether huc error status will be stored in encode status buffer 769 //! 770 //! \return MOS_STATUS 771 //! MOS_STATUS_SUCCESS if success, else fail reason 772 //! 773 MOS_STATUS StoreHucErrorStatus(MmioRegistersHuc* mmioRegisters, PMOS_COMMAND_BUFFER cmdBuffer, bool addToEnncodeStatus); 774 775 //! 776 //! \brief Put slice level commands in command buffer 777 //! 778 //! \param [in] cmdBuffer 779 //! Pointer to command buffer 780 //! \param [in] params 781 //! Pointer to slice state parameters 782 //! 783 //! \return MOS_STATUS 784 //! MOS_STATUS_SUCCESS if success, else fail reason 785 //! 786 virtual MOS_STATUS SendHwSliceEncodeCommand(PMOS_COMMAND_BUFFER cmdBuffer, PMHW_VDBOX_HEVC_SLICE_STATE params); 787 788 //! 789 //! \brief Sort and set distinct delta QPs 790 //! 791 //! \return void 792 //! 793 virtual void ProcessRoiDeltaQp(); 794 795 //! 796 //! \brief Program streamin buffer to force all the CUs to intra 797 //! 798 //! \param [in] streamIn 799 //! Pointer to streamin buffer 800 MOS_STATUS SetupForceIntraStreamIn(PMOS_RESOURCE streamIn); 801 802 //! \brief Set VDENC StreamIn Surface for BRC Adaptive Region Boost 803 //! 804 //! \param [in] vdencStreamIn 805 //! StreamIn Surface Resource. 806 //! \param [in] boostIndex 807 //! Region index for boosting. 808 //! 809 //! \return MOS_STATUS 810 //! MOS_STATUS_SUCCESS if success, else fail reason 811 //! 812 virtual MOS_STATUS SetupRegionBoosting( 813 PMOS_RESOURCE vdencStreamIn, 814 uint16_t boostIndex); 815 816 // Inherited virtual function 817 MOS_STATUS Initialize(CodechalSetting * settings) override; 818 MOS_STATUS AllocatePakResources() override; 819 MOS_STATUS FreePakResources() override; 820 MOS_STATUS AllocateEncResources() override; 821 MOS_STATUS FreeEncResources() override; 822 MOS_STATUS AllocateBrcResources() override; 823 MOS_STATUS FreeBrcResources() override; 824 MOS_STATUS InitializePicture(const EncoderParams& params) override; 825 MOS_STATUS SetSequenceStructs() override; 826 MOS_STATUS SetPictureStructs() override; 827 MOS_STATUS CalcScaledDimensions() override; 828 MOS_STATUS ValidateRefFrameData(PCODEC_HEVC_ENCODE_SLICE_PARAMS slcParams) override; 829 MOS_STATUS ExecutePictureLevel() override; 830 MOS_STATUS ExecuteSliceLevel() override; 831 MOS_STATUS ReadHcpStatus(PMOS_COMMAND_BUFFER cmdBuffer) override; 832 MOS_STATUS UserFeatureKeyReport() override; 833 MOS_STATUS GetStatusReport( 834 EncodeStatus *encodeStatus, 835 EncodeStatusReport *encodeStatusReport) override; 836 void SetHcpSliceStateCommonParams(MHW_VDBOX_HEVC_SLICE_STATE& sliceStateParams) override; 837 MOS_STATUS AddHcpPakInsertSliceHeader( 838 PMOS_COMMAND_BUFFER cmdBuffer, 839 PMHW_BATCH_BUFFER batchBuffer, 840 PMHW_VDBOX_HEVC_SLICE_STATE params) override; 841 842 MOS_STATUS PrepareHWMetaData(PMOS_COMMAND_BUFFER cmdBuffer); 843 844 #if USE_CODECHAL_DEBUG_TOOL 845 virtual MOS_STATUS DumpHucBrcInit(); 846 virtual MOS_STATUS DumpHucBrcUpdate(bool isInput); 847 virtual MOS_STATUS DumpVdencOutputs(); 848 849 //! 850 //! \brief Modify the frame size with fake header size 851 //! 852 //! \param [in] cmdBuffer 853 //! command buffer 854 //! \param [in] fakeHeaderSizeInByte 855 //! fake header size in bytes 856 //! \param [in] resBrcUpdateCurbe 857 //! Curebe/Dmem for brcupdate kernel 858 //! \param [in] targetSizePos 859 //! offset of targetSize in resBrcUpdateCurbe 860 //! \param [in] resPakStat 861 //! Pak stastics 862 //! \param [in] slcHrdSizePos 863 //! offset of slcHrdSizePos in resPakStat 864 //! 865 //! \return MOS_STATUS 866 //! MOS_STATUS_SUCCESS if success, else fail reason 867 //! 868 MOS_STATUS ModifyEncodedFrameSizeWithFakeHeaderSize( 869 PMOS_COMMAND_BUFFER cmdBuffer, 870 uint32_t fakeHeaderSizeInByte, 871 PMOS_RESOURCE resBrcUpdateCurbe, 872 uint32_t targetSizePos, 873 PMOS_RESOURCE resPakStat, 874 uint32_t slcHrdSizePos); 875 #endif 876 877 }; 878 879 //! typedef of class CodechalVdencHevcState* 880 using PCODECHAL_VDENC_HEVC_STATE = class CodechalVdencHevcState*; 881 882 #endif // __CODECHAL_VDENC_HEVC_H__ 883