blob: 499f0a605841477d20e4dccea442a10b087bbf14 [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_hevc_base.h
//! \brief Defines base class for HEVC encoder.
//!
#ifndef __CODECHAL_ENCODE_HEVC_BASE_H__
#define __CODECHAL_ENCODE_HEVC_BASE_H__
#include "codechal_encoder_base.h"
#if USE_CODECHAL_DEBUG_TOOL
#include "codechal_debug_encode_par.h"
#endif
//*------------------------------------------------------------------------------
//* Codec Definitions
//*------------------------------------------------------------------------------
#define CODECHAL_HEVC_MAX_SPS_NUM 16
#define CODECHAL_HEVC_MAX_PPS_NUM 64
#define CODECHAL_VDENC_HEVC_MAX_SLICE_NUM 70
#define CODECHAL_HEVC_MAX_LCU_SIZE_G9 32
#define CODECHAL_HEVC_MAX_LCU_SIZE_G10 64
#define CODECHAL_HEVC_MIN_LCU_SIZE 16
#define CODECHAL_HEVC_MIN_CU_SIZE 8
#define CODECHAL_HEVC_MIN_TILE_SIZE 128
#define CODECHAL_HEVC_VDENC_MIN_TILE_WIDTH_SIZE 256
#define CODECHAL_HEVC_VDENC_MIN_TILE_HEIGHT_SIZE 128
#define CODECHAL_HEVC_FRAME_BRC_BLOCK_SIZE 32
#define CODECHAL_HEVC_LCU_BRC_BLOCK_SIZE 128
#define CODECHAL_ENCODE_HEVC_NUM_MAX_VME_L0_REF_G9 3
#define CODECHAL_ENCODE_HEVC_NUM_MAX_VME_L1_REF_G9 1
#define CODECHAL_ENCODE_HEVC_NUM_MAX_VME_L0_REF_G10 4
#define CODECHAL_ENCODE_HEVC_NUM_MAX_VME_L1_REF_G10 4
#define CODECHAL_ENCODE_HEVC_MAX_NUM_WEIGHTED_PRED_L0 1
#define CODECHAL_ENCODE_HEVC_MAX_NUM_WEIGHTED_PRED_L1 1
#define CODECHAL_HEVC_MAX_NUM_HCP_PIPE 8
#define CODECHAL_HEVC_MAX_NUM_BRC_PASSES 4 // It doesn't include the 5th PAK pass for the BRC panic mode
#define CODECHAL_HEVC_SAO_STRMOUT_SIZE_PERLCU 16
#define ENCODE_HEVC_4K_PIC_WIDTH 3840
#define ENCODE_HEVC_4K_PIC_HEIGHT 2160
#define ENCODE_HEVC_5K_PIC_WIDTH 5120
#define ENCODE_HEVC_5K_PIC_HEIGHT 2880
#define ENCODE_HEVC_8K_PIC_WIDTH 7680
#define ENCODE_HEVC_8K_PIC_HEIGHT 4320
#define ENCODE_HEVC_16K_PIC_WIDTH 16384
#define ENCODE_HEVC_16K_PIC_HEIGHT 4096
// Max supported resolution for HEVC encode is 4K X 2K
#define ENCODE_HEVC_MAX_4K_PIC_WIDTH 4096
#define ENCODE_HEVC_MAX_4K_PIC_HEIGHT 2176
#define ENCODE_HEVC_MAX_8K_PIC_WIDTH 8192
#define ENCODE_HEVC_MAX_8K_PIC_HEIGHT 8192
#define ENCODE_HEVC_MAX_16K_PIC_WIDTH 16384
#define ENCODE_HEVC_MAX_16K_PIC_HEIGHT 16384
#define ENCODE_HEVC_MIN_DSS_PIC_WIDTH 480
#define ENCODE_HEVC_MIN_DSS_PIC_HEIGHT 320
// HEVC has only 3 target usage modes
#define CODECHAL_ENCODE_HEVC_TARGET_USAGE_MODE_PERFORMANCE 0
#define CODECHAL_ENCODE_HEVC_TARGET_USAGE_MODE_NORMAL 1
#define CODECHAL_ENCODE_HEVC_TARGET_USAGE_MODE_QUALITY 2
#define HEVC_BRC_CONSTANT_SURFACE_WIDTH_G9 (64)
#define HEVC_BRC_CONSTANT_SURFACE_HEIGHT_G9 (53)
#define HEVC_BRC_HISTORY_BUFFER_SIZE_G9 (576)
#define HEVC_BRC_HISTORY_BUFFER_SIZE_G10 (832)
#define HEVC_BRC_HISTORY_BUFFER_SIZE_G12 (1088)
#define HEVC_BRC_CONSTANT_SURFACE_HEIGHT_G10 (35)
#define CODECHAL_HEVC_NUM_PAK_SLICE_BATCH_BUFFERS (3)
#define HEVC_BRC_PAK_STATISTCS_SIZE (32)
#define HEVC_CONCURRENT_SURFACE_HEIGHT (32)
#define HEVC_BRC_SKIP_VAL_TABLE_SIZE (128)
#define HEVC_BRC_LAMBDA_TABLE_SIZE (1024)
#define HEVC_BRC_MVMODE_TABLE_SIZE (1664)
#define CODECHAL_INIT_DSH_SIZE_HEVC_ENC (MHW_PAGE_SIZE * 2)
#define HEVC_START_CODE_NAL_OFFSET (2)
#define HEVC_PAK_STATISTICS_SSE_OFFSET (32)
#define CODECHAL_ENCODE_HEVC_MAX_SLICE_QP 51
#define CODECHAL_ENCODE_HEVC_MIN_ICQ_QUALITYFACTOR 1
#define CODECHAL_ENCODE_HEVC_MAX_ICQ_QUALITYFACTOR 51
#define CODECHAL_ENCODE_HEVC_NUM_SYNC_TAGS 36
#define CODECHAL_ENCODE_HEVC_DEFAULT_AVBR_ACCURACY 30
#define CODECHAL_ENCODE_HEVC_DEFAULT_AVBR_CONVERGENCE 150
// Hevc always uses maxMvLen corresponding to AVC level 51. Refer GetMaxMvLen from AVC.
#define CODECHAL_ENCODE_HEVC_MAX_MV_LEN_AVC_LEVEL_51 511
#define CODECHAL_ENCODE_HEVC_GET_SIZE_IN_LCU(var, lcu_size) \
((var + (lcu_size - 1)) / lcu_size)
#define CODECHAL_HEVC_PAK_STREAMOUT_SIZE 0x500000 //size is accounted for 4Kx4K with all 8x8 CU,based on streamout0 and streamout1 requirements
//(4096*4096)/64 *16 (streamout0) + 1MB(streamout 1). there is scope to reduce streamout1 size. Need to check with HW team.
// 8K is just an estimation
#define CODECHAL_HEVC_BRC_QP_ADJUST_SIZE 576
#define CODECHAL_ENCODE_HEVC_NUM_MAX_VDENC_L0_REF_G10 3 // multiref, hevc vdenc
#define CODECHAL_ENCODE_HEVC_NUM_MAX_VDENC_L1_REF_G10 3 // multiref, hevc vdenc
#define CODECHAL_VDENC_HEVC_BRC_HISTORY_BUF_SIZE 964
#define CODECHAL_VDENC_HEVC_BRC_DEBUG_BUF_SIZE 0x1000 // 0x1000 = 4096
#define CODECHAL_VDENC_HEVC_BRC_HUC_STATUS_REENCODE_MASK (1<<31)
#define CODECHAL_VDENC_HEVC_BRC_HUC_STATUS_ERROR_MASK (1<<30)
#define CODECHAL_VDENC_HEVC_BRC_HUC_STATUS_ARITHMETIC_OVERFLOW_ERROR_MASK (1<<29)
#define CODECHAL_VDENC_HEVC_BRC_HUC_STATUS_MEMORY_ACCESS_ERROR_MASK (1<<28)
#define CODECHAL_VDENC_HEVC_BRC_HUC_STATUS_HISTORY_BUFFER_ERROR_MASK (1<<27)
#define CODECHAL_VDENC_HEVC_BRC_HUC_STATUS_DMEM_ERROR_MASK (1<<26)
#define CODECHAL_VDENC_HEVC_BRC_PAK_STATS_BUF_SIZE 464 // 116 DWORDs HEVC Frame Statistics
#define CODECHAL_HEVC_VDENC_STATS_SIZE 1216 // VDEnc Statistic: 48DWs (3CLs) of HMDC Frame Stats + 256 DWs (16CLs) of Histogram Stats = 1216 bytes
#define CODECHAL_HEVC_I_SLICE 2
#define CODECHAL_HEVC_P_SLICE 1
#define CODECHAL_HEVC_B_SLICE 0
#define CODECHAL_HEVC_NUM_SLICE_TYPES 3
#define CODECHAL_HEVC_NUM_MODE_MV_COSTS 171
#define CODECHAL_HEVC_MAX_BSTRUCTRUE_GOP_SIZE 16
#define CODECHAL_HEVC_MAX_BSTRUCTRUE_REF_NUM 8
#define CODECHAL_HEVC_BRC_MAX_QUALITY_LAYER 16
#define CODECHAL_HEVC_BRC_MAX_TEMPORAL_LAYER 3
struct MultiPassConfig
{
uint32_t SliceMaxQPOffset0;
uint32_t SliceMaxQPOffset1;
uint32_t SliceMaxQPOffset2;
uint32_t SliceMaxQPOffset3;
int32_t SliceMinQPOffset0;
int32_t SliceMinQPOffset1;
int32_t SliceMinQPOffset2;
int32_t SliceMinQPOffset3;
uint32_t MaxIntraConformanceLimit;
uint32_t MaxInterConformanceLimit;
uint32_t FrameRateCtrlFlag;
uint32_t InterMbMaxBitFlag;
uint32_t IntraMbMaxBitFlag;
uint32_t FrameMaxBitRate;
uint32_t FrameMinBitRate;
uint32_t MinFrameRateDelta;
uint32_t MaxFrameRateDelta;
int16_t NumberofPasses;
uint32_t MbRateCtrlFlag;
uint8_t FrameSzOverFlag;
uint8_t FrameSzUnderFlag;
uint8_t FrameMinBitRateUnit;
uint8_t FrameMaxBitRateUnit;
uint8_t StreamOutEnable;
MultiPassConfig() :
SliceMaxQPOffset0(0),
SliceMaxQPOffset1(0),
SliceMaxQPOffset2(0), // Set this to Default Max Limit as per Spec.,
SliceMaxQPOffset3(0),
SliceMinQPOffset0(0),
SliceMinQPOffset1(0),
SliceMinQPOffset2(0), // Set this to Default Max Limit as per Spec.,
SliceMinQPOffset3(0),
MaxIntraConformanceLimit(3180),
MaxInterConformanceLimit(3180),
FrameRateCtrlFlag(0),
InterMbMaxBitFlag(0),
IntraMbMaxBitFlag(0),
MinFrameRateDelta(0),
MaxFrameRateDelta(0),
MbRateCtrlFlag(0),
FrameSzOverFlag(0),
FrameSzUnderFlag(0),
FrameMinBitRateUnit(0),
FrameMaxBitRateUnit(0),
StreamOutEnable(0)
{}
};
struct EncodeHevcPar
{
uint32_t NumFrames;
uint32_t Width;
uint32_t Height;
uint32_t NumP;
uint32_t NumB;
uint32_t NumSlices;
uint32_t SliceStartLCU;
uint32_t InputChromaFormatIDC;
uint32_t ChromaFormatIDC;
uint32_t InputBitDepthLuma;
uint32_t InputBitDepthChroma;
uint32_t OutputBitDepthLuma;
uint32_t OutputBitDepthChroma;
uint32_t InternalBitDepthLuma;
uint32_t InternalBitDepthChroma;
uint32_t ISliceQP;
uint32_t PSliceQP;
uint32_t BSliceQP;
uint32_t BoxFilter;
uint32_t WeightedPred;
uint32_t WeightedBiPred;
uint32_t MaxRefIdxL0;
uint32_t MaxRefIdxL1;
uint32_t MaxBRefIdxL0;
uint32_t EnableBAsRefs;
uint32_t LowDelay;
uint32_t ChangePtoRefB;
uint32_t InputRgbToGbr;
uint32_t StartFrameNum;
uint32_t FrameRateCode;
uint32_t FrameRateM; //frame rate multipier (nominator)
uint32_t FrameRateD; //frame rate divider (denominator)
uint8_t numTemporalLayers;
/* BRC parameters */
uint32_t BRCMethod;
uint32_t BRCType;
uint32_t CuRC;
uint32_t LookAheadFrames;
uint32_t VideoTestData;
uint32_t AvbrAccuracy; //for AVBR
uint32_t AvbrConvergence; //for AVBR
uint32_t usePrevQP; //for fast mode
uint32_t RateControl; //obsolete
uint32_t BitRate;
uint32_t MaxBitRate; // for VBR support
uint32_t VbvSzInBit;
uint32_t InitVbvFullnessInBit;
uint32_t UserMaxIFrame; //user defined frame rate
uint32_t UserMaxPBFrame; //user defined frame rate
uint32_t EnableMultipass;
uint32_t MaxNumPakPassesI;
uint32_t MaxNumPakPassesPB;
uint32_t QPMax; // user defined QP max (default=51)
uint32_t QPMin; // user defined QP min (default=1)
uint32_t BitRateQT[CODECHAL_HEVC_BRC_MAX_QUALITY_LAYER][CODECHAL_HEVC_BRC_MAX_TEMPORAL_LAYER];
uint32_t MaxBitRateQT[CODECHAL_HEVC_BRC_MAX_QUALITY_LAYER][CODECHAL_HEVC_BRC_MAX_TEMPORAL_LAYER]; // for VBR support
uint32_t VbvSzInBitQT[CODECHAL_HEVC_BRC_MAX_QUALITY_LAYER][CODECHAL_HEVC_BRC_MAX_TEMPORAL_LAYER];
uint32_t InitVbvFullnessInBitQT[CODECHAL_HEVC_BRC_MAX_QUALITY_LAYER][CODECHAL_HEVC_BRC_MAX_TEMPORAL_LAYER];
uint32_t UserMaxFrameQT[CODECHAL_HEVC_BRC_MAX_QUALITY_LAYER][CODECHAL_HEVC_BRC_MAX_TEMPORAL_LAYER]; //user defined frame rate
uint32_t CRFQualityFactor;
uint32_t SlidingWindowRCEnable;
uint32_t SlidingWindowSize;
uint32_t SlidingWindowMaxRateRatio;
//reset test, for base layer
int32_t reset_frame_num;
int32_t new_br;
int32_t new_maxbr;
int16_t new_gopp;
int16_t new_gopi;
uint32_t new_frM; //frame rate multipier (nominator)
uint32_t new_frD; //frame rate divider (denominator)
uint32_t new_userMaxFrame; //user defined frame rate
//end reset test
MultiPassConfig MultiPassParam;
/* HEVC parameters */
uint32_t ProfileIDC;
uint32_t LevelIDC;
uint32_t Log2MaxCUSize;
uint32_t Log2MinCUSize;
uint32_t Log2MaxTUSize;
uint32_t Log2MinTUSize;
uint32_t Log2TUMaxDepthInter;
uint32_t Log2TUMaxDepthIntra;
uint32_t Log2ParallelMergeLevel;
uint32_t TransquantBypassEnableFlag;
uint32_t TransformSkipEnabledFlag;
uint32_t PCMEnabledFlag;
uint32_t Log2MaxPCMSize;
uint32_t Log2MinPCMSize;
uint32_t TemporalMvpEnableFlag;
uint32_t CollocatedFromL0Flag;
uint32_t CollocatedRefIdx;
uint32_t MaxNumMergeCand;
uint32_t MvdL1ZeroFlag;
uint32_t ConstrainedIntraPred;
uint32_t StrongIntraSmoothingEnableFlag;
int32_t ChromaCbQpOffset;
int32_t ChromaCrQpOffset;
uint8_t ScalingList[3 * 6 + 2][64]; /* 0-5: 4x4; 6-11: 8x8; 12-17: 16x16; 18-19: 32x32 */
uint8_t ScalingListDCCoef[2][6];
// 1st index L0/L1, 2nd index weight/offset, 3rd index: Luma, cb, cr
int32_t WeightOffset[2][2][3][16];
uint32_t Log2LumaDenom;
uint32_t Log2ChromaDenom;
int32_t EnableSEI;
uint32_t DeblockingIDC;
uint32_t LoopFilterAcrossSlicesEnabledFlag;
uint32_t LoopFilterAcrossTilesEnabledFlag;
int32_t DeblockingTc;
int32_t DeblockingBeta;
uint32_t PCMLoopFilterDisableFlag;
uint32_t AmpEnabledFlag;
uint32_t SignDataHidingFlag;
uint32_t SAOEnabledFlag;
uint32_t SAOLumaEnabledFlag;
uint32_t SAOChromaEnabledFlag;
uint32_t ForceSAOToZero;
uint32_t AdaptiveSAOMethod; /*0: always two passes, 1: if BRC has two pass, sao will be single pass, 2: Periodically enabling sao*/
uint32_t CuQpDeltaEnabledFlag;
uint32_t DiffCuQpDeltaDepth;
uint32_t ScalingListDataPresentFlag;
uint32_t CabacInitFlag;
uint32_t RoundingInter;
uint32_t RoundingIntra;
uint32_t UseLongTermPic;
uint32_t LogTermPicInterval;
uint32_t Seed;
uint32_t Log2MaxTUSkipBlockSize;
uint32_t ExplicitRdpcmEnabledFlag;
uint32_t ImplicitRdpcmEnabledFlag;
uint32_t TransformSkipRotationEnabledFlag;
uint32_t TransformSkipContextEnabledFlag;
uint32_t CrossComponentPredictionEnabledFlag;
uint32_t ExtendedPrecisionProcessingFlag;
uint32_t IntraSmoothingDisabledFlag;
uint32_t HighPrecisionOffsetsEnabledFlag;
uint32_t PersistentRiceAdaptationEnabledFlag;
uint32_t CabacBypassAlignmentEnabledFlag;
uint32_t SAOOffsetScaleLuma;
uint32_t SAOOffsetScaleChroma;
uint32_t TilesEnabledFlag;
uint32_t UniformSpacingFlag;
uint32_t NumTileColumns;
uint32_t NumTileRows;
uint32_t TileColumnsWidth[HEVC_NUM_MAX_TILE_COLUMN];
uint32_t TileRowsHeight[HEVC_NUM_MAX_TILE_ROW];
uint32_t SetLongTermAsRef0;
uint32_t TSDecisionEnabledFlag;
uint32_t IntraFrameRDOQEnabledFlag;
uint32_t InterFrameRDOQEnabledFlag;
uint32_t IntraRDOQEnableFlag;
uint32_t InterRDOQEnableFlag;
uint32_t AdaptiveRDOQFlag;
uint32_t AdaptiveRDOQIntraPctThreshold;
uint32_t AdaptiveRDOQIntraDistThreshold;
uint32_t IntraTuCountBasedRDOQDisable;
uint32_t RDOQIntraTUThreshold[4];
int32_t RDOQIntraTUThresholdInPercents;
uint32_t ScalabilityMode;
uint32_t RhoDomainEnabledFlag;
uint32_t SseStatsEnable;
uint32_t PAKStatsEnable;
uint32_t AddEoStreamNAL;
uint32_t AddEoSequenceNAL;
//VME HW control
uint32_t IntraPrediction;
uint32_t IntraSADMeasure;
uint32_t InterSADMeasure;
uint32_t BmeDisable;
uint32_t BilinearEnable;
uint32_t SubPelMode;
uint32_t ImeRefWindowSize;
uint32_t MaxNumSU;
uint32_t LenSP;
uint32_t EarlyImeSuccessEn;
uint32_t EarlyImeStopThres;
uint32_t AdaptiveEn;
uint32_t RefIDCostMode;
uint32_t DisablePIntra;
uint32_t InterShapeMask;
uint32_t IntraChromaModeMask;
uint32_t Intra32x32ModeMask;
uint32_t Intra16x16ModeMask;
uint32_t Intra8x8ModeMask;
int32_t HmeGlobalOffsetX[2][2];
int32_t HmeGlobalOffsetY[2][2];
uint32_t HmeMvCostingQP;
uint32_t HMECoarseRefPic;
uint32_t HMEStage1Disable;
uint32_t HMEStage2Disable;
uint32_t HMEDualWinner;
uint32_t HMERef1Disable;
uint32_t Ime16x16MvCostShift;
uint32_t Ime32x32AddMvCostShift;
uint32_t ImeStage3MvThreshold;
uint32_t MaxNumImePredictor;
uint32_t ImePredictorPriority[24];
//ENC SW control
uint32_t Enable64x64Skip;
uint32_t HevcMaxCuControl;
uint32_t MaxIntra8x8TuSize;
uint32_t MaxIntra16x16TuSize;
uint32_t MaxIntra32x32TuSize;
uint32_t MaxIntra64x64TuSize;
uint32_t MaxInter8x8TuSize;
uint32_t MaxInter16x16TuSize;
uint32_t MaxInter32x32TuSize;
uint32_t MaxInter64x64TuSize;
uint32_t NumBetaPreditors;
uint32_t NumMergeCandidateCu8x8;
uint32_t NumMergeCandidateCu16x16;
uint32_t NumMergeCandidateCu32x32;
uint32_t NumMergeCandidateCu64x64;
uint32_t IntraChromaSadWeight;
uint32_t DisableIntraLuma4x4Tu;
uint32_t RandEncModeEnabled;
//B Frame Coding Structure
uint32_t BGOPSize;
int32_t IntraPeriod;
uint32_t PerBFramePOC[CODECHAL_HEVC_MAX_BSTRUCTRUE_GOP_SIZE];
uint32_t PerBFrameQPOffset[CODECHAL_HEVC_MAX_BSTRUCTRUE_GOP_SIZE];
uint32_t PerBFrameRoundingInter[CODECHAL_HEVC_MAX_BSTRUCTRUE_GOP_SIZE];
uint32_t PerBFrameRoundingIntra[CODECHAL_HEVC_MAX_BSTRUCTRUE_GOP_SIZE];
double PerBFrameQPFactor[CODECHAL_HEVC_MAX_BSTRUCTRUE_GOP_SIZE];
uint32_t PerBFrameTcOffsetDiv2[CODECHAL_HEVC_MAX_BSTRUCTRUE_GOP_SIZE];
uint32_t PerBFrameBetaOffsetDiv2[CODECHAL_HEVC_MAX_BSTRUCTRUE_GOP_SIZE];
uint32_t PerBFrameTemporalID[CODECHAL_HEVC_MAX_BSTRUCTRUE_GOP_SIZE];
uint32_t PerBFrameNumRefPicsActiveL0[CODECHAL_HEVC_MAX_BSTRUCTRUE_GOP_SIZE];
uint32_t PerBFrameNumRefPicsActiveL1[CODECHAL_HEVC_MAX_BSTRUCTRUE_GOP_SIZE];
uint32_t PerBFrameNumRefPics[CODECHAL_HEVC_MAX_BSTRUCTRUE_GOP_SIZE];
int32_t PerBFrameRefPics[CODECHAL_HEVC_MAX_BSTRUCTRUE_GOP_SIZE*CODECHAL_HEVC_MAX_BSTRUCTRUE_REF_NUM];
uint32_t PerBFramePredict[CODECHAL_HEVC_MAX_BSTRUCTRUE_GOP_SIZE];
uint32_t PerBFrameDeltaRPS[CODECHAL_HEVC_MAX_BSTRUCTRUE_GOP_SIZE];
uint32_t PerBFrameNumRefIdcs[CODECHAL_HEVC_MAX_BSTRUCTRUE_GOP_SIZE];
uint32_t PefBFrameRefIdcs[CODECHAL_HEVC_MAX_BSTRUCTRUE_GOP_SIZE*CODECHAL_HEVC_MAX_BSTRUCTRUE_REF_NUM];
//CU QP Adjustment
uint32_t DisableCuQpAdj;
uint32_t MaxDeltaQP;
uint32_t SadMidPointThreshold;
uint32_t Zone01SadThreshold;
uint32_t Zone12SadThreshold;
uint32_t Zone23SadThreshold;
int32_t DeltaQPForSadZone0;
int32_t DeltaQPForSadZone1;
int32_t DeltaQPForSadZone2;
int32_t DeltaQPForSadZone3;
uint32_t Zone01MvThreshold;
uint32_t Zone12MvThreshold;
int32_t DeltaQPForMvZone0;
int32_t DeltaQPForMvZone1;
int32_t DeltaQPForMvZone2;
int32_t DeltaQPForMvZero;
int32_t DeltaQPForAngIntra;
int32_t DeltaQPForNonAngIntra;
int32_t DeltaQPForTU32x32;
int32_t DeltaQPForTU16x16;
int32_t DeltaQPForTU8x8;
int32_t DeltaQPForTU4x4;
int32_t DeltaQPForROIZone0;
int32_t DeltaQPForROIZone1;
int32_t DeltaQPForROIZone2;
int32_t DeltaQPForROIZone3;
int32_t DeltaQPForROIZone4;
int32_t DeltaQPForROIZone5;
int32_t DeltaQPForROIZone6;
int32_t DeltaQPForROIZone7;
uint32_t RfcThresIntraLow;
uint32_t RfcThresIntraHigh;
uint32_t RfcThresIntraChromaLow;
uint32_t RfcThresIntraChromaHigh;
uint32_t RfcThresInterLow;
uint32_t RfcThresInterHigh;
uint32_t RfcIntra64x64Depth;
uint32_t RfcIntra32x32Depth;
uint32_t RfcIntra16x16Depth;
uint32_t RfcIntra8x8Depth;
uint32_t RfcInter64x64Depth;
uint32_t RfcInter32x32Depth;
uint32_t RfcInter16x16Depth;
uint32_t RfcInter8x8Depth;
uint32_t InterTBSThresHigh;
uint32_t InterTBSThresLow;
uint32_t IntraLumaTBSThresHigh;
uint32_t IntraLumaTBSThresLow;
uint32_t IntraChromaTBSThresHigh;
uint32_t IntraChromaTBSThresLow;
uint32_t SseWeightStrength;
uint32_t SseWeightForZCOnly;
uint32_t VDEncMode;
uint32_t OutputQualityType;
//VDEnc BRC
uint32_t ReEncodePositiveQPDeltaThr;
uint32_t ReEncodeNegativeQPDeltaThr;
uint32_t PrevIntraPctThresh;
uint32_t CurIntraPctThresh;
uint32_t TopQPDeltaThrforAdaptive2Pass;
uint32_t BotQPDeltaThrforAdaptive2Pass;
uint32_t TopFrmSzPctThrforAdaptive2Pass;
uint32_t BotFrmSzPctThrforAdaptive2Pass;
uint32_t QPSelectMethodforFirstPass;
uint32_t MBHeaderCompensation;
uint32_t OverShootCarryFlag;
uint32_t OverShootSkipFramePct;
//mode/mv costs
uint32_t UseExtModeMvCosts;
double CostTable[CODECHAL_HEVC_NUM_MODE_MV_COSTS];
//end mode/mv costs
//StreamIn
uint32_t StreamInEn;
uint32_t StreamInPanicEn;
uint32_t StreamInROIEn;
uint32_t StreamInROIviaForceQPEn;
uint32_t StreamInDirtyRectEn;
uint32_t StreamInMvPredictorRef;
uint32_t StaticFrameZMVPercent;
uint32_t HMEStreamInRefCost;
//rolling I parameters
uint32_t IntraRefreshEnable; //0: disable 1: enable
uint32_t IntraRefreshMode; //0:row based 1: col based
uint32_t IntraRefreshSizeIn32x32; //refresh region
int32_t IntraRefreshDeltaQP;//delta QP for refresh region
//slice size control
uint32_t SliceSizeCtrl;
uint32_t EncLcuLag;
uint32_t SliceSizeThreshold;
uint32_t MaxSliceSize;
uint32_t CoeffBitsWeight;
uint32_t LCUBitSizeAdjustment;
uint32_t MaxNumSlicesCheckEnable;
//Left Recon Support
uint32_t LeftLCUReconEnable;
uint32_t LeftLCUReconEnableforRollingI;
// validate for RTL coverage
uint32_t NoOutputPriorPicsEnable;
//fade detection
uint32_t FadeDetectionEnable;
uint32_t RefListModforWeightPred;
//VJ : for supporting Chroma formats
uint32_t InputColorFormat;
uint32_t ChromaDownSamplingFilterType;
//Adaptive Rounding
uint32_t RoundThreshold[3][3]; //Dim0: CUSize (8x8, 16x16, 32x32 Dim1:CU Type (Intra, Inter, Merge/SKip), note 64x64 CUSize will use 32x32 threshold <<2;
uint32_t RoundValues[3][3][2]; //Dim0: CUSize (8x8, 16x16, 32x32 Dim1:CU Type (Intra, Inter, Merge/SKip)
//BRC adaptive bitstream fallback
uint32_t AdaptiveBSSelection;
//Kernel HME
uint32_t KernelHierarchicalMEFlag;
uint32_t KHMECoarseShape;
uint32_t SuperKHME;
uint32_t UltraKHME;
uint32_t EnableKHMEMVCost;
uint32_t KHMEUseNeighborPredictor;
uint32_t KernelInterSADTransform;
uint32_t KernelIntraSADTransform;
uint32_t KHMESubPelMode;
int32_t KMeSearchX;
int32_t KMeSearchY;
uint32_t KHMECombineOverlap;
uint32_t KHMECoarseRefPic;
uint32_t KHMECombineLen;
uint32_t KHMEBCombineLen;
uint32_t SuperKCombineDist;
//Timing budget overflow check
uint32_t TimeBudgetEnable;
uint32_t TimeBudgetInitial;
uint32_t TimeBudgetLCU;
uint32_t TimeBudgetDisableLCUNum;
//Panic mode
uint32_t PanicEnable;
uint32_t TransformType;
uint32_t ReconforIntraPrediciton;
//Stats dump
uint32_t EnableStatistics;
uint32_t NetworkTraceEnable;
uint32_t SceneChangeXFrameSizeEnable;
uint32_t SceneChangeXFrameSize;
uint32_t UseDefaultCosts;
uint32_t UseDefault_SAD_RDO_Lambdas;
uint32_t UseDefaulRDOQLambdas;
};
const char QPcTable[22] = { 29, 30, 31, 32, 32, 33, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, 39 };
const unsigned char g_cInit_HEVC_BRC_QP_ADJUST[CODECHAL_HEVC_BRC_QP_ADJUST_SIZE] = {
0x01, 0x02, 0x03, 0x05, 0x06, 0x01, 0x01, 0x02, 0x03, 0x05, 0x00, 0x00, 0x01, 0x02, 0x03, 0xff,
0x00, 0x00, 0x01, 0x02, 0xff, 0x00, 0x00, 0x00, 0x01, 0xfe, 0xfe, 0xff, 0x00, 0x01, 0xfd, 0xfd,
0xff, 0xff, 0x00, 0xfb, 0xfd, 0xfe, 0xff, 0xff, 0xfa, 0xfb, 0xfd, 0xfe, 0xff, 0x00, 0x04, 0x1e,
0x3c, 0x50, 0x78, 0x8c, 0xc8, 0xff, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x02, 0x03, 0x05, 0x06, 0x01, 0x01, 0x02, 0x03, 0x05, 0x00, 0x01, 0x01, 0x02, 0x03, 0xff,
0x00, 0x00, 0x01, 0x02, 0xff, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0x00, 0x01, 0xfe, 0xff,
0xff, 0xff, 0x00, 0xfc, 0xfe, 0xff, 0xff, 0x00, 0xfb, 0xfc, 0xfe, 0xff, 0xff, 0x00, 0x04, 0x1e,
0x3c, 0x50, 0x78, 0x8c, 0xc8, 0xff, 0x04, 0x05, 0x06, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x01, 0x02, 0x04, 0x05, 0x01, 0x01, 0x01, 0x02, 0x04, 0x00, 0x00, 0x01, 0x01, 0x02, 0xff,
0x00, 0x00, 0x01, 0x01, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x01, 0xfe, 0xff,
0xff, 0xff, 0x00, 0xfd, 0xfe, 0xff, 0xff, 0x00, 0xfb, 0xfc, 0xfe, 0xff, 0xff, 0x00, 0x02, 0x14,
0x28, 0x46, 0x82, 0xa0, 0xc8, 0xff, 0x04, 0x04, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03,
0x03, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x03, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00,
0x01, 0x02, 0x02, 0x02, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0xfe, 0xff, 0xff,
0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe,
0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfe, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03,
0x03, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x03, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00,
0x01, 0x02, 0x02, 0x02, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0xfe, 0xff, 0xff,
0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe,
0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfe, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03,
0x03, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x03, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00,
0x01, 0x02, 0x02, 0x02, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0xfe, 0xff, 0xff,
0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe,
0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfe, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const uint16_t SLCSZ_THRDELTAI_U16[52] =
{ //assuming Mb lag = 8
100, 100, 100, 100, 100, 100, 100, 100, 100, 100, //[0-9]
100, 100, 100, 100, 100, 100, 100, 100, 100, 100, //[10-19]
100, 100, 100, 100, 100, 100, 100, 100, 100, 100, //[20-29]
100, 100, 100, 100, 100, 100, 100, 100, 100, 100, //[30-39]
100, 100, 100, 100, 100, 100, 100, 100, 100, 100, //[40-49]
100, 100 //[50-51]
};
const uint16_t SLCSZ_THRDELTAP_U16[52] =
{ //assuming Mb lag = 6
100, 100, 100, 100, 100, 100, 100, 100, 100, 100, //[0-9]
100, 100, 100, 100, 100, 100, 100, 100, 100, 100, //[10-19]
100, 100, 100, 100, 100, 100, 100, 100, 100, 100, //[20-29]
100, 100, 100, 100, 100, 100, 100, 100, 100, 100, //[30-39]
100, 100, 100, 100, 100, 100, 100, 100, 100, 100, //[40-49]
100, 100 //[50-51]
};
enum
{
// 2x down-scaling kernel
CODECHAL_HEVC_SCALING_FRAME_BEGIN = 0,
CODECHAL_HEVC_SCALING_FRAME_SRC_Y = CODECHAL_HEVC_SCALING_FRAME_BEGIN + 0,
CODECHAL_HEVC_SCALING_FRAME_DST_Y = CODECHAL_HEVC_SCALING_FRAME_BEGIN + 1,
CODECHAL_HEVC_SCALING_FRAME_END = CODECHAL_HEVC_SCALING_FRAME_BEGIN + 2,
// 32x32 PU mode decision kernel
CODECHAL_HEVC_32x32_PU_BEGIN = CODECHAL_HEVC_SCALING_FRAME_END,
CODECHAL_HEVC_32x32_PU_OUTPUT = CODECHAL_HEVC_32x32_PU_BEGIN + 0,
CODECHAL_HEVC_32x32_PU_SRC_Y = CODECHAL_HEVC_32x32_PU_BEGIN + 1,
CODECHAL_HEVC_32x32_PU_SRC_UV = CODECHAL_HEVC_32x32_PU_BEGIN + 2,
CODECHAL_HEVC_32x32_PU_SRC_Y2x = CODECHAL_HEVC_32x32_PU_BEGIN + 3,
CODECHAL_HEVC_32x32_PU_SLICE_MAP = CODECHAL_HEVC_32x32_PU_BEGIN + 4,
CODECHAL_HEVC_32x32_PU_SRC_Y2x_VME = CODECHAL_HEVC_32x32_PU_BEGIN + 5,
CODECHAL_HEVC_32x32_PU_BRC_Input = CODECHAL_HEVC_32x32_PU_BEGIN + 6,
CODECHAL_HEVC_32x32_PU_LCU_QP = CODECHAL_HEVC_32x32_PU_BEGIN + 7,
CODECHAL_HEVC_32x32_PU_BRC_DATA = CODECHAL_HEVC_32x32_PU_BEGIN + 8,
CODECHAL_HEVC_32x32_PU_STATS_DATA = CODECHAL_HEVC_32x32_PU_BEGIN + 9,
CODECHAL_HEVC_32x32_PU_DEBUG = CODECHAL_HEVC_32x32_PU_BEGIN + 10,
CODECHAL_HEVC_32x32_PU_END = CODECHAL_HEVC_32x32_PU_BEGIN + 11,
// 16x16 SAD computation kernel
CODECHAL_HEVC_16x16_PU_SAD_BEGIN = CODECHAL_HEVC_32x32_PU_END,
CODECHAL_HEVC_16x16_PU_SAD_SRC_Y = CODECHAL_HEVC_16x16_PU_SAD_BEGIN + 0,
CODECHAL_HEVC_16x16_PU_SAD_SRC_UV = CODECHAL_HEVC_16x16_PU_SAD_BEGIN + 1,
CODECHAL_HEVC_16x16_PU_SAD_OUTPUT = CODECHAL_HEVC_16x16_PU_SAD_BEGIN + 2,
CODECHAL_HEVC_16x16_PU_SAD_32x32_MD_DATA = CODECHAL_HEVC_16x16_PU_SAD_BEGIN + 3,
CODECHAL_HEVC_16x16_PU_SLICE_MAP = CODECHAL_HEVC_16x16_PU_SAD_BEGIN + 4,
CODECHAL_HEVC_16x16_PU_Simplest_Intra = CODECHAL_HEVC_16x16_PU_SAD_BEGIN + 5,
CODECHAL_HEVC_16x16_PU_SAD_DEBUG = CODECHAL_HEVC_16x16_PU_SAD_BEGIN + 6,
CODECHAL_HEVC_16x16_PU_SAD_END = CODECHAL_HEVC_16x16_PU_SAD_BEGIN + 7,
// 16x16 PU mode decision kernel
CODECHAL_HEVC_16x16_PU_MD_BEGIN = CODECHAL_HEVC_16x16_PU_SAD_END,
CODECHAL_HEVC_16x16_PU_MD_SRC_Y = CODECHAL_HEVC_16x16_PU_MD_BEGIN + 0,
CODECHAL_HEVC_16x16_PU_MD_SRC_UV = CODECHAL_HEVC_16x16_PU_MD_BEGIN + 1,
CODECHAL_HEVC_16x16_PU_MD_16x16_SAD_DATA = CODECHAL_HEVC_16x16_PU_MD_BEGIN + 2,
CODECHAL_HEVC_16x16_PU_MD_PAK_OBJ = CODECHAL_HEVC_16x16_PU_MD_BEGIN + 3,
CODECHAL_HEVC_16x16_PU_MD_32x32_MD_DATA = CODECHAL_HEVC_16x16_PU_MD_BEGIN + 4,
CODECHAL_HEVC_16x16_PU_MD_VME_8x8_MD_DATA = CODECHAL_HEVC_16x16_PU_MD_BEGIN + 5,
CODECHAL_HEVC_16x16_PU_MD_SLICE_MAP = CODECHAL_HEVC_16x16_PU_MD_BEGIN + 6,
CODECHAL_HEVC_16x16_PU_MD_VME_SRC = CODECHAL_HEVC_16x16_PU_MD_BEGIN + 7,
CODECHAL_HEVC_16x16_PU_MD_BRC_Input = CODECHAL_HEVC_16x16_PU_MD_BEGIN + 8,
CODECHAL_HEVC_16x16_PU_MD_Simplest_Intra = CODECHAL_HEVC_16x16_PU_MD_BEGIN + 9,
CODECHAL_HEVC_16x16_PU_MD_LCU_QP = CODECHAL_HEVC_16x16_PU_MD_BEGIN + 10,
CODECHAL_HEVC_16x16_PU_MD_BRC_Data = CODECHAL_HEVC_16x16_PU_MD_BEGIN + 11,
CODECHAL_HEVC_16x16_PU_MD_DEBUG = CODECHAL_HEVC_16x16_PU_MD_BEGIN + 12,
CODECHAL_HEVC_16x16_PU_MD_END = CODECHAL_HEVC_16x16_PU_MD_BEGIN + 13,
// 8x8 PU kernel
CODECHAL_HEVC_8x8_PU_BEGIN = CODECHAL_HEVC_16x16_PU_MD_END,
CODECHAL_HEVC_8x8_PU_SRC_Y = CODECHAL_HEVC_8x8_PU_BEGIN + 0,
CODECHAL_HEVC_8x8_PU_SRC_UV = CODECHAL_HEVC_8x8_PU_BEGIN + 1,
CODECHAL_HEVC_8x8_PU_SLICE_MAP = CODECHAL_HEVC_8x8_PU_BEGIN + 2,
CODECHAL_HEVC_8x8_PU_VME_8x8_MODE = CODECHAL_HEVC_8x8_PU_BEGIN + 3,
CODECHAL_HEVC_8x8_PU_INTRA_MODE = CODECHAL_HEVC_8x8_PU_BEGIN + 4,
CODECHAL_HEVC_8x8_PU_BRC_Input = CODECHAL_HEVC_8x8_PU_BEGIN + 5,
CODECHAL_HEVC_8x8_PU_Simplest_Intra = CODECHAL_HEVC_8x8_PU_BEGIN + 6,
CODECHAL_HEVC_8x8_PU_LCU_QP = CODECHAL_HEVC_8x8_PU_BEGIN + 7,
CODECHAL_HEVC_8x8_PU_BRC_Data = CODECHAL_HEVC_8x8_PU_BEGIN + 8,
CODECHAL_HEVC_8x8_PU_DEBUG = CODECHAL_HEVC_8x8_PU_BEGIN + 9,
CODECHAL_HEVC_8x8_PU_END = CODECHAL_HEVC_8x8_PU_BEGIN + 10,
// 8x8 PU FMODE kernel
CODECHAL_HEVC_8x8_PU_FMODE_BEGIN = CODECHAL_HEVC_8x8_PU_END,
CODECHAL_HEVC_8x8_PU_FMODE_PAK_OBJECT = CODECHAL_HEVC_8x8_PU_FMODE_BEGIN + 0,
CODECHAL_HEVC_8x8_PU_FMODE_VME_8x8_MODE = CODECHAL_HEVC_8x8_PU_FMODE_BEGIN + 1,
CODECHAL_HEVC_8x8_PU_FMODE_INTRA_MODE = CODECHAL_HEVC_8x8_PU_FMODE_BEGIN + 2,
CODECHAL_HEVC_8x8_PU_FMODE_PAK_COMMAND = CODECHAL_HEVC_8x8_PU_FMODE_BEGIN + 3,
CODECHAL_HEVC_8x8_PU_FMODE_SLICE_MAP = CODECHAL_HEVC_8x8_PU_FMODE_BEGIN + 4,
CODECHAL_HEVC_8x8_PU_FMODE_INTRADIST = CODECHAL_HEVC_8x8_PU_FMODE_BEGIN + 5,
CODECHAL_HEVC_8x8_PU_FMODE_BRC_Input = CODECHAL_HEVC_8x8_PU_FMODE_BEGIN + 6,
CODECHAL_HEVC_8x8_PU_FMODE_Simplest_Intra = CODECHAL_HEVC_8x8_PU_FMODE_BEGIN + 7,
CODECHAL_HEVC_8x8_PU_FMODE_LCU_QP = CODECHAL_HEVC_8x8_PU_FMODE_BEGIN + 8,
CODECHAL_HEVC_8x8_PU_FMODE_BRC_Data = CODECHAL_HEVC_8x8_PU_FMODE_BEGIN + 9,
CODECHAL_HEVC_8x8_PU_FMODE_HAAR_DIST16x16 = CODECHAL_HEVC_8x8_PU_FMODE_BEGIN + 10,
CODECHAL_HEVC_8x8_PU_FMODE_STATS_DATA = CODECHAL_HEVC_8x8_PU_FMODE_BEGIN + 11,
CODECHAL_HEVC_8x8_PU_FMODE_FRAME_STATS_DATA = CODECHAL_HEVC_8x8_PU_FMODE_BEGIN + 12,
CODECHAL_HEVC_8x8_PU_FMODE_DEBUG = CODECHAL_HEVC_8x8_PU_FMODE_BEGIN + 13,
CODECHAL_HEVC_8x8_PU_FMODE_END = CODECHAL_HEVC_8x8_PU_FMODE_BEGIN + 14,
// B 32x32 PU intra check kernel
CODECHAL_HEVC_B_32x32_PU_BEGIN = CODECHAL_HEVC_8x8_PU_FMODE_END,
CODECHAL_HEVC_B_32x32_PU_OUTPUT = CODECHAL_HEVC_B_32x32_PU_BEGIN + 0,
CODECHAL_HEVC_B_32x32_PU_SRC_Y = CODECHAL_HEVC_B_32x32_PU_BEGIN + 1,
CODECHAL_HEVC_B_32x32_PU_SRC_UV = CODECHAL_HEVC_B_32x32_PU_BEGIN + 2,
CODECHAL_HEVC_B_32x32_PU_SRC_Y2x = CODECHAL_HEVC_B_32x32_PU_BEGIN + 3,
CODECHAL_HEVC_B_32x32_PU_SLICE_MAP = CODECHAL_HEVC_B_32x32_PU_BEGIN + 4,
CODECHAL_HEVC_B_32x32_PU_SRC_Y2x_VME = CODECHAL_HEVC_B_32x32_PU_BEGIN + 5,
CODECHAL_HEVC_B_32x32_PU_Simplest_Intra = CODECHAL_HEVC_B_32x32_PU_BEGIN + 6,
CODECHAL_HEVC_B_32x32_PU_HME_MVP = CODECHAL_HEVC_B_32x32_PU_BEGIN + 7,
CODECHAL_HEVC_B_32x32_PU_HME_DIST = CODECHAL_HEVC_B_32x32_PU_BEGIN + 8,
CODECHAL_HEVC_B_32x32_PU_LCU_SKIP = CODECHAL_HEVC_B_32x32_PU_BEGIN + 9,
CODECHAL_HEVC_B_32x32_PU_DEBUG = CODECHAL_HEVC_B_32x32_PU_BEGIN + 10,
CODECHAL_HEVC_B_32x32_PU_END = CODECHAL_HEVC_B_32x32_PU_BEGIN + 11,
// B MB ENC kernel
CODECHAL_HEVC_B_MBENC_BEGIN = CODECHAL_HEVC_B_32x32_PU_END,
CODECHAL_HEVC_B_MBENC_CU_RECORD = CODECHAL_HEVC_B_MBENC_BEGIN + 0,
CODECHAL_HEVC_B_MBENC_PAK_CMD = CODECHAL_HEVC_B_MBENC_BEGIN + 1,
CODECHAL_HEVC_B_MBENC_SRC_Y = CODECHAL_HEVC_B_MBENC_BEGIN + 2,
CODECHAL_HEVC_B_MBENC_SRC_UV = CODECHAL_HEVC_B_MBENC_BEGIN + 3,
CODECHAL_HEVC_B_MBENC_INTRA_DIST = CODECHAL_HEVC_B_MBENC_BEGIN + 4,
CODECHAL_HEVC_B_MBENC_MIN_DIST = CODECHAL_HEVC_B_MBENC_BEGIN + 5,
CODECHAL_HEVC_B_MBENC_HME_MVP = CODECHAL_HEVC_B_MBENC_BEGIN + 6,
CODECHAL_HEVC_B_MBENC_HME_DIST = CODECHAL_HEVC_B_MBENC_BEGIN + 7,
CODECHAL_HEVC_B_MBENC_SLICE_MAP = CODECHAL_HEVC_B_MBENC_BEGIN + 8,
CODECHAL_HEVC_B_MBENC_VME_UNISIC_DATA = CODECHAL_HEVC_B_MBENC_BEGIN + 9,
CODECHAL_HEVC_B_MBENC_Simplest_Intra = CODECHAL_HEVC_B_MBENC_BEGIN + 10,
CODECHAL_HEVC_B_MBENC_REF_COLLOC = CODECHAL_HEVC_B_MBENC_BEGIN + 11,
CODECHAL_HEVC_B_MBENC_Reserved = CODECHAL_HEVC_B_MBENC_BEGIN + 12,
CODECHAL_HEVC_B_MBENC_BRC_Input = CODECHAL_HEVC_B_MBENC_BEGIN + 13,
CODECHAL_HEVC_B_MBENC_LCU_QP = CODECHAL_HEVC_B_MBENC_BEGIN + 14,
CODECHAL_HEVC_B_MBENC_BRC_DATA = CODECHAL_HEVC_B_MBENC_BEGIN + 15,
//
CODECHAL_HEVC_B_MBENC_VME_CURRENT = CODECHAL_HEVC_B_MBENC_BEGIN + 16,
CODECHAL_HEVC_B_MBENC_VME_FORWARD_0 = CODECHAL_HEVC_B_MBENC_BEGIN + 17,
CODECHAL_HEVC_B_MBENC_VME_BACKWARD_0 = CODECHAL_HEVC_B_MBENC_BEGIN + 18,
CODECHAL_HEVC_B_MBENC_VME_FORWARD_1 = CODECHAL_HEVC_B_MBENC_BEGIN + 19,
CODECHAL_HEVC_B_MBENC_VME_BACKWARD_1 = CODECHAL_HEVC_B_MBENC_BEGIN + 20,
CODECHAL_HEVC_B_MBENC_VME_FORWARD_2 = CODECHAL_HEVC_B_MBENC_BEGIN + 21,
CODECHAL_HEVC_B_MBENC_VME_BACKWARD_2 = CODECHAL_HEVC_B_MBENC_BEGIN + 22,
CODECHAL_HEVC_B_MBENC_VME_FORWARD_3 = CODECHAL_HEVC_B_MBENC_BEGIN + 23,
CODECHAL_HEVC_B_MBENC_VME_BACKWARD_3 = CODECHAL_HEVC_B_MBENC_BEGIN + 24,
CODECHAL_HEVC_B_MBENC_VME_FORWARD_4 = CODECHAL_HEVC_B_MBENC_BEGIN + 25,
CODECHAL_HEVC_B_MBENC_VME_BACKWARD_4 = CODECHAL_HEVC_B_MBENC_BEGIN + 26,
CODECHAL_HEVC_B_MBENC_VME_FORWARD_5 = CODECHAL_HEVC_B_MBENC_BEGIN + 27,
CODECHAL_HEVC_B_MBENC_VME_BACKWARD_5 = CODECHAL_HEVC_B_MBENC_BEGIN + 28,
CODECHAL_HEVC_B_MBENC_VME_FORWARD_6 = CODECHAL_HEVC_B_MBENC_BEGIN + 29,
CODECHAL_HEVC_B_MBENC_VME_BACKWARD_6 = CODECHAL_HEVC_B_MBENC_BEGIN + 30,
CODECHAL_HEVC_B_MBENC_VME_FORWARD_7 = CODECHAL_HEVC_B_MBENC_BEGIN + 31,
CODECHAL_HEVC_B_MBENC_VME_BACKWARD_7 = CODECHAL_HEVC_B_MBENC_BEGIN + 32,
//
CODECHAL_HEVC_B_MBENC_VME_MUL_CURRENT = CODECHAL_HEVC_B_MBENC_BEGIN + 33,
CODECHAL_HEVC_B_MBENC_VME_MUL_BACKWARD_0 = CODECHAL_HEVC_B_MBENC_BEGIN + 34,
CODECHAL_HEVC_B_MBENC_VME_MUL_NOUSE_0 = CODECHAL_HEVC_B_MBENC_BEGIN + 35,
CODECHAL_HEVC_B_MBENC_VME_MUL_BACKWARD_1 = CODECHAL_HEVC_B_MBENC_BEGIN + 36,
CODECHAL_HEVC_B_MBENC_VME_MUL_NOUSE_1 = CODECHAL_HEVC_B_MBENC_BEGIN + 37,
CODECHAL_HEVC_B_MBENC_VME_MUL_BACKWARD_2 = CODECHAL_HEVC_B_MBENC_BEGIN + 38,
CODECHAL_HEVC_B_MBENC_VME_MUL_NOUSE_2 = CODECHAL_HEVC_B_MBENC_BEGIN + 39,
CODECHAL_HEVC_B_MBENC_VME_MUL_BACKWARD_3 = CODECHAL_HEVC_B_MBENC_BEGIN + 40,
CODECHAL_HEVC_B_MBENC_VME_MUL_NOUSE_3 = CODECHAL_HEVC_B_MBENC_BEGIN + 41,
//
CODECHAL_HEVC_B_MBENC_CONCURRENT_THD_MAP = CODECHAL_HEVC_B_MBENC_BEGIN + 42,
CODECHAL_HEVC_B_MBENC_MV_IDX = CODECHAL_HEVC_B_MBENC_BEGIN + 43,
CODECHAL_HEVC_B_MBENC_MVP_IDX = CODECHAL_HEVC_B_MBENC_BEGIN + 44,
CODECHAL_HEVC_B_MBENC_HAAR_DIST16x16 = CODECHAL_HEVC_B_MBENC_BEGIN + 45,
CODECHAL_HEVC_B_MBENC_STATS_DATA = CODECHAL_HEVC_B_MBENC_BEGIN + 46,
CODECHAL_HEVC_B_MBENC_FRAME_STATS_DATA = CODECHAL_HEVC_B_MBENC_BEGIN + 47,
CODECHAL_HEVC_B_MBENC_DEBUG = CODECHAL_HEVC_B_MBENC_BEGIN + 48,
//
CODECHAL_HEVC_B_MBENC_END = CODECHAL_HEVC_B_MBENC_BEGIN + 49,
//Coarse Intra distortion
CODECHAL_HEVC_COARSE_INTRA_BEGIN = CODECHAL_HEVC_B_MBENC_END,
CODECHAL_HEVC_COARSE_INTRA_Y4 = CODECHAL_HEVC_COARSE_INTRA_BEGIN + 0,
CODECHAL_HEVC_COARSE_INTRA_DISTORTION = CODECHAL_HEVC_COARSE_INTRA_BEGIN + 1,
CODECHAL_HEVC_COARSE_INTRA_VME_Y4 = CODECHAL_HEVC_COARSE_INTRA_BEGIN + 2,
CODECHAL_HEVC_COARSE_INTRA_END = CODECHAL_HEVC_COARSE_INTRA_BEGIN + 3,
// HEVC B PAK kernel
CODECHAL_HEVC_B_PAK_BEGIN = CODECHAL_HEVC_COARSE_INTRA_END,
CODECHAL_HEVC_B_PAK_CU_RECORD = CODECHAL_HEVC_B_PAK_BEGIN + 0,
CODECHAL_HEVC_B_PAK_PAK_OBJ = CODECHAL_HEVC_B_PAK_BEGIN + 1,
CODECHAL_HEVC_B_PAK_SLICE_MAP = CODECHAL_HEVC_B_PAK_BEGIN + 2,
CODECHAL_HEVC_B_PAK_BRC_INPUT = CODECHAL_HEVC_B_PAK_BEGIN + 3,
CODECHAL_HEVC_B_PAK_LCU_QP = CODECHAL_HEVC_B_PAK_BEGIN + 4,
CODECHAL_HEVC_B_PAK_BRC_DATA = CODECHAL_HEVC_B_PAK_BEGIN + 5,
CODECHAL_HEVC_B_PAK_MB_DATA = CODECHAL_HEVC_B_PAK_BEGIN + 6,
CODECHAL_HEVC_B_PAK_MVP_DATA = CODECHAL_HEVC_B_PAK_BEGIN + 7,
CODECHAL_HEVC_B_PAK_WA_PAK_DATA = CODECHAL_HEVC_B_PAK_BEGIN + 8,
CODECHAL_HEVC_B_PAK_WA_PAK_OBJ = CODECHAL_HEVC_B_PAK_BEGIN + 9,
CODECHAL_HEVC_B_PAK_DEBUG = CODECHAL_HEVC_B_PAK_BEGIN + 10,
CODECHAL_HEVC_B_PAK_END = CODECHAL_HEVC_B_PAK_BEGIN + 11,
//HEVC FORMAT CONVERSION AND DOWNSCALING KERNEL
CODECHAL_HEVC_DS_COMBINED_BEGIN = CODECHAL_HEVC_B_PAK_END,
CODECHAL_HEVC_DS_COMBINED_10BIT_Y = CODECHAL_HEVC_DS_COMBINED_BEGIN + 0,
CODECHAL_HEVC_DS_COMBINED_10BIT_UV = CODECHAL_HEVC_DS_COMBINED_BEGIN + 1,
CODECHAL_HEVC_DS_COMBINED_8BIT_Y = CODECHAL_HEVC_DS_COMBINED_BEGIN + 2,
CODECHAL_HEVC_DS_COMBINED_8BIT_UV = CODECHAL_HEVC_DS_COMBINED_BEGIN + 3,
CODECHAL_HEVC_DS_COMBINED_4xDOWNSCALE = CODECHAL_HEVC_DS_COMBINED_BEGIN + 4,
CODECHAL_HEVC_DS_COMBINED_MB_STATS = CODECHAL_HEVC_DS_COMBINED_BEGIN + 5,
CODECHAL_HEVC_DS_COMBINED_2xDOWNSCALE = CODECHAL_HEVC_DS_COMBINED_BEGIN + 6,
CODECHAL_HEVC_DS_COMBINED_END = CODECHAL_HEVC_DS_COMBINED_BEGIN + 7,
//BRC Init/Reset
CODECHAL_HEVC_BRC_INIT_RESET_BEGIN = CODECHAL_HEVC_DS_COMBINED_END,
CODECHAL_HEVC_BRC_INIT_RESET_HISTORY = CODECHAL_HEVC_BRC_INIT_RESET_BEGIN + 0,
CODECHAL_HEVC_BRC_INIT_RESET_DISTORTION = CODECHAL_HEVC_BRC_INIT_RESET_BEGIN + 1,
CODECHAL_HEVC_BRC_INIT_RESET_END = CODECHAL_HEVC_BRC_INIT_RESET_BEGIN + 2,
//BRC Update (frame based)
CODECHAL_HEVC_BRC_UPDATE_BEGIN = CODECHAL_HEVC_BRC_INIT_RESET_END,
CODECHAL_HEVC_BRC_UPDATE_HISTORY = CODECHAL_HEVC_BRC_UPDATE_BEGIN + 0,
CODECHAL_HEVC_BRC_UPDATE_PREV_PAK = CODECHAL_HEVC_BRC_UPDATE_BEGIN + 1,
CODECHAL_HEVC_BRC_UPDATE_PIC_STATE_R = CODECHAL_HEVC_BRC_UPDATE_BEGIN + 2,
CODECHAL_HEVC_BRC_UPDATE_PIC_STATE_W = CODECHAL_HEVC_BRC_UPDATE_BEGIN + 3,
CODECHAL_HEVC_BRC_UPDATE_ENC_OUTPUT = CODECHAL_HEVC_BRC_UPDATE_BEGIN + 4,
CODECHAL_HEVC_BRC_UPDATE_DISTORTION = CODECHAL_HEVC_BRC_UPDATE_BEGIN + 5,
CODECHAL_HEVC_BRC_UPDATE_BRCDATA = CODECHAL_HEVC_BRC_UPDATE_BEGIN + 6,
CODECHAL_HEVC_BRC_UPDATE_END = CODECHAL_HEVC_BRC_UPDATE_BEGIN + 7,
//BRC Update (LCU-based)
CODECHAL_HEVC_BRC_LCU_UPDATE_BEGIN = CODECHAL_HEVC_BRC_UPDATE_END,
CODECHAL_HEVC_BRC_LCU_UPDATE_HISTORY = CODECHAL_HEVC_BRC_LCU_UPDATE_BEGIN + 0,
CODECHAL_HEVC_BRC_LCU_UPDATE_HME_DISTORTION = CODECHAL_HEVC_BRC_LCU_UPDATE_BEGIN + 1,
CODECHAL_HEVC_BRC_LCU_UPDATE_INTRA_DISTORTION = CODECHAL_HEVC_BRC_LCU_UPDATE_BEGIN + 2,
CODECHAL_HEVC_BRC_LCU_UPDATE_HME_MVP = CODECHAL_HEVC_BRC_LCU_UPDATE_BEGIN + 3,
CODECHAL_HEVC_BRC_LCU_UPDATE_LCU_QP = CODECHAL_HEVC_BRC_LCU_UPDATE_BEGIN + 4,
CODECHAL_HEVC_BRC_LCU_UPDATE_ROI = CODECHAL_HEVC_BRC_LCU_UPDATE_BEGIN + 5,
CODECHAL_HEVC_BRC_LCU_UPDATE_END = CODECHAL_HEVC_BRC_LCU_UPDATE_BEGIN + 6,
// P MB ENC kernel
CODECHAL_HEVC_P_MBENC_BEGIN = CODECHAL_HEVC_BRC_LCU_UPDATE_END,
CODECHAL_HEVC_P_MBENC_CU_RECORD = CODECHAL_HEVC_P_MBENC_BEGIN + 0,
CODECHAL_HEVC_P_MBENC_PAK_CMD = CODECHAL_HEVC_P_MBENC_BEGIN + 1,
CODECHAL_HEVC_P_MBENC_SRC_Y = CODECHAL_HEVC_P_MBENC_BEGIN + 2,
CODECHAL_HEVC_P_MBENC_SRC_UV = CODECHAL_HEVC_P_MBENC_BEGIN + 3,
CODECHAL_HEVC_P_MBENC_INTRA_DIST = CODECHAL_HEVC_P_MBENC_BEGIN + 4,
CODECHAL_HEVC_P_MBENC_MIN_DIST = CODECHAL_HEVC_P_MBENC_BEGIN + 5,
CODECHAL_HEVC_P_MBENC_HME_MVP = CODECHAL_HEVC_P_MBENC_BEGIN + 6,
CODECHAL_HEVC_P_MBENC_HME_DIST = CODECHAL_HEVC_P_MBENC_BEGIN + 7,
CODECHAL_HEVC_P_MBENC_SLICE_MAP = CODECHAL_HEVC_P_MBENC_BEGIN + 8,
CODECHAL_HEVC_P_MBENC_VME_UNISIC_DATA = CODECHAL_HEVC_P_MBENC_BEGIN + 9,
CODECHAL_HEVC_P_MBENC_Simplest_Intra = CODECHAL_HEVC_P_MBENC_BEGIN + 10,
CODECHAL_HEVC_P_MBENC_REF_COLLOC = CODECHAL_HEVC_P_MBENC_BEGIN + 11,
CODECHAL_HEVC_P_MBENC_Reserved = CODECHAL_HEVC_P_MBENC_BEGIN + 12,
CODECHAL_HEVC_P_MBENC_BRC_Input = CODECHAL_HEVC_P_MBENC_BEGIN + 13,
CODECHAL_HEVC_P_MBENC_LCU_QP = CODECHAL_HEVC_P_MBENC_BEGIN + 14,
CODECHAL_HEVC_P_MBENC_BRC_DATA = CODECHAL_HEVC_P_MBENC_BEGIN + 15,
//
CODECHAL_HEVC_P_MBENC_VME_CURRENT = CODECHAL_HEVC_P_MBENC_BEGIN + 16,
CODECHAL_HEVC_P_MBENC_VME_FORWARD_0 = CODECHAL_HEVC_P_MBENC_BEGIN + 17,
CODECHAL_HEVC_P_MBENC_VME_FORWARD_1 = CODECHAL_HEVC_P_MBENC_BEGIN + 19,
CODECHAL_HEVC_P_MBENC_VME_FORWARD_2 = CODECHAL_HEVC_P_MBENC_BEGIN + 21,
CODECHAL_HEVC_P_MBENC_VME_FORWARD_3 = CODECHAL_HEVC_P_MBENC_BEGIN + 23,
CODECHAL_HEVC_P_MBENC_VME_FORWARD_4 = CODECHAL_HEVC_P_MBENC_BEGIN + 25,
CODECHAL_HEVC_P_MBENC_VME_FORWARD_5 = CODECHAL_HEVC_P_MBENC_BEGIN + 27,
CODECHAL_HEVC_P_MBENC_VME_FORWARD_6 = CODECHAL_HEVC_P_MBENC_BEGIN + 29,
CODECHAL_HEVC_P_MBENC_VME_FORWARD_7 = CODECHAL_HEVC_P_MBENC_BEGIN + 31,
//
CODECHAL_HEVC_P_MBENC_CONCURRENT_THD_MAP = CODECHAL_HEVC_P_MBENC_BEGIN + 33,
CODECHAL_HEVC_P_MBENC_MV_IDX = CODECHAL_HEVC_P_MBENC_BEGIN + 34,
CODECHAL_HEVC_P_MBENC_MVP_IDX = CODECHAL_HEVC_P_MBENC_BEGIN + 35,
CODECHAL_HEVC_P_MBENC_DEBUG = CODECHAL_HEVC_P_MBENC_BEGIN + 36,
//
CODECHAL_HEVC_P_MBENC_END = CODECHAL_HEVC_P_MBENC_BEGIN + 37,
CODECHAL_HEVC_NUM_SURFACES = CODECHAL_HEVC_P_MBENC_END
};
enum
{
// 2x down-scaling kernel
CODECHAL_HEVC_FEI_SCALING_FRAME_BEGIN = 0,
CODECHAL_HEVC_FEI_SCALING_FRAME_SRC_Y = CODECHAL_HEVC_FEI_SCALING_FRAME_BEGIN + 0,
CODECHAL_HEVC_FEI_SCALING_FRAME_DST_Y = CODECHAL_HEVC_FEI_SCALING_FRAME_BEGIN + 1,
CODECHAL_HEVC_FEI_SCALING_FRAME_END = CODECHAL_HEVC_FEI_SCALING_FRAME_BEGIN + 2,
// 32x32 PU mode decision kernel
CODECHAL_HEVC_FEI_32x32_PU_BEGIN = CODECHAL_HEVC_FEI_SCALING_FRAME_END,
CODECHAL_HEVC_FEI_32x32_PU_OUTPUT = CODECHAL_HEVC_FEI_32x32_PU_BEGIN + 0,
CODECHAL_HEVC_FEI_32x32_PU_SRC_Y = CODECHAL_HEVC_FEI_32x32_PU_BEGIN + 1,
CODECHAL_HEVC_FEI_32x32_PU_SRC_UV = CODECHAL_HEVC_FEI_32x32_PU_BEGIN + 2,
CODECHAL_HEVC_FEI_32x32_PU_SRC_Y2x = CODECHAL_HEVC_FEI_32x32_PU_BEGIN + 3,
CODECHAL_HEVC_FEI_32x32_PU_SLICE_MAP = CODECHAL_HEVC_FEI_32x32_PU_BEGIN + 4,
CODECHAL_HEVC_FEI_32x32_PU_SRC_Y2x_VME = CODECHAL_HEVC_FEI_32x32_PU_BEGIN + 5,
CODECHAL_HEVC_FEI_32x32_PU_BRC_Input = CODECHAL_HEVC_FEI_32x32_PU_BEGIN + 6,
CODECHAL_HEVC_FEI_32x32_PU_LCU_QP = CODECHAL_HEVC_FEI_32x32_PU_BEGIN + 7,
CODECHAL_HEVC_FEI_32x32_PU_BRC_DATA = CODECHAL_HEVC_FEI_32x32_PU_BEGIN + 8,
CODECHAL_HEVC_FEI_32x32_PU_STATS_DATA = CODECHAL_HEVC_FEI_32x32_PU_BEGIN + 9,
CODECHAL_HEVC_FEI_32x32_PU_DEBUG = CODECHAL_HEVC_FEI_32x32_PU_BEGIN + 10,
CODECHAL_HEVC_FEI_32x32_PU_END = CODECHAL_HEVC_FEI_32x32_PU_BEGIN + 11,
// 16x16 SAD computation kernel
CODECHAL_HEVC_FEI_16x16_PU_SAD_BEGIN = CODECHAL_HEVC_FEI_32x32_PU_END,
CODECHAL_HEVC_FEI_16x16_PU_SAD_SRC_Y = CODECHAL_HEVC_FEI_16x16_PU_SAD_BEGIN + 0,
CODECHAL_HEVC_FEI_16x16_PU_SAD_SRC_UV = CODECHAL_HEVC_FEI_16x16_PU_SAD_BEGIN + 1,
CODECHAL_HEVC_FEI_16x16_PU_SAD_OUTPUT = CODECHAL_HEVC_FEI_16x16_PU_SAD_BEGIN + 2,
CODECHAL_HEVC_FEI_16x16_PU_SAD_32x32_MD_DATA = CODECHAL_HEVC_FEI_16x16_PU_SAD_BEGIN + 3,
CODECHAL_HEVC_FEI_16x16_PU_SLICE_MAP = CODECHAL_HEVC_FEI_16x16_PU_SAD_BEGIN + 4,
CODECHAL_HEVC_FEI_16x16_PU_Simplest_Intra = CODECHAL_HEVC_FEI_16x16_PU_SAD_BEGIN + 5,
CODECHAL_HEVC_FEI_16x16_PU_SAD_DEBUG = CODECHAL_HEVC_FEI_16x16_PU_SAD_BEGIN + 6,
CODECHAL_HEVC_FEI_16x16_PU_SAD_END = CODECHAL_HEVC_FEI_16x16_PU_SAD_BEGIN + 7,
// 16x16 PU mode decision kernel
CODECHAL_HEVC_FEI_16x16_PU_MD_BEGIN = CODECHAL_HEVC_FEI_16x16_PU_SAD_END,
CODECHAL_HEVC_FEI_16x16_PU_MD_SRC_Y = CODECHAL_HEVC_FEI_16x16_PU_MD_BEGIN + 0,
CODECHAL_HEVC_FEI_16x16_PU_MD_SRC_UV = CODECHAL_HEVC_FEI_16x16_PU_MD_BEGIN + 1,
CODECHAL_HEVC_FEI_16x16_PU_MD_16x16_SAD_DATA = CODECHAL_HEVC_FEI_16x16_PU_MD_BEGIN + 2,
CODECHAL_HEVC_FEI_16x16_PU_MD_PAK_OBJ = CODECHAL_HEVC_FEI_16x16_PU_MD_BEGIN + 3,
CODECHAL_HEVC_FEI_16x16_PU_MD_32x32_MD_DATA = CODECHAL_HEVC_FEI_16x16_PU_MD_BEGIN + 4,
CODECHAL_HEVC_FEI_16x16_PU_MD_VME_8x8_MD_DATA = CODECHAL_HEVC_FEI_16x16_PU_MD_BEGIN + 5,
CODECHAL_HEVC_FEI_16x16_PU_MD_SLICE_MAP = CODECHAL_HEVC_FEI_16x16_PU_MD_BEGIN + 6,
CODECHAL_HEVC_FEI_16x16_PU_MD_VME_SRC = CODECHAL_HEVC_FEI_16x16_PU_MD_BEGIN + 7,
CODECHAL_HEVC_FEI_16x16_PU_MD_BRC_Input = CODECHAL_HEVC_FEI_16x16_PU_MD_BEGIN + 8,
CODECHAL_HEVC_FEI_16x16_PU_MD_Simplest_Intra = CODECHAL_HEVC_FEI_16x16_PU_MD_BEGIN + 9,
CODECHAL_HEVC_FEI_16x16_PU_MD_LCU_QP = CODECHAL_HEVC_FEI_16x16_PU_MD_BEGIN + 10,
CODECHAL_HEVC_FEI_16x16_PU_MD_BRC_Data = CODECHAL_HEVC_FEI_16x16_PU_MD_BEGIN + 11,
CODECHAL_HEVC_FEI_16x16_PU_MD_DEBUG = CODECHAL_HEVC_FEI_16x16_PU_MD_BEGIN + 12,
CODECHAL_HEVC_FEI_16x16_PU_MD_END = CODECHAL_HEVC_FEI_16x16_PU_MD_BEGIN + 13,
// 8x8 PU kernel
CODECHAL_HEVC_FEI_8x8_PU_BEGIN = CODECHAL_HEVC_FEI_16x16_PU_MD_END,
CODECHAL_HEVC_FEI_8x8_PU_SRC_Y = CODECHAL_HEVC_FEI_8x8_PU_BEGIN + 0,
CODECHAL_HEVC_FEI_8x8_PU_SRC_UV = CODECHAL_HEVC_FEI_8x8_PU_BEGIN + 1,
CODECHAL_HEVC_FEI_8x8_PU_SLICE_MAP = CODECHAL_HEVC_FEI_8x8_PU_BEGIN + 2,
CODECHAL_HEVC_FEI_8x8_PU_VME_8x8_MODE = CODECHAL_HEVC_FEI_8x8_PU_BEGIN + 3,
CODECHAL_HEVC_FEI_8x8_PU_INTRA_MODE = CODECHAL_HEVC_FEI_8x8_PU_BEGIN + 4,
CODECHAL_HEVC_FEI_8x8_PU_BRC_Input = CODECHAL_HEVC_FEI_8x8_PU_BEGIN + 5,
CODECHAL_HEVC_FEI_8x8_PU_Simplest_Intra = CODECHAL_HEVC_FEI_8x8_PU_BEGIN + 6,
CODECHAL_HEVC_FEI_8x8_PU_LCU_QP = CODECHAL_HEVC_FEI_8x8_PU_BEGIN + 7,
CODECHAL_HEVC_FEI_8x8_PU_BRC_Data = CODECHAL_HEVC_FEI_8x8_PU_BEGIN + 8,
CODECHAL_HEVC_FEI_8x8_PU_DEBUG = CODECHAL_HEVC_FEI_8x8_PU_BEGIN + 9,
CODECHAL_HEVC_FEI_8x8_PU_END = CODECHAL_HEVC_FEI_8x8_PU_BEGIN + 10,
// 8x8 PU FMODE kernel
CODECHAL_HEVC_FEI_8x8_PU_FMODE_BEGIN = CODECHAL_HEVC_FEI_8x8_PU_END,
CODECHAL_HEVC_FEI_8x8_PU_FMODE_PAK_OBJECT = CODECHAL_HEVC_FEI_8x8_PU_FMODE_BEGIN + 0,
CODECHAL_HEVC_FEI_8x8_PU_FMODE_VME_8x8_MODE = CODECHAL_HEVC_FEI_8x8_PU_FMODE_BEGIN + 1,
CODECHAL_HEVC_FEI_8x8_PU_FMODE_INTRA_MODE = CODECHAL_HEVC_FEI_8x8_PU_FMODE_BEGIN + 2,
CODECHAL_HEVC_FEI_8x8_PU_FMODE_PAK_COMMAND = CODECHAL_HEVC_FEI_8x8_PU_FMODE_BEGIN + 3,
CODECHAL_HEVC_FEI_8x8_PU_FMODE_SLICE_MAP = CODECHAL_HEVC_FEI_8x8_PU_FMODE_BEGIN + 4,
CODECHAL_HEVC_FEI_8x8_PU_FMODE_INTRADIST = CODECHAL_HEVC_FEI_8x8_PU_FMODE_BEGIN + 5,
CODECHAL_HEVC_FEI_8x8_PU_FMODE_BRC_Input = CODECHAL_HEVC_FEI_8x8_PU_FMODE_BEGIN + 6,
CODECHAL_HEVC_FEI_8x8_PU_FMODE_Simplest_Intra = CODECHAL_HEVC_FEI_8x8_PU_FMODE_BEGIN + 7,
CODECHAL_HEVC_FEI_8x8_PU_FMODE_LCU_QP = CODECHAL_HEVC_FEI_8x8_PU_FMODE_BEGIN + 8,
CODECHAL_HEVC_FEI_8x8_PU_FMODE_BRC_Data = CODECHAL_HEVC_FEI_8x8_PU_FMODE_BEGIN + 9,
CODECHAL_HEVC_FEI_8x8_PU_FMODE_HAAR16x16 = CODECHAL_HEVC_FEI_8x8_PU_FMODE_BEGIN + 10,
CODECHAL_HEVC_FEI_8x8_PU_FMODE_STATS_DATA = CODECHAL_HEVC_FEI_8x8_PU_FMODE_BEGIN + 11,
CODECHAL_HEVC_FEI_8X8_PU_FMODE_FRAME_STATS_DATA = CODECHAL_HEVC_FEI_8x8_PU_FMODE_BEGIN + 12,
CODECHAL_HEVC_FEI_8X8_PU_FMODE_CTB_DISTORTION = CODECHAL_HEVC_FEI_8x8_PU_FMODE_BEGIN + 13,
CODECHAL_HEVC_FEI_8x8_PU_FMODE_DEBUG = CODECHAL_HEVC_FEI_8x8_PU_FMODE_BEGIN + 14,
CODECHAL_HEVC_FEI_8x8_PU_FMODE_END = CODECHAL_HEVC_FEI_8x8_PU_FMODE_BEGIN + 15,
// B 32x32 PU intra check kernel
CODECHAL_HEVC_FEI_B_32x32_PU_BEGIN = CODECHAL_HEVC_FEI_8x8_PU_FMODE_END,
CODECHAL_HEVC_FEI_B_32x32_PU_OUTPUT = CODECHAL_HEVC_FEI_B_32x32_PU_BEGIN + 0,
CODECHAL_HEVC_FEI_B_32x32_PU_SRC_Y = CODECHAL_HEVC_FEI_B_32x32_PU_BEGIN + 1,
CODECHAL_HEVC_FEI_B_32x32_PU_SRC_UV = CODECHAL_HEVC_FEI_B_32x32_PU_BEGIN + 2,
CODECHAL_HEVC_FEI_B_32x32_PU_SRC_Y2x = CODECHAL_HEVC_FEI_B_32x32_PU_BEGIN + 3,
CODECHAL_HEVC_FEI_B_32x32_PU_SLICE_MAP = CODECHAL_HEVC_FEI_B_32x32_PU_BEGIN + 4,
CODECHAL_HEVC_FEI_B_32x32_PU_SRC_Y2x_VME = CODECHAL_HEVC_FEI_B_32x32_PU_BEGIN + 5,
CODECHAL_HEVC_FEI_B_32x32_PU_Simplest_Intra = CODECHAL_HEVC_FEI_B_32x32_PU_BEGIN + 6,
CODECHAL_HEVC_FEI_B_32x32_PU_HME_MVP = CODECHAL_HEVC_FEI_B_32x32_PU_BEGIN + 7,
CODECHAL_HEVC_FEI_B_32x32_PU_HME_DIST = CODECHAL_HEVC_FEI_B_32x32_PU_BEGIN + 8,
CODECHAL_HEVC_FEI_B_32x32_PU_LCU_SKIP = CODECHAL_HEVC_FEI_B_32x32_PU_BEGIN + 9,
CODECHAL_HEVC_FEI_B_32x32_PU_DEBUG = CODECHAL_HEVC_FEI_B_32x32_PU_BEGIN + 10,
CODECHAL_HEVC_FEI_B_32x32_PU_END = CODECHAL_HEVC_FEI_B_32x32_PU_BEGIN + 11,
// B MB ENC kernel
CODECHAL_HEVC_FEI_B_MBENC_BEGIN = CODECHAL_HEVC_FEI_B_32x32_PU_END,
CODECHAL_HEVC_FEI_B_MBENC_CU_RECORD = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 0,
CODECHAL_HEVC_FEI_B_MBENC_PAK_CMD = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 1,
CODECHAL_HEVC_FEI_B_MBENC_SRC_Y = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 2,
CODECHAL_HEVC_FEI_B_MBENC_SRC_UV = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 3,
CODECHAL_HEVC_FEI_B_MBENC_INTRA_DIST = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 4,
CODECHAL_HEVC_FEI_B_MBENC_MIN_DIST = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 5,
CODECHAL_HEVC_FEI_B_MBENC_HME_MVP = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 6,
CODECHAL_HEVC_FEI_B_MBENC_HME_DIST = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 7,
CODECHAL_HEVC_FEI_B_MBENC_SLICE_MAP = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 8,
CODECHAL_HEVC_FEI_B_MBENC_VME_UNISIC_DATA = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 9,
CODECHAL_HEVC_FEI_B_MBENC_Simplest_Intra = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 10,
CODECHAL_HEVC_FEI_B_MBENC_REF_COLLOC = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 11,
CODECHAL_HEVC_FEI_B_MBENC_Reserved = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 12,
CODECHAL_HEVC_FEI_B_MBENC_BRC_Input = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 13,
CODECHAL_HEVC_FEI_B_MBENC_LCU_QP = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 14,
CODECHAL_HEVC_FEI_B_MBENC_BRC_DATA = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 15,
//
CODECHAL_HEVC_FEI_B_MBENC_VME_CURRENT = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 16,
CODECHAL_HEVC_FEI_B_MBENC_VME_FORWARD_0 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 17,
CODECHAL_HEVC_FEI_B_MBENC_VME_BACKWARD_0 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 18,
CODECHAL_HEVC_FEI_B_MBENC_VME_FORWARD_1 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 19,
CODECHAL_HEVC_FEI_B_MBENC_VME_BACKWARD_1 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 20,
CODECHAL_HEVC_FEI_B_MBENC_VME_FORWARD_2 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 21,
CODECHAL_HEVC_FEI_B_MBENC_VME_BACKWARD_2 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 22,
CODECHAL_HEVC_FEI_B_MBENC_VME_FORWARD_3 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 23,
CODECHAL_HEVC_FEI_B_MBENC_VME_BACKWARD_3 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 24,
CODECHAL_HEVC_FEI_B_MBENC_VME_FORWARD_4 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 25,
CODECHAL_HEVC_FEI_B_MBENC_VME_BACKWARD_4 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 26,
CODECHAL_HEVC_FEI_B_MBENC_VME_FORWARD_5 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 27,
CODECHAL_HEVC_FEI_B_MBENC_VME_BACKWARD_5 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 28,
CODECHAL_HEVC_FEI_B_MBENC_VME_FORWARD_6 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 29,
CODECHAL_HEVC_FEI_B_MBENC_VME_BACKWARD_6 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 30,
CODECHAL_HEVC_FEI_B_MBENC_VME_FORWARD_7 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 31,
CODECHAL_HEVC_FEI_B_MBENC_VME_BACKWARD_7 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 32,
//
CODECHAL_HEVC_FEI_B_MBENC_VME_MUL_CURRENT = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 33,
CODECHAL_HEVC_FEI_B_MBENC_VME_MUL_BACKWARD_0 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 34,
CODECHAL_HEVC_FEI_B_MBENC_VME_MUL_NOUSE_0 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 35,
CODECHAL_HEVC_FEI_B_MBENC_VME_MUL_BACKWARD_1 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 36,
CODECHAL_HEVC_FEI_B_MBENC_VME_MUL_NOUSE_1 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 37,
CODECHAL_HEVC_FEI_B_MBENC_VME_MUL_BACKWARD_2 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 38,
CODECHAL_HEVC_FEI_B_MBENC_VME_MUL_NOUSE_2 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 39,
CODECHAL_HEVC_FEI_B_MBENC_VME_MUL_BACKWARD_3 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 40,
CODECHAL_HEVC_FEI_B_MBENC_VME_MUL_NOUSE_3 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 41,
//
CODECHAL_HEVC_FEI_B_MBENC_CONCURRENT_THD_MAP = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 42,
CODECHAL_HEVC_FEI_B_MBENC_MV_IDX = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 43,
CODECHAL_HEVC_FEI_B_MBENC_MVP_IDX = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 44,
CODECHAL_HEVC_FEI_B_MBENC_HAAR_DIST16x16 = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 45,
CODECHAL_HEVC_FEI_B_MBENC_STATS_DATA = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 46,
CODECHAL_HEVC_FEI_B_MBENC_FRAME_STATS_DATA = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 47,
//
CODECHAL_HEVC_FEI_B_MBENC_EXTERNAL_MVP = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 48,
CODECHAL_HEVC_FEI_B_MBENC_PER_CTB_CTRL = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 49,
CODECHAL_HEVC_FEI_B_MBENC_CTB_DISTORTION = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 50,
CODECHAL_HEVC_FEI_B_MBENC_DEBUG = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 51,
//
CODECHAL_HEVC_FEI_B_MBENC_END = CODECHAL_HEVC_FEI_B_MBENC_BEGIN + 52,
// HEVC B PAK kernel
CODECHAL_HEVC_FEI_B_PAK_BEGIN = CODECHAL_HEVC_FEI_B_MBENC_END,
CODECHAL_HEVC_FEI_B_PAK_CU_RECORD = CODECHAL_HEVC_FEI_B_PAK_BEGIN + 0,
CODECHAL_HEVC_FEI_B_PAK_PAK_OBJ = CODECHAL_HEVC_FEI_B_PAK_BEGIN + 1,
CODECHAL_HEVC_FEI_B_PAK_SLICE_MAP = CODECHAL_HEVC_FEI_B_PAK_BEGIN + 2,
CODECHAL_HEVC_FEI_B_PAK_BRC_INPUT = CODECHAL_HEVC_FEI_B_PAK_BEGIN + 3,
CODECHAL_HEVC_FEI_B_PAK_LCU_QP = CODECHAL_HEVC_FEI_B_PAK_BEGIN + 4,
CODECHAL_HEVC_FEI_B_PAK_BRC_DATA = CODECHAL_HEVC_FEI_B_PAK_BEGIN + 5,
CODECHAL_HEVC_FEI_B_PAK_MB_DATA = CODECHAL_HEVC_FEI_B_PAK_BEGIN + 6,
CODECHAL_HEVC_FEI_B_PAK_MVP_DATA = CODECHAL_HEVC_FEI_B_PAK_BEGIN + 7,
CODECHAL_HEVC_FEI_B_PAK_WA_PAK_DATA = CODECHAL_HEVC_FEI_B_PAK_BEGIN + 8,
CODECHAL_HEVC_FEI_B_PAK_WA_PAK_OBJ = CODECHAL_HEVC_FEI_B_PAK_BEGIN + 9,
CODECHAL_HEVC_FEI_B_PAK_DEBUG = CODECHAL_HEVC_FEI_B_PAK_BEGIN + 10,
CODECHAL_HEVC_FEI_B_PAK_END = CODECHAL_HEVC_FEI_B_PAK_BEGIN + 11,
//HEVC FORMAT CONVERSION AND DOWNSCALING KERNEL
CODECHAL_HEVC_FEI_DS_COMBINED_BEGIN = CODECHAL_HEVC_FEI_B_PAK_END,
CODECHAL_HEVC_FEI_DS_COMBINED_10BIT_Y = CODECHAL_HEVC_FEI_DS_COMBINED_BEGIN + 0,
CODECHAL_HEVC_FEI_DS_COMBINED_10BIT_UV = CODECHAL_HEVC_FEI_DS_COMBINED_BEGIN + 1,
CODECHAL_HEVC_FEI_DS_COMBINED_8BIT_Y = CODECHAL_HEVC_FEI_DS_COMBINED_BEGIN + 2,
CODECHAL_HEVC_FEI_DS_COMBINED_8BIT_UV = CODECHAL_HEVC_FEI_DS_COMBINED_BEGIN + 3,
CODECHAL_HEVC_FEI_DS_COMBINED_4xDOWNSCALE = CODECHAL_HEVC_FEI_DS_COMBINED_BEGIN + 4,
CODECHAL_HEVC_FEI_DS_COMBINED_MB_STATS = CODECHAL_HEVC_FEI_DS_COMBINED_BEGIN + 5,
CODECHAL_HEVC_FEI_DS_COMBINED_2xDOWNSCALE = CODECHAL_HEVC_FEI_DS_COMBINED_BEGIN + 6,
CODECHAL_HEVC_FEI_DS_COMBINED_END = CODECHAL_HEVC_FEI_DS_COMBINED_BEGIN + 7,
// P MB ENC kernel
CODECHAL_HEVC_FEI_P_MBENC_BEGIN = CODECHAL_HEVC_FEI_DS_COMBINED_END,
CODECHAL_HEVC_FEI_P_MBENC_CU_RECORD = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 0,
CODECHAL_HEVC_FEI_P_MBENC_PAK_CMD = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 1,
CODECHAL_HEVC_FEI_P_MBENC_SRC_Y = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 2,
CODECHAL_HEVC_FEI_P_MBENC_SRC_UV = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 3,
CODECHAL_HEVC_FEI_P_MBENC_INTRA_DIST = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 4,
CODECHAL_HEVC_FEI_P_MBENC_MIN_DIST = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 5,
CODECHAL_HEVC_FEI_P_MBENC_HME_MVP = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 6,
CODECHAL_HEVC_FEI_P_MBENC_HME_DIST = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 7,
CODECHAL_HEVC_FEI_P_MBENC_SLICE_MAP = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 8,
CODECHAL_HEVC_FEI_P_MBENC_VME_UNISIC_DATA = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 9,
CODECHAL_HEVC_FEI_P_MBENC_Simplest_Intra = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 10,
CODECHAL_HEVC_FEI_P_MBENC_REF_COLLOC = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 11,
CODECHAL_HEVC_FEI_P_MBENC_Reserved = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 12,
CODECHAL_HEVC_FEI_P_MBENC_BRC_Input = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 13,
CODECHAL_HEVC_FEI_P_MBENC_LCU_QP = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 14,
CODECHAL_HEVC_FEI_P_MBENC_BRC_DATA = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 15,
//
CODECHAL_HEVC_FEI_P_MBENC_VME_CURRENT = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 16,
CODECHAL_HEVC_FEI_P_MBENC_VME_FORWARD_0 = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 17,
CODECHAL_HEVC_FEI_P_MBENC_VME_FORWARD_1 = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 19,
CODECHAL_HEVC_FEI_P_MBENC_VME_FORWARD_2 = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 21,
CODECHAL_HEVC_FEI_P_MBENC_VME_FORWARD_3 = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 23,
CODECHAL_HEVC_FEI_P_MBENC_VME_FORWARD_4 = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 25,
CODECHAL_HEVC_FEI_P_MBENC_VME_FORWARD_5 = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 27,
CODECHAL_HEVC_FEI_P_MBENC_VME_FORWARD_6 = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 29,
CODECHAL_HEVC_FEI_P_MBENC_VME_FORWARD_7 = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 31,
//
CODECHAL_HEVC_FEI_P_MBENC_CONCURRENT_THD_MAP = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 33,
CODECHAL_HEVC_FEI_P_MBENC_MV_IDX = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 34,
CODECHAL_HEVC_FEI_P_MBENC_MVP_IDX = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 35,
CODECHAL_HEVC_FEI_P_MBENC_DEBUG = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 36,
//
CODECHAL_HEVC_FEI_P_MBENC_END = CODECHAL_HEVC_FEI_P_MBENC_BEGIN + 37,
CODECHAL_HEVC_FEI_NUM_SURFACES = CODECHAL_HEVC_FEI_P_MBENC_END
};
//!
//! \enum HEVC_BRC_FRAME_TYPE
//! \brief HEVC BRC frame type
//!
enum HEVC_BRC_FRAME_TYPE
{
HEVC_BRC_FRAME_TYPE_P_OR_LB = 0,
HEVC_BRC_FRAME_TYPE_B = 1,
HEVC_BRC_FRAME_TYPE_I = 2,
HEVC_BRC_FRAME_TYPE_B1 = 3,
HEVC_BRC_FRAME_TYPE_B2 = 4,
HEVC_BRC_FRAME_TYPE_INVALID
};
//!
//! \enum HEVC_ME_DIST_TYPE
//! \brief HEVC me dist type
//!
enum HEVC_ME_DIST_TYPE
{
HEVC_ME_DIST_TYPE_INTRA = 0,
HEVC_ME_DIST_TYPE_INTRA_BRC_DIST,
HEVC_ME_DIST_TYPE_INTER_BRC_DIST
};
//!
//! \enum CODECHAL_ENCODE_HEVC_MULTIPRED
//! \brief Codechal encode HEVC multipred
//!
enum CODECHAL_ENCODE_HEVC_MULTIPRED
{
CODECHAL_ENCODE_HEVC_MULTIPRED_ENABLE = 0x01,
CODECHAL_ENCODE_HEVC_MULTIPRED_DISABLE = 0x80
} ;
//!
//! \struct CODECHAL_ENCODE_HEVC_SLICE_MAP
//! \brief Codechal encode HEVC slice map
//!
struct CODECHAL_ENCODE_HEVC_SLICE_MAP
{
uint8_t ucSliceID;
uint8_t Reserved[3];
};
using PCODECHAL_ENCODE_HEVC_SLICE_MAP = CODECHAL_ENCODE_HEVC_SLICE_MAP*;
//!
//! \struct CODECHAL_ENCODE_HEVC_WALKING_CONTROL_REGION
//! \brief Codechal encode HEVC walking control region
//!
struct CODECHAL_ENCODE_HEVC_WALKING_CONTROL_REGION
{
uint16_t Reserve0[2];
uint16_t StartYCurrentSlice;
uint16_t StartYNextSlice;
uint16_t Xoffset;
uint16_t Reserve1[2];
uint16_t Yoffset;
uint32_t Reserve2[4];
uint32_t alignment[8];
};
using PCODECHAL_ENCODE_HEVC_WALKING_CONTROL_REGION = CODECHAL_ENCODE_HEVC_WALKING_CONTROL_REGION*;
//!
//! \struct CODECHAL_ENCODE_HEVC_REFFRAME_SYNC_OBJ
//! \brief Codechal encode HEVC reference frame sync object
//!
struct CODECHAL_ENCODE_HEVC_REFFRAME_SYNC_OBJ
{
uint32_t uiSemaphoreObjCount;
MOS_RESOURCE resSyncObject;
bool bInUsed;
CODECHAL_ENCODE_BUFFER resSemaphoreMem;
};
using PCODECHAL_ENCODE_HEVC_REFFRAME_SYNC_OBJ = CODECHAL_ENCODE_HEVC_REFFRAME_SYNC_OBJ*;
C_ASSERT((sizeof(CODECHAL_ENCODE_HEVC_WALKING_CONTROL_REGION)) == 64);
//!
//! \struct CODECHAL_ENCODE_HEVC_WALKINGPATTERN_PARAM
//! \brief Codechal encode HEVC walking pattern parameter
//!
struct CODECHAL_ENCODE_HEVC_WALKINGPATTERN_PARAM
{
// Media Walker setting
MHW_WALKER_PARAMS MediaWalker;
MHW_VFE_SCOREBOARD ScoreBoard;
int Offset_Y;
int Offset_Delta;
uint32_t dwNumRegion;
uint32_t dwMaxHeightInRegion;
uint32_t dwNumUnitsInRegion;
};
using PCODECHAL_ENCODE_HEVC_WALKINGPATTERN_PARAM = CODECHAL_ENCODE_HEVC_WALKINGPATTERN_PARAM*;
//!
//! \struct HEVC_TILE_STATS_INFO
//! \brief HEVC tiles states info
//!
struct HEVC_TILE_STATS_INFO
{
uint32_t uiTileSizeRecord;
uint32_t uiHevcPakStatistics;
uint32_t uiVdencStatistics;
uint32_t uiHevcSliceStreamout;
};
using PHEVC_TILE_STATS_INFO = HEVC_TILE_STATS_INFO*;
//!
//! \struct CODECHAL_ENCODE_HEVC_PAK_STATS_BUFFER
//! \brief Codechal encode HEVC PAK States buffer
//!
struct CODECHAL_ENCODE_HEVC_PAK_STATS_BUFFER
{
uint32_t HCP_BITSTREAM_BYTECOUNT_FRAME;
uint32_t HCP_BITSTREAM_BYTECOUNT_FRAME_NOHEADER;
uint32_t HCP_IMAGE_STATUS_CONTROL;
uint32_t Reserved0;
uint32_t HCP_IMAGE_STATUS_CONTROL_FOR_LAST_PASS;
uint32_t Reserved1[3];
};
//!
//! \enum CODECHAL_HEVC_MBENC_KRNIDX
//! \brief Codechal HEVC MBENC KRNIDX
//!
enum CODECHAL_HEVC_MBENC_KRNIDX
{
CODECHAL_HEVC_MBENC_2xSCALING = 0,
CODECHAL_HEVC_MBENC_32x32MD,
CODECHAL_HEVC_MBENC_16x16SAD,
CODECHAL_HEVC_MBENC_16x16MD,
CODECHAL_HEVC_MBENC_8x8PU,
CODECHAL_HEVC_MBENC_8x8FMODE,
CODECHAL_HEVC_MBENC_32x32INTRACHECK,
CODECHAL_HEVC_MBENC_BENC,
CODECHAL_HEVC_MBENC_BPAK,
CODECHAL_HEVC_MBENC_ADV,
CODECHAL_HEVC_MBENC_NUM,
CODECHAL_HEVC_MBENC_DS_COMBINED = CODECHAL_HEVC_MBENC_NUM, //this will be added for 10 bit for KBL
CODECHAL_HEVC_MBENC_NUM_KBL,
CODECHAL_HEVC_MBENC_PENC = CODECHAL_HEVC_MBENC_NUM_KBL,
CODECHAL_HEVC_MBENC_ADV_P,
CODECHAL_HEVC_MBENC_NUM_BXT_SKL //Only BXT and SKL support HEVC P frame
};
//!
//! \enum CODECHAL_HEVC_FEI_MBENC_KRNIDX
//! \brief Codechal HEVC FEI MBENC KRNIDX
//!
enum CODECHAL_HEVC_FEI_MBENC_KRNIDX
{
CODECHAL_HEVC_FEI_MBENC_BENC = CODECHAL_HEVC_MBENC_BENC,
CODECHAL_HEVC_FEI_MBENC_BPAK,
CODECHAL_HEVC_FEI_MBENC_NUM,
CODECHAL_HEVC_FEI_MBENC_DS_COMBINED = CODECHAL_HEVC_FEI_MBENC_NUM, //this will be added for 10 bit for KBL
CODECHAL_HEVC_FEI_MBENC_NUM_KBL,
CODECHAL_HEVC_FEI_MBENC_PENC = CODECHAL_HEVC_FEI_MBENC_NUM_KBL,
CODECHAL_HEVC_FEI_MBENC_NUM_BXT_SKL //Only BXT and SKL support HEVC P frame
} ;
//!
//! \enum CODECHAL_HEVC_BRC_KRNIDX
//! \brief Codechal HEVC BRC KRNIDX
//!
enum CODECHAL_HEVC_BRC_KRNIDX
{
CODECHAL_HEVC_BRC_COARSE_INTRA = 0,
CODECHAL_HEVC_BRC_INIT,
CODECHAL_HEVC_BRC_RESET,
CODECHAL_HEVC_BRC_FRAME_UPDATE,
CODECHAL_HEVC_BRC_LCU_UPDATE,
CODECHAL_HEVC_BRC_NUM
};
//! \class CodechalEncodeHevcBase
//! \brief HEVC encoder base class
//! \details This class defines the base class for HEVC encoder, it includes
//! common member fields, functions, interfaces etc shared by both dual-pipe and VDEnc for all Gens.
//!
//! To create a HEVC encoder instance, client needs to call CodechalEncodeHevcBase::CreateHevcState()
//!
class CodechalEncodeHevcBase : public CodechalEncoderState
{
public:
static constexpr uint32_t MAX_LCU_SIZE = 64; //!< Max LCU size 64
static constexpr uint32_t QP_NUM = 52; //!< Number of QP values
static const uint8_t TransformSkipCoeffsTable[4][2][2][2][2]; //!< Transform skip related coeff table
static const uint16_t TransformSkipLambdaTable[QP_NUM]; //!< Transform skip related lambda table
static const uint8_t CC_BYPASS = 0x0; //!< MFX Video Copy Mode
static const uint8_t CC_LIST_MODE = 0x1; //!< MFX Video CP Copy Mode
//! HEVC encoder slice type enum
enum
{
CODECHAL_ENCODE_HEVC_B_SLICE = 0,
CODECHAL_ENCODE_HEVC_P_SLICE = 1,
CODECHAL_ENCODE_HEVC_I_SLICE = 2,
CODECHAL_ENCODE_HEVC_NUM_SLICE_TYPES = 3
};
// Parameters passed from application
PCODEC_HEVC_ENCODE_PICTURE_PARAMS m_hevcPicParams = nullptr; //!< Pointer to picture parameter
PCODEC_HEVC_ENCODE_SEQUENCE_PARAMS m_hevcSeqParams = nullptr; //!< Pointer to sequence parameter
PCODEC_HEVC_ENCODE_SLICE_PARAMS m_hevcSliceParams = nullptr; //!< Pointer to slice parameter
CodecEncodeHevcFeiPicParams * m_hevcFeiPicParams = nullptr; //!< Pointer to FEI picture parameter
PCODECHAL_HEVC_IQ_MATRIX_PARAMS m_hevcIqMatrixParams = nullptr; //!< Pointer to IQ matrix parameter
uint32_t m_widthAlignedMaxLcu = 0; //!< Picture width aligned in max LCU size
uint32_t m_heightAlignedMaxLcu = 0; //!< Picture height aligned in max LCU size
// PAK resources
MOS_RESOURCE m_resDeblockingFilterRowStoreScratchBuffer; //!< Deblocking filter row store scratch data buffer
MOS_RESOURCE m_resDeblockingFilterTileRowStoreScratchBuffer; //!< Deblocking filter tile row store Scratch data buffer
MOS_RESOURCE m_resDeblockingFilterColumnRowStoreScratchBuffer; //!< Deblocking filter column row Store scratch data buffer
MOS_RESOURCE m_resMetadataLineBuffer; //!< Metadata line data buffer
MOS_RESOURCE m_resMetadataTileLineBuffer; //!< Metadata tile line data buffer
MOS_RESOURCE m_resMetadataTileColumnBuffer; //!< Metadata tile column data buffer
MOS_RESOURCE m_resSaoLineBuffer; //!< SAO line data buffer
MOS_RESOURCE m_resSaoTileLineBuffer; //!< SAO tile line data buffer
MOS_RESOURCE m_resSaoTileColumnBuffer; //!< SAO tile column data buffer
MOS_RESOURCE m_resLcuBaseAddressBuffer; //!< LCU base address buffer
MOS_RESOURCE m_resLcuIldbStreamOutBuffer; //!< LCU ILDB streamout buffer
MOS_RESOURCE m_resSaoStreamOutBuffer; //!< SAO streamout buffer
MOS_RESOURCE m_resFrameStatStreamOutBuffer; //!< Frame statistics streamout buffer
MOS_RESOURCE m_resSseSrcPixelRowStoreBuffer; //!< SSE src pixel row store buffer
MHW_BATCH_BUFFER m_batchBufferForPakSlices[CODECHAL_HEVC_NUM_PAK_SLICE_BATCH_BUFFERS]; //!< Batch buffer for pak slice commands
uint32_t m_currPakSliceIdx = 0; //!< Current pak slice index
bool m_useBatchBufferForPakSlices = false; //!< Flag to indicate if batch buffer is used for PAK slice level commands
uint32_t m_batchBufferForPakSlicesStartOffset = 0; //!< Pak slice command start offset within batch buffer
uint32_t m_defaultPictureStatesSize = 0; //!< Picture state command size
uint32_t m_defaultPicturePatchListSize = 0; //!< Picture state patch list size
uint32_t m_defaultSliceStatesSize = 0; //!< Slice state command size
uint32_t m_defaultSlicePatchListSize = 0; //!< Slice state patch list size
unsigned char m_uc2NdSaoPass = 0; //!< Second SAO pass number
bool m_b2NdSaoPassNeeded = false; //!< Second SAO pass enable flag
CODECHAL_ENCODE_HEVC_REFFRAME_SYNC_OBJ m_refSync[CODEC_NUM_TRACKED_BUFFERS]; //!< Reference frame sync object
PCODECHAL_ENCODE_HEVC_REFFRAME_SYNC_OBJ m_currRefSync = nullptr; //!< Pointer to current frame sync object
unsigned char m_lastMbCodeIndex = 0; //!< Used in the non-parallel BRC to check if the previous PAK is ready
unsigned char m_currMinus2MbCodeIndex = 0; //!< Used in the parallel BRC to check if the (N-2)th PAK is ready, where N is the frame number
int8_t m_refIdxMapping[CODEC_MAX_NUM_REF_FRAME_HEVC]; //!< Reference frame index mapping
bool m_lowDelay = false; //!< Low delay flag
bool m_sameRefList = false; //!< Flag to specify if ref list L0 and L1 are same
bool m_isMaxLcu64 = false; //!< Flag to specify if max LCU size is 64
uint32_t m_sizeOfMvTemporalBuffer = 0; //!< MV temporal buffer size
bool m_encode4KSequence = false; //!< Flag to specify if input sequence is 4k size
bool m_encode16KSequence = false; //!< Flag to specify if input sequence is 16k size
bool m_hevcRdoqEnabled = false; //!< RDOQ enable flag
uint32_t m_rdoqIntraTuThreshold = 0; //!< RDOQ intra threshold
bool m_hevcIFrameRdoqEnabled = true; //!< Control intra frame RDOQ enable/disable
#if (_DEBUG || _RELEASE_INTERNAL)
bool m_rdoqIntraTuOverride = false; //!< Override RDOQ intra TU or not
bool m_rdoqIntraTuDisableOverride = false; //!< Override RDOQ intra TU disable
uint16_t m_rdoqIntraTuThresholdOverride = 0; //!< Override RDOQ intra TU threshold
#endif
bool m_is10BitHevc = false; //!< 10bit encoding flag
unsigned char m_chromaFormat = HCP_CHROMA_FORMAT_YUV420; //!< Chroma format(420, 422 etc)
unsigned char m_bitDepth = 8; //!< Bit depth
uint32_t m_maxNumSlicesSupported = CODECHAL_HEVC_MAX_NUM_SLICES_LVL_5; //!< Maximal number of slices supported
uint32_t m_sizeOfSseSrcPixelRowStoreBufferPerLcu = 0; //!< Size of SSE row store buffer per LCU
uint32_t m_sizeOfHcpPakFrameStats = 0; //!> Size of HEVC PAK frame statistics
uint8_t m_roundingInter = 4; // the value is from prototype
uint8_t m_roundingIntra = 10; // the value is from prototype
bool m_currUsedRefPic[CODEC_MAX_NUM_REF_FRAME_HEVC]; //!< Reference picture usage array
CODEC_PIC_ID m_picIdx[CODEC_MAX_NUM_REF_FRAME_HEVC]; //!< Reference picture index array
PCODEC_REF_LIST m_refList[CODECHAL_NUM_UNCOMPRESSED_SURFACE_HEVC]; //!< Pointer to reference pictures
PCODECHAL_NAL_UNIT_PARAMS *m_nalUnitParams = nullptr; //!< Pointer to NAL unit parameters
bool m_enable26WalkingPattern = false; //!< 26 walking pattern enable flag
// ME
bool m_hmeEnabled = false; //!< HME enable flag
bool m_b16XMeEnabled = false; //!< 16xME enable flag
bool m_b32XMeEnabled = false; //!< 32xME enable flag
MOS_SURFACE m_s4XMeMvDataBuffer; //!< 4xME mv data buffer
MOS_SURFACE m_s16XMeMvDataBuffer; //!< 16xME mv data buffer
MOS_SURFACE m_s32XMeMvDataBuffer; //!< 32xME mv data buffer
MOS_SURFACE m_s4XMeDistortionBuffer; //!< 4xME distortion buffer
bool m_brcDistortionBufferSupported = false; //!< Brc distorion supported flag
bool m_b4XMeDistortionBufferSupported = false; //!< 4xME distorion supported flag
uint8_t * m_bmeMethodTable = nullptr; //!< Pointer for ME method table based on TargetUsage
uint8_t * m_meMethodTable = nullptr; //!< Pointer for ME method table based on TargetUsage
// BRC
uint16_t m_usAvbrAccuracy = 0; //!< AVBR accuracy
uint16_t m_usAvbrConvergence = 0; //!< AVBR convergence
double m_dBrcInitCurrentTargetBufFullInBits = 0.0; //!< Initial value of target buffer fullness in bits
double m_dBrcInitResetInputBitsPerFrame = 0.0; //!< Input bits per frame
uint32_t m_brcInitResetBufSizeInBits = 0; //!< Target buffer size in bits
uint32_t m_hevcBrcPakStatisticsSize = 0; //!< BRC PAK statistics size
bool m_brcEnabled = false; //!< BRC enable flag
bool m_lcuBrcEnabled = false; //!< LCU BRC enable flag
bool m_brcInit = true; //!< BRC init flag
bool m_brcReset = false; //!< BRC reset flag
bool m_brcRoiEnabled = false; //!< BRC Roi flag
bool m_roiValueInDeltaQp = true; //!< ROI Value in deltaQP or priority flag
CODECHAL_ENCODE_BUFFER m_resPakcuLevelStreamoutData; //!< PAK LCU level stream out data buffer
// Mb Qp Data
bool m_mbQpDataEnabled = false; //!< Mb Qp Data Enable Flag.
MOS_SURFACE m_mbQpDataSurface; //!< Pointer to MOS_SURFACE of Mb Qp data surface, provided by DDI.
protected:
//!
//! \brief Constructor
//!
CodechalEncodeHevcBase(CodechalHwInterface* hwInterface,
CodechalDebugInterface* debugInterface,
PCODECHAL_STANDARD_INFO standardInfo);
uint8_t* m_kernelBinary = nullptr; //!< Pointer to the kernel binary
uint32_t m_combinedKernelSize = 0; //!< Combined kernel binary size
PMHW_VDBOX_HEVC_SLICE_STATE m_sliceStateParams = nullptr; //!< Slice state parameters
PMHW_VDBOX_PIPE_MODE_SELECT_PARAMS m_pipeModeSelectParams = nullptr; //!< Pipe mode select parameters
PMHW_VDBOX_PIPE_BUF_ADDR_PARAMS m_pipeBufAddrParams = nullptr; //!< Pipe buffer addr parameters
public:
//!
//! \brief Destructor
//!
virtual ~CodechalEncodeHevcBase() {};
//!
//! \brief Help function to check if the rate control method is BRC
//!
//! \param [in] rc
//! Rate control method
//!
//! \return True if using BRC , else return false
//!
bool IsRateControlBrc(uint8_t rc)
{
return (rc == RATECONTROL_CBR) ||
(rc == RATECONTROL_VBR) ||
(rc == RATECONTROL_AVBR) ||
(rc == RATECONTROL_VCM) ||
(rc == RATECONTROL_ICQ) ||
(rc == RATECONTROL_QVBR);
}
//!
//! \brief Help function to calculate the slice QP
//!
//! \return Slice QP value
//!
int CalSliceQp()
{
CODECHAL_ENCODE_ASSERT(m_hevcSliceParams);
CODECHAL_ENCODE_ASSERT(m_hevcPicParams);
int qp = m_hevcSliceParams->slice_qp_delta + m_hevcPicParams->QpY;
CODECHAL_ENCODE_ASSERT(qp >= 0 && qp < QP_NUM);
return qp;
}
//!
//! \brief Help function to get current PAK pass
//!
//! \return Current PAK pass
//!
virtual int GetCurrentPass()
{
return m_currPass;
}
//!
//! \brief Help function to check if current PAK pass is first pass
//!
//! \return True if current PAK pass is first pass, otherwise return false
//!
virtual bool IsFirstPass()
{
return GetCurrentPass() == 0 ? true : false;
}
//!
//! \brief Help function to check if current PAK pass is last pass
//!
//! \return True if current PAK pass is last pass, otherwise return false
//!
virtual bool IsLastPass()
{
return GetCurrentPass() == m_numPasses ? true : false;
}
//!
//! \brief Help function to check if legacy command buffer is used
//!
//! \return True if using legacy command buffer, otherwise return false
//!
bool UseRenderCommandBuffer()
{
return (m_osInterface->pfnGetGpuContext(m_osInterface) == m_renderContext);
}
//!
//! \brief Help function to retrieve a command buffer
//!
//! \param [in, out] cmdBuffer
//! Pointer to command buffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS GetCommandBuffer(PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Help function to return a command buffer
//!
//! \param [in] cmdBuffer
//! Pointer to command buffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS ReturnCommandBuffer(PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Help function to submit a command buffer
//!
//! \param [in] cmdBuffer
//! Pointer to command buffer
//! \param [in] nullRendering
//! Null rendering flag
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SubmitCommandBuffer(
PMOS_COMMAND_BUFFER cmdBuffer,
bool nullRendering);
//!
//! \brief Help function to verify command buffer size
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS VerifyCommandBufferSize();
//!
//! \brief Help function to send prolog with frame tracking information
//!
//! \param [in] cmdBuffer
//! Pointer to command buffer
//! \param [in] frameTrackingRequested
//! True if frame tracking info is needed, false otherwise
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SendPrologWithFrameTracking(
PMOS_COMMAND_BUFFER cmdBuffer,
bool frameTrackingRequested,
MHW_MI_MMIOREGISTERS *mmioRegister = nullptr);
//!
//! \brief Wait for dependent VDBOX to get ready
//!
//! \param [in] cmdBuffer
//! Pointer to command buffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS WaitForVDBOX(PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Add MI_SEMAPHORE_WAIT command in command buffer
//!
//! \param [in] semaphoreMem
//! Pointer to semaphore resource
//! \param [in] cmdBuffer
//! Pointer to command buffer
//! \param [in] semValue
//! Value to wait on semaphore memory
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SendHWWaitCommand(
PMOS_RESOURCE semaphoreMem,
PMOS_COMMAND_BUFFER cmdBuffer,
uint32_t semValue);
//!
//! \brief Send MI atomic command
//!
//! \param [in] semaMem
//! Pointer to semaphore resource
//! \param [in] ImmData
//! immediate data for atomic operation
//! \param [in] opCode
//! enum value of MHW_COMMON_MI_ATOMIC_OPCODE
//! \param [in] cmdBuffer
//! Pointer to command buffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SendMIAtomicCmd(
PMOS_RESOURCE semaMem,
uint32_t ImmData,
MHW_COMMON_MI_ATOMIC_OPCODE opCode,
PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Store data to semaphore memory
//!
//! \param [in] semaphoreMem
//! Pointer to semaphore resource
//! \param [in] cmdBuffer
//! Pointer to command buffer
//! \param [in] value
//! Value to store in semaphore memory
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetSemaphoreMem(
PMOS_RESOURCE semaphoreMem,
PMOS_COMMAND_BUFFER cmdBuffer,
uint32_t value);
//!
//! \brief Allocate resources for encoder instance
//! \details It is invoked when initializing encoder instance and it would call #AllocateEncResources(), #AllocateBrcResources(),
//! #AllocatePakResources() and #InitSurfaceInfoTable()
//!
//! \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 Help function to allocate a 1D buffer
//!
//! \param [in,out] buffer
//! Pointer to allocated buffer
//! \param [in] size
//! Buffer size
//! \param [in] name
//! Buffer name
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateBuffer(
PCODECHAL_ENCODE_BUFFER buffer,
uint32_t size,
const char* name,
int32_t dwMemType = 0);
//!
//! \brief Help function to allocate a generic 2D surface
//!
//! \param [in,out] surface
//! Pointer to allocated surface
//! \param [in] width
//! Surface width
//! \param [in] height
//! Surface height
//! \param [in] name
//! Surface name
//! \param [in] tileType
//! Tile type
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateBuffer2D(
PMOS_SURFACE surface,
uint32_t width,
uint32_t height,
const char* name,
MOS_TILE_TYPE tileType = MOS_TILE_LINEAR,
int32_t dwMemType = 0);
//!
//! \brief Help function to allocate a NV12 TILE_Y surface
//!
//! \param [in,out] surface
//! Pointer to allocated surface
//! \param [in] width
//! Surface width
//! \param [in] height
//! Surface height
//! \param [in] name
//! Surface name
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateSurface(
PMOS_SURFACE surface,
uint32_t width,
uint32_t height,
const char* name,
int32_t dwMemType = 0);
//!
//! \brief Help function to allocate PAK slice level batch buffers
//!
//! \param [in] numSlices
//! Number of slices
//! \param [in] numPakPasses
//! Number of PAK passes
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateBatchBufferForPakSlices(
uint32_t numSlices,
unsigned char numPakPasses);
//! \brief Calculates the PSNR values for luma/ chroma
//!
//! \param [in, out] encodeStatus
//! Pointer to encoder status
//! \param [in, out] encodeStatusReport
//! Pointer to encoder status report
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS CalculatePSNR(
EncodeStatus *encodeStatus,
EncodeStatusReport *encodeStatusReport);
//! \brief Copy sum square error for luma/ chroma channel from
//! frame statistics report into encodeStatus buffer
//!
//! \param [in, out] cmdBuffer
//! Pointer to command buffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS ReadSseStatistics(PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Help function to release PAK slice level batch buffers
//!
//! \param [in] index
//! Index of batch buffer to be released
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS ReleaseBatchBufferForPakSlices(uint32_t index);
//!
//! \brief Help function to get the MaxMBPS for speicifc level Id
//!
//! \param [in] levelIdc
//! HEVC level Id
//! \param [in] maxMBPS
//! Max MBPS
//! \param [in] maxBytePerPic
//! Max byte per picture
//!
//! \return MaxMBPS(max number of MB per second) for input level Id
//!
MOS_STATUS GetMaxMBPS(uint32_t levelIdc, uint32_t* maxMBPS, uint64_t* maxBytePerPic);
//!
//! \brief Help function to calcuate max frame size corresponding to the input profile/level
//!
//! \return Max frame size in bytes
//!
uint32_t GetProfileLevelMaxFrameSize();
//!
//! \brief Help function to create a flat scaling list (when scaling list is not passed in sequence parameter)
//!
//! \return void
//!
void CreateFlatScalingList();
//!
//! \brief Help function to create a default scaling list (when scaling list data is not presented in picture parameter)
//!
//! \return void
//!
void CreateDefaultScalingList();
//!
//! \brief Validate low delay mode for B frame
//!
//! \param [in] slcParams
//! Pointer to slice parameter
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS ValidateLowDelayBFrame(PCODEC_HEVC_ENCODE_SLICE_PARAMS slcParams);
//!
//! \brief Validate if reference list L0 and L1 are same
//!
//! \param [in] slcParams
//! Pointer to slice parameter
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS ValidateSameRefInL0L1(PCODEC_HEVC_ENCODE_SLICE_PARAMS slcParams);
//!
//! \brief Verify slice SAO state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS VerifySliceSAOState();
//!
//! \brief Update recon surface to Variant format for 422 10-bit
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS UpdateYUY2SurfaceInfo(
PMOS_SURFACE surface,
bool is10Bit);
//!
//! \brief Check if the color format of the surface is supported
//!
//! \details If the color format is not supported, and the Codec/Gen supports color space conversion feature
// then Csc+Ds+Conversion kernel will be called to convert raw surface to supported color format
//!
//! \param [in] surface
//! pointer to surface
//!
//! \return bool
//! true if the color format is supported, false otherwise
//!
virtual bool CheckSupportedFormat(PMOS_SURFACE surface) { return true; }
//!
//! \brief Initialize encoder instance with the provided settings
//! \details When derived class overwrite this function to do its own initialization,
// it should call #CodechalEncodeHevcBase::Initialize() first
// to do common initializations
//!
//! \param [in] settings
//! Encoder settings
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS Initialize(CodechalSetting * settings);
//!
//! \brief Initialize surface info
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitSurfaceInfoTable()
{
return MOS_STATUS_SUCCESS;
}
//!
//! \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
//!
virtual 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
//!
virtual MOS_STATUS SetPictureStructs();
//!
//! \brief Calculate maximum bitsize allowed for LCU
//! \details Calculate LCU max coding size according to log2_max_coding_block_size_minus3
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS CalcLCUMaxCodingSize();
//!
//! \brief Setup/configure encoder based on slice parameter set
//! \details It is invoked for every picture and and it would set up and configure the
// encoder state that used for current picture and slices
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetSliceStructs();
//!
//! \brief Calculate transform skip parameters
//!
//! \param [in, out] params
//! Transform skip parameters
//!
//! \return void
//!
virtual void CalcTransformSkipParameters(MHW_VDBOX_ENCODE_HEVC_TRANSFORM_SKIP_PARAMS& params);
//!
//! \brief Retreive image status information
//!
//! \param [in] cmdBuffer
//! Pointer to command buffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS ReadImageStatus(PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Retreive HCP status
//!
//! \param [in] cmdBuffer
//! Pointer to command buffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS ReadHcpStatus(PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Retreive BRC Pak statistics
//!
//! \param [in] cmdBuffer
//! Pointer to command buffer
//! \param [in] params
//! BRC pak statistics parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS ReadBrcPakStatistics(
PMOS_COMMAND_BUFFER cmdBuffer,
EncodeReadBrcPakStatsParams* params);
//!
//! \brief Get encoder status report
//!
//! \param [in, out] encodeStatus
//! Pointer to encoder status
//! \param [in, out] encodeStatusReport
//! Pointer to encoder status report
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS GetStatusReport(
EncodeStatus *encodeStatus,
EncodeStatusReport *encodeStatusReport);
//!
//! \brief User Feature key report
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS UserFeatureKeyReport();
//!
//! \brief Initialize encoder at picture level
//!
//! \param [in] params
//! Picture encoding parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitializePicture(const EncoderParams& params);
//!
//! \brief Perform platform capability check
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS PlatformCapabilityCheck()
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Set batch buffer for PAK slices
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetBatchBufferForPakSlices();
// HCP/PAK functions
//!
//! \brief Set HCP_PIPE_MODE_SELECT parameters
//!
//! \param [in, out] pipeModeSelectParams
//! HCP_PIPE_MODE_SELECT parameters
//!
//! \return void
//!
virtual void SetHcpPipeModeSelectParams(MHW_VDBOX_PIPE_MODE_SELECT_PARAMS& pipeModeSelectParams);
//!
//! \brief Set HCP_SURFACE_PARAMS for source picture
//!
//! \param [in, out] srcSurfaceParams
//! HCP_SURFACE_PARAMS for source picture
//!
//! \return void
//!
virtual void SetHcpSrcSurfaceParams(MHW_VDBOX_SURFACE_PARAMS& srcSurfaceParams);
//!
//! \brief Set HCP_SURFACE_PARAMS for recon picture
//!
//! \param [in, out] reconSurfaceParams
//! HCP_SURFACE_PARAMS for recon picture
//!
//! \return void
//!
virtual void SetHcpReconSurfaceParams(MHW_VDBOX_SURFACE_PARAMS& reconSurfaceParams);
//!
//! \brief Set HCP_PIPE_BUF_ADDR parameters
//!
//! \param [in, out] pipeBufAddrParams
//! HCP_PIPE_BUF_ADDR parameters
//!
//! \return void
//!
virtual void SetHcpPipeBufAddrParams(MHW_VDBOX_PIPE_BUF_ADDR_PARAMS& pipeBufAddrParams);
//!
//! \brief Set HCP_IND_OBJ_BASE_ADDR parameters
//!
//! \param [in, out] indObjBaseAddrParams
//! HCP_IND_OBJ_BASE_ADDR parameters
//!
//! \return void
//!
virtual void SetHcpIndObjBaseAddrParams(MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS& indObjBaseAddrParams);
//!
//! \brief Set HCP_QM_STATE and HCP_FQM_STATE parameters
//!
//! \param [in, out] fqmParams
//! HCP_FQM_STATE parameters
//! \param [in, out] qmParams
//! HCP_QM_STATE parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual void SetHcpQmStateParams(MHW_VDBOX_QM_PARAMS& fqmParams, MHW_VDBOX_QM_PARAMS& qmParams);
//!
//! \brief Set HCP_PIC_STATE parameters
//!
//! \param [in, out] picStateParams
//! HCP_PIC_STATE parameters
//!
//! \return void
//!
virtual void SetHcpPicStateParams(MHW_VDBOX_HEVC_PIC_STATE& picStateParams);
//!
//! \brief Set HCP_SLICE_STATE parameters shared by all slices
//!
//! \param [in, out] sliceStateParams
//! HCP_SLICE_STATE parameters
//!
//! \return void
//!
virtual void SetHcpSliceStateCommonParams(MHW_VDBOX_HEVC_SLICE_STATE& sliceStateParams);
//!
//! \brief Create HCP_SLICE_STATE parameters shared by all slices
//!
//! \return void
//!
virtual void CreateMhwParams();
//!
//! \brief Set HCP_SLICE_STATE parameters that are different at slice level
//!
//! \param [in, out] sliceStateParams
//! HCP_SLICE_STATE parameters
//! \param [in] slcData
//! Pointer to CODEC_ENCODE_SLCDATA
//! \param [in] currSlcIdx
//! Current slice index
//!
//! \return void
//!
virtual void SetHcpSliceStateParams(
MHW_VDBOX_HEVC_SLICE_STATE& sliceStateParams,
PCODEC_ENCODER_SLCDATA slcData,
uint32_t currSlcIdx);
//!
//! \brief Add HCP_REF_IDX command to command buffer or batch buffer
//!
//! \param [in, out] cmdBuffer
//! Pointer to the command buffer
//! \param [in, out] batchBuffer
//! Pointer to the batch buffer
//! \param [in] params
//! Pointer to MHW_VDBOX_HEVC_SLICE_STATE parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpRefIdxCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_HEVC_SLICE_STATE params);
//!
//! \brief Add HCP_PAK_INSERT_OBJECT commands for NALUs to command buffer or batch buffer
//! \details This function would add multiple HCP_PAK_INSERT_OBJECT, one of each NALU
//!
//! \param [in, out] cmdBuffer
//! Pointer to the command buffer
//! \param [in, out] batchBuffer
//! Pointer to the batch buffer
//! \param [in] params
//! Pointer to MHW_VDBOX_HEVC_SLICE_STATE parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpPakInsertNALUs(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_HEVC_SLICE_STATE params);
//!
//! \brief Add HCP_PAK_INSERT_OBJECT commands for slice header to command buffer or batch buffer
//!
//! \param [in, out] cmdBuffer
//! Pointer to the command buffer
//! \param [in, out] batchBuffer
//! Pointer to the batch buffer
//! \param [in] params
//! Pointer to MHW_VDBOX_HEVC_SLICE_STATE parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpPakInsertSliceHeader(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_HEVC_SLICE_STATE params);
//! \brief Initialize kernel state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitKernelState() = 0;
//!
//! \brief Get max binding table count required
//!
//! \return Value of max binding table count
//!
virtual uint32_t GetMaxBtCount() = 0;
//!
//! \brief Allocate resources for PAK
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AllocatePakResources();
//!
//! \brief Free PAK resources
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS FreePakResources();
//!
//! \brief Allocate resources for ENC
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AllocateEncResources() = 0;
//!
//! \brief Free ENC resources
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS FreeEncResources() = 0;
//!
//! \brief Allocate BRC resources
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AllocateBrcResources() = 0;
//!
//! \brief Free BRC resources
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS FreeBrcResources() = 0;
//!
//! \brief Calculate down scaled dimensions
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS CalcScaledDimensions() = 0;
//!
//! \brief Validate ref frame data
//!
//! \param [in] slcParams
//! Slice parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS ValidateRefFrameData(PCODEC_HEVC_ENCODE_SLICE_PARAMS slcParams) = 0;
//!
//! \brief Encode kernel functions
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS EncodeKernelFunctions() = 0;
//!
//! \brief Execute kernel functions
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS ExecuteKernelFunctions();
//!
//! \brief Encode command at picture level
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS ExecutePictureLevel() = 0;
//!
//! \brief Encode command at slice level
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS ExecuteSliceLevel() = 0;
//!
//! \brief Calculate picture state command size
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS CalculatePictureStateCommandSize();
//!
//! \brief Calculate picture state command size
//!
//! \param [in, out] cmdBuffer
//! Pointer to the command buffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddHcpPipeBufAddrCmd(
PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Initialize MMC state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS InitMmcState();
//!
//! \brief Compute Temporal Different
//!
//! \return short
//! return the current picordercnt difference
//!
short ComputeTemporalDifferent(
CODEC_PICTURE refPic);
//!
//! \brief Init surface codec params 1D
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
MOS_STATUS InitSurfaceCodecParams1D(
CODECHAL_SURFACE_CODEC_PARAMS* p,
PMOS_RESOURCE buffer,
uint32_t size,
uint32_t offset,
uint32_t cacheabilityControl,
uint32_t bindingTableOffset,
bool isWritable);
//!
//! \brief Init surface codec params 2D
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
MOS_STATUS InitSurfaceCodecParams2D(
CODECHAL_SURFACE_CODEC_PARAMS* p,
PMOS_SURFACE surface,
uint32_t cacheabilityControl,
uint32_t bindingTableOffset,
uint32_t verticalLineStride,
bool isWritable);
//!
//! \brief Update the slice count according to the slice shutdown policy
//!
virtual void UpdateSSDSliceCount() { return; };
void MotionEstimationDisableCheck();
//!
//! \brief Allocate 4x ME resources
//!
//! \param [in] param
//! Pointer to parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateResources4xME(
HmeParams* param);
//!
//! \brief Allocate 16x ME resources
//!
//! \param [in] param
//! Pointer to parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateResources16xME(
HmeParams* param);
//!
//! \brief Allocate 32x ME resources
//!
//! \param [in] param
//! Pointer to parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateResources32xME(
HmeParams* param);
//!
//! \brief Destroy ME resources
//!
//! \param [in] param
//! Pointer to parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS DestroyMEResources(
HmeParams* param);
#if USE_CODECHAL_DEBUG_TOOL
MOS_STATUS DumpSeqParams(
PCODEC_HEVC_ENCODE_SEQUENCE_PARAMS seqParams);
MOS_STATUS DumpPicParams(
PCODEC_HEVC_ENCODE_PICTURE_PARAMS picParams);
MOS_STATUS DumpFeiPicParams(
CodecEncodeHevcFeiPicParams *feiPicParams);
MOS_STATUS DumpSliceParams(
PCODEC_HEVC_ENCODE_SLICE_PARAMS sliceParams,
PCODEC_HEVC_ENCODE_PICTURE_PARAMS picParams);
MOS_STATUS DumpMbEncPakOutput(PCODEC_REF_LIST currRefList, CodechalDebugInterface* debugInterface);
MOS_STATUS DumpFrameStatsBuffer(CodechalDebugInterface* debugInterface);
//!
//! \brief Create HEVC PAR
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS CreateHevcPar();
//!
//! \brief Destroy HEVC PAR
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS DestroyHevcPar();
//!
//! \brief Dump sequence PAR file
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS DumpSeqParFile() { return MOS_STATUS_SUCCESS; }
//!
//! \brief Dump frame PAR file
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS DumpFrameParFile() { return MOS_STATUS_SUCCESS; }
//!
//! \brief Populate const parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS PopulateConstParam();
//!
//! \brief Set MHW_VDBOX_AVC_IMG_STATE parameter
//!
//! \param [in] hevcSeqParams
//! pointer to HEVC encode sequence parameters
//! \param [in] hevcPicParams
//! pointer to HEVC encode picture parameters
//! \param [in] hevcSlcParams
//! pointer to HEVC encode slice parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS PopulateDdiParam(
PCODEC_HEVC_ENCODE_SEQUENCE_PARAMS hevcSeqParams,
PCODEC_HEVC_ENCODE_PICTURE_PARAMS hevcPicParams,
PCODEC_HEVC_ENCODE_SLICE_PARAMS hevcSlcParams);
//!
//! \brief Set PMHW_VDBOX_HEVC_SLICE_STATE parameter
//!
//! \param [in] adaptiveRoundingInterEnable
//! adaptive rounding inter enable flag
//! \param [in] sliceState
//! pointer to slice state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS PopulateSliceStateParam(
bool adaptiveRoundingInterEnable,
PMHW_VDBOX_HEVC_SLICE_STATE sliceState)
{
return MOS_STATUS_SUCCESS;
};
//!
//! \brief Set BRC init parameter
//!
//! \param [in] *cmd
//! pointer to command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS PopulateBrcInitParam(void *cmd)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Set BRC update parameter
//!
//! \param [in] *cmd
//! pointer to command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS PopulateBrcUpdateParam(void *cmd)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Set encode parameter
//!
//! \param [in] meMethod
//! ME method
//! \param [in] *cmd
//! pointer to command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS PopulateEncParam(
uint8_t meMethod,
void *cmd)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Set MHW_VDBOX_AVC_IMG_STATE parameter
//!
//! \param [in] cmdBuffer
//! pointer to command buffer
//! \param [in] secondLevelBatchBuffer
//! pointer to second level batch buffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS PopulatePakParam(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER secondLevelBatchBuffer) {
return MOS_STATUS_SUCCESS;
}
EncodeHevcPar *m_hevcPar = nullptr; //!< HEVC PAR parameters
#endif
};
//!
//! \brief Get bitstream buffer size
//!
//! \param [in] frameWidth
//! The width of frame
//! \param [in] frameHeight
//! The height of frame
//! \param [in] chromaFormat
//! Chroma format
//! \param [in] is10Bits
//! Check if is 10bits
//! \return uint32_t
//! Bitstream buffer size
//!
uint32_t CodecHalHevcEncode_GetBitstreamBufferSize(
uint32_t frameWidth,
uint32_t frameHeight,
uint8_t chromaFormat,
bool is10Bits);
#endif // __CODECHAL_ENCODE_HEVC_BASE_H__