blob: a5d49fb927ac9fb0fc477a36109db9d2c1af4194 [file] [log] [blame]
/*
* Copyright (c) 2017, 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_encode_vp8.h
//! \brief This file defines the base C++ class/interface for VP8 DualPipe encoding
//! to be used across CODECHAL components.
//!
#ifndef __CODECHAL_ENCODE_VP8_H__
#define __CODECHAL_ENCODE_VP8_H__
#include "codechal_encoder_base.h"
#define CODECHAL_NUM_VP8_ENC_SYNC_TAGS 36
#define CODECHAL_INIT_DSH_SIZE_VP8_ENC MHW_PAGE_SIZE * 2
#define CODECHAL_ENCODE_VP8_INVALID_PIC_ID CODECHAL_NUM_UNCOMPRESSED_SURFACE_VP8
#define VP8_NUM_COEFF_PLANES 4
#define VP8_NUM_COEFF_BANDS 8
#define VP8_NUM_LOCAL_COMPLEXITIES 3
#define VP8_NUM_COEFF_NODES 11
#define VP8_LAST_REF_FLAG 0x1
#define VP8_GOLDEN_REF_FLAG 0x2
#define VP8_ALT_REF_FLAG 0x4
#define INTERMEDIATE_PARTITION0_SIZE (64 * 1024)
#define TOKEN_STATISTICS_SIZE (304 * sizeof(uint32_t)) //270 tokens + 34 DWs for partition and segment info
#define COEFFS_PROPABILITIES_SIZE (VP8_NUM_COEFF_PLANES * VP8_NUM_COEFF_BANDS * VP8_NUM_LOCAL_COMPLEXITIES * VP8_NUM_COEFF_NODES) //1056
#define HISTOGRAM_SIZE (136 * sizeof(uint32_t))
#define MODE_PROPABILITIES_SIZE 96
#define HEADER_METADATA_SIZE (32 * sizeof(uint32_t))
#define PICTURE_STATE_CMD_SIZE (37 * sizeof(uint32_t))
#define PICTURE_STATE_SIZE (PICTURE_STATE_CMD_SIZE + HEADER_METADATA_SIZE + (16 * sizeof(uint32_t))) // + Extra dws for NOOP and BB_End
#define HEADER_METADATA_OFFSET (PICTURE_STATE_CMD_SIZE + (3 * sizeof(uint32_t))) //Add one extra noop
#define MPU_BITSTREAM_SIZE 128
#define TPU_BITSTREAM_SIZE 1344
#define ENTROPY_COST_TABLE_SIZE (256 * sizeof(uint32_t))
#define MPU_CURBE_SIZE (24 * sizeof(uint32_t))
#define TOKEN_BITS_DATA_SIZE (16 * sizeof(uint32_t))
#define VP8_KERNEL_DUMP_SIZE (600000 * sizeof(uint32_t))
#define VP8_MODE_COST_UPDATE_SURFACE_SIZE 64
#define REPAK_DECISION_BUF_SIZE (4 * sizeof(uint32_t))
#define VP8_ALL_DC_BIAS_DEFAULT 1500
#define CODECHAL_VP8_QP_MAX 127
#define CODECHAL_VP8_MODE_COST_SURFACE_SIZE 64
#define BRC_CONSTANTSURFACE_VP8 2880
#define CODECHAL_ENCODE_VP8_BRC_CONSTANTSURFACE_WIDTH 64
#define CODECHAL_ENCODE_VP8_BRC_CONSTANTSURFACE_HEIGHT 44
//*------------------------------------------------------------------------------
//* Codec Definitions
//*------------------------------------------------------------------------------
enum CodechalEncodeVp8MbencKernelStateIdx
{
CODECHAL_ENCODE_VP8_MBENC_IDX_I_CHROMA = 0,
CODECHAL_ENCODE_VP8_MBENC_IDX_I_LUMA,
CODECHAL_ENCODE_VP8_MBENC_IDX_P,
CODECHAL_ENCODE_VP8_MBENC_IDX_NUM
};
enum CodechalEncodeVp8BrcKernelStateIdx
{
CODECHAL_ENCODE_VP8_BRC_IDX_IFRAMEDIST = 0,
CODECHAL_ENCODE_VP8_BRC_IDX_INIT,
CODECHAL_ENCODE_VP8_BRC_IDX_RESET,
CODECHAL_ENCODE_VP8_BRC_IDX_UPDATE,
CODECHAL_ENCODE_VP8_BRC_IDX_NUM,
};
enum CodechalEncodeVp8MbpakKernelStateIdx
{
CODECHAL_ENCODE_VP8_MBPAK_IDX_PHASE1 = 0,
CODECHAL_ENCODE_VP8_MBPAK_IDX_PHASE2,
CODECHAL_ENCODE_VP8_MBPAK_IDX_NUM
};
static const uint8_t CodecHal_TargetUsageToMode_VP8[NUM_TARGET_USAGE_MODES] =
{
encodeNormalMode,
encodeQualityMode,
encodeQualityMode,
encodeNormalMode,
encodeNormalMode,
encodeNormalMode,
encodePerformanceMode,
encodePerformanceMode
};
struct CodechalVp8ModeCostUpdateSurface
{
union
{
struct
{
uint32_t : 16;
uint32_t Intra16x16 : 16;
};
struct
{
uint32_t Value;
};
} DW0;
union
{
struct
{
uint32_t : 16;
uint32_t Intra4x4 : 16;
};
struct
{
uint32_t Value;
};
} DW1;
union
{
struct
{
uint32_t Inter16x8 : 16;
uint32_t Inter8x8 : 16;
};
struct
{
uint32_t Value;
};
} DW2;
union
{
struct
{
uint32_t : 16;
uint32_t Inter4x4 : 16;
};
struct
{
uint32_t Value;
};
} DW3;
union
{
struct
{
uint32_t : 32;
};
struct
{
uint32_t Value;
};
} DW4;
union
{
struct
{
uint32_t : 32;
};
struct
{
uint32_t Value;
};
} DW5;
union
{
struct
{
uint32_t IntraNonDCPenalty16x16 : 16;
uint32_t IntraNonDCPenalty4x4 : 16;
};
struct
{
uint32_t Value;
};
} DW6;
union
{
struct
{
uint32_t RefFrameCostIntra : 16;
uint32_t RefFrameCostLast : 16;
};
struct
{
uint32_t Value;
};
} DW7;
union
{
struct
{
uint32_t RefFrameCostGold : 16;
uint32_t RefFrameCostAlt : 16;
};
struct
{
uint32_t Value;
};
} DW8;
};
struct CodechalBindingTableVp8BrcUpdate
{
uint32_t dwBrcHistoryBuffer;
uint32_t dwBrcPakStatisticsOutputBuffer;
uint32_t dwBrcMSDKPakSurfaceBuffer;
uint32_t dwBrcEncoderCfgReadBuffer;
uint32_t dwBrcEncoderCfgWriteBuffer;
uint32_t dwBrcMbPak1CurbeWriteBuffer;
uint32_t dwBrcMbPak2CurbeWriteBuffer;
uint32_t dwBrcMbPakInputMSDKBuffer;
uint32_t dwBrcMbPakTableData;
uint32_t dwBrcMbEncCurbeReadBuffer;
uint32_t dwBrcMbEncCurbeWriteData;
uint32_t dwBrcMpuCurbeReadBuffer;
uint32_t dwBrcMpuCurbeWriteData;
uint32_t dwBrcTpuCurbeReadBuffer;
uint32_t dwBrcTpuCurbeWriteData;
uint32_t dwBrcDistortionBuffer;
uint32_t dwBrcConstantData;
uint32_t dwVp8BrcSegmentationMap;
uint32_t dwBindingTableStartOffset;
uint32_t dwNumBindingTableEntries;
};
struct CodechalBindingTableVp8Mbenc
{
uint32_t dwVp8MBEncMBOut;
uint32_t dwVp8MBEncCurrY;
uint32_t dwVp8MBEncCurrUV;
uint32_t dwVp8MBEncMVDataFromME;
uint32_t dwVp8MBEncIndMVData;
uint32_t dwVp8MBEncCurrPic;
uint32_t dwVp8MBEncLastRefPic;
uint32_t dwVp8MBEncGoldenRefPic;
uint32_t dwVp8MBEncAlternateRefPic;
uint32_t dwVp8MBEncRef1Pic;
uint32_t dwVp8MBEncRef2Pic;
uint32_t dwVp8MBEncRef3Pic;
uint32_t dwVp8MBEncMBModeCostLuma;
uint32_t dwVp8MBEncBlockModeCost;
uint32_t dwVp8MBEncChromaRecon;
uint32_t dwVp8MBEncPerMBQuantDataI;
uint32_t dwVp8MBEncPerMBQuantDataP;
uint32_t dwVp8MBEncRefMBCount;
uint32_t dwVp8MBEncVMEInterPred;
uint32_t dwVp8MBEncVMEDebugStreamoutI;
uint32_t dwVp8MBEncVMEDebugStreamoutP;
uint32_t dwVp8MBEncSegmentationMap;
uint32_t dwVp8MBEncSegmentationMapP;
uint32_t dwVp8MBEncHistogram;
uint32_t dwVp8MBEncHistogramP;
uint32_t dwVp8MBEncVME;
uint32_t dwBindingTableStartOffset;
uint32_t dwNumBindingTableEntries;
uint32_t dwVp8InterPredDistortion;
uint32_t dwVp8PerMVDataSurface;
uint32_t dwVp8MBModeCostUpdateSurface;
uint32_t dwVp8MBEncBRCDist;
uint32_t dwVp8MBEncVMECoarseIntra;
uint32_t dwVp8MbEncCurrYDownscaled;
uint32_t dwVp8MbEncSwscoreboardI;
uint32_t dwVp8MbEncSwscoreboardP;
};
struct CodechalBindingTableVp8Me
{
uint32_t dwVp8MEMVDataSurface;
uint32_t dwVp816xMEMVDataSurface;
uint32_t dwVp8MeDist;
uint32_t dwVp8MeBrcDist;
uint32_t dwVp8MeCurrPic;
uint32_t dwVp8MeRef1Pic;
uint32_t dwVp8MeRef2Pic;
uint32_t dwVp8MeRef3Pic;
uint32_t dwVp8MeLastRefPic;
uint32_t dwVp8MeGoldenRefPic;
uint32_t dwVp8MeAlternateRefPic;
uint32_t dwBindingTableStartOffset;
uint32_t dwNumBindingTableEntries;
};
struct CodechalBindingTableVp8Mbpak
{
uint32_t dwVp8MBPakPerMBOut;
uint32_t dwVp8MBPakCurrY;
uint32_t dwVp8MBPakCurrUV;
uint32_t dwVp8MBPakLastRefY;
uint32_t dwVp8MBPakLastRefUV;
uint32_t dwVp8MBPakGoldenRefY;
uint32_t dwVp8MBPakGoldenRefUV;
uint32_t dwVp8MBPakAlternateRefY;
uint32_t dwVp8MBPakAlternateRefUV;
uint32_t dwVp8MBPakIndMVData;
uint32_t dwVp8MBPakCurrReconY;
uint32_t dwVp8MBPakCurrReconUV;
uint32_t dwVp8MBPakRowBuffY;
uint32_t dwVp8MBPakRowBuffUV;
uint32_t dwVp8MBPakColBuffY;
uint32_t dwVp8MBPakColBuffUV;
uint32_t dwVp8MBPakDebugStreamout;
uint32_t dwBindingTableStartOffset;
uint32_t dwNumBindingTableEntries;
};
struct CodechalBindingTableVp8Mpu
{
uint32_t dwVp8MpuHistogram;
uint32_t dwVp8MpuReferenceModeProbability;
uint32_t dwVp8MpuModeProbability;
uint32_t dwVp8MpuReferenceTokenProbability;
uint32_t dwVp8MpuTokenProbability;
uint32_t dwVp8MpuFrameHeaderBitstream;
uint32_t dwVp8MpuHeaderMetaData;
uint32_t dwVp8MpuPictureState;
uint32_t dwVp8MpuMpuBitstream;
uint32_t dwVp8MpuKernelDebugDump;
uint32_t dwVp8MpuEntropyCost;
uint32_t dwVp8MpuTokenBitsData;
uint32_t dwBindingTableStartOffset;
uint32_t dwNumBindingTableEntries;
uint32_t dwVp8MpuModeCostUpdateSurface;
};
struct CodechalBindingTableVp8Tpu
{
uint32_t dwVp8TpuPakTokenStatistics;
uint32_t dwVp8TpuTokenUpdateFlags;
uint32_t dwVp8TpuEntropyCost;
uint32_t dwVp8TpuFrameHeaderBitstream;
uint32_t dwVp8TpuDefaultTokenProbability;
uint32_t dwVp8TpuPictureState;
uint32_t dwVp8TpuMpuCurbeData;
uint32_t dwVp8TpuHeaderMetaData;
uint32_t dwVp8TpuTokenProbability;
uint32_t dwVp8TpuPakHardwareTokenProbabilityPass1;
uint32_t dwVp8TpuKeyFrameTokenProbability;
uint32_t dwVp8TpuUpdatedTokenProbability;
uint32_t dwVp8TpuPakHardwareTokenProbabilityPass2;
uint32_t dwVp8TpuKernelDebugDump;
uint32_t dwVp8TpuRepakDecision;
uint32_t dwBindingTableStartOffset;
uint32_t dwNumBindingTableEntries;
};
struct CodechalVp8BrcInitResetCurbeParams
{
CODEC_PICTURE CurrPic;
PCODEC_VP8_ENCODE_SEQUENCE_PARAMS pSeqParams;
PCODEC_VP8_ENCODE_PIC_PARAMS pPicParams;
uint32_t dwFrameWidth;
uint32_t dwFrameHeight;
uint32_t dwAVBRAccuracy;
uint32_t dwAVBRConvergence;
double *pdBrcInitCurrentTargetBufFullInBits; // Passed back to Render Interface
double *pdBrcInitResetInputBitsPerFrame; // Passed back to Render Interface
uint32_t *pdwBrcInitResetBufSizeInBits; // Passed back to Render Interface
bool bInitBrc;
bool bMbBrcEnabled;
uint32_t dwFramerate;
PMHW_KERNEL_STATE pKernelState;
};
struct CodechalVp8BrcUpdateCurbeParams
{
CODEC_PICTURE CurrPic;
PCODEC_VP8_ENCODE_SEQUENCE_PARAMS pSeqParams;
PCODEC_VP8_ENCODE_PIC_PARAMS pPicParams;
PCODECHAL_VP8_HYBRIDPAK_FRAMEUPDATE pSliceParams;
PCODEC_VP8_ENCODE_QUANT_DATA pVp8QuantData;
uint16_t wPictureCodingType;
uint32_t dwAVBRAccuracy;
uint32_t dwAVBRConvergence;
uint32_t dwFrameWidthInMB;
uint32_t dwFrameHeightInMB;
uint32_t dwBrcInitResetBufSizeInBits;
double dBrcInitResetInputBitsPerFrame;
double *pdBrcInitCurrentTargetBufFullInBits; // Passed in and back
bool bHmeEnabled;
bool bInitBrc;
bool bUsedAsRef;
uint8_t ucKernelMode; // Normal/Quality/Performance
uint32_t dwVp8BrcNumPakPasses;
uint32_t dwHeaderBytesInserted; // dwHeaderBytesInserted is for WAAVCSWHeaderInsertion and is 0 otherwise
bool bMultiRefQpEnabled;
uint32_t wFrameNumber;
};
struct CodechalVp8MeCurbeParams
{
PCODEC_VP8_ENCODE_SEQUENCE_PARAMS pSeqParams;
PCODEC_VP8_ENCODE_PIC_PARAMS pPicParams;
uint32_t dwFrameWidth;
uint32_t dwFrameFieldHeight;
uint16_t wPictureCodingType;
bool b16xME;
bool b16xMeEnabled;
uint8_t ucKernelMode;
};
struct CodechalVp8MbencCurbeParams
{
PCODEC_VP8_ENCODE_SEQUENCE_PARAMS pSeqParams;
PCODEC_VP8_ENCODE_PIC_PARAMS pPicParams;
PCODEC_VP8_ENCODE_QUANT_DATA pVp8QuantData;
PCODECHAL_VP8_HYBRIDPAK_FRAMEUPDATE pVp8SliceParams;
PCODEC_REF_LIST *ppRefList;
uint16_t wPicWidthInMb;
uint16_t wFieldFrameHeightInMb;
uint16_t wPictureCodingType;
bool bHmeEnabled;
bool bVmeKernelDump;
bool bMbEncIFrameDistEnabled;
bool bBrcEnabled;
uint8_t ucKernelMode; // normal, performance, quality.
bool bMbEncIFrameDistInUse;
PCODEC_PICTURE pCurrOriginalPic;
PCODEC_PICTURE pLastRefPic;
PCODEC_PICTURE pGoldenRefPic;
PCODEC_PICTURE pAlternateRefPic;
PMHW_KERNEL_STATE pKernelState;
};
struct CodechalVp8MbpakCurbeParams
{
PCODEC_VP8_ENCODE_SEQUENCE_PARAMS pSeqParams;
PCODEC_VP8_ENCODE_PIC_PARAMS pPicParams;
PCODEC_VP8_ENCODE_QUANT_DATA pVp8QuantData;
PCODEC_REF_LIST *ppRefList;
uint16_t wPicWidthInMb;
uint16_t wFieldFrameHeightInMb;
uint16_t wPictureCodingType;
bool bHmeEnabled;
bool bVmeKernelDump;
uint8_t ucKernelMode; // normal, performance, quality.
CODECHAL_MEDIA_STATE_TYPE EncFunctionType;
PMHW_KERNEL_STATE pKernelState;
};
struct CodechalVp8MpuCurbeParams
{
PCODEC_VP8_ENCODE_SEQUENCE_PARAMS pSeqParams;
PCODEC_VP8_ENCODE_PIC_PARAMS pPicParams;
PCODEC_VP8_ENCODE_QUANT_DATA pVp8QuantData;
uint16_t wPictureCodingType;
bool bVmeKernelDump;
uint8_t ucKernelMode; // normal, performance, quality.
CODECHAL_MEDIA_STATE_TYPE EncFunctionType;
};
struct CodechalVp8TpuCurbeParams
{
PCODEC_VP8_ENCODE_SEQUENCE_PARAMS pSeqParams;
PCODEC_VP8_ENCODE_PIC_PARAMS pPicParams;
PCODEC_VP8_ENCODE_QUANT_DATA pVp8QuantData;
uint16_t wPictureCodingType;
uint16_t wPicWidthInMb;
uint16_t wFieldFrameHeightInMb;
bool bVmeKernelDump;
uint8_t ucKernelMode; // normal, performance, quality.
CODECHAL_MEDIA_STATE_TYPE EncFunctionType;
bool bRebinarizationFrameHdr;
bool bAdaptiveRePak;
};
struct CodechalVp8BrcInitResetSurfaceParams
{
PMOS_RESOURCE presBrcHistoryBuffer;
PMOS_SURFACE psMeBrcDistortionBuffer;
uint32_t dwMeBrcDistortionBottomFieldOffset;
uint32_t dwDownscaledWidthInMb4x;
uint32_t dwDownscaledFrameHeightInMb4x;
PMHW_KERNEL_STATE pKernelState;
};
struct CodechalVp8BrcUpdateSurfaceParams
{
PMHW_KERNEL_STATE pMbEncKernelState;
PMOS_RESOURCE presBrcHistoryBuffer; // BRC history buffer
PMOS_RESOURCE presBrcPakStatisticBuffer; // BRC PAKStatistic buffer
PMOS_RESOURCE presVp8BrcConstantDataBuffer;
PMOS_RESOURCE presVp8EncoderCfgCommandReadBuffer;
PMOS_RESOURCE presVp8EncoderCfgCommandWriteBuffer;
PMOS_RESOURCE presVp8PakQPInputTable;
PMOS_RESOURCE presMbCodeBuffer;
PMOS_SURFACE ps4xMeDistortionBuffer;
PMOS_SURFACE psMeBrcDistortionBuffer;
MOS_RESOURCE resMbBrcConstDataBuffer;
uint32_t dwDownscaledWidthInMb4x;
uint32_t dwDownscaledFrameFieldHeightInMb4x;
bool bMbBrcEnabled;
PMOS_SURFACE psSegmentationMap;
uint32_t dwEncoderCfgCommandOffset;
PMHW_KERNEL_STATE pKernelState;
uint16_t wPictureCodingType; // I, P frame
uint32_t dwBrcPakStatisticsSize;
};
struct CodechalVp8MeSurfaceParams
{
PCODEC_REF_LIST *ppRefList;
PCODEC_PICTURE pLastRefPic;
PCODEC_PICTURE pGoldenRefPic;
PCODEC_PICTURE pAlternateRefPic;
PMOS_SURFACE ps4xMeMvDataBuffer;
PMOS_SURFACE ps16xMeMvDataBuffer;
PMOS_SURFACE psMeDistortionBuffer;
PMOS_SURFACE psMeBrcDistortionBuffer;
uint32_t dwDownscaledWidthInMb;
uint32_t dwDownscaledHeightInMb;
uint32_t dwVerticalLineStride;
uint32_t dwVerticalLineStrideOffset;
bool b16xMeInUse;
bool b16xMeEnabled;
uint32_t RefCtrl;
struct CodechalBindingTableVp8Me* pMeBindingTable;
PMHW_KERNEL_STATE pKernelState;
};
struct CodechalVp8MbencSurfaceParams
{
CODECHAL_MEDIA_STATE_TYPE MediaStateType;
PCODEC_REF_LIST *ppRefList;
PCODEC_PICTURE pCurrReconstructedPic;
PCODEC_PICTURE pLastRefPic;
PCODEC_PICTURE pGoldenRefPic;
PCODEC_PICTURE pAlternateRefPic;
uint16_t wPictureCodingType;
PMOS_SURFACE psCurrPicSurface;
uint32_t dwCurrPicSurfaceOffset;
uint32_t dwMvOffset;
uint32_t dwHistogramSize;
PMOS_SURFACE ps4xMeMvDataBuffer;
PMOS_SURFACE ps4xMeDistortionBuffer;
PMOS_SURFACE psMeBrcDistortionBuffer;
uint32_t dwOriFrameWidth;
uint32_t dwOriFrameHeight;
uint32_t dwVerticalLineStride;
uint32_t dwVerticalLineStrideOffset;
uint32_t dwFrameWidthInMb;
uint32_t dwFrameFieldHeightInMb;
bool bHmeEnabled;
bool bVMEKernelDump;
bool bSegmentationEnabled;
bool bMbEncIFrameDistInUse;
uint32_t dwMbDataOffset;
uint32_t uiRefCtrl;
PMOS_RESOURCE presPerMB_MBCodeOpData;
PMOS_SURFACE psMBModeCostLumaBuffer;
PMOS_SURFACE psBlockModeCostBuffer;
PMOS_RESOURCE psChromaReconBuffer; //for FF Vp8
PMOS_SURFACE psPerMBQuantDataBuffer;
PMOS_RESOURCE presRefMbCountSurface;
PMOS_RESOURCE presVmeKernelDumpBuffer;
PMOS_SURFACE psSegmentationMap;
PMOS_RESOURCE presHistogram;
PMOS_SURFACE psInterPredictionDistortionSurface;
PMOS_RESOURCE presPerMVDataSurface;
PMOS_RESOURCE presModeCostUpdateSurface;
PCODECHAL_VP8_HYBRIDPAK_FRAMEUPDATE pVp8SliceParams;
struct CodechalBindingTableVp8Mbenc* pMbEncBindingTable;
PMHW_KERNEL_STATE pKernelState;
};
struct CodechalVp8MbpakSurfaceParams
{
CODECHAL_MEDIA_STATE_TYPE MediaStateType;
PCODEC_REF_LIST *ppRefList;
PCODEC_PICTURE pCurrReconstructedPic;
PCODEC_PICTURE pLastRefPic;
PCODEC_PICTURE pGoldenRefPic;
PCODEC_PICTURE pAlternateRefPic;
uint16_t wPictureCodingType;
uint32_t dwCurrPicSurfaceOffset;
uint32_t dwMvOffset;
uint32_t dwOriFrameWidth;
uint32_t dwOriFrameHeight;
uint32_t dwVerticalLineStride;
uint32_t dwVerticalLineStrideOffset;
bool bVMEKernelDump;
uint32_t dwMbDataOffset;
PMOS_RESOURCE presPerMB_MBCodeOpData;
PMOS_RESOURCE presRowBuffY;
PMOS_RESOURCE presRowBuffUV;
PMOS_RESOURCE presColBuffY;
PMOS_RESOURCE presColBuffUV;
PMOS_RESOURCE presVmeKernelDumpBuffer;
struct CodechalBindingTableVp8Mbpak* pMbPakBindingTable;
PMHW_KERNEL_STATE pKernelState;
};
struct CodechalVp8MpuSurfaceParams
{
CODECHAL_MEDIA_STATE_TYPE MediaStateType;
uint32_t dwHistogramSize;
uint32_t dwModeProbabilitySize;
uint32_t dwTokenProbabilitySize;
uint32_t dwFrameHeaderSize;
uint32_t dwPictureStateSize;
uint32_t dwHeaderMetadataSize;
uint32_t dwMpuBitstreamSize;
uint32_t dwTpuBitstreamSize;
uint32_t dwEntropyCostTableSize;
uint32_t dwHeaderMetaDataOffset;
uint32_t dwTokenBitsDataSize;
uint32_t dwKernelDumpSize;
bool bVMEKernelDump;
PMOS_RESOURCE presHistogram;
PMOS_RESOURCE presRefModeProbability;
PMOS_RESOURCE presModeProbability;
PMOS_RESOURCE presRefTokenProbability;
PMOS_RESOURCE presTokenProbability;
PMOS_RESOURCE presFrameHeader;
PMOS_RESOURCE presHeaderMetadata;
PMOS_RESOURCE presPictureState;
PMOS_RESOURCE presMpuBitstream;
PMOS_RESOURCE presTpuBitstream;
PMOS_RESOURCE presVmeKernelDumpBuffer;
PMOS_RESOURCE presEntropyCostTable;
PMOS_RESOURCE presTokenBitsData;
PMOS_RESOURCE presModeCostUpdateBuffer;
PMHW_KERNEL_STATE pKernelState;
};
struct CodechalVp8TpuSurfaceParams
{
CODECHAL_MEDIA_STATE_TYPE MediaStateType;
uint32_t dwPakTokenStatsSize;
uint32_t dwTokenProbabilitySize;
uint32_t dwEntropyCostTableSize;
uint32_t dwFrameHeaderSize;
uint32_t dwPictureStateSize;
uint32_t dwMpuCurbeSize;
uint32_t dwHeaderMetadataSize;
uint32_t dwHeaderMetaDataOffset;
uint32_t dwKernelDumpSize;
uint32_t dwRepakDecision;
bool bVMEKernelDump;
PMOS_RESOURCE presPakTokenStatistics;
PMOS_RESOURCE presPakTokenUpdateFlags;
PMOS_RESOURCE presEntropyCostTable;
PMOS_RESOURCE presFrameHeader;
PMOS_RESOURCE presDefaultTokenProbability;
PMOS_RESOURCE presPictureState;
PMOS_RESOURCE presMpuCurbeData;
PMOS_RESOURCE presHeaderMetadata;
PMOS_RESOURCE presCurrFrameTokenProbability;
PMOS_RESOURCE presHwTokenProbabilityPass1;
PMOS_RESOURCE presKeyFrameTokenProbability;
PMOS_RESOURCE presUpdatedFrameTokenProbability;
PMOS_RESOURCE presHwTokenProbabilityPass2;
PMOS_RESOURCE presRepakDecisionSurface;
PMOS_RESOURCE presVmeKernelDumpBuffer;
PMHW_KERNEL_STATE pKernelState;
};
struct CodechalResourcesBrcParams
{
bool bHWWalker;
uint32_t dwDownscaledWidthInMB4x;
uint32_t dwDownscaledHeightInMB4x;
uint32_t dwDownscaledFieldHeightInMB4x;
uint32_t dwFrameWidthInMB;
uint32_t dwFrameHeightInMB;
};
struct CodechalVp8InitBrcConstantBufferParams
{
PMOS_INTERFACE pOsInterface;
PCODEC_PIC_ID pVp8PicIdx;
MOS_RESOURCE resBrcConstantDataBuffer; // sBrcConstantDataBuffer[uiCurrDSH]
uint32_t dwMbEncBlockBasedSkipEn;
PCODEC_VP8_ENCODE_PIC_PARAMS pPicParams; // pAvcPicParams[ucPPSIdx]
uint16_t wPictureCodingType;
};
struct CodechalVp8InitMbencConstantBufferParams
{
PMOS_INTERFACE pOsInterface;
MOS_SURFACE sMBModeCostLumaBuffer;
MOS_SURFACE sBlockModeCostBuffer;
PMOS_RESOURCE presHistogram;
};
struct CodechalVp8InitPakBufferParams
{
PMOS_INTERFACE pOsInterface;
PMOS_RESOURCE presCoeffProbsBuffer;
PMOS_RESOURCE presFrameHeaderBuffer;
uint8_t *pHeader;
uint32_t dwHeaderSize;
};
struct CodechalVp8UpdateMpuTpuBufferParams
{
PMOS_INTERFACE pOsInterface;
PMOS_RESOURCE presCurrFrameTokenProbability;
PMOS_RESOURCE presHwTokenProbabilityPass1;
PMOS_RESOURCE presKeyFrameTokenProbability;
PMOS_RESOURCE presHwTokenProbabilityPass2;
PMOS_RESOURCE presRepakDecisionSurface;
uint32_t dwCoeffProbsSize;
};
struct CodechalVp8MpuTpuBuffers
{
MOS_RESOURCE resRefModeProbs;
MOS_RESOURCE resModeProbs;
MOS_RESOURCE resRefCoeffProbs;
MOS_RESOURCE resCoeffProbs;
MOS_RESOURCE resPictureState;
MOS_RESOURCE resMpuBitstream;
MOS_RESOURCE resEntropyCostTable;
MOS_RESOURCE resTokenBitsData;
MOS_RESOURCE resTpuBitstream;
MOS_RESOURCE resPakTokenStatistics;
MOS_RESOURCE resPakTokenUpdateFlags;
MOS_RESOURCE resDefaultTokenProbability;
MOS_RESOURCE resKeyFrameTokenProbability;
MOS_RESOURCE resUpdatedTokenProbability;
MOS_RESOURCE resHwTokenProbabilityPass2;
MOS_RESOURCE resRepakDecisionSurface;
};
struct CodecEncodeVp8DumpState
{
MOS_SURFACE *sMbSegmentMapSurface;
MOS_SURFACE *s4xMEDistortionBuffer;
MHW_KERNEL_STATE *MpuKernelState;
MHW_KERNEL_STATE *TpuKernelState;
EncodeBrcBuffers *BrcBuffers;
struct CodechalVp8MpuTpuBuffers *MpuTpuBuffers;
MOS_RESOURCE *resFrameHeader;
bool *bBrcEnabled;
MOS_RESOURCE *resModeCostUpdateSurface;
MOS_RESOURCE *resHistogram;
};
struct CodechalEncodeVp8InitKernelStateParams
{
PMHW_KERNEL_STATE pKernelState;
MhwRenderInterface *pRenderEngineInterface;
uint8_t* pui8Binary;
EncOperation Operation;
uint32_t dwKrnStateIdx;
uint32_t dwCombinedKernelSize;
int32_t iBtCount;
int32_t iCurbeCount;
};
//!
//! \class CodechalEncodeVp8
//! \brief VP8 dual-pipe encoder base class
//! \details This class defines the base class for VP8 dual-pipe encoder, it includes
//! common member fields, functions, interfaces etc shared by all GENs.
//! Gen specific definitions, features should be put into their corresponding classes.
//! To create a VP8 dual-pipe encoder instance, client needs to call CodechalEncodeVp8::CreateVp8State()
//!
class CodechalEncodeVp8 : public CodechalEncoderState
{
public:
//!
//! \brief Destructor
//!
virtual ~CodechalEncodeVp8();
//!
//! \brief Allocate resources for encoder instance
//! \details It is invoked when initializing encoder instance
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateResources();
//!
//! \brief Free encoder resources
//! \details It is invoked when destorying encoder instance and it would call
//! FreeEncResources(), FreeBrcResources() and FreePakResources()
//!
//! \return void
//!
void FreeResources();
//!
//! \brief Resize buffers due to resoluton change.
//! \details Resize buffers due to resoluton change.
//!
//! \return void
//!
virtual void ResizeBuffer();
//!
//! \brief Initialize encoder at picture level. Called by each frame.
//!
//! \param [in] params
//! Picture encoding parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS InitializePicture(const EncoderParams& params);
//!
//! \brief Encode kernel functions
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS ExecuteKernelFunctions();
//!
//! \brief Encode command at picture level
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS ExecutePictureLevel();
//!
//! \brief Encode command at slice level
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS ExecuteSliceLevel();
//!
//! \brief Initialize encoder instance
//! \details When GEN specific derived class implements this function to do its own initialization,
// it is required that the derived class calls #CodechalEncodeMpeg2::Initialize() first
// which would do common initialization for all GENs
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS Initialize(CodechalSetting * codecHalSettings);
//!
//! \brief Read Image Status
//!
//! \param [out] cmdBuffer
//! Pointer to MOS_COMMAND_BUFFER
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS ReadImageStatus(PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Read Mfc image Status
//!
//! \param [out] cmdBuffer
//! Pointer to MOS_COMMAND_BUFFER
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS ReadMfcStatus(PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Read Pak Statistics
//!
//! \param [in] params
//! Pointer to CODECHAL_ENCODE_READ_BRC_PAK_STATS_PARAMS
//! \param [out] cmdBuffer
//! Pointer to MOS_COMMAND_BUFFER
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS ReadBrcPakStatistics(
PMOS_COMMAND_BUFFER cmdBuffer,
EncodeReadBrcPakStatsParams* params);
//!
//! \brief Get Status Report
//!
//! \param [in] encodeStatus
//! Pointer to CODECHAL_ENCODE_STATUS
//! \param [out] pEncodeStatusReport
//! Pointer to CODECHAL_ENCODE_STATUS_REPORT
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS GetStatusReport(
EncodeStatus *encodeStatus,
EncodeStatusReport *pEncodeStatusReport);
//!
//! \brief Initialize MMC state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS InitMmcState();
CODEC_VP8_ENCODE_PIC_PARAMS *m_vp8PicParams = nullptr; //<! Pointer to CodecVp8EncodePictureParams
#if USE_CODECHAL_DEBUG_TOOL
MOS_STATUS DumpMbEncPakOutput(PCODEC_REF_LIST currRefList, CodechalDebugInterface* debugInterface);
#endif // USE_CODECHAL_DEBUG_TOOL
protected:
//!
//! \brief Constructor
//!
CodechalEncodeVp8(
CodechalHwInterface* hwInterface,
CodechalDebugInterface* debugInterface,
PCODECHAL_STANDARD_INFO standardInfo);
//!
//! \brief Allocate Resource of BRC
//!
//! \param [in] params
//! Pointer to CODECHAL_RESOURCES_BRC_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateBrcResources (struct CodechalResourcesBrcParams* params);
//!
//! \brief Help function to allocate a 1D buffer
//!
//! \param [in,out] buffer
//! Pointer to allocated buffer
//! \param [in] bufSize
//! Buffer size
//! \param [in] name
//! Buffer name
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateBuffer(
PMOS_RESOURCE buffer,
uint32_t bufSize,
PCCHAR name);
//!
//! \brief Help function to allocate a generic 2D surface
//!
//! \param [in,out] surface
//! Pointer to allocated surface
//! \param [in] surfWidth
//! Surface width
//! \param [in] surfHeight
//! Surface height
//! \param [in] name
//! Surface name
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateBuffer2D(
PMOS_SURFACE surface,
uint32_t surfWidth,
uint32_t surfHeight,
PCCHAR name);
//!
//! \brief Help function to allocate a batch buffer
//!
//! \param [in,out] batchBuffer
//! Pointer to allocated batch buffer
//! \param [in] bufSize
//! Buffer size
//! \param [in] name
//! Batch buffer name
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateBatchBuffer(
PMHW_BATCH_BUFFER batchBuffer,
uint32_t bufSize,
PCCHAR name);
//!
//! \brief Free all Resources of BRC
//!
//! \return void
//!
void FreeBrcResources();
//!
//! \brief Initialize kernel state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitKernelState() = 0;
//!
//! \brief Initialize Mpu Tpu Buffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitMpuTpuBuffer() = 0;
//!
//! \brief Set Curbe for BRC Init or Reset
//!
//! \param [in] params
//! Pointer to CODECHAL_VP8_BRC_INIT_RESET_CURBE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetBrcInitResetCurbe(struct CodechalVp8BrcInitResetCurbeParams* params) = 0;
//!
//! \brief Send Surface for BRC Init or Reset
//!
//! \param [in] cmdBuffer
//! Pointer to MOS_COMMAND_BUFFER
//! \param [in] params
//! Pointer to CODECHAL_VP8_BRC_INIT_RESET_SURFACE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SendBrcInitResetSurfaces(
PMOS_COMMAND_BUFFER cmdBuffer,
struct CodechalVp8BrcInitResetSurfaceParams* params) = 0;
//!
//! \brief Set Curbe for BRC Update
//!
//! \param [in] params
//! Pointer to CODECHAL_VP8_BRC_UPDATE_CURBE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetBrcUpdateCurbe(struct CodechalVp8BrcUpdateCurbeParams* params) = 0;
//!
//! \brief Send Surface for BRC Update
//!
//! \param [in] cmdBuffer
//! Pointer to MOS_COMMAND_BUFFER
//! \param [in] params
//! Pointer to CODECHAL_VP8_BRC_UPDATE_SURFACE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SendBrcUpdateSurfaces(
PMOS_COMMAND_BUFFER cmdBuffer,
struct CodechalVp8BrcUpdateSurfaceParams* params);
//!
//! \brief Set Curbe for Mb Enc
//!
//! \param [in] params
//! Pointer to CODECHAL_VP8_MBENC_CURBE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetMbEncCurbe(struct CodechalVp8MbencCurbeParams* params) = 0;
//!
//! \brief Set Curbe for ME
//!
//! \param [in] params
//! Pointer to CODECHAL_VP8_ME_CURBE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetMeCurbe(struct CodechalVp8MeCurbeParams* params) = 0;
//!
//! \brief Set Curbe for Mpu
//!
//! \param [in] params
//! Pointer to CODECHAL_VP8_MPU_CURBE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetMpuCurbe(struct CodechalVp8MpuCurbeParams* params) = 0;
//!
//! \brief Set Curbe for Tpu
//!
//! \param [in] params
//! Pointer to CODECHAL_VP8_TPU_CURBE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetTpuCurbe(struct CodechalVp8TpuCurbeParams* params) = 0;
//!
//! \brief BRC Constant Buffer Initialize
//!
//! \param [in] params
//! Pointer to CODECHAL_VP8_INIT_BRC_CONSTANT_BUFFER_PARAMS params
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitBrcConstantBuffer(struct CodechalVp8InitBrcConstantBufferParams* params) = 0;
//!
//! \brief BRC Distortion Buffer Initialize
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitBrcDistortionBuffer() = 0;
//!
//! \brief Send Surface for ME
//!
//! \param [in] cmdBuffer
//! Pointer to MOS_COMMAND_BUFFER
//! \param [in] params
//! Pointer to CODECHAL_VP8_ME_SURFACE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SendMeSurfaces(
PMOS_COMMAND_BUFFER cmdBuffer,
struct CodechalVp8MeSurfaceParams* params);
//!
//! \brief Update MpuTpu Buffer with Key Frame
//!
//! \param [in] params
//! Pointer to CODECHAL_VP8_UPDATE_MPU_TPU_BUFFER_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS KeyFrameUpdateMpuTpuBuffer(struct CodechalVp8UpdateMpuTpuBufferParams* params) = 0;
//!
//! \brief Send Surface for Mpu
//!
//! \param [in] cmdBuffer
//! Pointer to MOS_COMMAND_BUFFER
//! \param [in] params
//! Pointer to CODECHAL_VP8_MPU_SURFACE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SendMpuSurfaces(
PMOS_COMMAND_BUFFER cmdBuffer,
struct CodechalVp8MpuSurfaceParams* params) = 0;
//!
//! \brief Send Surface for Tpu
//!
//! \param [in] cmdBuffer
//! Pointer to MOS_COMMAND_BUFFER
//! \param [in] params
//! Pointer to CODECHAL_VP8_TPU_SURFACE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SendTpuSurfaces(
PMOS_COMMAND_BUFFER cmdBuffer,
struct CodechalVp8TpuSurfaceParams* params);
//!
//! \brief MBEnc Constant Buffer initialize
//!
//! \param [in] params
//! Pointer to CODECHAL_VP8_INIT_MBENC_CONSTANT_BUFFER_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitMBEncConstantBuffer(struct CodechalVp8InitMbencConstantBufferParams* params) = 0;
//!
//! \brief Send Surface for Mb Enc
//!
//! \param [in] cmdBuffer
//! Pointer to MOS_COMMAND_BUFFER
//! \param [in] params
//! Pointer to CODECHAL_VP8_MBENC_SURFACE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SendMbEncSurfaces(
PMOS_COMMAND_BUFFER cmdBuffer,
struct CodechalVp8MbencSurfaceParams* params);
//!
//! \brief Set Pak Stats In Tpu Curbe
//!
//! \param [in] cmdBuffer
//! Pointer to MOS_COMMAND_BUFFER
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetPakStatsInTpuCurbe(PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Setup/configure encoder based on sequence parameter set
//! \details It is invoked when the encoder receives a new sequence parameter set and it would
//! set up and configure the encoder state that used for the sequence
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetSequenceStructs();
//!
//! \brief Setup/configure encoder based on picture parameter set
//! \details It is invoked for every picture and it would set up and configure the
//! encoder state that used for current picture
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetPictureStructs();
//!
//! \brief Invoke BRC Init/Reset kernel
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS BrcInitResetKernel();
//!
//! \brief Invoke BRC update kernel
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS BrcUpdateKernel();
//!
//! \brief Top level function for invoking MBenc kernel
//!
//! \param [in] isEncPhase1NotRun
//! Indicate if MbEnc Phase 1 is not enabled
//! \param [in] isEncPhase2
//! Indicate if MbEnc Phase 2 is enabled
//! \param [in] mbEncIFrameDistInUse
//! Indicate if MbEnc I-Frame distortion is enabled
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS MbEncKernel(
bool isEncPhase1NotRun,
bool isEncPhase2,
bool mbEncIFrameDistInUse);
//!
//! \brief Invoke ME kernel
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS MeKernel();
//!
//! \brief Invoke MPU kernel
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS MpuKernel();
//!
//! \brief Invoke TPU kernel
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS TpuKernel();
//!
//! \brief Retrieves the MFC registers and stores them in the dump buffer
//!
//! \param [in] cmdBuffer
//! Pointer to MOS_COMMAND_BUFFER
//! \param [in] resource
//! Pointer to MOS_RESOURCE
//! \param [in] baseOffset
//! Offset of base
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetPakStatsDebugBuffer(
PMOS_COMMAND_BUFFER cmdBuffer,
PMOS_RESOURCE resource,
uint32_t baseOffset);
//!
//! \brief Encode BRC command at slice level
//!
//! \param [in] cmdBuffer
//! Pointer to MOS_COMMAND_BUFFER
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS EncodeSliceLevelBrc(PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Add Batch Buffer End to Picture State Command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AddBBEndToPicStateCmd();
//!
//! \brief Get maximum BT count
//!
//! \return uint32_t
//! Maximum BT count
//!
uint32_t GetMaxBtCount();
#if USE_CODECHAL_DEBUG_TOOL
MOS_STATUS DumpVp8EncodePicParams(PCODEC_VP8_ENCODE_PIC_PARAMS picParams);
MOS_STATUS DumpVp8EncodeSeqParams(PCODEC_VP8_ENCODE_SEQUENCE_PARAMS seqParams);
#endif // USE_CODECHAL_DEBUG_TOOL
MEDIA_FEATURE_TABLE * m_skuTable = nullptr; // SKU table
MEDIA_WA_TABLE * m_waTable = nullptr; // SKU table
// Parameters passed by application
CODEC_VP8_ENCODE_SEQUENCE_PARAMS * m_vp8SeqParams = nullptr;
CODEC_VP8_ENCODE_QUANT_DATA * m_vp8QuantData = nullptr;
CODECHAL_VP8_HYBRIDPAK_FRAMEUPDATE *m_vp8SliceParams = nullptr;
uint8_t* m_kernelBinary = nullptr; //!< Pointer to the kernel binary
uint32_t m_combinedKernelSize = 0; //!< Combined kernel binary size
CODEC_PIC_ID m_picIdx[CODEC_MAX_NUM_REF_FRAME_NON_AVC];
PCODEC_REF_LIST m_refList[CODECHAL_NUM_UNCOMPRESSED_SURFACE_VP8];
bool m_hmeEnabled = false;
bool m_b16XMeEnabled = false;
bool m_hmeDone = false;
bool m_b16XMeDone = false;
bool m_refCtrlOptimizationDone = false;
bool m_brcInit = false;
bool m_brcReset = false;
bool m_brcEnabled = false;
bool m_mbBrcEnabled = false;
bool m_mbEncIFrameDistEnabled = false;
bool m_brcDistortionBufferSupported = false;
bool m_initBrcDistortionBuffer = false;
bool m_brcConstantBufferSupported = false;
bool m_brcSegMapSupported = false;
bool m_mbEncCurbeSetInBrcUpdate;
bool m_mbPakCurbeSetInBrcUpdate = false;
bool m_mpuCurbeSetInBrcUpdate;
bool m_tpuCurbeSetInBrcUpdate;
bool m_mfxEncoderConfigCommandInitialized = false;
bool m_adaptiveRepakSupported = false;
bool m_repakSupported = false;
uint16_t m_usMinPakPasses = 0;
uint16_t m_usRepakPassIterVal = 0; // n th pass when Repak is executed
// MB Enc
MHW_KERNEL_STATE m_mbEncKernelStates[CODECHAL_ENCODE_VP8_MBENC_IDX_NUM];
uint32_t m_numMbEncEncKrnStates = 0;
uint32_t m_mbEncIFrameDshSize = 0;
struct CodechalBindingTableVp8Mbenc m_mbEncBindingTable;
uint32_t m_mbEncBlockBasedSkipEn = 0;
MOS_RESOURCE m_resRefMbCountSurface;
MOS_SURFACE m_mbModeCostLumaBuffer = {};
MOS_SURFACE m_blockModeCostBuffer = {};
MOS_RESOURCE m_chromaReconBuffer; // for fixed function VP8
MOS_SURFACE m_perMbQuantDataBuffer = {};
MOS_RESOURCE m_resPredMvDataSurface;
MOS_RESOURCE m_resHistogram;
MOS_RESOURCE m_resModeCostUpdateSurface;
// MBRC = 1: internal segment map (sInSegmentMapSurface) is provided from BRC update kernel
// MBRC = 0: external segment map (sMbSegmentMapSurface) is provided from the app, ignore internal segment map
MOS_SURFACE m_inSegmentMapSurface = {};
MOS_SURFACE m_mbSegmentMapSurface = {}; // var of type MOS_SURFACE of Mb segment map surface
// MPU & TPU Buffers
struct CodechalVp8MpuTpuBuffers m_mpuTpuBuffers;
// TPU
MHW_KERNEL_STATE m_tpuKernelState;
struct CodechalBindingTableVp8Tpu m_tpuBindingTable = {};
// MPU
MHW_KERNEL_STATE m_mpuKernelState;
struct CodechalBindingTableVp8Mpu m_mpuBindingTable = {};
// VME Scratch Buffers
MOS_RESOURCE m_resVmeKernelDumpBuffer;
bool m_vmeKernelDump;
//HW pak
MOS_RESOURCE m_resIntraRowStoreScratchBuffer;
MOS_RESOURCE m_resFrameHeader;
MOS_RESOURCE m_resPakIntermediateBuffer;
// ME
MHW_KERNEL_STATE m_meKernelState;
struct CodechalBindingTableVp8Me m_meBindingTable = {};
MOS_SURFACE m_s4XMemvDataBuffer;
MOS_SURFACE m_s16XMemvDataBuffer = {};
MOS_SURFACE m_s4XMeDistortionBuffer;
uint32_t m_averageKeyFrameQp = 0;
uint32_t m_averagePFrameQp = 0;
uint32_t m_pFramePositionInGop = 0;
// BRC Params, these parameters not used for BDW
MHW_KERNEL_STATE m_brcKernelStates[CODECHAL_ENCODE_VP8_BRC_IDX_NUM];
struct CodechalBindingTableVp8BrcUpdate m_brcUpdateBindingTable = {};
EncodeBrcBuffers m_brcBuffers;
uint16_t m_usAvbrAccuracy = 0;
uint16_t m_usAvbrConvergence = 0;
double m_dBrcInitCurrentTargetBufFullInBits = 0;
double m_dBrcInitResetInputBitsPerFrame = 0;
uint32_t m_brcInitResetBufSizeInBits = 0;
uint32_t m_brcConstantSurfaceWidth = 0;
uint32_t m_brcConstantSurfaceHeight = 0;
uint32_t m_frameRate = 0;
};
#endif // __CODECHAL_ENCODER_VP8_H__