| /* |
| * Copyright (c) 2017-2018, Intel Corporation |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included |
| * in all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR |
| * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
| * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
| * OTHER DEALINGS IN THE SOFTWARE. |
| */ |
| //! |
| //! \file codechal_huc_cmd_initializer.h |
| //! \brief Defines base class for HUC cmd initializer encoder. |
| //! |
| |
| #ifndef __CODECHAL_CMD_INITIALIZER_H__ |
| #define __CODECHAL_CMD_INITIALIZER_H__ |
| |
| #if defined (_HEVC_ENCODE_VME_SUPPORTED) || defined (_HEVC_ENCODE_VDENC_SUPPORTED) |
| #include "codechal_encode_hevc_base.h" |
| #endif |
| #include "codechal_encoder_base.h" |
| |
| #ifdef _VP9_ENCODE_VDENC_SUPPORTED |
| class CodechalVdencVp9State; |
| #endif |
| |
| // Command initializer command |
| typedef enum _CODECHAL_CMD_INITIALIZER_CMDTYPE |
| { |
| CODECHAL_CMD1 = 1, |
| CODECHAL_CMD2 = 2, |
| CODECHAL_CMD3 = 3, |
| CODECHAL_CMD5 = 5, |
| } CODECHAL_CMD_INITIALIZER_CMDTYPE; |
| |
| //! |
| //! \struct HucComDmem |
| //! \brief The struct of Huc Com Dmem |
| //! |
| struct HucComDmem |
| { |
| uint32_t OutputSize; //!< Total size in byte of the Output SLB |
| uint32_t TotalOutputCommands; //!< Total Commands in the output SLB |
| uint8_t TargetUsage; //!< TU number |
| uint8_t Codec; //!< 0-HEVC VDEnc; 1-VP9 VDEnc; 2-AVC VDEnc |
| uint8_t FrameType; //!< 0-I Frame; 1-P Frame; 2-B Frame |
| uint8_t Reserved[37]; |
| struct |
| { |
| uint16_t StartInBytes; //!< Command starts offset in bytes in Output SLB |
| uint8_t ID; //!< Command ID |
| uint8_t Type; //!< Command Type |
| uint32_t BBEnd; |
| } OutputCOM[50]; |
| }; |
| |
| //! |
| //! \struct HucComData |
| //! \brief The struct of Huc commands data |
| //! |
| struct HucComData |
| { |
| uint32_t TotalCommands; //!< Total Commands in the Data buffer |
| struct |
| { |
| uint16_t ID; //!< Command ID, defined and order must be same as that in DMEM |
| uint16_t SizeOfData; //!< data size in uint32_t |
| uint32_t data[40]; |
| } InputCOM[50]; |
| }; |
| |
| //! |
| //! \struct HucInputCmd1 |
| //! \brief The struct of Huc input command 1 |
| //! |
| struct HucInputCmd1 |
| { |
| // Shared |
| uint32_t FrameWidthInMinCbMinus1; |
| |
| uint32_t FrameHeightInMinCbMinus1; |
| |
| uint32_t log2_min_coding_block_size_minus3; |
| |
| uint8_t VdencStreamInEnabled; |
| uint8_t PakOnlyMultipassEnable; |
| uint16_t num_ref_idx_l0_active_minus1; |
| |
| uint16_t SADQPLambda; |
| uint16_t RDQPLambda; |
| |
| // HEVC |
| uint16_t num_ref_idx_l1_active_minus1; |
| uint8_t RSVD0; |
| uint8_t ROIStreamInEnabled; |
| |
| int8_t ROIDeltaQp[8]; // [-3..3] or [-51..51] |
| |
| uint8_t FwdPocNumForRefId0inL0; |
| uint8_t FwdPocNumForRefId0inL1; |
| uint8_t FwdPocNumForRefId1inL0; |
| uint8_t FwdPocNumForRefId1inL1; |
| |
| uint8_t FwdPocNumForRefId2inL0; |
| uint8_t FwdPocNumForRefId2inL1; |
| uint8_t FwdPocNumForRefId3inL0; |
| uint8_t FwdPocNumForRefId3inL1; |
| |
| uint8_t EnableRollingIntraRefresh; |
| int8_t QpDeltaForInsertedIntra; |
| uint16_t IntraInsertionSize; |
| |
| uint32_t IntraInsertionReferenceLocation[3]; |
| |
| uint16_t IntraInsertionLocation; |
| int8_t QpY; |
| uint8_t RoundingEnabled; |
| |
| uint8_t UseDefaultQpDeltas; |
| uint8_t PanicEnabled; |
| uint8_t TemporalMvpEnableFlag; |
| uint8_t RSVD[1]; |
| |
| // VP9 |
| uint16_t SrcFrameWidthMinus1; |
| uint16_t SrcFrameHeightMinus1; |
| |
| uint8_t SegmentationEnabled; |
| uint8_t PrevFrameSegEnabled; |
| uint8_t SegMapStreamInEnabled; |
| uint8_t LumaACQIndex; |
| |
| int8_t LumaDCQIndexDelta; |
| uint8_t RESERVED[3]; |
| |
| int16_t SegmentQIndexDelta[8]; |
| }; |
| |
| //! |
| //! \struct HucInputCmd2 |
| //! \brief The struct of Huc input command 2 |
| //! |
| struct HucInputCmd2 |
| { |
| uint32_t SADQPLambda; |
| uint8_t RoiEnabled; |
| uint8_t RSVD[3]; |
| }; |
| |
| #ifdef _VP9_ENCODE_VDENC_SUPPORTED |
| //! |
| //! \struct Vp9CmdInitializerParams |
| //! \brief VP9 Params struct for huc initializer |
| //! |
| struct Vp9CmdInitializerParams |
| { |
| uint8_t vdencMvCosts[12] = { 0 }; |
| uint8_t vdencRdMvCosts[12] = { 0 }; |
| uint8_t vdencHmeMvCosts[8] = { 0 }; |
| uint8_t vdencModeCosts[CODEC_VDENC_NUM_MODE_COST] = { 0 }; |
| |
| uint16_t pictureCodingType; |
| |
| PCODEC_VP9_ENCODE_SEQUENCE_PARAMS seqParams; |
| PCODEC_VP9_ENCODE_PIC_PARAMS picParams; |
| bool segmentationEnabled; |
| bool segmentMapProvided; |
| PCODEC_VP9_ENCODE_SEGMENT_PARAMS segmentParams; |
| bool prevFrameSegEnabled; |
| uint8_t numRefFrames; |
| bool me16Enabled; |
| uint8_t dysRefFrameFlags; |
| bool dysVdencMultiPassEnabled; |
| int currentPass; |
| bool singleTaskPhaseSupported; |
| bool lastTaskInPhase; |
| bool firstTaskInPhase; |
| uint32_t mode; |
| bool videoContextUsesNullHw; |
| CodechalDebugInterface* debugInterface; |
| bool dynamicScalingEnabled; |
| bool bPrevFrameKey; |
| // Common |
| uint16_t sadQpLambda; |
| uint16_t rdQpLambda; |
| bool vdencPakOnlyMultipassEnabled; |
| |
| }; |
| #endif |
| |
| //! |
| //! \class CodechalCmdInitializer |
| //! \brief Command Initializer class |
| //! |
| class CodechalCmdInitializer |
| { |
| public: |
| static constexpr uint32_t m_hucCmdInitializerKernelDescriptor = 14; //!< VDBox Huc cmd initializer kernel descriptoer |
| |
| bool m_pakOnlyPass = false; |
| bool m_acqpEnabled = false; |
| bool m_brcEnabled = false; |
| bool m_streamInEnabled = false; |
| bool m_roundingEnabled = false; |
| bool m_panicEnabled = false; |
| bool m_roiStreamInEnabled = false; |
| bool m_brcAdaptiveRegionBoostEnabled = false; |
| int32_t m_currentPass = 0; |
| int32_t m_cmdCount = 0 ; |
| |
| CodechalEncoderState *m_encoder = nullptr; //!< Pointer to ENCODER base class |
| MOS_INTERFACE *m_osInterface = nullptr; //!< OS interface |
| MhwMiInterface *m_miInterface = nullptr; //!< Common Mi Interface |
| MhwVdboxVdencInterface *m_vdencInterface = nullptr; |
| void* m_picParams = nullptr; //!< Pointer to picture parameter |
| void* m_seqParams = nullptr; //!< Pointer to sequence parameter |
| void* m_sliceParams = nullptr; //!< Pointer to slice parameter |
| |
| #ifdef _VP9_ENCODE_VDENC_SUPPORTED |
| //VP9 related changes |
| Vp9CmdInitializerParams m_vp9Params; |
| #endif |
| CodechalHwInterface* m_hwInterface = nullptr; |
| MOS_RESOURCE m_cmdInitializerDmemBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM][3]; |
| MOS_RESOURCE m_cmdInitializerDataBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM][3]; |
| MOS_RESOURCE m_cmdInitializerDysScalingDmemBuffer = {0}; |
| MOS_RESOURCE m_cmdInitializerDysScalingDataBuffer = {0}; |
| |
| static constexpr uint32_t CODECHAL_CMD1_SIZE = 120; |
| static constexpr uint32_t CODECHAL_CMD2_SIZE = 148; |
| |
| bool m_hevcVisualQualityImprovementEnableFlag = false; //!< VQI enable flag |
| |
| public: |
| //! |
| //! \brief Constructor |
| //! |
| |
| CodechalCmdInitializer(CodechalEncoderState *encoder); |
| |
| //! |
| //! \brief Default Constructor |
| //! |
| CodechalCmdInitializer() {}; |
| //! |
| |
| //! |
| //! \brief Destructor |
| //! |
| virtual ~CodechalCmdInitializer() {}; |
| |
| //! |
| //! \brief Free Resources |
| //! |
| virtual void CmdInitializerFreeResources(); |
| |
| //! |
| //! \brief Allocate resources for VP9 |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS CmdInitializerAllocateResources(CodechalHwInterface* m_hwInterface); |
| |
| //! |
| //! \brief Set all the data of the InputCom of command initializer HuC FW |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS CmdInitializerSetConstData( |
| PMOS_INTERFACE osInterface, |
| MhwMiInterface *miInterface, |
| MhwVdboxVdencInterface *vdencInterface, |
| void* seqParams, |
| void* picParams, |
| void* sliceParams, |
| bool pakOnlyPass, |
| bool acqpEnabled, |
| bool brcEnabled, |
| bool streaminEnabled, |
| bool roiStreamInEnabled, |
| bool brcAdaptiveRegionBoostEnable, |
| bool roundingEnabled, |
| bool panicEnabled, |
| int32_t currentPass |
| ); |
| |
| //! |
| //! \brief Set DMEM of command initializer HuC FW |
| //! |
| //! \param [in] brcEnabled |
| //! Indicate if brc is enabled |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS CmdInitializerSetDmem(bool brcEnabled); |
| |
| //! |
| //! \brief Executes command initializer HuC FW |
| //! |
| //! \param [in] brcEnabled |
| //! Indicate if brc is enabled |
| //! \param [in] secondlevelBB |
| //! Second level batch buffer |
| //! \param [in] cmdBuffer |
| //! cmdBuffer provided by outside |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS CmdInitializerExecute( |
| bool brcEnabled, |
| PMOS_RESOURCE secondlevelBB, |
| MOS_COMMAND_BUFFER* cmdBuffer = nullptr); |
| |
| //! |
| //! \brief Set Add Commands to BatchBuffer |
| //! |
| //! \param [in] commandtype |
| //! Command type, type 1 or type 2 command |
| //! \param [in] cmdBuffer |
| //! Command buffer |
| //! \param [in] addToBatchBufferHuCBRC |
| //! Flag to mention if the scenario is BRC or CQP |
| //! \param [in] isLowDelayB |
| //! Flag to indicate if it is LDB or not |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS SetAddCommands(uint32_t commandtype, PMOS_COMMAND_BUFFER cmdBuffer, bool addToBatchBufferHuCBRC, uint32_t roundInterValue, uint32_t roundIntraValue, bool isLowDelayB = true, int8_t * pRefIdxMapping = nullptr, int8_t recNotFilteredID = 0) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| return eStatus; |
| } |
| #ifdef _VP9_ENCODE_VDENC_SUPPORTED |
| //! |
| //! \brief Set all const VP9 data of the InputCom of command initializer HuC FW |
| //! |
| //! \param [in] state |
| //! Pointer to CodechalVdencVp9State |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS CommandInitializerSetVp9Params(CodechalVdencVp9State *state); |
| |
| //! |
| //! \brief Set DMEM of command initializer HuC FW for VP9 |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS CmdInitializerVp9SetDmem(); |
| |
| //! |
| //! \brief Executes VP9 command initializer HuC FW |
| //! |
| //! \param [in] cmdBuffer |
| //! Command buffer |
| //! \param [in] picStateBuffer |
| //! Picture state buffer |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS CmdInitializerVp9Execute(PMOS_COMMAND_BUFFER cmdBuffer, PMOS_RESOURCE picStateBuffer); |
| |
| //! |
| //! \brief Set Add Commands to BatchBuffer for VP9 |
| //! |
| //! \param [in] commandtype |
| //! Command type, type 1 or type 2 command |
| //! [in] cmdBuffer |
| //! Command buffer |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS AddCommandsVp9(uint32_t commandtype, PMOS_COMMAND_BUFFER cmdBuffer) |
| { |
| return MOS_STATUS_SUCCESS; |
| } |
| #endif |
| #if USE_CODECHAL_DEBUG_TOOL |
| //! |
| //! \brief Dump HuC Cmd Initializer |
| //! |
| //! \param [in] secondlevelBB |
| //! Kernel output commands is stored in secondlevelBB |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS DumpHucCmdInit(PMOS_RESOURCE secondlevelBB); |
| #endif |
| |
| protected: |
| #if defined (_HEVC_ENCODE_VME_SUPPORTED) || defined (_HEVC_ENCODE_VDENC_SUPPORTED) |
| virtual MOS_STATUS ConstructHevcHucCmd1ConstData( |
| PCODEC_HEVC_ENCODE_SEQUENCE_PARAMS seqParams, |
| PCODEC_HEVC_ENCODE_PICTURE_PARAMS picParams, |
| PCODEC_HEVC_ENCODE_SLICE_PARAMS sliceParams, |
| struct HucComData * hucConstData); |
| |
| virtual MOS_STATUS ConstructHevcHucCmd2ConstData( |
| PCODEC_HEVC_ENCODE_SEQUENCE_PARAMS seqParams, |
| PCODEC_HEVC_ENCODE_PICTURE_PARAMS picParams, |
| PCODEC_HEVC_ENCODE_SLICE_PARAMS sliceParams, |
| struct HucComData * hucConstData); |
| |
| virtual uint16_t GetCmd1StartOffset(bool brcEnabled); |
| virtual uint16_t GetCmd2StartOffset(bool brcEnabled); |
| #endif |
| }; |
| using PCODECHAL_CMD_INITIALIZER = class CodechalCmdInitializer*; |
| |
| #endif //__CODECHAL_CMD_INITIALIZER_H__ |