blob: ba48b36aadd000a0922b68c4076711903627097e [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.h
//! \brief This modules implements HW interface layer to be used on all platforms on all operating systems/DDIs, across MHW components.
//!
#ifndef _MHW_VDBOX_H_
#define _MHW_VDBOX_H_
#include "codec_def_encode_avc.h"
#include "codec_def_encode_jpeg.h"
#include "codec_def_encode_mpeg2.h"
#include "codec_def_encode_vp9.h"
#include "codec_def_decode_vp9.h"
#include "codec_def_decode_vc1.h"
#include "codec_def_decode_avc.h"
#include "codec_def_decode_hevc.h"
#include "mos_os.h"
#include "mhw_utilities.h"
#include "mhw_cp_interface.h"
#define MHW_VDBOX_VC1_BITPLANE_BUFFER_PITCH_SMALL 64
#define MHW_VDBOX_VC1_BITPLANE_BUFFER_PITCH_LARGE 128
#define MHW_VDBOX_MFX_RAW_UV_PLANE_ALIGNMENT_GEN9 4 // starting Gen9 the alignment is relaxed to 4x instead of 16x
#define MHW_VDBOX_MFX_UV_PLANE_ALIGNMENT_LEGACY 16
#define MHW_VDBOX_MFX_RECON_UV_PLANE_ALIGNMENT 16
#define MHW_VDBOX_HCP_RAW_UV_PLANE_ALIGNMENT 4 // starting Gen9 the alignment is relaxed to 4x instead of 16x
#define MHW_VDBOX_HCP_RECON_UV_PLANE_ALIGNMENT 8
#define MHW_VDBOX_PAK_BITSTREAM_OVERFLOW_SIZE 400
#define MHW_VDBOX_PAK_SLICE_HEADER_OVERFLOW_SIZE 50
#define MHW_VDBOX_VDENC_DYNAMIC_SLICE_WA_COUNT 1500
// Rowstore Cache values
#define MHW_VDBOX_PICWIDTH_1K 1024
#define MHW_VDBOX_PICWIDTH_2K 2048
#define MHW_VDBOX_PICWIDTH_3K 3072
#define MHW_VDBOX_PICWIDTH_4K 4096
#define MHW_VDBOX_PICWIDTH_8K 8192
#define INTRAROWSTORE_FRAME_FIELD_BASEADDRESS_PICWIDTH_LESS_THAN_2K 256
#define INTRAROWSTORE_FRAME_FIELD_BASEADDRESS_PICWIDTH_BETWEEN_2K_AND_3K 384
#define INTRAROWSTORE_MBAFF_BASEADDRESS_PICWIDTH_LESS_THAN_2K 512
#define INTRAROWSTORE_FRAME_FIELD_BASEADDRESS_PICWIDTH_BETWEEN_3K_AND_4K 384
#define DEBLOCKINGROWSTORE_FRAME_FIELD_BASEADDRESS_PICWIDTH_LESS_THAN_2K 384
#define BSDMPCROWSTORE_BASEADDRESS 0
#define MPRROWSTORE_FRAME_FIELD_BASEADDRESS_PICWIDTH_LESS_THAN_2K 128
#define MPRROWSTORE_FRAME_FIELD_BASEADDRESS_PICWIDTH_BETWEEN_2K_AND_3K 192
#define MPRROWSTORE_FRAME_FIELD_BASEADDRESS_PICWIDTH_GREATER_THAN_3K 256
#define MPRROWSTORE_MBAFF_BASEADDRESS_PICWIDTH_LESS_THAN_2K 256
#define VDENCROWSTORE_FRAME_BASEADDRESS_PICWIDTH_LESS_THAN_2K 128
#define VDENCROWSTORE_FRAME_BASEADDRESS_PICWIDTH_BETWEEN_2K_AND_3K 192
#define VDENCROWSTORE_FRAME_BASEADDRESS_PICWIDTH_BETWEEN_3K_AND_4K 256
#define HEVCDATROWSTORE_BASEADDRESS 0
#define HEVCDFROWSTORE_BASEADDRESS_PICWIDTH_LESS_THAN_OR_EQU_TO_2K 64
#define HEVCDFROWSTORE_BASEADDRESS_PICWIDTH_BETWEEN_2K_AND_4K 128
#define HEVCSAOROWSTORE_BASEADDRESS_PICWIDTH_LESS_THAN_OR_EQU_TO_2K 320
#define VP9HVDROWSTORE_BASEADDRESS 0
#define VP9DFROWSTORE_BASEADDRESS_PICWIDTH_LESS_THAN_OR_EQU_TO_2K 32
#define MHW_CACHELINE_SIZE 64
#define BYTES_PER_DWORD 4
#define NUM_PAK_DWS_PER_LCU 5
#define NUM_DWS_PER_CU 8
#define VP9DFROWSTORE_BASEADDRESS_8BIT_PICWIDTH_LESS_THAN_OR_EQU_TO_4K 384
#define VP9DATROWSTORE_BASEADDRESS_8BIT_PICWIDTH_LESS_THAN_OR_EQU_TO_4K 64
typedef enum _MHW_VDBOX_ADDRESS_SHIFT
{
MHW_VDBOX_SURFACE_STATE_SHIFT = 0,
MHW_VDBOX_MFX_GENERAL_STATE_SHIFT = 6,
MHW_VDBOX_HCP_GENERAL_STATE_SHIFT = 6,
MHW_VDBOX_HUC_GENERAL_STATE_SHIFT = 6,
MHW_VDBOX_MFX_UPPER_BOUND_STATE_SHIFT = 12,
MHW_VDBOX_STATE_BASE_ADDRESS_SHIFT = 12,
MHW_VDBOX_HCP_UPPER_BOUND_STATE_SHIFT = 12,
MHW_VDBOX_HUC_UPPER_BOUND_STATE_SHIFT = 12,
MHW_VDBOX_HUC_IMEM_STATE_SHIFT = 15,
MHW_VDBOX_HCP_DECODED_BUFFER_SHIFT = 12
} MHW_VDBOX_ADDRESS_SHIFT;
typedef enum _MHW_VDBOX_NODE_IND
{
MHW_VDBOX_NODE_1 = 0x0,
MHW_VDBOX_NODE_2 = 0x1,
MHW_VDBOX_NODE_MAX
} MHW_VDBOX_NODE_IND;
typedef struct _MHW_VDBOX_AVC_QM_PARAMS
{
uint8_t List4x4[6][16];
uint8_t List8x8[2][64];
} MHW_VDBOX_AVC_QM_PARAMS, *PMHW_VDBOX_AVC_QM_PARAMS;
typedef struct _MHW_VDBOX_HEVC_QM_PARAMS
{
uint8_t List4x4[6][16];
uint8_t List8x8[6][64];
uint8_t List16x16[6][64];
uint8_t List32x32[2][64];
uint8_t ListDC16x16[6];
uint8_t ListDC32x32[2];
} MHW_VDBOX_HEVC_QM_PARAMS, *PMHW_VDBOX_HEVC_QM_PARAMS;
typedef enum _HCP_SURFACE_FORMAT
{
HCP_SURFACE_FORMAT_YUY2 = 0x0,
HCP_SURFACE_FORMAT_RGBX8888 = 0x1,
HCP_SURFACE_FORMAT_AYUV4444 = 0x2,
HCP_SURFACE_FORMAT_P010_VARIANT = 0x3,
HCP_SURFACE_FORMAT_PLANAR_420_8 = 0x4,
HCP_SURFACE_FORMAT_UYVY = 0x5,
HCP_SURFACE_FORMAT_YVYU = 0x6,
HCP_SURFACE_FORMAT_VYUY = 0x7,
HCP_SURFACE_FORMAT_Y210 = 0x8,
HCP_SURFACE_FORMAT_Y216 = 0x8,
HCP_SURFACE_FORMAT_RGBA1010102 = 0x9,
HCP_SURFACE_FORMAT_Y410 = 0xA,
HCP_SURFACE_FORMAT_NV21 = 0xB,
HCP_SURFACE_FORMAT_Y416 = 0xC,
HCP_SURFACE_FORMAT_P010 = 0xD,
HCP_SURFACE_FORMAT_P016 = 0xE,
HCP_SURFACE_FORMAT_Y8 = 0xF,
HCP_SURFACE_FORMAT_Y16 = 0x10,
HCP_SURFACE_FORMAT_Y216_VARIANT = 0x11,
HCP_SURFACE_FORMAT_Y416_VARIANT = 0x12,
HCP_SURFACE_FORMAT_YUYV_VARIANT = 0x13,
HCP_SURFACE_FORMAT_AYUV4444_VARIANT = 0x14,
HCP_SURFACE_FORMAT_RESERVED = 0x15,
} HCP_SURFACE_FORMAT;
typedef enum _PIPE_WORK_MODE
{
MHW_VDBOX_HCP_PIPE_WORK_MODE_LEGACY = 0,
MHW_VDBOX_HCP_PIPE_WORK_MODE_CABAC_FE = 1,
MHW_VDBOX_HCP_PIPE_WORK_MODE_CODEC_BE = 2,
MHW_VDBOX_HCP_PIPE_WORK_MODE_CABAC_REAL_TILE = 3,
}MHW_VDBOX_HCP_PIPE_WORK_MODE;
typedef enum _MULTI_ENGINE_MODE
{
MHW_VDBOX_HCP_MULTI_ENGINE_MODE_FE_LEGACY = 0,
MHW_VDBOX_HCP_MULTI_ENGINE_MODE_LEFT = 1,
MHW_VDBOX_HCP_MULTI_ENGINE_MODE_RIGHT = 2,
MHW_VDBOX_HCP_MULTI_ENGINE_MODE_MIDDLE = 3,
}MHW_VDBOX_HCP_MULTI_ENGINE_MODE;
typedef enum
{
MHW_VDBOX_HCP_RT_FIRST_PHASE = 0, //!< First phase
MHW_VDBOX_HCP_RT_MIDDLE_PHASE = 1, //!< Middle phase
MHW_VDBOX_HCP_RT_LAST_PHASE = 2 //!< Last phase
} MHW_HCP_RT_PHASE_INDICATOR;
typedef enum _VDENC_PIPE_NUM_OF_PIPE
{
VDENC_PIPE_SINGLE_PIPE = 0,
VDENC_PIPE_TWO_PIPE = 1,
VDENC_PIPE_INVALID = 2,
VDENC_PIPE_FOUR_PIPE = 3,
}VDENC_PIPE_NUM_OF_PIPE;
typedef enum
{
HCP_CHROMA_FORMAT_MONOCHROME = 0,
HCP_CHROMA_FORMAT_YUV420 = 1,
HCP_CHROMA_FORMAT_YUV422 = 2,
HCP_CHROMA_FORMAT_YUV444 = 3
} HCP_CHROMA_FORMAT_IDC;
// Media memory compression trigger
typedef enum _MHW_MEDIA_MEMORY_COMPRESSION_EN
{
MHW_MEDIA_MEMCOMP_DISABLED = 0x0,
MHW_MEDIA_MEMCOMP_ENABLED = 0x1
} MHW_MEDIA_MEMORY_COMPRESSION_EN;
// Media memory compression mode
typedef enum _MHW_MEDIA_MEMORY_COMPRESSION_MODE
{
MHW_MEDIA_MEMCOMP_MODE_HORIZONTAL = 0x0,
MHW_MEDIA_MEMCOMP_MODE_VERTICAL = 0x1,
} MHW_MEDIA_MEMORY_COMPRESSION_MODE;
//!
//! \enum ROWSTORE_SCRATCH_BUFFER_CACHE
//! \brief Rowstore scratch buffer cache select
//!
enum ROWSTORE_SCRATCH_BUFFER_CACHE
{
BUFFER_TO_LLC = 0x0,
BUFFER_TO_INTERNALMEDIASTORAGE = 0x1
};
struct MHW_VDBOX_PIPE_MODE_SELECT_PARAMS
{
uint32_t Mode = 0;
bool bStreamOutEnabled = false;
bool bStreamOutEnabledExtEnabled = false;
bool bShortFormatInUse = false;
bool bVC1OddFrameHeight = false;
bool pakFrmLvlStrmoutEnable = false;
bool pakPiplnStrmoutEnabled = false;
bool bDeblockerStreamOutEnable = false;
bool bPostDeblockOutEnable = false;
bool bPreDeblockOutEnable = false;
bool bDynamicSliceEnable = false;
bool bSaoFirstPass = false;
bool bRdoqEnable = false;
bool bDynamicScalingEnabled = false;
// VDEnc specific
bool bVdencEnabled = false;
bool bVdencStreamInEnable = false;
uint8_t ucVdencBitDepthMinus8 = 0;
bool bPakThresholdCheckEnable = false;
bool bVdencPakObjCmdStreamOutEnable = false;
bool bBatchBufferInUse = false;
bool bTlbPrefetchEnable = 0;
PMHW_BATCH_BUFFER pBatchBuffer = nullptr;
uint32_t ChromaType = 0;
MOS_FORMAT Format = {};
bool isIFrame = false;
bool bIBCEnabled = false;
// HuC specific
uint32_t dwMediaSoftResetCounterValue = 0;
bool bAdvancedRateControlEnable = false;
bool bStreamObjectUsed = false;
// No need to set protection settings
bool disableProtectionSetting = false;
virtual ~MHW_VDBOX_PIPE_MODE_SELECT_PARAMS() {}
};
using PMHW_VDBOX_PIPE_MODE_SELECT_PARAMS = MHW_VDBOX_PIPE_MODE_SELECT_PARAMS * ;
typedef struct _MHW_VDBOX_SURFACE_PARAMS
{
uint32_t Mode;
PMOS_SURFACE psSurface; // 2D surface parameters
uint8_t ucVDirection;
uint8_t ChromaType;
uint8_t ucSurfaceStateId;
uint8_t ucBitDepthLumaMinus8;
uint8_t ucBitDepthChromaMinus8;
uint32_t dwUVPlaneAlignment;
bool bDisplayFormatSwizzle;
bool bSrc8Pak10Mode;
bool bColorSpaceSelection;
bool bVdencDynamicScaling;
uint32_t dwActualWidth;
uint32_t dwActualHeight;
uint32_t dwReconSurfHeight;
MOS_MEMCOMP_STATE mmcState;
uint8_t mmcSkipMask;
uint32_t dwCompressionFormat;
} MHW_VDBOX_SURFACE_PARAMS, *PMHW_VDBOX_SURFACE_PARAMS;
struct MHW_VDBOX_PIPE_BUF_ADDR_PARAMS
{
uint32_t Mode = 0;
PMOS_SURFACE psPreDeblockSurface = nullptr; // Pointer to MOS_SURFACE of render surface
MOS_MEMCOMP_STATE PreDeblockSurfMmcState = MOS_MEMCOMP_DISABLED;
PMOS_SURFACE psPostDeblockSurface = nullptr; // Pointer to MOS_SURFACE of render surface
MOS_MEMCOMP_STATE PostDeblockSurfMmcState = MOS_MEMCOMP_DISABLED;
PMOS_SURFACE psRawSurface = nullptr; // Pointer to MOS_SURFACE of raw surface
MOS_MEMCOMP_STATE RawSurfMmcState = MOS_MEMCOMP_DISABLED;
PMOS_SURFACE ps4xDsSurface = nullptr;
MOS_MEMCOMP_STATE Ps4xDsSurfMmcState = MOS_MEMCOMP_DISABLED;
PMOS_SURFACE ps8xDsSurface = nullptr;
MOS_MEMCOMP_STATE Ps8xDsSurfMmcState = MOS_MEMCOMP_DISABLED;
PMOS_RESOURCE presDataBuffer = nullptr; // Handle of residual difference surface
PMOS_RESOURCE presReferences[CODEC_MAX_NUM_REF_FRAME] = {};
PMOS_RESOURCE presMfdIntraRowStoreScratchBuffer = nullptr; // Handle of MFD Intra Row Store Scratch data surface
PMOS_RESOURCE presMfdDeblockingFilterRowStoreScratchBuffer = nullptr; // Handle of MFD Deblocking Filter Row Store Scratch data surface
PMOS_RESOURCE presStreamOutBuffer = nullptr;
MOS_MEMCOMP_STATE StreamOutBufMmcState = MOS_MEMCOMP_DISABLED;
PMOS_RESOURCE presMacroblockIldbStreamOutBuffer1 = nullptr;
PMOS_RESOURCE presMacroblockIldbStreamOutBuffer2 = nullptr;
PMOS_RESOURCE presSliceSizeStreamOutBuffer = nullptr;
PMOS_SURFACE psFwdRefSurface0 = nullptr;
PMOS_SURFACE psFwdRefSurface1 = nullptr;
PMOS_SURFACE psFwdRefSurface2 = nullptr;
bool bDynamicScalingEnable = false;
PMOS_RESOURCE presVdencIntraRowStoreScratchBuffer = nullptr; // For VDEnc, Handle of VDEnc Intra Row Store Scratch data surface
PMOS_RESOURCE presVdencTileRowStoreBuffer = nullptr;
PMOS_RESOURCE presVdencStreamOutBuffer = nullptr;
PMOS_RESOURCE presVdencCuObjStreamOutBuffer = nullptr;
PMOS_RESOURCE presVdencPakObjCmdStreamOutBuffer = nullptr;
PMOS_RESOURCE presVdencStreamInBuffer = nullptr;
PMOS_RESOURCE presVdencReferences[CODEC_MAX_NUM_REF_FRAME] = {};
PMOS_RESOURCE presVdenc4xDsSurface[CODEC_MAX_NUM_REF_FRAME] = {};
PMOS_RESOURCE presVdenc8xDsSurface[CODEC_MAX_NUM_REF_FRAME] = {};
PMOS_RESOURCE presVdencColocatedMVWriteBuffer = nullptr; // For AVC only
PMOS_RESOURCE presVdencColocatedMVReadBuffer = nullptr; // For AVC only
PMOS_RESOURCE presDeblockingFilterTileRowStoreScratchBuffer = nullptr; // For HEVC, VP9
PMOS_RESOURCE presDeblockingFilterColumnRowStoreScratchBuffer = nullptr; // For HEVC, VP9
PMOS_RESOURCE presMetadataLineBuffer = nullptr; // For HEVC, VP9
PMOS_RESOURCE presMetadataTileLineBuffer = nullptr; // For HEVC, VP9
PMOS_RESOURCE presMetadataTileColumnBuffer = nullptr; // For HEVC, VP9
PMOS_RESOURCE presSaoLineBuffer = nullptr; // For HEVC only
PMOS_RESOURCE presSaoTileLineBuffer = nullptr; // For HEVC only
PMOS_RESOURCE presSaoTileColumnBuffer = nullptr; // For HEVC only
PMOS_RESOURCE presCurMvTempBuffer = nullptr; // For HEVC, VP9
PMOS_RESOURCE presColMvTempBuffer[CODEC_MAX_NUM_REF_FRAME] = {}; // For HEVC, VP9
PMOS_RESOURCE presLcuBaseAddressBuffer = nullptr; // For HEVC only
PMOS_RESOURCE presLcuILDBStreamOutBuffer = nullptr; // For HEVC only
PMOS_RESOURCE presVp9ProbBuffer = nullptr; // For VP9 only
PMOS_RESOURCE presVp9SegmentIdBuffer = nullptr; // For VP9 only
PMOS_RESOURCE presHvdLineRowStoreBuffer = nullptr; // For VP9 only
PMOS_RESOURCE presHvdTileRowStoreBuffer = nullptr; // For VP9 only
PMOS_RESOURCE presSaoStreamOutBuffer = nullptr; // For HEVC only
PMOS_RESOURCE presSaoRowStoreBuffer = nullptr; // For HEVC only
PMOS_SURFACE presP010RTSurface = nullptr; // For HEVC only
PMOS_RESOURCE presFrameStatStreamOutBuffer = nullptr;
PMOS_RESOURCE presSseSrcPixelRowStoreBuffer = nullptr;
PMOS_RESOURCE presSegmentMapStreamIn = nullptr;
PMOS_RESOURCE presSegmentMapStreamOut = nullptr;
PMOS_RESOURCE presPakCuLevelStreamoutBuffer = nullptr;
PMHW_VDBOX_SURFACE_PARAMS pRawSurfParam = nullptr;
PMHW_VDBOX_SURFACE_PARAMS pDecodedReconParam = nullptr;
bool bVdencEnabled = false;
bool bRawIs10Bit = false;
bool bDecodecReconIs10Bit = false;
uint32_t dwNumRefIdxL0ActiveMinus1 = 0;
uint32_t dwNumRefIdxL1ActiveMinus1 = 0;
uint32_t dwLcuStreamOutOffset = 0;
uint32_t dwFrameStatStreamOutOffset = 0;
uint32_t dwVdencStatsStreamOutOffset = 0;
bool oneOnOneMapping = false; // Flag for indicating using 1:1 ref index mapping for vdenc
bool isLowDelayB = true; // Flag to indicate if it is LDB
bool isIFrame = false; // Flag to indicate if it is I frame
bool isPFrame = false; // Flag to indicate if it is P frame
bool bIBCEnabled = false;
uint8_t IBCRefIdxMask = 0;
PMOS_RESOURCE presVdencCumulativeCuCountStreamoutSurface = nullptr;
virtual ~MHW_VDBOX_PIPE_BUF_ADDR_PARAMS() {}
};
using PMHW_VDBOX_PIPE_BUF_ADDR_PARAMS = MHW_VDBOX_PIPE_BUF_ADDR_PARAMS * ;
typedef struct _MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS
{
uint32_t Mode;
PMOS_RESOURCE presDataBuffer;
uint32_t dwDataSize;
uint32_t dwDataOffset;
PMOS_RESOURCE presMvObjectBuffer;
uint32_t dwMvObjectSize;
uint32_t dwMvObjectOffset;
PMOS_RESOURCE presPakBaseObjectBuffer;
uint32_t dwPakBaseObjectSize;
uint32_t dwPakBaseObjectOffset;
PMOS_RESOURCE presPakTileSizeStasBuffer;
uint32_t dwPakTileSizeStasBufferSize;
uint32_t dwPakTileSizeRecordOffset;
// used by VP9
PMOS_RESOURCE presCompressedHeaderBuffer;
uint32_t dwCompressedHeaderSize;
PMOS_RESOURCE presProbabilityDeltaBuffer;
uint32_t dwProbabilityDeltaSize;
PMOS_RESOURCE presProbabilityCounterBuffer;
uint32_t dwProbabilityCounterOffset;
uint32_t dwProbabilityCounterSize;
PMOS_RESOURCE presTileRecordBuffer;
uint32_t dwTileRecordSize;
PMOS_RESOURCE presCuStatsBuffer;
uint32_t dwCuStatsSize;
PMOS_RESOURCE presStreamOutObjectBuffer;
uint32_t dwStreamOutObjectSize;
uint32_t dwStreamOutObjectOffset;
} MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS, *PMHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS;
struct MHW_VDBOX_AVC_IMG_PARAMS
{
// Decoding Params
PCODEC_AVC_PIC_PARAMS pAvcPicParams = nullptr;
PCODEC_MVC_EXT_PIC_PARAMS pMvcExtPicParams = nullptr;
uint8_t ucActiveFrameCnt = 0;
// Encoding Params
PCODEC_AVC_ENCODE_SEQUENCE_PARAMS pEncodeAvcSeqParams = nullptr;
PCODEC_AVC_ENCODE_PIC_PARAMS pEncodeAvcPicParams = nullptr;
PCODEC_AVC_ENCODE_SLICE_PARAMS pEncodeAvcSliceParams = nullptr;
PCODEC_REF_LIST *ppRefList = nullptr;
CODEC_PIC_ID *pPicIdx = nullptr;
uint32_t dwTqEnabled = 0;
uint32_t dwTqRounding = 0;
uint32_t dwMaxVmvR = 0;
uint16_t wPicWidthInMb = 0;
uint16_t wPicHeightInMb = 0;
uint16_t wSlcHeightInMb = 0;
uint8_t ucKernelMode = 0; // normal, performance, quality.
//FEI multiple passes PAK ---max frame size
uint16_t currPass = 0;
uint8_t *pDeltaQp = nullptr;
uint32_t dwMaxFrameSize = 0;
bool bIPCMPass = false;
// VDEnc specific
bool bVdencEnabled = false;
bool bVDEncPerfModeEnabled = false;
bool bVdencStreamInEnabled = false;
bool bVdencBRCEnabled = false;
bool bSliceSizeStreamOutEnabled = false;
bool bCrePrefetchEnable = false;
bool bPerMBStreamOut = false;
bool bRollingIRestrictFracCand = false;
uint32_t dwMbSlcThresholdValue = 0; // For VDENC dynamic slice size control
uint32_t dwVdencSliceMinusBytes = 0;
uint8_t *pVDEncModeCost = nullptr;
uint8_t *pVDEncMvCost = nullptr;
uint8_t *pVDEncHmeMvCost = nullptr;
uint32_t biWeight = 0;
virtual ~MHW_VDBOX_AVC_IMG_PARAMS(){}
};
using PMHW_VDBOX_AVC_IMG_PARAMS = MHW_VDBOX_AVC_IMG_PARAMS * ;
typedef struct _MHW_VDBOX_QM_PARAMS
{
uint32_t Standard;
uint32_t Mode;
PMHW_VDBOX_AVC_QM_PARAMS pAvcIqMatrix;
CodecMpeg2IqMatrix *pMpeg2IqMatrix;
CodecJpegQuantMatrix *pJpegQuantMatrix;
uint32_t JpegQMTableSelector;
bool bJpegQMRotation;
PMHW_VDBOX_HEVC_QM_PARAMS pHevcIqMatrix;
} MHW_VDBOX_QM_PARAMS, *PMHW_VDBOX_QM_PARAMS;
typedef struct _MHW_VDBOX_AVC_WEIGHTOFFSET_PARAMS
{
uint32_t uiList;
uint32_t uiLumaLogWeightDenom;
uint32_t uiChromaLogWeightDenom;
uint32_t uiLumaWeightFlag;
uint32_t uiChromaWeightFlag;
uint32_t uiNumRefForList;
int16_t Weights[2][32][3][2];
PCODEC_AVC_ENCODE_PIC_PARAMS pAvcPicParams;
} MHW_VDBOX_AVC_WEIGHTOFFSET_PARAMS, *PMHW_VDBOX_AVC_WEIGHTOFFSET_PARAMS;
typedef struct _MHW_VDBOX_PAK_INSERT_PARAMS
{
PBSBuffer pBsBuffer;
// also reuse dwBitSize for passing SrcDataEndingBitInclusion when (pEncoder->bLastPicInStream || pEncoder->bLastPicInSeq)
uint32_t dwBitSize;
uint32_t dwOffset;
uint32_t uiSkipEmulationCheckCount;
bool bLastPicInSeq;
bool bLastPicInStream;
bool bLastHeader;
bool bEmulationByteBitsInsert;
bool bSetLastPicInStreamData;
bool bSliceHeaderIndicator;
bool bHeaderLengthExcludeFrmSize;
uint32_t *pdwMpeg2PicHeaderTotalBufferSize;
uint32_t *pdwMpeg2PicHeaderDataStartOffset;
bool bResetBitstreamStartingPos;
bool bEndOfSlice;
uint32_t dwLastPicInSeqData;
uint32_t dwLastPicInStreamData;
PMHW_BATCH_BUFFER pBatchBufferForPakSlices;
bool bVdencInUse;
} MHW_VDBOX_PAK_INSERT_PARAMS, *PMHW_VDBOX_PAK_INSERT_PARAMS;
typedef struct _MHW_VDBOX_VP9_SEGMENT_STATE
{
uint32_t Mode;
PCODEC_VP9_SEGMENT_PARAMS pVp9SegmentParams;
PCODEC_VP9_ENCODE_SEGMENT_PARAMS pVp9EncodeSegmentParams;
uint8_t ucCurrentSegmentId;
uint8_t ucQPIndexLumaAC;
const uint8_t *pcucLfQpLookup;
uint8_t *pbSegStateBufferPtr;
} MHW_VDBOX_VP9_SEGMENT_STATE, *PMHW_VDBOX_VP9_SEGMENT_STATE;
typedef struct _MHW_VDBOX_HCP_BSD_PARAMS
{
uint32_t dwBsdDataLength;
uint32_t dwBsdDataStartOffset;
} MHW_VDBOX_HCP_BSD_PARAMS, *PMHW_VDBOX_HCP_BSD_PARAMS;
typedef struct _MHW_VDBOX_ROWSTORE_PARAMS
{
uint32_t Mode;
uint32_t dwPicWidth;
uint32_t bMbaff;
bool bIsFrame;
uint8_t ucBitDepthMinus8;
uint8_t ucChromaFormat;
uint8_t ucLCUSize;
} MHW_VDBOX_ROWSTORE_PARAMS, *PMHW_VDBOX_ROWSTORE_PARAMS;
typedef struct _MHW_VDBOX_ROWSTORE_CACHE
{
bool bSupported;
bool bEnabled;
uint32_t dwAddress;
} MHW_VDBOX_ROWSTORE_CACHE, *PMHW_VDBOX_ROWSTORE_CACHE;
struct MHW_VDBOX_STATE_CMDSIZE_PARAMS
{
bool bShortFormat = false;
bool bHucDummyStream = false;
bool bSfcInUse = false;
uint32_t uNumStoreDataImm = 0;
uint32_t uNumStoreReg = 0;
uint32_t uNumMfxWait = 0;
uint32_t uNumAddConBBEnd = 0;
uint32_t uNumMiCopy = 0;
uint32_t uNumMiFlush = 0;
uint32_t bPerformHucStreamOut = false;
uint32_t uNumVdPipelineFlush = 0;
virtual ~MHW_VDBOX_STATE_CMDSIZE_PARAMS() {}
};
using PMHW_VDBOX_STATE_CMDSIZE_PARAMS = MHW_VDBOX_STATE_CMDSIZE_PARAMS * ;
typedef struct _MHW_VDBOX_AVC_SLICE_STATE
{
PCODEC_PIC_ID pAvcPicIdx;
PMOS_RESOURCE presDataBuffer;
uint32_t dwDataBufferOffset;
uint32_t dwOffset;
uint32_t dwLength;
uint32_t dwSliceIndex;
bool bLastSlice;
uint32_t dwTotalBytesConsumed;
// Decoding Only
PCODEC_AVC_PIC_PARAMS pAvcPicParams;
PCODEC_MVC_EXT_PIC_PARAMS pMvcExtPicParams;
PCODEC_AVC_SLICE_PARAMS pAvcSliceParams;
uint32_t dwNextOffset;
uint32_t dwNextLength;
bool bIntelEntrypointInUse;
bool bPicIdRemappingInUse;
bool bShortFormatInUse;
bool bPhantomSlice;
uint8_t ucDisableDeblockingFilterIdc;
uint8_t ucSliceBetaOffsetDiv2;
uint8_t ucSliceAlphaC0OffsetDiv2;
// Encoding Only
PCODEC_AVC_ENCODE_SEQUENCE_PARAMS pEncodeAvcSeqParams;
PCODEC_AVC_ENCODE_PIC_PARAMS pEncodeAvcPicParams;
PCODEC_AVC_ENCODE_SLICE_PARAMS pEncodeAvcSliceParams;
PBSBuffer pBsBuffer;
PCODECHAL_NAL_UNIT_PARAMS *ppNalUnitParams;
PMHW_BATCH_BUFFER pBatchBufferForPakSlices;
bool bSingleTaskPhaseSupported;
bool bFirstPass;
bool bLastPass;
bool bBrcEnabled;
bool bRCPanicEnable;
bool bInsertBeforeSliceHeaders;
bool bAcceleratorHeaderPackingCaps;
uint32_t dwBatchBufferForPakSlicesStartOffset;
uint32_t uiSkipEmulationCheckCount;
uint32_t dwRoundingValue;
uint32_t dwRoundingIntraValue;
bool bRoundingInterEnable;
uint16_t wFrameFieldHeightInMB; // Frame/field Height in MB
bool bVdencInUse;
bool bVdencNoTailInsertion;
bool oneOnOneMapping = false;
bool bFullFrameData;
} MHW_VDBOX_AVC_SLICE_STATE, *PMHW_VDBOX_AVC_SLICE_STATE;
#endif