blob: c5566cb7c2ef0e1ce54efa47da5e2c9b1079dd67 [file] [log] [blame]
/*
* Copyright (c) 2011-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_avc.h
//! \brief This file defines the base C++ class/interface for AVC DualPipe encoding
//! to be used across CODECHAL components.
//!
#ifndef __CODECHAL_ENCODE_AVC_H__
#define __CODECHAL_ENCODE_AVC_H__
#include "codechal_encode_avc_base.h"
#define CODECHAL_ENCODE_AVC_MAX_LAMBDA 0xEFFF
// BRC Block Copy
#define CODECHAL_ENCODE_AVC_BRC_COPY_NUM_ROWS_PER_VME_SEND_MSG 8
#define CODECHAL_ENCODE_AVC_BRC_COPY_NUM_SEND_MSGS_PER_KERNEL 3
#define CODECHAL_ENCODE_AVC_BRC_COPY_BLOCK_WIDTH 64
// SubMbPartMask defined in CURBE for AVC ENC
#define CODECHAL_ENCODE_AVC_DISABLE_4X4_SUB_MB_PARTITION 0x40
#define CODECHAL_ENCODE_AVC_DISABLE_4X8_SUB_MB_PARTITION 0x20
#define CODECHAL_ENCODE_AVC_DISABLE_8X4_SUB_MB_PARTITION 0x10
typedef enum _CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_BRC_INIT_RESET
{
CODECHAL_ENCODE_AVC_BRC_INIT_RESET_HISTORY = 0,
CODECHAL_ENCODE_AVC_BRC_INIT_RESET_DISTORTION,
CODECHAL_ENCODE_AVC_BRC_INIT_RESET_NUM_SURFACES
} CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_BRC_INIT_RESET;
typedef enum _CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_BRC_BLOCK_COPY
{
CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_INPUT = 0,
CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_OUTPUT,
CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_NUM_SURFACES
} CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_BRC_BLOCK_COPY;
typedef struct _CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS
{
PMHW_KERNEL_STATE pKernelState;
uint32_t dwBufferOffset;
uint32_t dwBlockHeight;
} CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS;
typedef struct _CODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS
{
PMOS_INTERFACE pOsInterface;
PCODEC_AVC_ENCODE_SLICE_PARAMS pAvcSlcParams;
PCODEC_PIC_ID pAvcPicIdx;
MOS_SURFACE sBrcConstantDataBuffer; // sBrcConstantDataBuffer[uiCurrDSH]
uint32_t dwMbEncBlockBasedSkipEn;
PCODEC_AVC_ENCODE_PIC_PARAMS pPicParams; // pAvcPicParams[ucPPSIdx]
uint16_t wPictureCodingType;
bool bSkipBiasAdjustmentEnable;
bool bAdaptiveIntraScalingEnable;
bool bOldModeCostEnable;
PCODECHAL_ENCODE_AVC_QUALITY_CTRL_PARAMS pAvcQCParams;
} CODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS, *PCODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS;
typedef struct _CODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS
{
PMOS_RESOURCE presBrcHistoryBuffer;
PMOS_SURFACE psMeBrcDistortionBuffer;
uint32_t dwMeBrcDistortionBottomFieldOffset;
uint32_t dwDownscaledWidthInMb4x;
uint32_t dwDownscaledFrameFieldHeightInMb4x;
} CODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS;
typedef struct _CODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS
{
double *pdBrcInitCurrentTargetBufFullInBits; // Passed back to Render Interface
double *pdBrcInitResetInputBitsPerFrame; // Passed back to Render Interface
uint32_t* pdwBrcInitResetBufSizeInBits; // Passed back to Render Interface
PMHW_KERNEL_STATE pKernelState;
} CODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS;
typedef struct _CODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS
{
PMOS_INTERFACE pOsInterface;
PMOS_RESOURCE presBrcConstantDataBuffer;
uint32_t dwMbEncBlockBasedSkipEn;
PCODEC_AVC_ENCODE_PIC_PARAMS pPicParams; // pAvcPicParams[ucPPSIdx]
uint16_t wPictureCodingType;
bool bSkipBiasAdjustmentEnable;
bool bAdaptiveIntraScalingEnable;
bool bOldModeCostEnable;
bool bPreProcEnable;
bool bEnableKernelTrellis;
PCODECHAL_ENCODE_AVC_QUALITY_CTRL_PARAMS pAvcQCParams;
uint32_t Lambda[52][2];
} CODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS, *PCODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS;
typedef struct _CODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS
{
PCODEC_AVC_ENCODE_SEQUENCE_PARAMS pSeqParams;
PCODEC_AVC_ENCODE_PIC_PARAMS pPicParams;
PCODEC_AVC_ENCODE_SLICE_PARAMS pSlcParams;
PCODEC_REF_LIST *ppRefList;
PCODEC_PIC_ID pPicIdx;
PCODECHAL_ENCODE_AVC_QUALITY_CTRL_PARAMS pAvcQCParams;
uint16_t wPicWidthInMb;
uint16_t wFieldFrameHeightInMb;
uint32_t* pdwBlockBasedSkipEn; // To be returned to render interface
bool bBrcEnabled;
bool bMbEncIFrameDistEnabled;
bool bRoiEnabled;
bool bDirtyRoiEnabled;
bool bUseMbEncAdvKernel;
bool bMbDisableSkipMapEnabled;
bool bStaticFrameDetectionEnabled; // static frame detection enable or not
bool bApdatvieSearchWindowSizeEnabled;
bool bSquareRollingIEnabled;
uint16_t usSliceHeight;
PMHW_KERNEL_STATE pKernelState;
uint8_t* pCurbeBinary;
} CODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS;
typedef struct _CODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS
{
double *pdBrcInitCurrentTargetBufFullInBits; // Passed in and back
uint32_t dwNumSkipFrames;
uint32_t dwSizeSkipFrames;
uint8_t ucMinQP; // Limit min QP that the kernel can choose, based on app setting
uint8_t ucMaxQP; // Limit max QP that the kernel can choose, based on app setting
uint8_t ucEnableROI; // ROI feature for BRC
uint32_t dwIntraRefreshQpThreshold;
bool bSquareRollingIEnabled;
PMHW_KERNEL_STATE pKernelState;
} CODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS;
typedef struct _CODECHAL_ENCODE_AVC_BINDING_TABLE_BRC_UPDATE
{
uint32_t dwFrameBrcHistoryBuffer;
uint32_t dwFrameBrcPakStatisticsOutputBuffer;
uint32_t dwFrameBrcImageStateReadBuffer;
uint32_t dwFrameBrcImageStateWriteBuffer;
uint32_t dwFrameBrcMbEncCurbeReadBuffer;
uint32_t dwFrameBrcMbEncCurbeWriteData;
uint32_t dwFrameBrcDistortionBuffer;
uint32_t dwFrameBrcConstantData;
uint32_t dwFrameBrcMbStatBuffer;
uint32_t dwFrameBrcMvDataBuffer;
uint32_t dwMbBrcHistoryBuffer;
uint32_t dwMbBrcDistortionBuffer;
uint32_t dwMbBrcMbQpBuffer;
uint32_t dwMbBrcROISurface;
uint32_t dwMbBrcIntraDistortionPBFrameSurface;
uint32_t dwMbBrcMbStatBuffer;
uint32_t dwBindingTableStartOffset;
uint32_t dwNumBindingTableEntries;
} CODECHAL_ENCODE_AVC_BINDING_TABLE_BRC_UPDATE, *PCODECHAL_ENCODE_AVC_BINDING_TABLE_BRC_UPDATE;
typedef struct _CODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS
{
CODECHAL_MEDIA_STATE_TYPE MbEncMediaStateType;
EncodeBrcBuffers* pBrcBuffers;
uint32_t dwDownscaledWidthInMb4x;
uint32_t dwDownscaledFrameFieldHeightInMb4x;
bool bMbBrcEnabled;
bool bUseAdvancedDsh;
bool bBrcRoiEnabled;
PMOS_RESOURCE presMbEncCurbeBuffer;
PMOS_RESOURCE presMbEncBRCBuffer; //extra surface on KBL BRC update
PMOS_SURFACE psRoiSurface;
PMOS_RESOURCE presMbStatBuffer;
PMOS_SURFACE psMvDataBuffer;
uint32_t dwBrcPakStatisticsSize;
uint32_t dwBrcHistoryBufferSize;
uint32_t dwMbEncBRCBufferSize;
uint32_t dwMvBottomFieldOffset;
uint8_t ucCurrRecycledBufIdx;
PCODECHAL_ENCODE_AVC_BINDING_TABLE_BRC_UPDATE pBrcUpdateBindingTable;
PMHW_KERNEL_STATE pKernelState;
} CODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS;
typedef struct _CODECHAL_ENCODE_AVC_IPCM_THRESHOLD
{
uint8_t QP;
uint16_t Threshold;
} CODECHAL_ENCODE_AVC_IPCM_THRESHOLD;
// Force RepartitionCheck
typedef enum _CODECHAL_ENCODE_AVC_RPC
{
CODECHAL_ENCODE_RPC_FOLLOW_DRIVER = 0,
CODECHAL_ENCODE_RPC_FORCE_ENABLE,
CODECHAL_ENCODE_RPC_FORCE_DISABLE
} CODECHAL_ENCODE_AVC_RPC;
typedef struct _CODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC
{
uint32_t dwAvcMBEncMfcAvcPakObj;
uint32_t dwAvcMBEncIndMVData;
uint32_t dwAvcVPPStatistics;
uint32_t dwAvcMBEncCurrY;
uint32_t dwAvcMBEncCurrUV;
uint32_t dwAvcMBEncMbSpecificData;
uint32_t dwAvcMBEncFwdRefY;
uint32_t dwAvcMBEncBwdRefY;
uint32_t dwAvcMBEncFwdRefMVData;
uint32_t dwAvcMBEncBwdRefMBData;
uint32_t dwAvcMBEncBwdRefMVData;
uint32_t dwAvcMBEncMVDataFromME;
uint32_t dwAvcMBEncRefPicSelectL0;
uint32_t dwAvcMBEncRefPicSelectL1;
uint32_t dwAvcMBEncCurrPic;
uint32_t dwAvcMBEncFwdPic;
uint32_t dwAvcMBEncBwdPic;
uint32_t dwAvcMBEncMbBrcConstData;
uint32_t dwAvcMBEncMEDist;
uint32_t dwAvcMBEncBRCDist;
uint32_t dwAvcMBEncDebugScratch;
uint32_t dwAvcMBEncFlatnessChk;
uint32_t dwAvcMBEncMBStats;
uint32_t dwAvcMBEncMADData;
uint32_t dwAvcMBEncVMEDistortion;
uint32_t dwAvcMbEncBRCCurbeData;
uint32_t dwAvcMBEncSliceMapData;
uint32_t dwAvcMBEncMvPrediction;
uint32_t dwAvcMBEncMbNonSkipMap;
uint32_t dwAvcMBEncAdv;
uint32_t dwAvcMBEncStaticDetectionCostTable;
// Frame Binding Table Entries
uint32_t dwAvcMBEncCurrPicFrame[CODEC_AVC_NUM_REF_LISTS];
uint32_t dwAvcMBEncFwdPicFrame[CODECHAL_ENCODE_NUM_MAX_VME_L0_REF];
uint32_t dwAvcMBEncBwdPicFrame[CODECHAL_ENCODE_NUM_MAX_VME_L1_REF * 2]; // Bwd ref IDX0 and IDX1 are repeated, so include two extra to account for this
uint32_t dwAvcMBEncMbQpFrame;
uint32_t dwAvcMbEncMADFrame;
uint32_t dwAvcMBEncSliceMapFrame;
uint32_t dwAvcMBEncMbNonSkipMapFrame;
// Field Binding Table Entries
uint32_t dwAvcMBEncFieldCurrPic[CODEC_AVC_NUM_REF_LISTS];
uint32_t dwAvcMBEncFwdPicTopField[CODECHAL_ENCODE_NUM_MAX_VME_L0_REF];
uint32_t dwAvcMBEncFwdPicBotField[CODECHAL_ENCODE_NUM_MAX_VME_L0_REF];
uint32_t dwAvcMBEncBwdPicTopField[CODECHAL_ENCODE_NUM_MAX_VME_L1_REF * 2];
uint32_t dwAvcMBEncBwdPicBotField[CODECHAL_ENCODE_NUM_MAX_VME_L1_REF * 2];
uint32_t dwAvcMBEncMbQpField;
uint32_t dwAvcMBEncMADField;
uint32_t dwAvcMBEncSliceMapField;
uint32_t dwAvcMBEncMbNonSkipMapField;
uint32_t dwBindingTableStartOffset;
uint32_t dwNumBindingTableEntries;
} CODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC, *PCODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC;
typedef struct _CODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS
{
CODECHAL_MEDIA_STATE_TYPE MediaStateType;
PCODEC_AVC_ENCODE_SLICE_PARAMS pAvcSlcParams;
CodecEncodeAvcFeiPicParams *pFeiPicParams;
PCODEC_REF_LIST *ppRefList;
PCODEC_PIC_ID pAvcPicIdx;
PCODEC_PICTURE pCurrOriginalPic;
PCODEC_PICTURE pCurrReconstructedPic;
uint16_t wPictureCodingType;
PMOS_SURFACE psCurrPicSurface;
uint32_t dwCurrPicSurfaceOffset;
uint32_t dwMbCodeBottomFieldOffset;
uint32_t dwMvBottomFieldOffset;
PMOS_SURFACE ps4xMeMvDataBuffer;
CmSurface2D *ps4xMeMvDataCmBuffer;
uint32_t dwMeMvBottomFieldOffset;
PMOS_SURFACE ps4xMeDistortionBuffer;
CmSurface2D *ps4xMeDistortionCmBuffer;
uint32_t dwMeDistortionBottomFieldOffset;
uint32_t dwRefPicSelectBottomFieldOffset;
PMOS_SURFACE psMeBrcDistortionBuffer;
uint32_t dwMeBrcDistortionBottomFieldOffset;
PMOS_RESOURCE presMbBrcConstDataBuffer;
PMOS_RESOURCE presMbSpecificDataBuffer;
PMOS_SURFACE psMbQpBuffer;
uint32_t dwMbQpBottomFieldOffset;
bool bFlatnessCheckEnabled;
PMOS_SURFACE psFlatnessCheckSurface;
uint32_t dwFlatnessCheckBottomFieldOffset;
bool bMBVProcStatsEnabled;
PMOS_RESOURCE presMBVProcStatsBuffer;
uint32_t dwMBVProcStatsBottomFieldOffset;
PMOS_RESOURCE presMADDataBuffer;
bool bMADEnabled;
uint32_t dwFrameWidthInMb;
uint32_t dwFrameFieldHeightInMb;
uint32_t dwFrameHeightInMb;
uint32_t dwVerticalLineStride;
uint32_t dwVerticalLineStrideOffset;
bool bHmeEnabled;
bool bMbEncIFrameDistInUse;
bool bMbQpBufferInUse;
bool bMbSpecificDataEnabled;
bool bMbConstDataBufferInUse;
bool bUsedAsRef;
PMOS_RESOURCE presMbEncCurbeBuffer;
PMOS_RESOURCE presMbEncBRCBuffer; //extra surface on KBL BRC update
uint32_t dwMbEncBRCBufferSize;
bool bUseMbEncAdvKernel;
bool bArbitraryNumMbsInSlice;
PMOS_SURFACE psSliceMapSurface; // Slice map for arbitrary number of mbs in slice feature
uint32_t dwSliceMapBottomFieldOffset;
bool bBrcEnabled;
PMHW_KERNEL_STATE pKernelState;
bool bUseAdvancedDsh;
PCODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC pMbEncBindingTable;
bool bMbDisableSkipMapEnabled;
PMOS_SURFACE psMbDisableSkipMapSurface;
bool bStaticFrameDetectionEnabled;
PMOS_RESOURCE presSFDOutputBuffer;
PMOS_RESOURCE presSFDCostTableBuffer;
PCODEC_AVC_REF_PIC_SELECT_LIST pWeightedPredOutputPicSelectList;
bool bUseWeightedSurfaceForL0;
bool bUseWeightedSurfaceForL1;
PMOS_RESOURCE presMbInlineData;
PMOS_RESOURCE presVMEOutSurface;
} CODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS;
typedef struct _CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS
{
uint32_t submitNumber;
PMHW_KERNEL_STATE pKernelState;
PCODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC pBindingTable;
} CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS;
typedef enum _CODECHAL_ENCODE_AVC_MULTIPRED
{
CODECHAL_ENCODE_AVC_MULTIPRED_ENABLE = 0x01,
CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE = 0x80
} CODECHAL_ENCODE_AVC_MULTIPRED;
typedef struct _CODECHAL_ENCODE_AVC_BINDING_TABLE_PREPROC
{
uint32_t dwAvcPreProcCurrY;
uint32_t dwAvcPreProcCurrUV;
uint32_t dwAvcPreProcMVDataFromHME;
uint32_t dwAvcPreProcMvPredictor;
uint32_t dwAvcPreProcMbQp;
uint32_t dwAvcPreProcMvDataOut;
uint32_t dwAvcPreProcMbStatsOut;
uint32_t dwAvcPreProcVMECurrPicFrame[CODEC_AVC_NUM_REF_LISTS];
uint32_t dwAvcPreProcVMEFwdPicFrame;
uint32_t dwAvcPreProcVMEBwdPicFrame[2]; // Bwd ref IDX0 and IDX1 are repeated, so include two to account for this
uint32_t dwAvcPreProcFtqLut;
uint32_t dwAvcPreProcVMECurrPicField[2];
uint32_t dwAvcPreProcVMEFwdPicField[2];
uint32_t dwAvcPreProcVMEBwdPicField[2];
uint32_t dwAvcPreProcFtqLutField;
uint32_t dwBindingTableStartOffset;
uint32_t dwNumBindingTableEntries;
} CODECHAL_ENCODE_AVC_BINDING_TABLE_PREPROC, *PCODECHAL_ENCODE_AVC_BINDING_TABLE_PREPROC;
typedef struct _CODECHAL_ENCOCDE_AVC_PREPROC_SURFACE_PARAMS
{
FeiPreEncParams *pPreEncParams;
PCODEC_REF_LIST *ppRefList;
PCODEC_PICTURE pCurrOriginalPic;
PMOS_SURFACE psCurrPicSurface;
PMOS_SURFACE ps4xMeMvDataBuffer;
PMOS_RESOURCE presFtqLutBuffer;
uint32_t dwMeMvBottomFieldOffset;
uint32_t dwMBVProcStatsBottomFieldOffset;
uint32_t dwFrameWidthInMb;
uint32_t dwFrameFieldHeightInMb;
uint32_t dwVerticalLineStride;
uint32_t dwVerticalLineStrideOffset;
bool bHmeEnabled;
PMHW_KERNEL_STATE pKernelState;
PCODECHAL_ENCODE_AVC_BINDING_TABLE_PREPROC pPreProcBindingTable;
} CODECHAL_ENCODE_AVC_PREPROC_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_PREPROC_SURFACE_PARAMS;
typedef struct _CODECHAL_ENCODE_AVC_PREPROC_CURBE_PARAMS
{
FeiPreEncParams *pPreEncParams;
uint16_t wPicWidthInMb;
uint16_t wFieldFrameHeightInMb;
PMHW_KERNEL_STATE pKernelState;
uint8_t* pCurbeBinary;
} CODECHAL_ENCODE_AVC_PREPROC_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_PREPROC_CURBE_PARAMS;
typedef struct _CODECHAL_ENCODE_AVC_WP_CURBE_PARAMS
{
uint8_t RefPicListIdx;
uint32_t WPIdx;
} CODECHAL_ENCODE_AVC_WP_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_WP_CURBE_PARAMS;
typedef struct _CODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS
{
PMOS_SURFACE psInputRefBuffer;
PMOS_SURFACE psOutputScaledBuffer;
uint32_t dwVerticalLineStride;
uint32_t dwVerticalLineStrideOffset;
uint8_t ucVDirection;
PMHW_KERNEL_STATE pKernelState;
} CODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS;
//!
//! \struct CodechalEncodeAvcEnc
//! \brief Codechal encode Avc Encode
//!
struct CodechalEncodeAvcEnc : public CodechalEncodeAvcBase
{
typedef struct _CODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS
{
union
{
struct
{
uint32_t ForceToIntra : MOS_BITFIELD_RANGE( 0, 0 );
uint32_t Reserved : MOS_BITFIELD_RANGE( 1,31 );
};
struct
{
uint32_t Value;
};
} DW0;
union
{
struct
{
uint32_t Reserved : MOS_BITFIELD_RANGE( 0,31 );
};
struct
{
uint32_t Value;
};
} DW1;
union
{
struct
{
uint32_t Reserved : MOS_BITFIELD_RANGE( 0,31 );
};
struct
{
uint32_t Value;
};
} DW2;
union
{
struct
{
uint32_t Reserved : MOS_BITFIELD_RANGE( 0,31 );
};
struct
{
uint32_t Value;
};
} DW3;
} CODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS, *PCODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS;
C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(CODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS)) == 4);
// SEI
CodechalEncodeSeiData SeiData; //!< Encode SEI data parameter.
uint32_t dwSEIDataOffset; //!< Encode SEI data offset.
uint8_t* pSeiParamBuffer; //!< Encode SEI data buffer.
bool bMbEncCurbeSetInBrcUpdate; //!< bMbEncCurbeSetInBrcUpdate.
bool bMbEncIFrameDistEnabled; //!< bMbEncIFrameDistEnabled.
bool bBrcInit; //!< BRC init enable flag.
bool bBrcReset; //!< BRC reset enable flag.
bool bBrcEnabled; //!< BRC enable flag.
bool bMbBrcEnabled; //!< MBBrc enable flag.
bool bBrcRoiEnabled; //!< BRC ROI feature enable flag.
bool bROIValueInDeltaQP; //!< ROI QP in delta QP flag.
bool bROISmoothEnabled; //!< ROI smooth area enable flag.
bool bMbBrcUserFeatureKeyControl; //!< MBBRC user feature control enable flag.
double dBrcTargetSize; //!< BRC target size.
uint32_t dwTrellis; //!< Trellis Number.
bool bAcceleratorHeaderPackingCaps; //!< Flag set by driver from driver caps.
uint32_t dwIntraRefreshQpThreshold; //!< Intra Refresh QP Threshold.
bool bSquareRollingIEnabled; //!< SquareRollingI enable flag.
// VME Scratch Buffers
MOS_RESOURCE resVMEScratchBuffer; //!< VME Scratch Buffer resource.
bool bVMEScratchBuffer; //!< VME ScratchBuffer enable flag.
MOS_RESOURCE resVmeKernelDumpBuffer; //!< VME Kernel Dump resource.
bool bVMEKernelDump; //!< VME kernel dump flag.
uint32_t ulVMEKernelDumpBottomFieldOffset; //!< VME Kernel Dump Bottom Field Offset
// MbEnc
PMHW_KERNEL_STATE pMbEncKernelStates; //!< Pointer to MbEnc Kernel States.
CODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC MbEncBindingTable; //!< Pointer to MbEnc BindingTable.
uint32_t dwNumMbEncEncKrnStates; //!< MbEncEncKrnStates Number.
CODEC_AVC_REF_PIC_SELECT_LIST RefPicSelectList[CODECHAL_ENCODE_AVC_REF_PIC_SELECT_ENTRIES]; //!< Array of RefPicSelect.
uint8_t ucCurrRefPicSelectIndex; //!< Current RefPic Select Index
uint32_t ulRefPicSelectBottomFieldOffset; //!< RefPic Select BottomField Offset
uint32_t dwMbEncBlockBasedSkipEn; //!< MbEnc Block Based Skip enable flag.
bool bKernelTrellis; //!< Kernel controlled Trellis Quantization.
bool bExtendedMvCostRange; //!< Extended MV Cost Range for Gen10+.
//MFE MbEnc
MHW_KERNEL_STATE mfeMbEncKernelState; //!< Mfe MbEnc Kernel State.
// Intra Distortion
PMHW_KERNEL_STATE pIntraDistortionKernelStates; //!< Point to Intra Distortion Kernel States.
// WP
PMHW_KERNEL_STATE pWPKernelState; //!< Point to WP Kernel State.
CODEC_AVC_REF_PIC_SELECT_LIST WeightedPredOutputPicSelectList[CODEC_AVC_NUM_WP_FRAME]; //!< Array of WeightedPredOutputPicSelectList.
// BRC Params
MHW_KERNEL_STATE BrcKernelStates[CODECHAL_ENCODE_BRC_IDX_NUM]; //!< Array of BrcKernelStates.
CODECHAL_ENCODE_AVC_BINDING_TABLE_BRC_UPDATE BrcUpdateBindingTable; //!< BrcUpdate BindingTable
// PreProc
MHW_KERNEL_STATE PreProcKernelState; //!< PreProc KernelState
CODECHAL_ENCODE_AVC_BINDING_TABLE_PREPROC PreProcBindingTable; //!< PreProc BindingTable
EncodeBrcBuffers BrcBuffers; //!< BRC related buffers
uint16_t usAVBRAccuracy; //!< AVBR Accuracy
uint16_t usAVBRConvergence; //!< AVBR Convergence
double dBrcInitCurrentTargetBufFullInBits; //!< BRC init current target buffer full in bits
double dBrcInitResetInputBitsPerFrame; //!< BrcInitReset Input Bits Per Frame
uint32_t dwBrcInitResetBufSizeInBits; //!< BrcInitReset Buffer Size In Bits
uint32_t dwBrcInitPreviousTargetBufFullInBits; //!< BRC Init Previous Target Buffer Full In Bits
// Below values will be set if qp control params are sent by app
bool bMinMaxQPControlEnabled; //!< Flag to indicate if min/max QP feature is enabled or not.
uint8_t ucIMinQP; //!< I frame Minimum QP.
uint8_t ucIMaxQP; //!< I frame Maximum QP.
uint8_t ucPMinQP; //!< P frame Minimum QP.
uint8_t ucPMaxQP; //!< P frame Maximum QP.
uint8_t ucBMinQP; //!< B frame Minimum QP.
uint8_t ucBMaxQP; //!< B frame Maximum QP.
bool bPFrameMinMaxQPControl; //!< Indicates min/max QP values for P-frames are set separately or not.
bool bBFrameMinMaxQPControl; //!< Indicates min/max QP values for B-frames are set separately or not.
uint32_t dwSkipFrameBufferSize; //!< size of skip frame packed data.
MOS_RESOURCE resSkipFrameBuffer; //!< copy skip frame packed data from DDI.
// Mb Disable Skip Map
bool bMbDisableSkipMapEnabled; //!< MbDisableSkipMap Flag.
PMOS_SURFACE psMbDisableSkipMapSurface; //!< Point to MbDisableSkipMap Surface.
// Mb Qp Data
bool bMbQpDataEnabled; //!< Mb Qp Data Enable Flag.
MOS_SURFACE sMbQpDataSurface; //!< Pointer to MOS_SURFACE of Mb Qp data surface, provided by DDI.
// Mb specific Data
bool bMbSpecificDataEnabled;
MOS_RESOURCE resMbSpecificDataBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM];
// Static frame detection
bool bStaticFrameDetectionEnable; //!< Static frame detection enable.
bool bApdatvieSearchWindowEnable; //!< allow search window size change when SFD enabled.
bool bPerMbSFD; //!<
MOS_RESOURCE resSFDOutputBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; //!< Array of SFDOutputBuffer.
MOS_RESOURCE resSFDCostTablePFrameBuffer; //!< SFD CostTable of P Frame.
MOS_RESOURCE resSFDCostTableBFrameBuffer; //!< SFD CostTable of B Frame.
PMHW_KERNEL_STATE pSFDKernelState; //!< Point to SFD kernel state.
// Generation Specific Support Flags & User Feature Key Reads
bool bBrcDistortionBufferSupported; //!< BRC DistortionBuffer Support Flag.
bool bRefPicSelectListSupported; //!< RefPicSelectList Support Flag.
uint8_t ucMbBrcSupportCaps; //!< MbBrcSupport Capability.
bool bMultiPredEnable; //!< MultiPredictor enable, 6 predictors
bool bFTQEnable; //!< FTQEnable
bool bCAFSupported; //!< CAFSupported
bool bCAFEnable; //!< CAFEnable
bool bCAFDisableHD; //!< Disable CAF for HD
bool bSkipBiasAdjustmentSupported; //!< SkipBiasAdjustment support for P frame
bool bAdaptiveIntraScalingEnable; //!< Enable AdaptiveIntraScaling
bool bOldModeCostEnable; //!< Enable Old Mode Cost (HSW cost table for BDW)
bool bMultiRefQpEnabled; //!< BDW MultiRef QP
bool bAdvancedDshInUse; //!< Use MbEnc Adv kernel
bool bUseMbEncAdvKernel; //!< Use MbEnc Adv kernel
bool bUseWeightedSurfaceForL0; //!< Use WP Surface for L0
bool bUseWeightedSurfaceForL1; //!< Use WP Surface for L1
bool bWeightedPredictionSupported; //!< Weighted prediction support
bool bBrcSplitEnable; //!< starting GEN9 BRC kernel has split into frame-level and MB-level update.
bool bDecoupleMbEncCurbeFromBRC; //!< starting GEN95 BRC kernel write to extra surface instead of MBEnc curbe.
bool bSliceLevelReportSupported; //!< Slice Level Report support
bool bFBRBypassEnable; //!< FBRBypassEnable
bool bBrcRoiSupported; //!< BRC Roi Support Flag.
bool bMvDataNeededByBRC; //!< starting G95, mv data buffer from HME is needed by BRC frame update kernel.
bool bHighTextureModeCostEnable; //!< HighTexture ModeCost Enable Flag.
bool bRoundingInterEnable; //!< RoundingInter Enable Flag.
bool bAdaptiveRoundingInterEnable; //!< Adaptive Rounding Inter Enable Flag.
uint32_t dwRoundingInterP; //!< Rounding Inter for P frame
uint32_t dwRoundingInterB; //!< Rounding Inter for B frame
uint32_t dwRoundingInterBRef; //!< Rounding Inter for BRef frame
uint32_t dwBrcConstantSurfaceWidth; //!< Brc Constant Surface Width
uint32_t dwBrcConstantSurfaceHeight; //!< Brc Constant Surface Height
uint32_t dwSlidingWindowSize; //!< Sliding Window Size
bool bForceToSkipEnable; //!< ForceToSkip Enable Flag
bool bBRCVarCompuBypass; //!< Bypass variance computation in BRC kernel
static const uint32_t MaxLenSP[NUM_TARGET_USAGE_MODES];
static const uint32_t EnableAdaptiveSearch[NUM_TARGET_USAGE_MODES];
static const uint32_t FTQBasedSkip[NUM_TARGET_USAGE_MODES];
static const uint32_t HMEBCombineLen[NUM_TARGET_USAGE_MODES];
static const uint32_t HMECombineLen[NUM_TARGET_USAGE_MODES];
static const uint32_t SearchX[NUM_TARGET_USAGE_MODES];
static const uint32_t SearchY[NUM_TARGET_USAGE_MODES];
static const uint32_t BSearchX[NUM_TARGET_USAGE_MODES];
static const uint32_t BSearchY[NUM_TARGET_USAGE_MODES];
static const uint32_t InterRoundingP_TQ[NUM_TARGET_USAGE_MODES];
static const uint32_t InterRoundingBRef_TQ[NUM_TARGET_USAGE_MODES];
static const uint32_t InterRoundingB_TQ[NUM_TARGET_USAGE_MODES];
static const uint32_t TrellisQuantizationEnable[NUM_TARGET_USAGE_MODES];
static const uint32_t EnableAdaptiveTrellisQuantization[NUM_TARGET_USAGE_MODES];
static const uint32_t TQ_LAMBDA_I_FRAME[CODEC_AVC_NUM_QP][2];
static const uint32_t TQ_LAMBDA_P_FRAME[CODEC_AVC_NUM_QP][2];
static const uint32_t TQ_LAMBDA_B_FRAME[CODEC_AVC_NUM_QP][2];
static const uint8_t IntraScalingFactor_Cm_Common[64];
static const uint8_t AdaptiveIntraScalingFactor_Cm_Common[64];
static const uint32_t OldIntraModeCost_Cm_Common[CODEC_AVC_NUM_QP];
static const uint32_t MvCost_PSkipAdjustment_Cm_Common[CODEC_AVC_NUM_QP];
static const uint16_t SkipVal_B_Common[2][2][64];
static const uint16_t SkipVal_P_Common[2][2][64];
static const uint32_t PreProcFtqLut_Cm_Common[CODEC_AVC_NUM_QP][16];
static const uint32_t MBBrcConstantData_Cm_Common[3][CODEC_AVC_NUM_QP][16];
static const uint32_t ModeMvCost_Common[3][CODEC_AVC_NUM_QP][8];
static const uint16_t RefCost_Common[3][64];
static const uint8_t MaxRefIdx0_Progressive_4K[NUM_TARGET_USAGE_MODES];
static const uint8_t MaxRefIdx0[NUM_TARGET_USAGE_MODES];
static const uint8_t MaxBRefIdx0[NUM_TARGET_USAGE_MODES];
static const uint8_t MaxRefIdx1[NUM_TARGET_USAGE_MODES];
static const uint32_t SuperHME[NUM_TARGET_USAGE_MODES];
static const uint32_t UltraHME[NUM_TARGET_USAGE_MODES];
static const uint32_t ModeMvCost_Cm[3][52][8];
static const uint8_t m_qpDistMaxFrameAdjustmentCm[576];
static const uint32_t MultiPred[NUM_TARGET_USAGE_MODES];
static const uint32_t MRDisableQPCheck[NUM_TARGET_USAGE_MODES];
static const uint16_t RefCost_MultiRefQp[NUM_PIC_TYPES][64];
static const uint32_t CODECHAL_ENCODE_AVC_AllFractional_Common[NUM_TARGET_USAGE_MODES];
static const uint32_t CODECHAL_ENCODE_AVC_DisableAllFractionalCheckForHighRes_Common[NUM_TARGET_USAGE_MODES];
static const uint32_t m_refThreshold = 400;
static const uint32_t m_mbencNumTargetUsages = 3;
static const uint32_t m_brcConstantSurfaceEarlySkipTableSize = 128;
static const uint32_t m_brcConstantSurfaceRefCostSize = 128;
static const uint32_t m_brcConstantSurfacModeMvCostSize = 1664;
typedef enum _ID_OFFSET_MBENC_CM
{
MBENC_I_OFFSET_CM = 0,
MBENC_P_OFFSET_CM = 1,
MBENC_B_OFFSET_CM = 2,
MBENC_TARGET_USAGE_CM = 3
} ID_OFFSET_MBENC_CM;
//!
//! \brief Constructor
//!
CodechalEncodeAvcEnc(
CodechalHwInterface * hwInterface,
CodechalDebugInterface *debugInterface,
PCODECHAL_STANDARD_INFO standardInfo);
//!
//! \brief Copy constructor
//!
CodechalEncodeAvcEnc(const CodechalEncodeAvcEnc&) = delete;
//!
//! \brief Copy assignment operator
//!
CodechalEncodeAvcEnc& operator=(const CodechalEncodeAvcEnc&) = delete;
//!
//! \brief Destructor
//!
virtual ~CodechalEncodeAvcEnc();
//Encode interface implementations
//!
//! \brief Initialize standard related members.
//! \details Initialize members, set proper value
//! to involved variables, allocate resources.
//!
//! \param [in] settings
//! Encode settings.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS Initialize(
CodechalSetting * settings) override;
//!
//! \brief Initialize encoder related members.
//! \details Initialize members, set proper value
//! to involved variables, allocate resources.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS InitializePicture(const EncoderParams& params) override;
//!
//! \brief Call media kernel functions.
//! \details Call to related encode kernel functions.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS ExecuteKernelFunctions() override;
//!
//! \brief Encode frame in picture level.
//! \details Call related encode functions to encode
//! one frame in picture level.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS ExecutePictureLevel() override;
//!
//! \brief Encode frame in slice level.
//! \details Call related encode functions to encode
//! one frame in slice level.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS ExecuteSliceLevel() override;
//!
//! \brief Encode User Feature Key Report.
//! \details Report user feature values set by encode.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS UserFeatureKeyReport() override;
virtual MOS_STATUS ExecutePreEnc(EncoderParams* encodeParams) override;
//!
//! \brief Slice map surface programming
//! \details Set slice map data.
//!
//! \param [in] data
//! Encode interface
//! \param [in] avcSliceParams
//! Slice map command params
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS EncodeGenerateSliceMap(
uint8_t* data,
PCODEC_AVC_ENCODE_SLICE_PARAMS avcSliceParams);
//!
//! \brief Allocate necessary resources.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS AllocateResources() override;
//!
//! \brief Allocate necessary resources for BRC case.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS AllocateResourcesBrc();
//!
//! \brief Allocate necessary resources for MBBRC case.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS AllocateResourcesMbBrc();
//!
//! \brief Release allocated resources for BRC case.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS ReleaseResourcesBrc();
//!
//! \brief Release allocated resources for MBBRC case.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS ReleaseResourcesMbBrc();
//!
//! \brief AVC Enc State Initialization.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS Initialize() override;
//!
//! \brief Generic State Picture Level Encoding..
//!
//! \param [in] params
//! Pointer to the CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS GenericEncodePictureLevel(
PCODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS params);
//!
//! \brief Run Encode ME kernel
//!
//! \param [in] brcBuffers
//! Pointer to the EncodeBrcBuffers
//! \param [in] hmeLevel
//! Hme level
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS GenericEncodeMeKernel(EncodeBrcBuffers* brcBuffers, HmeLevel hmeLevel);
//!
//! \brief Initialize Encode ME kernel state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS InitKernelStateMe() override;
//!
//! \brief Set Encode ME kernel Curbe data.
//!
//! \param [in] params
//! Pointer to the MeCurbeParams
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS SetCurbeMe (
MeCurbeParams* params) override;
//!
//! \brief Set Encode ME kernel Surfaces
//!
//! \param [in] cmdBuffer
//! Pointer to the PMOS_COMMAND_BUFFER
//! \param [in] params
//! Pointer to the CODECHAL_ME_SURFACE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS SendMeSurfaces (
PMOS_COMMAND_BUFFER cmdBuffer,
MeSurfaceParams* params) override;
// AvcState functions.
//!
//! \brief Initialize data members of AVC encoder instance
//!
//! \return void
//!
virtual void InitializeDataMember();
// state related funcs
//!
//! \brief Initialize encode state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitializeState();
//!
//! \brief Validate reference list L0 and L1.
//!
//! \param [in] params
//! Pointer to CODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS ValidateNumReferences(
PCODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS params);
//!
//! \brief Initialize brc constant buffer
//!
//! \param [in] params
//! Pointer to CODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitBrcConstantBuffer(
PCODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS params);
//!
//! \brief Initialize mbbrc constant buffer
//!
//! \param [in] params
//! Pointer to CODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitMbBrcConstantDataBuffer(
PCODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS params);
//!
//! \brief Get inter rounding value.
//!
//! \param [in] sliceState
//! Pointer to MHW_VDBOX_AVC_SLICE_STATE
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS GetInterRounding(
PMHW_VDBOX_AVC_SLICE_STATE sliceState);
//!
//! \brief Calculate lambda table.
//!
//! \param [in] slice_type
//! Slice type.
//! \param [out] lambda
//! Lambda table.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS CalcLambdaTable(
uint16_t slice_type,
uint32_t* lambda);
//!
//! \brief Get Trellis Quantization mode/value enable or not.
//!
//! \param [in] params
//! Pointer to CODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS.
//! \param [out] trellisQuantParams
//! Pointer to CODECHAL_ENCODE_AVC_TQ_PARAMS, mode & value setup.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS GetTrellisQuantization(
PCODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS params,
PCODECHAL_ENCODE_AVC_TQ_PARAMS trellisQuantParams)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Get Skip Bias Adjustment.
//!
//! \param [in] sliceQP
//! Slice QP.
//! \param [in] gopRefDist
//! GOP reference dist.
//! \param [in] skipBiasAdjustmentEnable
//! Adjustable or not.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS GetSkipBiasAdjustment(
uint8_t sliceQP,
uint16_t gopRefDist,
bool* skipBiasAdjustmentEnable);
//!
//! \brief Get Hme Supported Based On TU.
//!
//! \param [in] hmeLevel
//! HME level
//! \param [out] supported
//! Supported or not
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS GetHmeSupportedBasedOnTU(
HmeLevel hmeLevel,
bool *supported);
//!
//! \brief Get MbBrc status.
//!
//! \param [in] targetUsage
//! Target Usage.
//! \param [out] mbBrcEnabled
//! MBBRC enabled or not
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS GetMbBrcEnabled(
uint32_t targetUsage,
bool *mbBrcEnabled);
//!
//! \brief CAF enabled or not.
//!
//! \param [out] cafEnable
//! CAF enabled or not
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS GetCAFEnabled(
bool *cafEnable);
//!
//! \brief ATD enabled or not.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS GetATDEnabled();
//!
//! \brief Init BRC reset kernel
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS BrcInitResetKernel();
//!
//! \brief Init MbEnc kernel state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitKernelStateMbEnc()
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Init Weight Prediction kernel state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitKernelStateWP()
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Init BRC kernel state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitKernelStateBrc()
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Init FEI PreProc kernel state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitKernelStatePreProc()
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Init SFD(still frame detection) kernel state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitKernelStateSFD();
//!
//! \brief Init kernel state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitKernelState();
//!
//! \brief Insert RefPic Select List
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS InsertInRefPicSelectList();
//!
//! \brief Run MbEnc Kernel.
//!
//! \param [in] mbEncIFrameDistInUse
//! MbEncIFrameDist in use or not
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS MbEncKernel(
bool mbEncIFrameDistInUse);
//!
//! \brief Run Brc Frame Update Kernel.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS BrcFrameUpdateKernel();
//!
//! \brief Run Brc Copy Kernel.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS BrcCopyKernel();
//!
//! \brief Run Brc MB update Kernel.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS BrcMbUpdateKernel();
//!
//! \brief Run MbEnc Kernel.
//!
//! \param [in] useRefPicList1
//! Use RefPicList 1 or Not.
//! \param [in] index
//! Index
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS WPKernel(
bool useRefPicList1,
uint32_t index);
//!
//! \brief Run SFD(still frame detection) kernel
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SFDKernel();
//!
//! \brief Get MbEnc kernel state Idx
//!
//! \param [in] params
//! Pointer to the CodechalEncodeIdOffsetParams
//! \param [in] kernelOffset
//! kernel offset
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS GetMbEncKernelStateIdx(
CodechalEncodeIdOffsetParams* params,
uint32_t* kernelOffset)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Get MbEnc kernel curbe data
//!
//! \param [in] params
//! Pointer to CODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetCurbeAvcMbEnc(
PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS params)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Set MFE MbEnc kernel curbe data
//!
//! \param [in] mbEncIFrameDistInUse
//! MbEncIFrameDist in use or not
//!
//! \return BOOL
//! true if MFE MbEnc is enabled, otherwise false
//!
virtual bool IsMfeMbEncEnabled(
bool mbEncIFrameDistInUse)
{
return false;
}
//!
//! \brief Init Mfe MbEnc kernel state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitKernelStateMfeMbEnc()
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Defer init MFE specific resoruces and flags.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitMfe()
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Set MFE MbEnc kernel curbe data
//!
//! \param [in] params
//! Pointer to CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetCurbeAvcMfeMbEnc(
PCODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS params)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Update binding table for MFE MbEnc kernel
//!
//! \param [in] submitIndex
//! Index in this mfe submission call
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS UpdateMfeMbEncBindingTable(
uint32_t submitIndex)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Get Weighted Prediction kernel curbe data
//!
//! \param [in] params
//! Pointer to CODECHAL_ENCODE_AVC_WP_CURBE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetCurbeAvcWP(
PCODECHAL_ENCODE_AVC_WP_CURBE_PARAMS params)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Get FEI PreProc kernel curbe data
//!
//! \param [in] params
//! Pointer to CODECHAL_ENCODE_AVC_PREPROC_CURBE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetCurbeAvcPreProc(
PCODECHAL_ENCODE_AVC_PREPROC_CURBE_PARAMS params)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Get BRC InitReset kernel curbe data
//!
//! \param [in] params
//! Pointer to CODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetCurbeAvcBrcInitReset(
PCODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS params)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Get FrameBRCUpdate kernel curbe data
//!
//! \param [in] params
//! Pointer to CODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetCurbeAvcFrameBrcUpdate(
PCODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS params)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Get MbBrcUpdate kernel curbe data
//!
//! \param [in] params
//! Pointer to CODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetCurbeAvcMbBrcUpdate(
PCODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS params)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Get Brc Block Copy kernel curbe data
//!
//! \param [in] params
//! Pointer to CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetCurbeAvcBrcBlockCopy(
PCODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS params)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Get SFD kernel curbe data
//!
//! \param [in] params
//! Pointer to CODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetCurbeAvcSFD(
PCODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS params);
//!
//! \brief Set Sequence Structs
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetSequenceStructs() override;
//!
//! \brief Set Sequence Structs
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetPictureStructs() override;
//!
//! \brief Set slice Structs
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetSliceStructs() override;
//!
//! \brief Set BRC InitReset kernel Surface
//!
//! \param [in] cmdBuffer
//! Cmd Buffer
//! \param [in] params
//! Pointer to CODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SendBrcInitResetSurfaces(
PMOS_COMMAND_BUFFER cmdBuffer,
PCODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS params);
//!
//! \brief Set MbEnc kernel Surface data
//!
//! \param [in] cmdBuffer
//! Cmd Buffer
//! \param [in] params
//! Pointer to CODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SendAvcMbEncSurfaces(
PMOS_COMMAND_BUFFER cmdBuffer,
PCODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS params)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Set Weighted Prediction kernel Surface state
//!
//! \param [in] cmdBuffer
//! Cmd Buffer
//! \param [in] params
//! Pointer to CODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SendAvcWPSurfaces(
PMOS_COMMAND_BUFFER cmdBuffer,
PCODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS params)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Set FEI PreProc kernel Surface state
//!
//! \param [in] cmdBuffer
//! Cmd Buffer
//! \param [in] params
//! Pointer to CODECHAL_ENCODE_AVC_PREPROC_SURFACE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SendAvcPreProcSurfaces(
PMOS_COMMAND_BUFFER cmdBuffer,
PCODECHAL_ENCODE_AVC_PREPROC_SURFACE_PARAMS params)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Set BrcFrameUpdate kernel Surface state
//!
//! \param [in] cmdBuffer
//! Cmd Buffer
//! \param [in] params
//! pointer to CODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SendAvcBrcFrameUpdateSurfaces(
PMOS_COMMAND_BUFFER cmdBuffer,
PCODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS params)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Set BrcMbUpdate kernel Surface state
//!
//! \param [in] cmdBuffer
//! Cmd Buffer
//! \param [in] params
//! Pointer to CODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SendAvcBrcMbUpdateSurfaces(
PMOS_COMMAND_BUFFER cmdBuffer,
PCODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS params)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Set SFD kernel Surface state
//!
//! \param [in] cmdBuffer
//! Cmd Buffer
//! \param [in] params
//! Pointer to CODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SendAvcSFDSurfaces(
PMOS_COMMAND_BUFFER cmdBuffer,
PCODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS params);
//!
//! \brief Set ROI kernel Surface state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetupROISurface()
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Inserts the generic prologue command for a command buffer
//! \param [in] cmdBuffer
//! Command buffer
//! \param [in] frameTracking
//! Indicate if frame tracking requested
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SendPrologWithFrameTracking(
PMOS_COMMAND_BUFFER cmdBuffer,
bool frameTracking,
MHW_MI_MMIOREGISTERS *mmioRegister = nullptr) override;
//!
//! \brief Realize the scene change report
//! \param [in] cmdBuffer
//! Command buffer
//! [in] params
//! Pointer to the CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS SceneChangeReport(
PMOS_COMMAND_BUFFER cmdBuffer,
PCODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS params)
{
return MOS_STATUS_SUCCESS;
};
//! \brief Dump encode kernel output
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS DumpEncodeKernelOutput();
//!
//! \brief Calculate skip value
//! \param [in] encBlockBasedSkipEn
//! Indicate if encode block Based skip enabled
//! \param [in] transform8x8Flag
//! Indicate if transform8*8 makes effect
//! \param [in] skipVal
//! input Skip value
//! \return uint16_t
//! return the updated Skip value
//!
uint16_t CalcSkipVal(
bool encBlockBasedSkipEn,
bool transform8x8Flag,
uint16_t skipVal);
//!
//! \brief Get Max MV value per 2 mbs based on LevelIdc
//! \details VDBOX private function to get max MV value per 2 mbs
//! \param [in] levelIdc
//! AVC level
//! \return uint32_t
//! return the max mv value per 2 mbs
//!
uint32_t GetMaxMvsPer2Mb(uint8_t levelIdc);
//!
//! \brief Get QP value
//! \param [in] params
//! AVC mbenc cubre params
//! \param [in] list
//! forword or backword reference
//! \param [in] index
//! reference frame index
//! \return uint8_t
//! return 0
uint32_t GetRefPicFieldFlag(
PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS params,
uint32_t list,
uint32_t index);
//!
//! \brief Get QP value
//! \param [in] params
//! AVC mbenc cubre params
//! \param [list] list
//! forword or backword reference
//! \param [in] index
//! reference frame index
//! \return uint8_t
//! return 0
uint8_t AVCGetQPValueFromRefList(
PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS params,
uint32_t list,
uint32_t index);
//!
//! \brief Send surfaces for the AVC BRC Block Copy kernel
//! \param [in] hwInterface
//! Hardware interface
//! \param [in] cmdBuffer
//! comand buffer
//! \param [in] mbEncKernelState
//! MB encoder kernel state
//! \param [in] kernelState
//! Kernel State
//! \param [in] presAdvancedDsh
//! pmos resource
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SendBrcBlockCopySurfaces(
CodechalHwInterface *hwInterface,
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_KERNEL_STATE mbEncKernelState,
PMHW_KERNEL_STATE kernelState,
PMOS_RESOURCE presAdvancedDsh);
#if USE_CODECHAL_DEBUG_TOOL
protected:
virtual MOS_STATUS DumpSeqParFile() override;
virtual MOS_STATUS DumpFrameParFile() override;
virtual MOS_STATUS PopulateHmeParam(
bool is16xMeEnabled,
bool is32xMeEnabled,
uint8_t meMethod,
void *cmd) override;
#endif
};
#endif // __CODECHAL_ENCODE_AVC_H__