blob: 8e2d584c198a6978e3fb85bddcf33b71f6393cf8 [file] [log] [blame]
/*
* Copyright (c) 2014-2020, 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 mhw_vdbox_hcp_interface.h
//! \brief MHW interface for constructing HCP commands for the Vdbox engine
//! \details Defines the interfaces for constructing MHW Vdbox HCP commands across all platforms
//!
#ifndef _MHW_VDBOX_HCP_INTERFACE_H_
#define _MHW_VDBOX_HCP_INTERFACE_H_
#include "mhw_vdbox.h"
#include "mhw_mi.h"
#include "codec_def_encode_hevc.h"
#define MHW_HCP_WORST_CASE_LCU_CU_TU_INFO (26 * MHW_CACHELINE_SIZE) // 18+4+4
#define MHW_HCP_WORST_CASE_LCU_CU_TU_INFO_REXT (35 * MHW_CACHELINE_SIZE) // 27+4+4
#define MHW_HCP_WORST_CASE_CU_TU_INFO (4 * MHW_CACHELINE_SIZE) // 2+1+1
#define MHW_HCP_WORST_CASE_CU_TU_INFO_REXT (6 * MHW_CACHELINE_SIZE) // 4+1+1
struct MHW_VDBOX_HEVC_PIC_STATE
{
// Decode
PCODEC_HEVC_PIC_PARAMS pHevcPicParams = nullptr;
// Encode
PCODEC_HEVC_ENCODE_SEQUENCE_PARAMS pHevcEncSeqParams = nullptr;
PCODEC_HEVC_ENCODE_PICTURE_PARAMS pHevcEncPicParams = nullptr;
bool bSAOEnable = false;
bool bNotFirstPass = false;
bool bHevcRdoqEnabled = false;
bool bUseVDEnc = false;
bool sseEnabledInVmeEncode = false;
PMHW_BATCH_BUFFER pBatchBuffer = nullptr;
bool bBatchBufferInUse = false;
bool bRDOQIntraTUDisable = false;
uint16_t wRDOQIntraTUThreshold = 0;
uint32_t brcNumPakPasses = 0;
bool rhodomainRCEnable = false;
bool bTransformSkipEnable = false;
//FEI multiple passes PAK ---max frame size
uint16_t currPass = 0;
uint8_t *deltaQp = nullptr;
uint32_t maxFrameSize = 0;
virtual ~MHW_VDBOX_HEVC_PIC_STATE(){}
};
using PMHW_VDBOX_HEVC_PIC_STATE = MHW_VDBOX_HEVC_PIC_STATE * ;
typedef struct _MHW_VDBOX_HEVC_TILE_STATE
{
PCODEC_HEVC_PIC_PARAMS pHevcPicParams;
uint16_t *pTileColWidth;
uint16_t *pTileRowHeight;
} MHW_VDBOX_HEVC_TILE_STATE, *PMHW_VDBOX_HEVC_TILE_STATE;
typedef struct _MHW_VDBOX_HCP_BUFFER_SIZE_PARAMS
{
uint8_t ucMaxBitDepth;
uint8_t ucChromaFormat;
uint32_t dwCtbLog2SizeY;
uint32_t dwPicWidth;
uint32_t dwPicHeight;
uint32_t dwBufferSize;
uint32_t dwMaxFrameSize;
}MHW_VDBOX_HCP_BUFFER_SIZE_PARAMS, *PMHW_VDBOX_HCP_BUFFER_SIZE_PARAMS;
typedef struct _MHW_VDBOX_HCP_BUFFER_REALLOC_PARAMS
{
uint8_t ucMaxBitDepth;
uint8_t ucChromaFormat;
uint32_t dwPicWidth;
uint32_t dwPicHeight;
uint32_t dwPicWidthAlloced;
uint32_t dwPicHeightAlloced;
uint32_t dwCtbLog2SizeY;
uint32_t dwCtbLog2SizeYMax;
uint32_t dwFrameSize;
uint32_t dwFrameSizeAlloced;
bool bNeedBiggerSize;
}MHW_VDBOX_HCP_BUFFER_REALLOC_PARAMS, *PMHW_VDBOX_HCP_BUFFER_REALLOC_PARAMS;
struct MHW_VDBOX_HEVC_REF_IDX_PARAMS
{
CODEC_PICTURE CurrPic = {};
bool isEncode = false;
uint8_t ucList = 0;
uint8_t ucNumRefForList = 0;
CODEC_PICTURE RefPicList[2][CODEC_MAX_NUM_REF_FRAME_HEVC] = {};
void **hevcRefList = nullptr;
int32_t poc_curr_pic = 0;
int32_t poc_list[CODEC_MAX_NUM_REF_FRAME_HEVC] = {};
int8_t *pRefIdxMapping = 0;
uint16_t RefFieldPicFlag = 0;
uint16_t RefBottomFieldFlag = 0;
bool bDummyReference = false;
virtual ~MHW_VDBOX_HEVC_REF_IDX_PARAMS(){}
};
using PMHW_VDBOX_HEVC_REF_IDX_PARAMS = MHW_VDBOX_HEVC_REF_IDX_PARAMS * ;
typedef struct _MHW_VDBOX_HEVC_WEIGHTOFFSET_PARAMS
{
uint8_t ucList;
char LumaWeights[2][15];
int16_t LumaOffsets[2][15];
char ChromaWeights[2][15][2];
int16_t ChromaOffsets[2][15][2];
} MHW_VDBOX_HEVC_WEIGHTOFFSET_PARAMS, *PMHW_VDBOX_HEVC_WEIGHTOFFSET_PARAMS;
typedef struct _MHW_VDBOX_ENCODE_HEVC_TRANSFORM_SKIP_PARAMS
{
bool Transformskip_enabled;
uint16_t Transformskip_lambda;
uint8_t Transformskip_Numzerocoeffs_Factor0;
uint8_t Transformskip_Numnonzerocoeffs_Factor0;
uint8_t Transformskip_Numzerocoeffs_Factor1;
uint8_t Transformskip_Numnonzerocoeffs_Factor1;
}MHW_VDBOX_ENCODE_HEVC_TRANSFORM_SKIP_PARAMS, *PMHW_VDBOX_ENCODE_HEVC_TRANSFORM_SKIP_PARAMS;
struct MHW_VDBOX_HEVC_SLICE_STATE
{
PCODEC_PIC_ID pHevcPicIdx = nullptr;
PMOS_RESOURCE presDataBuffer = nullptr;
uint32_t dwDataBufferOffset = 0;
uint32_t dwOffset = 0;
uint32_t dwLength = 0;
uint32_t dwSliceIndex = 0;
bool bLastSlice = false;
bool bLastSliceInTile = false;
bool bLastSliceInTileColumn = false;
bool bHucStreamOut = false;
int8_t *pRefIdxMapping = nullptr;
bool bSaoLumaFlag = false;
bool bSaoChromaFlag = false;
PCODEC_HEVC_SLICE_PARAMS pHevcSliceParams = nullptr;
PCODEC_HEVC_PIC_PARAMS pHevcPicParams = nullptr;
// Encoding Only
PCODEC_HEVC_ENCODE_SEQUENCE_PARAMS pEncodeHevcSeqParams = nullptr;
PCODEC_HEVC_ENCODE_PICTURE_PARAMS pEncodeHevcPicParams = nullptr;
PCODEC_HEVC_ENCODE_SLICE_PARAMS pEncodeHevcSliceParams = nullptr;
PBSBuffer pBsBuffer = nullptr;
PCODECHAL_NAL_UNIT_PARAMS *ppNalUnitParams = nullptr;
bool bFirstPass = false;
bool bLastPass = false;
bool bIntraRefFetchDisable = false;
bool bBrcEnabled = false;
uint32_t dwHeaderBytesInserted = 0;
uint32_t dwHeaderDummyBytes = 0;
uint32_t uiSkipEmulationCheckCount = 0;
bool bInsertBeforeSliceHeaders = false;
bool bIsLowDelay = false;
// Encoding + BRC only
PMHW_BATCH_BUFFER pBatchBufferForPakSlices = nullptr;
bool bSingleTaskPhaseSupported = false;
uint32_t dwBatchBufferForPakSlicesStartOffset = 0;
bool bVdencInUse = false;
bool bVdencHucInUse = false;
bool bWeightedPredInUse = false;
PMHW_BATCH_BUFFER pVdencBatchBuffer = nullptr;
//Pak related params
MHW_VDBOX_ENCODE_HEVC_TRANSFORM_SKIP_PARAMS EncodeHevcTransformSkipParams = {};
bool DeblockingFilterDisable = false;
char TcOffsetDiv2 = 0;
char BetaOffsetDiv2 = 0;
uint8_t RoundingIntra = 0;
uint8_t RoundingInter = 0;
virtual ~MHW_VDBOX_HEVC_SLICE_STATE(){}
};
using PMHW_VDBOX_HEVC_SLICE_STATE = MHW_VDBOX_HEVC_SLICE_STATE * ;
typedef struct _MHW_VDBOX_VP9_ENCODE_PIC_STATE
{
PCODEC_VP9_ENCODE_PIC_PARAMS pVp9PicParams;
PCODEC_REF_LIST *ppVp9RefList;
PCODEC_VP9_ENCODE_SEQUENCE_PARAMS pVp9SeqParams;
union
{
struct
{
uint8_t KeyFrame : 1; // [0..1]
uint8_t IntraOnly : 1; // [0..1]
uint8_t Display : 1; // [0..1]
uint8_t ReservedField : 5; // [0]
} fields;
uint8_t value;
} PrevFrameParams;
uint32_t dwPrevFrmWidth;
uint32_t dwPrevFrmHeight;
uint8_t ucTxMode;
bool bUseDysRefSurface;
bool bNonFirstPassFlag;
bool bSSEEnable;
bool bVdencPakOnlyPassFlag;
uint32_t uiMaxBitRate;
uint32_t uiMinBitRate;
} MHW_VDBOX_VP9_ENCODE_PIC_STATE, *PMHW_VDBOX_VP9_ENCODE_PIC_STATE;
typedef struct _MHW_VDBOX_VP9_PIC_STATE
{
// Decode
PCODEC_VP9_PIC_PARAMS pVp9PicParams;
PCODEC_REF_LIST *ppVp9RefList;
union
{
struct
{
uint8_t KeyFrame : 1; // [0..1]
uint8_t IntraOnly : 1; // [0..1]
uint8_t Display : 1; // [0..1]
uint8_t ReservedField : 5; // [0]
} fields;
uint8_t value;
} PrevFrameParams;
uint32_t dwPrevFrmWidth;
uint32_t dwPrevFrmHeight;
} MHW_VDBOX_VP9_PIC_STATE, *PMHW_VDBOX_VP9_PIC_STATE;
typedef struct _MHW_VDBOX_IMAGE_STATUS_CONTROL
{
union
{
struct
{
uint32_t MaxMbConformanceFlag : 1;
uint32_t FrameBitcountFlag : 1;
uint32_t Panic : 1;
uint32_t MissingHuffmanCode : 1; // new addition for JPEG encode
uint32_t : 4;
uint32_t TotalNumPass : 4;
uint32_t VDENCSliceOverflowErrorOccurred : 1;
uint32_t NumPassPolarityChange : 2;
uint32_t CumulativeSliceQpPolarityChange : 1;
uint32_t SuggestedSliceQPDelta : 8;
uint32_t CumulativeSliceDeltaQP : 8;
};
struct
{
uint32_t hcpLCUMaxSizeViolate : 1;
uint32_t hcpFrameBitCountViolateOverRun : 1;
uint32_t hcpFrameBitCountViolateUnderRun : 1;
uint32_t : 5;
uint32_t hcpTotalPass : 4;
uint32_t : 4;
uint32_t hcpCumulativeFrameDeltaLF : 7;
uint32_t : 1;
uint32_t hcpCumulativeFrameDeltaQp : 8;
};
struct
{
uint32_t Value;
};
};
}MHW_VDBOX_IMAGE_STATUS_CONTROL, *PMHW_VDBOX_IMAGE_STATUS_CONTROL;
typedef struct _MHW_VDBOX_PAK_NUM_OF_SLICES
{
// Num Slices
union
{
struct
{
uint32_t NumberOfSlices : 16;
uint32_t Reserved : 16;
};
struct
{
uint32_t Value;
};
};
}MHW_VDBOX_PAK_NUM_OF_SLICES, *PMHW_VDBOX_PAK_NUM_OF_SLICES;
// definition for HEVC/VP9 internal buffer type
typedef enum _MHW_VDBOX_HCP_INTERNAL_BUFFER_TYPE
{
MHW_VDBOX_HCP_INTERNAL_BUFFER_DBLK_LINE = 0x0,
MHW_VDBOX_HCP_INTERNAL_BUFFER_DBLK_TILE_LINE,
MHW_VDBOX_HCP_INTERNAL_BUFFER_DBLK_TILE_COL,
MHW_VDBOX_HCP_INTERNAL_BUFFER_MV_UP_RT_COL,
MHW_VDBOX_HCP_INTERNAL_BUFFER_META_LINE,
MHW_VDBOX_HCP_INTERNAL_BUFFER_META_TILE_LINE,
MHW_VDBOX_HCP_INTERNAL_BUFFER_META_TILE_COL,
MHW_VDBOX_HCP_INTERNAL_BUFFER_TR_NBR,
MHW_VDBOX_HCP_INTERNAL_BUFFER_SAO_LINE,
MHW_VDBOX_HCP_INTERNAL_BUFFER_SAO_TILE_LINE,
MHW_VDBOX_HCP_INTERNAL_BUFFER_SAO_TILE_COL,
MHW_VDBOX_HCP_INTERNAL_BUFFER_HSSE_RS,
MHW_VDBOX_HCP_INTERNAL_BUFFER_HSAO_RS,
MHW_VDBOX_HCP_INTERNAL_BUFFER_CURR_MV_TEMPORAL,
MHW_VDBOX_HCP_INTERNAL_BUFFER_COLL_MV_TEMPORAL,
MHW_VDBOX_HCP_INTERNAL_BUFFER_SLC_STATE_STREAMOUT,
MHW_VDBOX_HCP_INTERNAL_BUFFER_CABAC_STREAMOUT,
MHW_VDBOX_HCP_INTERNAL_BUFFER_MV_UP_RIGHT_COL,
MHW_VDBOX_HCP_INTERNAL_BUFFER_INTRA_PRED_UP_RIGHT_COL,
MHW_VDBOX_HCP_INTERNAL_BUFFER_INTRA_PRED_LFT_RECON_COL,
MHW_VDBOX_VP9_INTERNAL_BUFFER_SEGMENT_ID,
MHW_VDBOX_VP9_INTERNAL_BUFFER_HVD_LINE,
MHW_VDBOX_VP9_INTERNAL_BUFFER_HVD_TILE
} MHW_VDBOX_HCP_INTERNAL_BUFFER_TYPE;
//! MHW Vdbox Hcp interface
/*!
This class defines the interfaces for constructing Vdbox Hcp commands across all platforms
*/
class MhwVdboxHcpInterface
{
public:
//!
//! \enum HevcSliceType
//! \brief HEVC slice type
//!
enum HevcSliceType
{
hevcSliceB = 0,
hevcSliceP = 1,
hevcSliceI = 2
};
protected:
PMOS_INTERFACE m_osInterface = nullptr; //!< Pointer to OS interface
MhwMiInterface *m_miInterface = nullptr; //!< Pointer to MI interface
MhwCpInterface *m_cpInterface = nullptr; //!< Pointer to CP interface
MEDIA_FEATURE_TABLE *m_skuTable = nullptr; //!< Pointer to SKU table
MEDIA_WA_TABLE *m_waTable = nullptr; //!< Pointer to WA table
bool m_decodeInUse = false; //!< Flag to indicate if the interface is for decoder or encoder use
MHW_MEMORY_OBJECT_CONTROL_PARAMS m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_END_CODEC] = {}; //!< Cacheability settings
bool m_rhoDomainStatsEnabled = false; //!< Flag to indicate if Rho domain stats is enabled
bool m_rowstoreCachingSupported = false; //!< Flag to indicate if row store cache is supported
uint32_t m_brcNumPakPasses = 4; //!< Number of brc pak passes
MHW_VDBOX_ROWSTORE_CACHE m_hevcDatRowStoreCache = {};
MHW_VDBOX_ROWSTORE_CACHE m_hevcDfRowStoreCache = {};
MHW_VDBOX_ROWSTORE_CACHE m_hevcSaoRowStoreCache = {};
MHW_VDBOX_ROWSTORE_CACHE m_hevcHSaoRowStoreCache = {};
MHW_VDBOX_ROWSTORE_CACHE m_vp9HvdRowStoreCache = {};
MHW_VDBOX_ROWSTORE_CACHE m_vp9DfRowStoreCache = {};
MHW_VDBOX_ROWSTORE_CACHE m_vp9DatRowStoreCache = {};
uint32_t m_hevcEncCuRecordSize = 0; //!< size of hevc enc cu record
uint32_t m_pakHWTileSizeRecordSize = 0; //! pak HW tile size recored size
static const uint32_t m_timeStampCountsPerMillisecond = (12000048 / 1000); //<! Time stamp coounts per millisecond
static const uint32_t m_hcpCabacErrorFlagsMask = 0x0879; //<! Hcp CABAC error flags mask
MmioRegistersHcp m_mmioRegisters[MHW_VDBOX_NODE_MAX] = {}; //!< hcp mmio registers
static const HevcSliceType m_hevcBsdSliceType[3]; //!< HEVC Slice Types for Long Format
//!
//! \brief Constructor
//!
MhwVdboxHcpInterface(
PMOS_INTERFACE osInterface,
MhwMiInterface *miInterface,
MhwCpInterface *cpInterface,
bool decodeInUse);
//!
//! \brief Add a resource to the command buffer
//! \details Internal function to add either a graphics address of a resource or
//! add the resource to the patch list for the requested buffer
//!
//! \param [in] osInterface
//! OS interface
//! \param [in] cmdBuffer
//! Command buffer to which resource is added
//! \param [in] params
//! Parameters necessary to add the resource
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS(*pfnAddResourceToCmd) (
PMOS_INTERFACE osInterface,
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_RESOURCE_PARAMS params);
//!
//! \brief Convert to Sign Magnitude
//! \details Implementation of signed bitfield as specified
//!
//! \param [in] val
//! Input value to calculate
//! \param [in] signBitPos
//! The position of sign bit
//!
//! \return uint16_t
//! value calculated
//!
uint16_t Convert2SignMagnitude(
int32_t val,
uint32_t signBitPos);
public:
//!
//! \brief Destructor
//!
virtual ~MhwVdboxHcpInterface() {}
//!
//! \brief Get OS interface
//!
//! \return [out] PMOS_INTERFACE
//! Pointer to the OS interface.
//!
inline PMOS_INTERFACE GetOsInterface()
{
return m_osInterface;
}
//!
//! \brief Get mmio registers
//!
//! \param [in] index
//! mmio registers index.
//!
//! \return [out] MmioRegistersHcp*
//! mmio registers got.
//!
inline MmioRegistersHcp* GetMmioRegisters(MHW_VDBOX_NODE_IND index)
{
if (index < MHW_VDBOX_NODE_MAX)
{
return &m_mmioRegisters[index];
}
else
{
MHW_ASSERT("index is out of range!");
return &m_mmioRegisters[MHW_VDBOX_NODE_1];
}
}
//!
//! \brief Get Hcp Cabac Error Flags Mask
//!
//! \return [out] uint32_t
//! Mask got.
//!
virtual inline uint32_t GetHcpCabacErrorFlagsMask()
{
return m_hcpCabacErrorFlagsMask;
}
//!
//! \brief Get Watch Dog Timer Threhold
//!
//! \return [out] uint32_t
//! Threhold got.
//!
virtual inline uint32_t GetWatchDogTimerThrehold()
{
return 0;
}
//!
//! \brief Get Time Stamp Counts Per Millisecond
//!
//! \return [out] uint32_t
//! Counts got.
//!
inline uint32_t GetTimeStampCountsPerMillisecond()
{
return m_timeStampCountsPerMillisecond;
}
//!
//! \brief Get hevc enc cu record size
//! \return [out] uint32_t
//! Brc pak passes num.
//!
inline uint32_t GetHevcEncCuRecordSize()
{
return m_hevcEncCuRecordSize;
}
//!
//! \brief Get pak HW tile size record size
//! \return [out] uint32_t
//! Brc pak passes num.
//!
inline uint32_t GetPakHWTileSizeRecordSize()
{
return m_pakHWTileSizeRecordSize;
}
//!
//! \brief Judge if row store caching supported
//!
//! \return bool
//! true if supported, else false
//!
inline bool IsRowStoreCachingSupported()
{
return m_rowstoreCachingSupported;
}
//!
//! \brief Judge if hevc dat store caching enabled
//!
//! \return bool
//! true if enabled, else false
//!
inline bool IsHevcDatRowstoreCacheEnabled()
{
return m_hevcDatRowStoreCache.bEnabled ? true : false;
}
//!
//! \brief Judge if hevc df row store caching enabled
//!
//! \return bool
//! true if enabled, else false
//!
inline bool IsHevcDfRowstoreCacheEnabled()
{
return m_hevcDfRowStoreCache.bEnabled ? true : false;
}
//!
//! \brief Judge if hevc sao row store caching enabled
//!
//! \return bool
//! true if enabled, else false
//!
inline bool IsHevcSaoRowstoreCacheEnabled()
{
return m_hevcSaoRowStoreCache.bEnabled ? true : false;
}
//!
//! \brief Judge if vp9 hvd row store caching enabled
//!
//! \return bool
//! true if enabled, else false
//!
inline bool IsVp9HvdRowstoreCacheEnabled()
{
return m_vp9HvdRowStoreCache.bEnabled ? true : false;
}
//!
//! \brief Judge if vp9 df row store caching enabled
//!
//! \return bool
//! true if enabled, else false
//!
inline bool IsVp9DfRowstoreCacheEnabled()
{
return m_vp9DfRowStoreCache.bEnabled ? true : false;
}
//!
//! \brief Judge if vp9 dat row store caching enabled
//!
//! \return bool
//! true if enabled, else false
//!
inline bool IsVp9DatRowstoreCacheEnabled()
{
return m_vp9DatRowStoreCache.bEnabled ? true : false;
}
//!
//! \brief Set cacheability settings
//!
//! \param [in] cacheabilitySettings
//! Cacheability settings
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetCacheabilitySettings(
MHW_MEMORY_OBJECT_CONTROL_PARAMS cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_END_CODEC])
{
MHW_FUNCTION_ENTER;
uint32_t size = MOS_CODEC_RESOURCE_USAGE_END_CODEC * sizeof(MHW_MEMORY_OBJECT_CONTROL_PARAMS);
MOS_STATUS eStatus = MOS_SecureMemcpy(m_cacheabilitySettings, size,
cacheabilitySettings, size);
return eStatus;
}
//!
//! \brief Determines if the slice is P slice
//! \param [in] sliceType
//! slice type
//! \return bool
//! True if it's P slice, otherwise return false
//!
inline bool IsHevcPSlice(uint8_t sliceType)
{
return (sliceType < MHW_ARRAY_SIZE(m_hevcBsdSliceType)) ?
(m_hevcBsdSliceType[sliceType] == hevcSliceP) : false;
}
//!
//! \brief Determines if the slice is B slice
//! \param [in] sliceType
//! slice type
//! \return bool
//! True if it's B slice, otherwise return false
//!
inline bool IsHevcBSlice(uint8_t sliceType)
{
return (sliceType < MHW_ARRAY_SIZE(m_hevcBsdSliceType)) ?
(m_hevcBsdSliceType[sliceType] == hevcSliceB) : false;
}
//!
//! \brief Determines if the slice is I slice
//! \param [in] sliceType
//! slice type
//! \return bool
//! True if it's I slice, otherwise return false
//!
inline bool IsHevcISlice(uint8_t sliceType)
{
return (sliceType < MHW_ARRAY_SIZE(m_hevcBsdSliceType)) ?
(m_hevcBsdSliceType[sliceType] == hevcSliceI) : false;
}
//!
//! \brief Get pak object size
//!
//! \return uint32_t
//! The size got
//!
virtual uint32_t GetHcpPakObjSize() = 0;
//!
//! \brief Calculates the maximum size for HCP picture level commands
//! \details Client facing function to calculate the maximum size for HCP picture level commands
//! \param [in] mode
//! Indicate the codec mode
//! \param [out] commandsSize
//! The maximum command buffer size
//! \param [out] patchListSize
//! The maximum command patch list size
//! \param [in] params
//! Indicate the command size parameters
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS GetHcpStateCommandSize(
uint32_t mode,
uint32_t *commandsSize,
uint32_t *patchListSize,
PMHW_VDBOX_STATE_CMDSIZE_PARAMS params) = 0;
//!
//! \brief Calculates maximum size for HCP slice/MB level commands
//! \details Client facing function to calculate maximum size for HCP slice/MB level commands
//! \param [in] mode
//! Indicate the codec mode
//! \param [out] commandsSize
//! The maximum command buffer size
//! \param [out] patchListSize
//! The maximum command patch list size
//! \param [in] modeSpecific
//! Indicate the long or short format
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS GetHcpPrimitiveCommandSize(
uint32_t mode,
uint32_t *commandsSize,
uint32_t *patchListSize,
bool modeSpecific) = 0;
//!
//! \brief get the size of hw command
//! \details Internal function to get the size of HEVC_VP9_RDOQ_STATE_CMD
//! \return commandSize
//! The command size
//!
virtual uint32_t GetHcpHevcVp9RdoqStateCommandSize() = 0;
//!
//! \brief get the size of hw command
//! \details Internal function to get the size of HCP_VP9_PIC_STATE_CMD
//! \return commandSize
//! The command size
//!
virtual uint32_t GetHcpVp9PicStateCommandSize() = 0;
//!
//! \brief get the size of hw command
//! \details Internal function to get the size of HCP_VP9_SEGMENT_STATE_CMD
//! \return commandSize
//! The command size
//!
virtual uint32_t GetHcpVp9SegmentStateCommandSize() = 0;
//!
//! \brief Get the required buffer size for VDBOX
//! \details Internal function to get required buffer size for HEVC codec (both dual pipe and vdenc, enc and dec)
//!
//! \param [in] bufferType
//! HEVC Buffer type
//! \param [in, out] hcpBufSizeParam
//! HCP buffer size parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS GetHevcBufferSize(
MHW_VDBOX_HCP_INTERNAL_BUFFER_TYPE bufferType,
PMHW_VDBOX_HCP_BUFFER_SIZE_PARAMS hcpBufSizeParam) = 0;
//!
//! \brief Get the required buffer size for VDBOX
//! \details Internal function to get required buffer size for VP9 codec
//!
//! \param [in] bufferType
//! HEVC Buffer type
//! \param [in, out] hcpBufSizeParam
//! HCP buffer size parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS GetVp9BufferSize(
MHW_VDBOX_HCP_INTERNAL_BUFFER_TYPE bufferType,
PMHW_VDBOX_HCP_BUFFER_SIZE_PARAMS hcpBufSizeParam) = 0;
//!
//! \brief Get the required buffer size for VDBOX
//! \details Internal function to judge if buffer realloc is needed for HEVC codec
//!
//! \param [in] bufferType
//! HEVC Buffer type
//! \param [in, out] reallocParam
//! HCP Re-allocate parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS IsHevcBufferReallocNeeded(
MHW_VDBOX_HCP_INTERNAL_BUFFER_TYPE bufferType,
PMHW_VDBOX_HCP_BUFFER_REALLOC_PARAMS reallocParam) = 0;
//!
//! \brief Get the required buffer size for VDBOX
//! \details Internal function to judge if buffer realloc is needed for VP9 codec
//!
//! \param [in] bufferType
//! HEVC Buffer type
//! \param [in, out] reallocParam
//! HCP Re-allocate parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS IsVp9BufferReallocNeeded(
MHW_VDBOX_HCP_INTERNAL_BUFFER_TYPE bufferType,
PMHW_VDBOX_HCP_BUFFER_REALLOC_PARAMS reallocParam) = 0;
//!
//! \brief Adds HCP Pipe Pipe Mode Select command in command buffer
//! \details Client facing function to add HCP Pipe Mode Select command in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AddHcpSurfaceCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_SURFACE_PARAMS params);
//!
//! \brief Adds HCP slice state command in command buffer
//! \details Client facing function to add HCP slice state command in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] hevcSliceState
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AddHcpSliceStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HEVC_SLICE_STATE hevcSliceState);
//!
//! \brief Adds HCP picture State command in command buffer
//! \details Client facing function to add HCP picture State command for encode in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AddHcpPicStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HEVC_PIC_STATE params);
//!
//! \brief Adds HCP Protect State command in command buffer
//! \details Client facing function to add HCP picture State command for encode in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] hevcSliceState
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AddHcpProtectStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HEVC_SLICE_STATE hevcSliceState);
//!
//! \brief Programs base address of rowstore scratch buffers
//! \details Internal function to get base address of rowstore scratch buffers
//!
//! \param [in] rowstoreParams
//! Rowstore parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS GetRowstoreCachingAddrs(
PMHW_VDBOX_ROWSTORE_PARAMS rowstoreParams) = 0;
//!
//! \brief Adds HCP Pipe Pipe Mode Select command in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpPipeModeSelectCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_PIPE_MODE_SELECT_PARAMS params) = 0;
//!
//! \brief Adds HCP Surface State command for decode in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpDecodeSurfaceStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_SURFACE_PARAMS params) = 0;
//!
//! \brief Adds HCP Surface State command for encode in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpEncodeSurfaceStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_SURFACE_PARAMS params) = 0;
//!
//! \brief Adds HCP Pipe Buffer Address State command in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpPipeBufAddrCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_PIPE_BUF_ADDR_PARAMS params) = 0;
//!
//! \brief Adds HCP Indirect Object Base Address State command in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpIndObjBaseAddrCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS params) = 0;
//!
//! \brief Adds HCP QM State command in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpQmStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_QM_PARAMS params) = 0;
//!
//! \brief Adds HCP FQM State command in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpFqmStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_QM_PARAMS params) = 0;
//!
//! \brief Adds HCP picture State command for decode in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpDecodePicStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HEVC_PIC_STATE params) = 0;
//!
//! \brief Adds HCP picture State command for encode in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpEncodePicStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HEVC_PIC_STATE params) = 0;
//!
//! \brief Adds HCP tile State command in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpTileStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HEVC_TILE_STATE params) = 0;
//!
//! \brief Adds HCP reference frame index command in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] batchBuffer
//! Batch buffer to add to VDBOX_BUFFER_START
//! \param [in] params
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpRefIdxStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_HEVC_REF_IDX_PARAMS params) = 0;
//!
//! \brief Adds HCP weight offset state command in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] batchBuffer
//! Batch buffer to add to VDBOX_BUFFER_START
//! \param [in] params
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpWeightOffsetStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_HEVC_WEIGHTOFFSET_PARAMS params) = 0;
//!
//! \brief Adds HCP slice state command for decode in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] hevcSliceState
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpDecodeSliceStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HEVC_SLICE_STATE hevcSliceState) = 0;
//!
//! \brief Adds HCP slice state command for encode in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] hevcSliceState
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpEncodeSliceStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HEVC_SLICE_STATE hevcSliceState) = 0;
//!
//! \brief Adds HCP Protect state command for decode in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] hevcSliceState
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpDecodeProtectStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HEVC_SLICE_STATE hevcSliceState) = 0;
//!
//! \brief Adds HCP BSD object state command in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpBsdObjectCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HCP_BSD_PARAMS params) = 0;
//!
//! \brief Adds HCP Pak insert object State command foe encode in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpPakInsertObject(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_PAK_INSERT_PARAMS params) = 0;
//!
//! \brief Adds VP9 picture state command for decode in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] batchBuffer
//! Batch buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpVp9PicStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_VP9_PIC_STATE params) = 0;
//!
//! \brief Adds VP9 picture state command for encode in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] batchBuffer
//! Batch buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpVp9PicStateEncCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_VP9_ENCODE_PIC_STATE params) = 0;
//!
//! \brief Adds VP9 segment state command for decode in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] batchBuffer
//! Batch buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpVp9SegmentStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_VP9_SEGMENT_STATE params) = 0;
//!
//! \brief Adds VP9 RDOQ state command for encode in command buffer
//!
//! \param [in] cmdBuffer
//! Command buffer to which HW command is added
//! \param [in] params
//! Params structure used to populate the HW command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpHevcVp9RdoqStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_HEVC_PIC_STATE params) = 0;
//!
//! \brief Adds HEVC Brc buffer
//!
//! \param [in] hcpImgStates
//! Resource to which Brc buffer is added
//! \param [in] hevcPicState
//! Params structure used to add the Brc buffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpHevcPicBrcBuffer(
PMOS_RESOURCE hcpImgStates,
PMHW_VDBOX_HEVC_PIC_STATE hevcPicState) = 0;
//!
//! \brief Get OsResLaceOrAceOrRgbHistogramBuffer Size
//!
//! \param [in] width
//! Width of Surface
//! \param [in] height
//! Height of Surface
//! \param [out] size
//! Size of OsResLaceOrAceOrRgbHistogramBuffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS GetOsResLaceOrAceOrRgbHistogramBufferSize(
uint32_t width,
uint32_t height,
uint32_t *size) = 0;
//!
//! \brief Get OsResStatisticsOutputBuffer Size
//!
//! \param [in] width
//! Width of Surface
//! \param [in] height
//! Height of Surface
//! \param [out] size
//! Size of OsResStatisticsOutputBuffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS GetOsResStatisticsOutputBufferSize(
uint32_t width,
uint32_t height,
uint32_t *size) = 0;
};
#endif