blob: 1c5533f8eb8da5296db63f9a82e77432aab44229 [file] [log] [blame]
/*
* 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__