blob: 269c80a48c1f07b80fcf17873b898db534575a5c [file] [log] [blame]
/*
* Copyright (c) 2017-2021, Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
//!
//! \file codechal_encode_avc_base.h
//! \brief Defines base class for AVC encoder.
//!
#ifndef __CODECHAL_ENCODE_AVC_BASE_H__
#define __CODECHAL_ENCODE_AVC_BASE_H__
#include "codechal_encoder_base.h"
#include "codechal_kernel_hme.h"
#if USE_CODECHAL_DEBUG_TOOL
#include "codechal_debug_encode_par.h"
#endif
#define CODECHAL_ENCODE_AVC_INVALID_ROUNDING 0xFF
#define CODECHAL_ENCODE_AVC_NUM_SYNC_TAGS 64
#define CODECHAL_ENCODE_AVC_INIT_DSH_SIZE MHW_PAGE_SIZE * 3
#define CODECHAL_ENCODE_AVC_MAX_SLICE_QP (CODEC_AVC_NUM_QP - 1) // 0 - 51 inclusive
#define CODECHAL_ENCODE_AVC_MIN_ICQ_QUALITYFACTOR 1
#define CODECHAL_ENCODE_AVC_MAX_ICQ_QUALITYFACTOR 51
#define CODECHAL_ENCODE_AVC_MAX_SLICES_SUPPORTED 256
#define CODECHAL_ENCODE_AVC_DEFAULT_AVBR_ACCURACY 30
#define CODECHAL_ENCODE_AVC_MIN_AVBR_CONVERGENCE 100
#define CODECHAL_ENCODE_AVC_DEFAULT_AVBR_CONVERGENCE 150
#define CODECHAL_ENCODE_AVC_REF_PIC_SELECT_ENTRIES (CODEC_AVC_MAX_NUM_REF_FRAME + 1) // one extra for current picture
// Invalid AVC PicID
#define CODECHAL_ENCODE_AVC_INVALID_PIC_ID CODEC_AVC_NUM_UNCOMPRESSED_SURFACE
#define CODECHAL_ENCODE_AVC_SFD_OUTPUT_BUFFER_SIZE_COMMON 128
#if USE_CODECHAL_DEBUG_TOOL
#define CODECHAL_DEBUG_ENCODE_AVC_NAL_START_CODE_SEI 0x00000106
#define CODECHAL_DEBUG_ENCODE_AVC_NAL_START_CODE_PPS 0x00000128
struct EncodeAvcPar
{
// DDI Params
uint8_t ProfileIDC;
uint8_t LevelIDC;
uint8_t CabacInitIDC;
uint8_t ChromaFormatIDC;
uint8_t PictureCodingType;
uint8_t MaxRefIdxL0;
uint8_t MaxRefIdxL1;
uint8_t MaxBRefIdxL0;
uint8_t BRCMethod;
uint8_t BRCType;
uint8_t DeblockingIDC;
uint8_t WeightedPred;
uint8_t WeightedBiPred;
char ChromaQpOffset;
char SecondChromaQpOffset;
char ISliceQP;
char PSliceQP;
char BSliceQP;
char DeblockingFilterAlpha;
char DeblockingFilterBeta;
bool EnableSEI;
bool DisableVUIHeader;
bool EnableWeightPredictionDetection;
bool EntropyCodingMode;
bool DirectInference;
bool Transform8x8Mode;
bool UseOrigAsRef;
bool BiSubMbPartMask;
uint16_t NumP;
uint16_t NumB;
uint16_t FrameRateM;
uint16_t FrameRateD;
uint16_t CRFQualityFactor;
uint32_t NumSlices;
uint32_t SliceHeight;
uint32_t NumSuperSlices;
uint32_t SuperSliceHeight[CODECHAL_ENCODE_AVC_MAX_SLICES_SUPPORTED];
bool ConstrainedIntraPred;
uint8_t SliceMode;
int16_t hme0XOffset;
int16_t hme0YOffset;
int16_t hme1XOffset;
int16_t hme1YOffset;
// HME Params
uint8_t SuperCombineDist;
bool SuperHME;
bool UltraHME;
bool StreamInEnable;
uint8_t StreamInL0FromNewRef;
uint8_t StreamInL1FromNewRef;
// BRC init Params
bool MBBRCEnable;
bool MBRC;
uint16_t AvbrAccuracy;
uint16_t AvbrConvergence;
uint32_t BitRate;
uint32_t InitVbvFullnessInBit;
uint32_t MaxBitRate;
uint32_t VbvSzInBit;
uint32_t SlidingWindowEnable;
uint32_t SlidingWindowSize;
uint32_t SlidingWindowMaxRateRatio;
uint32_t LowDelayGoldenFrameBoost;
uint32_t TopQPDeltaThrforAdaptive2Pass;
uint32_t BotQPDeltaThrforAdaptive2Pass;
uint32_t TopFrmSzPctThrforAdaptive2Pass;
uint32_t BotFrmSzPctThrforAdaptive2Pass;
uint32_t MBHeaderCompensation;
uint32_t QPSelectMethodforFirstPass;
bool MBQpCtrl;
bool ICQReEncode;
bool AdaptiveCostAdjustEnable;
bool AdaptiveHMEExtension;
uint32_t QPMin;
uint32_t QPMax;
bool HrdConformanceCheckDisable;
uint8_t StreamInStaticRegion;
uint8_t ScenarioInfo;
bool SliceSizeWA;
uint32_t INumMbsLag;
uint32_t PNumMbsLag;
uint32_t LongTermInterval;
// BRC frame update Params
bool EnableMultipass;
uint8_t MaxNumPakPasses;
uint32_t UserMaxFrame;
uint32_t UserMaxFrameP;
bool FrameSkipEnable;
bool SceneChgDetectEn;
uint32_t SceneChgPrevIntraPctThresh;
uint32_t SceneChgCurIntraPctThresh;
uint32_t SceneChgWidth0;
uint32_t SceneChgWidth1;
bool Transform8x8PDisable;
uint32_t SliceSizeThr;
uint32_t SliceMaxSize;
// Enc Params
uint8_t SubPelMode;
uint8_t MaxLenSP;
uint8_t MEMethod;
uint8_t BMEMethod;
uint8_t HMECombineOverlap;
uint8_t SearchX;
uint8_t SearchY;
uint8_t BSearchX;
uint8_t BSearchY;
uint8_t SearchControl;
uint8_t BSearchControl;
uint8_t BiMixDisable;
uint32_t BiWeight;
bool DisableExtendedMvCostRange;
bool EnableAdaptiveSearch;
bool EnableFBRBypass;
bool BlockBasedSkip;
bool MADEnableFlag;
bool EnableMBFlatnessCheckOptimization;
bool EnableArbitrarySliceSize;
bool EnableWavefrontOptimization;
bool BSkipType;
bool EnableAdaptiveTxDecision;
bool EnablePerMBStaticCheck;
bool EnableAdaptiveSearchWindowSize;
bool EnableIntraCostScalingForStaticFrame;
uint32_t StaticFrameZMVPercent;
uint32_t StaticFrameIntraCostScalingRatioP;
uint32_t StaticFrameIntraCostScalingRatioB;
bool AdaptiveMvStreamIn;
uint32_t LargeMvThresh;
uint32_t LargeMvPctThreshold;
bool UniMixDisable;
bool DirectMode;
uint16_t RefThresh;
uint16_t MBTextureThreshold;
uint16_t TxDecisionThr;
uint32_t MRDisableQPCheck;
uint32_t AllFractional;
uint32_t DisableAllFractionalCheckForHighRes;
uint32_t HMECombineLen;
uint32_t HMEBCombineLen;
uint32_t FTQBasedSkip;
uint32_t MultiplePred;
uint32_t EnableAdaptiveIntraScaling;
uint32_t SurvivedSkipCost;
bool VDEncPerfMode;
bool VdencExtPakObjDisable;
bool PPMVDisable;
uint8_t LeftNbrPelMode;
uint8_t DisPSubPartMask;
uint8_t DisPSubMbMask;
uint8_t DisBSubPartMask;
uint8_t DisBSubMbMask;
uint8_t ImePredOverlapThr;
uint8_t MBSizeEstScalingRatioINTRA;
bool IntraMBHdrScaleFactor;
uint8_t MBSizeEstScalingRatioINTER;
bool InterMBHdrScaleFactor;
uint8_t PFrameMaxNumImePred;
uint8_t BFrameMaxNumImePred;
uint8_t HMERefWindowSize;
uint8_t IMELeftPredDep;
uint8_t NumFMECandCheck;
uint8_t PFrameImePredLargeSW;
uint8_t BFrameImePredLargeSW;
bool RdoChromaEnable;
uint16_t Intra4x4ModeMask;
uint16_t Intra8x8ModeMask;
bool RdoIntraChromaSearch;
uint8_t Intra16x16ModeMask;
uint8_t InitMBBudgetTr4x4;
bool ROIEnable;
uint8_t PFrameZeroCbfEn;
uint8_t BFrameZeroCbfEn;
uint8_t ForceIPCMMinQP;
uint8_t IntraTr4x4Percent;
bool MultiPassHmeEnable;
uint32_t IntraPredictionIFrame;
uint32_t IntraPrediction;
// PAK Params
uint8_t RoundingIntra;
bool RoundingIntraEnabled;
bool EnableAdaptiveRounding;
bool RoundingInterEnabled;
bool EnableAdaptiveTrellisQuantization;
bool TrellisQuantizationEnable;
bool TrellisQuantizationChromaDisable;
uint32_t RoundingInter;
uint32_t RoundingInterB;
uint32_t TrellisQuantizationRounding;
uint8_t FrmHdrEncodingFrequency;
bool ExtendedRhoDomainEn;
};
#endif
static const uint8_t CodecHal_TargetUsageToMode_AVC[NUM_TARGET_USAGE_MODES] =
{ encodeNormalMode, encodeQualityMode, encodeQualityMode, encodeNormalMode,
encodeNormalMode, encodeNormalMode, encodeNormalMode, encodePerformanceMode };
typedef struct _CODEC_AVC_REF_PIC_SELECT_LIST
{
uint8_t FrameIdx;
MOS_SURFACE sBuffer;
} CODEC_AVC_REF_PIC_SELECT_LIST, *PCODEC_AVC_REF_PIC_SELECT_LIST;
typedef struct _CODECHAL_ENCODE_AVC_TQ_PARAMS
{
uint32_t dwTqEnabled;
uint32_t dwTqRounding;
} CODECHAL_ENCODE_AVC_TQ_PARAMS, *PCODECHAL_ENCODE_AVC_TQ_PARAMS;
typedef struct _CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS
{
PMOS_SURFACE psPreDeblockSurface;
PMOS_SURFACE psPostDeblockSurface;
PMOS_RESOURCE presMacroblockIldbStreamOutBuffer1;
PMOS_RESOURCE presMacroblockIldbStreamOutBuffer2;
bool bBrcEnabled;
PMHW_BATCH_BUFFER pImgStateBatchBuffer;
PMOS_RESOURCE presBrcHistoryBuffer;
bool bDeblockerStreamOutEnable;
bool bPostDeblockOutEnable;
bool bPreDeblockOutEnable;
bool bPerMBStreamOutEnable;
} CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS, *PCODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS;
typedef struct _CODECHAL_ENCODE_AVC_ME_CURBE
{
// DW0
union
{
struct
{
uint32_t SkipModeEn : MOS_BITFIELD_BIT( 0 );
uint32_t AdaptiveEn : MOS_BITFIELD_BIT( 1 );
uint32_t BiMixDis : MOS_BITFIELD_BIT( 2 );
uint32_t : MOS_BITFIELD_RANGE( 3, 4 );
uint32_t EarlyImeSuccessEn : MOS_BITFIELD_BIT( 5 );
uint32_t : MOS_BITFIELD_BIT( 6 );
uint32_t T8x8FlagForInterEn : MOS_BITFIELD_BIT( 7 );
uint32_t : MOS_BITFIELD_RANGE( 8,23 );
uint32_t EarlyImeStop : MOS_BITFIELD_RANGE( 24,31 );
};
struct
{
uint32_t Value;
};
} DW0;
// DW1
union
{
struct
{
uint32_t MaxNumMVs : MOS_BITFIELD_RANGE( 0, 5 );
uint32_t : MOS_BITFIELD_RANGE( 6,15 );
uint32_t BiWeight : MOS_BITFIELD_RANGE( 16,21 );
uint32_t : MOS_BITFIELD_RANGE( 22,27 );
uint32_t UniMixDisable : MOS_BITFIELD_BIT( 28 );
uint32_t : MOS_BITFIELD_RANGE( 29,31 );
};
struct
{
uint32_t Value;
};
} DW1;
// DW2
union
{
struct
{
uint32_t MaxLenSP : MOS_BITFIELD_RANGE( 0, 7 );
uint32_t MaxNumSU : MOS_BITFIELD_RANGE( 8,15 );
uint32_t : MOS_BITFIELD_RANGE( 16,31 );
};
struct
{
uint32_t Value;
};
} DW2;
// DW3
union
{
struct
{
uint32_t SrcSize : MOS_BITFIELD_RANGE( 0, 1 );
uint32_t : MOS_BITFIELD_RANGE( 2, 3 );
uint32_t MbTypeRemap : MOS_BITFIELD_RANGE( 4, 5 );
uint32_t SrcAccess : MOS_BITFIELD_BIT( 6 );
uint32_t RefAccess : MOS_BITFIELD_BIT( 7 );
uint32_t SearchCtrl : MOS_BITFIELD_RANGE( 8,10 );
uint32_t DualSearchPathOption : MOS_BITFIELD_BIT( 11 );
uint32_t SubPelMode : MOS_BITFIELD_RANGE( 12,13 );
uint32_t SkipType : MOS_BITFIELD_BIT( 14 );
uint32_t DisableFieldCacheAlloc : MOS_BITFIELD_BIT( 15 );
uint32_t InterChromaMode : MOS_BITFIELD_BIT( 16 );
uint32_t FTEnable : MOS_BITFIELD_BIT( 17 );
uint32_t BMEDisableFBR : MOS_BITFIELD_BIT( 18 );
uint32_t BlockBasedSkipEnable : MOS_BITFIELD_BIT( 19 );
uint32_t InterSAD : MOS_BITFIELD_RANGE( 20,21 );
uint32_t IntraSAD : MOS_BITFIELD_RANGE( 22,23 );
uint32_t SubMbPartMask : MOS_BITFIELD_RANGE( 24,30 );
uint32_t : MOS_BITFIELD_BIT( 31 );
};
struct
{
uint32_t Value;
};
} DW3;
// DW4
union
{
struct
{
uint32_t : MOS_BITFIELD_RANGE( 0, 7 );
uint32_t PictureHeightMinus1 : MOS_BITFIELD_RANGE( 8,15 );
uint32_t PictureWidth : MOS_BITFIELD_RANGE( 16,23 );
uint32_t : MOS_BITFIELD_RANGE( 24,31 );
};
struct
{
uint32_t Value;
};
} DW4;
// DW5
union
{
struct
{
uint32_t : MOS_BITFIELD_RANGE( 0, 7 );
uint32_t QpPrimeY : MOS_BITFIELD_RANGE( 8,15 );
uint32_t RefWidth : MOS_BITFIELD_RANGE( 16,23 );
uint32_t RefHeight : MOS_BITFIELD_RANGE( 24,31 );
};
struct
{
uint32_t Value;
};
} DW5;
// DW6
union
{
struct
{
uint32_t : MOS_BITFIELD_RANGE( 0, 2 );
uint32_t WriteDistortions : MOS_BITFIELD_BIT( 3 );
uint32_t UseMvFromPrevStep : MOS_BITFIELD_BIT( 4 );
uint32_t : MOS_BITFIELD_RANGE( 5, 7 );
uint32_t SuperCombineDist : MOS_BITFIELD_RANGE( 8,15 );
uint32_t MaxVmvR : MOS_BITFIELD_RANGE( 16,31 );
};
struct
{
uint32_t Value;
};
} DW6;
// DW7
union
{
struct
{
uint32_t : MOS_BITFIELD_RANGE( 0,15 );
uint32_t MVCostScaleFactor : MOS_BITFIELD_RANGE( 16,17 );
uint32_t BilinearEnable : MOS_BITFIELD_BIT( 18 );
uint32_t SrcFieldPolarity : MOS_BITFIELD_BIT( 19 );
uint32_t WeightedSADHAAR : MOS_BITFIELD_BIT( 20 );
uint32_t AConlyHAAR : MOS_BITFIELD_BIT( 21 );
uint32_t RefIDCostMode : MOS_BITFIELD_BIT( 22 );
uint32_t : MOS_BITFIELD_BIT( 23 );
uint32_t SkipCenterMask : MOS_BITFIELD_RANGE( 24,31 );
};
struct
{
uint32_t Value;
};
} DW7;
// DW8
union
{
struct
{
uint32_t Mode0Cost : MOS_BITFIELD_RANGE( 0, 7 );
uint32_t Mode1Cost : MOS_BITFIELD_RANGE( 8,15 );
uint32_t Mode2Cost : MOS_BITFIELD_RANGE( 16,23 );
uint32_t Mode3Cost : MOS_BITFIELD_RANGE( 24,31 );
};
struct
{
uint32_t Value;
};
} DW8;
// DW9
union
{
struct
{
uint32_t Mode4Cost : MOS_BITFIELD_RANGE( 0, 7 );
uint32_t Mode5Cost : MOS_BITFIELD_RANGE( 8,15 );
uint32_t Mode6Cost : MOS_BITFIELD_RANGE( 16,23 );
uint32_t Mode7Cost : MOS_BITFIELD_RANGE( 24,31 );
};
struct
{
uint32_t Value;
};
} DW9;
// DW10
union
{
struct
{
uint32_t Mode8Cost : MOS_BITFIELD_RANGE( 0, 7 );
uint32_t Mode9Cost : MOS_BITFIELD_RANGE( 8,15 );
uint32_t RefIDCost : MOS_BITFIELD_RANGE( 16,23 );
uint32_t ChromaIntraModeCost : MOS_BITFIELD_RANGE( 24,31 );
};
struct
{
uint32_t Value;
};
} DW10;
// DW11
union
{
struct
{
uint32_t MV0Cost : MOS_BITFIELD_RANGE( 0, 7 );
uint32_t MV1Cost : MOS_BITFIELD_RANGE( 8,15 );
uint32_t MV2Cost : MOS_BITFIELD_RANGE( 16,23 );
uint32_t MV3Cost : MOS_BITFIELD_RANGE( 24,31 );
};
struct
{
uint32_t Value;
};
} DW11;
// DW12
union
{
struct
{
uint32_t MV4Cost : MOS_BITFIELD_RANGE( 0, 7 );
uint32_t MV5Cost : MOS_BITFIELD_RANGE( 8,15 );
uint32_t MV6Cost : MOS_BITFIELD_RANGE( 16,23 );
uint32_t MV7Cost : MOS_BITFIELD_RANGE( 24,31 );
};
struct
{
uint32_t Value;
};
} DW12;
// DW13
union
{
struct
{
uint32_t NumRefIdxL0MinusOne : MOS_BITFIELD_RANGE( 0, 7 );
uint32_t NumRefIdxL1MinusOne : MOS_BITFIELD_RANGE( 8,15 );
uint32_t RefStreaminCost : MOS_BITFIELD_RANGE( 16,23 );
uint32_t ROIEnable : MOS_BITFIELD_RANGE( 24,26 );
uint32_t : MOS_BITFIELD_RANGE( 27,31 );
};
struct
{
uint32_t Value;
};
} DW13;
// DW14
union
{
struct
{
uint32_t List0RefID0FieldParity : MOS_BITFIELD_BIT( 0 );
uint32_t List0RefID1FieldParity : MOS_BITFIELD_BIT( 1 );
uint32_t List0RefID2FieldParity : MOS_BITFIELD_BIT( 2 );
uint32_t List0RefID3FieldParity : MOS_BITFIELD_BIT( 3 );
uint32_t List0RefID4FieldParity : MOS_BITFIELD_BIT( 4 );
uint32_t List0RefID5FieldParity : MOS_BITFIELD_BIT( 5 );
uint32_t List0RefID6FieldParity : MOS_BITFIELD_BIT( 6 );
uint32_t List0RefID7FieldParity : MOS_BITFIELD_BIT( 7 );
uint32_t List1RefID0FieldParity : MOS_BITFIELD_BIT( 8 );
uint32_t List1RefID1FieldParity : MOS_BITFIELD_BIT( 9 );
uint32_t : MOS_BITFIELD_RANGE( 10,31 );
};
struct
{
uint32_t Value;
};
} DW14;
// DW15
union
{
struct
{
uint32_t PrevMvReadPosFactor : MOS_BITFIELD_RANGE( 0, 7 );
uint32_t MvShiftFactor : MOS_BITFIELD_RANGE( 8,15 );
uint32_t Reserved : MOS_BITFIELD_RANGE( 16,31 );
};
struct
{
uint32_t Value;
};
} DW15;
struct
{
// DW16
union
{
struct
{
SearchPathDelta SPDelta_0;
SearchPathDelta SPDelta_1;
SearchPathDelta SPDelta_2;
SearchPathDelta SPDelta_3;
};
struct
{
uint32_t Value;
};
} DW16;
// DW17
union
{
struct
{
SearchPathDelta SPDelta_4;
SearchPathDelta SPDelta_5;
SearchPathDelta SPDelta_6;
SearchPathDelta SPDelta_7;
};
struct
{
uint32_t Value;
};
} DW17;
// DW18
union
{
struct
{
SearchPathDelta SPDelta_8;
SearchPathDelta SPDelta_9;
SearchPathDelta SPDelta_10;
SearchPathDelta SPDelta_11;
};
struct
{
uint32_t Value;
};
} DW18;
// DW19
union
{
struct
{
SearchPathDelta SPDelta_12;
SearchPathDelta SPDelta_13;
SearchPathDelta SPDelta_14;
SearchPathDelta SPDelta_15;
};
struct
{
uint32_t Value;
};
} DW19;
// DW20
union
{
struct
{
SearchPathDelta SPDelta_16;
SearchPathDelta SPDelta_17;
SearchPathDelta SPDelta_18;
SearchPathDelta SPDelta_19;
};
struct
{
uint32_t Value;
};
} DW20;
// DW21
union
{
struct
{
SearchPathDelta SPDelta_20;
SearchPathDelta SPDelta_21;
SearchPathDelta SPDelta_22;
SearchPathDelta SPDelta_23;
};
struct
{
uint32_t Value;
};
} DW21;
// DW22
union
{
struct
{
SearchPathDelta SPDelta_24;
SearchPathDelta SPDelta_25;
SearchPathDelta SPDelta_26;
SearchPathDelta SPDelta_27;
};
struct
{
uint32_t Value;
};
} DW22;
// DW23
union
{
struct
{
SearchPathDelta SPDelta_28;
SearchPathDelta SPDelta_29;
SearchPathDelta SPDelta_30;
SearchPathDelta SPDelta_31;
};
struct
{
uint32_t Value;
};
} DW23;
// DW24
union
{
struct
{
SearchPathDelta SPDelta_32;
SearchPathDelta SPDelta_33;
SearchPathDelta SPDelta_34;
SearchPathDelta SPDelta_35;
};
struct
{
uint32_t Value;
};
} DW24;
// DW25
union
{
struct
{
SearchPathDelta SPDelta_36;
SearchPathDelta SPDelta_37;
SearchPathDelta SPDelta_38;
SearchPathDelta SPDelta_39;
};
struct
{
uint32_t Value;
};
} DW25;
// DW26
union
{
struct
{
SearchPathDelta SPDelta_40;
SearchPathDelta SPDelta_41;
SearchPathDelta SPDelta_42;
SearchPathDelta SPDelta_43;
};
struct
{
uint32_t Value;
};
} DW26;
// DW27
union
{
struct
{
SearchPathDelta SPDelta_44;
SearchPathDelta SPDelta_45;
SearchPathDelta SPDelta_46;
SearchPathDelta SPDelta_47;
};
struct
{
uint32_t Value;
};
} DW27;
// DW28
union
{
struct
{
SearchPathDelta SPDelta_48;
SearchPathDelta SPDelta_49;
SearchPathDelta SPDelta_50;
SearchPathDelta SPDelta_51;
};
struct
{
uint32_t Value;
};
} DW28;
// DW29
union
{
struct
{
SearchPathDelta SPDelta_52;
SearchPathDelta SPDelta_53;
SearchPathDelta SPDelta_54;
SearchPathDelta SPDelta_55;
};
struct
{
uint32_t Value;
};
} DW29;
} SPDelta;
// DW30
union
{
struct
{
uint32_t ActualMBWidth : MOS_BITFIELD_RANGE( 0,15 );
uint32_t ActualMBHeight : MOS_BITFIELD_RANGE( 16,31 );
};
struct
{
uint32_t Value;
};
} DW30;
// DW31
union
{
struct
{
uint32_t Reserved : MOS_BITFIELD_RANGE( 0,31 );
};
struct
{
uint32_t Value;
};
} DW31;
// DW32
union
{
struct
{
uint32_t _4xMeMvOutputDataSurfIndex : MOS_BITFIELD_RANGE( 0,31 );
};
struct
{
uint32_t Value;
};
} DW32;
// DW33
union
{
struct
{
uint32_t _16xOr32xMeMvInputDataSurfIndex : MOS_BITFIELD_RANGE( 0,31 );
};
struct
{
uint32_t Value;
};
} DW33;
// DW34
union
{
struct
{
uint32_t _4xMeOutputDistSurfIndex : MOS_BITFIELD_RANGE( 0,31 );
};
struct
{
uint32_t Value;
};
} DW34;
// DW35
union
{
struct
{
uint32_t _4xMeOutputBrcDistSurfIndex : MOS_BITFIELD_RANGE( 0,31 );
};
struct
{
uint32_t Value;
};
} DW35;
// DW36
union
{
struct
{
uint32_t VMEFwdInterPredictionSurfIndex : MOS_BITFIELD_RANGE( 0,31 );
};
struct
{
uint32_t Value;
};
} DW36;
// DW37
union
{
struct
{
uint32_t VMEBwdInterPredictionSurfIndex : MOS_BITFIELD_RANGE( 0,31 );
};
struct
{
uint32_t Value;
};
} DW37;
// DW38
union
{
struct
{
uint32_t VDEncStreamInSurfIndex : MOS_BITFIELD_RANGE( 0,31 );
};
struct
{
uint32_t Value;
};
} DW38;
} CODECHAL_ENCODE_AVC_ME_CURBE, *PCODECHAL_ENCODE_AVC_ME_CURBE;
C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(CODECHAL_ENCODE_AVC_ME_CURBE)) == 39);
// AVC ME CURBE init data for G9 CM Kernel
static const uint32_t g_cInit_CODECHAL_ENCODE_AVC_ME_CURBE[39] =
{
0x00000000, 0x00200010, 0x00003939, 0x77a43000, 0x00000000, 0x28300000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff
};
// CURBE for Static Frame Detection kernel
typedef struct _CODECHAL_ENCODE_AVC_SFD_CURBE_COMMON
{
union
{
struct
{
uint32_t VDEncModeDisable : MOS_BITFIELD_BIT( 0 );
uint32_t BRCModeEnable : MOS_BITFIELD_BIT( 1 );
uint32_t SliceType : MOS_BITFIELD_RANGE( 2, 3 );
uint32_t : MOS_BITFIELD_BIT( 4 );
uint32_t StreamInType : MOS_BITFIELD_RANGE( 5, 8 );
uint32_t EnableAdaptiveMvStreamIn : MOS_BITFIELD_BIT( 9 );
uint32_t : MOS_BITFIELD_BIT( 10 );
uint32_t EnableIntraCostScalingForStaticFrame : MOS_BITFIELD_BIT( 11 );
uint32_t Reserved : MOS_BITFIELD_RANGE( 12, 31 );
};
struct
{
uint32_t Value;
};
} DW0;
union
{
struct
{
uint32_t QPValue : MOS_BITFIELD_RANGE( 0, 7 );
uint32_t NumOfRefs : MOS_BITFIELD_RANGE( 8, 15 );
uint32_t HMEStreamInRefCost : MOS_BITFIELD_RANGE( 16, 23 );
uint32_t Reserved : MOS_BITFIELD_RANGE( 24, 31 );
};
struct
{
uint32_t Value;
};
} DW1;
union
{
struct
{
uint32_t FrameWidthInMBs : MOS_BITFIELD_RANGE( 0, 15 ); // round-up to 4-MB aligned
uint32_t FrameHeightInMBs : MOS_BITFIELD_RANGE( 16, 31 ); // round-up to 4-MB aligned
};
struct
{
uint32_t Value;
};
} DW2;
union
{
struct
{
uint32_t LargeMvThresh : MOS_BITFIELD_RANGE( 0, 31 );
};
struct
{
uint32_t Value;
};
} DW3;
union
{
struct
{
uint32_t TotalLargeMvThreshold : MOS_BITFIELD_RANGE( 0, 31 );
};
struct
{
uint32_t Value;
};
} DW4;
union
{
struct
{
uint32_t ZMVThreshold : MOS_BITFIELD_RANGE( 0, 31 );
};
struct
{
uint32_t Value;
};
} DW5;
union
{
struct
{
uint32_t TotalZMVThreshold : MOS_BITFIELD_RANGE( 0, 31 );
};
struct
{
uint32_t Value;
};
} DW6;
union
{
struct
{
uint32_t MinDistThreshold : MOS_BITFIELD_RANGE( 0, 31 );
};
struct
{
uint32_t Value;
};
} DW7;
uint8_t CostTable[52];
union
{
struct
{
uint32_t ActualWidthInMB : MOS_BITFIELD_RANGE( 0, 15 );
uint32_t ActualHeightInMB : MOS_BITFIELD_RANGE( 16, 31 );
};
struct
{
uint32_t Value;
};
} DW21;
union
{
struct
{
uint32_t Reserved : MOS_BITFIELD_RANGE( 0,31 );
};
struct
{
uint32_t Value;
};
} DW22;
union
{
struct
{
uint32_t Reserved : MOS_BITFIELD_RANGE( 0,31 );
};
struct
{
uint32_t Value;
};
} DW23;
union
{
struct
{
uint32_t VDEncInputImagStateIndex : MOS_BITFIELD_RANGE( 0, 31 ); // used in VDEnc CQP mode
};
struct
{
uint32_t Value;
};
} DW24;
union
{
struct
{
uint32_t Reserved : MOS_BITFIELD_RANGE( 0,31 );
};
struct
{
uint32_t Value;
};
} DW25;
union
{
struct
{
uint32_t MVDataSurfaceIndex : MOS_BITFIELD_RANGE( 0, 31 ); // contains HME MV Data generated by HME kernel
};
struct
{
uint32_t Value;
};
} DW26;
union
{
struct
{
uint32_t InterDistortionSurfaceIndex : MOS_BITFIELD_RANGE( 0, 31 ); // contains HME Inter Distortion generated by HME kernel
};
struct
{
uint32_t Value;
};
} DW27;
union
{
struct
{
uint32_t OutputDataSurfaceIndex : MOS_BITFIELD_RANGE( 0, 31 );
};
struct
{
uint32_t Value;
};
} DW28;
union
{
struct
{
uint32_t VDEncOutputImagStateIndex : MOS_BITFIELD_RANGE( 0, 31 );
};
struct
{
uint32_t Value;
};
} DW29;
} CODECHAL_ENCODE_AVC_SFD_CURBE_COMMON, *PCODECHAL_ENCODE_AVC_SFD_CURBE_COMMON;
C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(CODECHAL_ENCODE_AVC_SFD_CURBE_COMMON)) == 30);
typedef struct _CODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS
{
uint32_t dwDownscaledWidthInMb4x;
uint32_t dwDownscaledHeightInMb4x;
uint32_t dwMeMvBottomFieldOffset;
uint32_t dwMeDistortionBottomFieldOffset;
PMOS_RESOURCE presVDEncImageStateInputBuffer;
PMOS_SURFACE psMeMvDataSurface;
PMOS_SURFACE psMeDistortionSurface;
PMOS_RESOURCE presOutputBuffer;
PMOS_RESOURCE presVDEncImageStateOutputBuffer;
PMHW_KERNEL_STATE pKernelState;
bool bVdencActive;
bool bVdencBrcEnabled;
} CODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS;
typedef struct _CODECHAL_ENCODE_AVC_PACK_PIC_HEADER_PARAMS
{
PBSBuffer pBsBuffer;
PCODEC_AVC_ENCODE_PIC_PARAMS pPicParams; // pAvcPicParams[ucPPSIdx]
PCODEC_AVC_ENCODE_SEQUENCE_PARAMS pSeqParams; // pAvcSeqParams[ucSPSIdx]
PCODECHAL_ENCODE_AVC_VUI_PARAMS pAvcVuiParams;
PCODEC_AVC_IQ_MATRIX_PARAMS pAvcIQMatrixParams;
PCODECHAL_NAL_UNIT_PARAMS *ppNALUnitParams;
CodechalEncodeSeiData* pSeiData;
uint32_t dwFrameHeight;
uint32_t dwOriFrameHeight;
uint16_t wPictureCodingType;
bool bNewSeq;
bool *pbNewPPSHeader;
bool *pbNewSeqHeader;
} CODECHAL_ENCODE_AVC_PACK_PIC_HEADER_PARAMS, *PCODECHAL_ENCODE_AVC_PACK_PIC_HEADER_PARAMS;
typedef struct _CODECHAL_ENCODE_AVC_PACK_SLC_HEADER_PARAMS
{
PBSBuffer pBsBuffer;
PCODEC_AVC_ENCODE_PIC_PARAMS pPicParams; // pAvcPicParams[ucPPSIdx]
PCODEC_AVC_ENCODE_SEQUENCE_PARAMS pSeqParams; // pAvcSeqParams[ucSPSIdx]
PCODEC_AVC_ENCODE_SLICE_PARAMS pAvcSliceParams;
PCODEC_REF_LIST *ppRefList;
CODEC_PICTURE CurrPic;
CODEC_PICTURE CurrReconPic;
CODEC_AVC_ENCODE_USER_FLAGS UserFlags;
CODECHAL_ENCODE_AVC_NAL_UNIT_TYPE NalUnitType;
uint16_t wPictureCodingType;
bool bVdencEnabled;
} CODECHAL_ENCODE_AVC_PACK_SLC_HEADER_PARAMS, *PCODECHAL_ENCODE_AVC_PACK_SLC_HEADER_PARAMS;
typedef struct _CODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS
{
PCODEC_AVC_ENCODE_SEQUENCE_PARAMS pSeqParams; // pAvcSeqParams[ucSPSIdx]
PCODEC_AVC_ENCODE_PIC_PARAMS pPicParams;
PCODEC_AVC_ENCODE_SLICE_PARAMS pAvcSliceParams;
uint16_t wPictureCodingType;
uint16_t wPicHeightInMB;
uint16_t wFrameFieldHeightInMB;
bool bFirstFieldIPic;
bool bVDEncEnabled;
bool bPAKonly;
} CODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS, *PCODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS;
typedef struct _CODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS
{
uint16_t wPictureCodingType;
uint8_t ucTargetUsage;
uint8_t ucQP;
bool bBrcEnabled;
bool bVdEncEnabled;
} CODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS, *PCODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS;
typedef struct _CODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS
{
PMHW_KERNEL_STATE pKernelState;
} CODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS;
//!
//! \brief Vertical MV component range based on levelIdc
//! \details VDBOX private function to get vertical MV componet range
//! \param [in] levelIdc
//! AVC level
//! \return uint32_t
//! return the max vertical mv component base on input level
//!
uint32_t CodecHalAvcEncode_GetMaxVmvR(uint8_t levelIdc);
//!
//! \brief Get MV component range based on levelIdc
//! \details VDBOX private function to get MV componet range
//! \param [in] levelIdc
//! AVC level
//! \return uint32_t
//! return the max mv component base on input level
//!
uint32_t CodecHalAvcEncode_GetMaxMvLen(uint8_t levelIdc);
//!
//! \brief Get the filed parity: Top filed or Bottom filed
//! \details Client facing function to get the filed parity: Top filed or Bottom filed
//! \param [in] params
//! PCODEC_AVC_ENCODE_SLICE_PARAMS pSlcParams
//! \param [list] list
//! forword or backword reference
//! \param [in] index
//! reference frame index
//! \return uint32_t
//! Bottom field or Top field
//!
bool CodecHalAvcEncode_GetFieldParity(
PCODEC_AVC_ENCODE_SLICE_PARAMS params,
uint32_t list,
uint32_t index);
//!
//! \brief Get profile level max frame size
//! \param [in] seqParams
//! Encoder Sequence params
//! \param [in] encoder
//! Encoder structure
//! \param [in] profileLevelMaxFrame
//! Profile Level Max Frame
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS CodecHalAvcEncode_GetProfileLevelMaxFrameSize(
PCODEC_AVC_ENCODE_SEQUENCE_PARAMS seqParams,
CodechalEncoderState* encoder,
uint32_t* profileLevelMaxFrame);
//! \brief Get the max number of allowed slice
//! \param [in] profileIdc
//! AVC profile idc
//! \param [in] levelIdc
//! AVC level idc
//! \param [in] framesPer100Sec
//! frame Per 100Sec
//! \return uint16_t
//! return uiMaxAllowedNumSlices
//!
uint16_t CodecHalAvcEncode_GetMaxNumSlicesAllowed(
CODEC_AVC_PROFILE_IDC profileIdc,
CODEC_AVC_LEVEL_IDC levelIdc,
uint32_t framesPer100Sec);
//!
//! \brief Use to pack picture header related params
//! \param [in] params
//! picture header pack params
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS CodecHalAvcEncode_PackPictureHeader(
PCODECHAL_ENCODE_AVC_PACK_PIC_HEADER_PARAMS params);
//!
//! \brief Use to pack slice header related params
//! \param [in] params
//! slice header pack params
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS CodecHalAvcEncode_PackSliceHeader(
PCODECHAL_ENCODE_AVC_PACK_SLC_HEADER_PARAMS params);
//!
//! \brief Use to get picture num of slice header to be packed
//! \param [in] params
//! pack slice header pack params
//! \param [in] list
//! forword or backword reference
//! \return void
//!
static void CodecHal_PackSliceHeader_GetPicNum (
PCODECHAL_ENCODE_AVC_PACK_SLC_HEADER_PARAMS params,
uint8_t list);
//!
//! \class CodechalEncodeAvcBase
//! \brief CodechalE encode Avc base
//!
class CodechalEncodeAvcBase : public CodechalEncoderState
{
public:
// AvcState functions.
//!
//! \brief Constructor
//!
CodechalEncodeAvcBase(
CodechalHwInterface * hwInterface,
CodechalDebugInterface *debugInterface,
PCODECHAL_STANDARD_INFO standardInfo);
//!
//! \brief Copy constructor
//!
CodechalEncodeAvcBase(const CodechalEncodeAvcBase&) = delete;
//!
//! \brief Copy assignment operator
//!
CodechalEncodeAvcBase& operator=(const CodechalEncodeAvcBase&) = delete;
//!
//! \brief Destructor
//!
virtual ~CodechalEncodeAvcBase();
//Encode interface definitions
//!
//! \brief Initialize standard related members.
//! \details Initialize members, set proper value
//! to involved variables, allocate resources.
//! \param [in] settings
//! Encode settings.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS Initialize(CodechalSetting * settings);
virtual MOS_STATUS GetStatusReport(
EncodeStatus* encodeStatus,
EncodeStatusReport* encodeStatusReport)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Encode User Feature Key Report.
//! \details Report user feature values set by encode.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS UserFeatureKeyReport();
//!
//! \brief Initialize Encode ME kernel state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS InitKernelStateMe() = 0;
//!
//! \brief Set Encode ME kernel Curbe data.
//!
//! \param [in] params
//! Pointer to the MeCurbeParams
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS SetCurbeMe( MeCurbeParams* params ) = 0;
//!
//! \brief Set Encode ME kernel Surfaces
//!
//! \param [in] cmdBuffer
//! Pointer to the MOS_COMMAND_BUFFER
//! \param [in] params
//! Pointer to the CODECHAL_ME_SURFACE_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS SendMeSurfaces(
PMOS_COMMAND_BUFFER cmdBuffer,
MeSurfaceParams* params) = 0;
//!
//! \brief AVC State Initialization.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS Initialize();
//!
//! \brief AVC Resource Allocation for ENC.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS AllocateEncResources();
//!
//! \brief AVC Resource Allocation for Encoder.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS AllocateResources();
//!
//! \brief Set AVC Sequence Structs.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS SetSequenceStructs();
//!
//! \brief Set AVC Picture Structs.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS SetPictureStructs();
//!
//! \brief Set AVC Slice Structs.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS SetSliceStructs();
//!
//! \brief Run Encode ME kernel
//!
//! \param [in] brcBuffers
//! Pointer to the EncodeBrcBuffers
//! \param [in] hmeLevel
//! Hme level
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS EncodeMeKernel(
EncodeBrcBuffers* brcBuffers,
HmeLevel hmeLevel);
//!
//! \brief Allocate Batch Buffer For PakSlice.
//!
//! \param [in] numSlices
//! Number of Slice
//! \param [in] numPakPasses
//! Number of PAK pass.
//! \param [in] currRecycledBufIdx
//! Current Recycle Buffer Index.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS AllocateBatchBufferForPakSlices(
uint32_t numSlices,
uint8_t numPakPasses,
uint8_t currRecycledBufIdx);
//!
//! \brief Release Batch Buffer For PakSlice.
//!
//! \param [in] currRecycledBufIdx
//! Current Recycle Buffer Index.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS ReleaseBatchBufferForPakSlices( uint8_t currRecycledBufIdx);
//!
//! \brief Initialize kernel binary size info.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
MOS_STATUS AddIshSize(uint32_t kuid, uint8_t* kernelBase);
//!
//! \brief Calculate scaling list
//!
//! \return void
//!
void ScalingListFlat();
//!
//! \brief Calculate scaling list
//!
//! \return void
//!
void ScalingListFallbackRuleA();
//!
//! \brief Get Dist Scale factor
//!
//! \return void
//!
void GetDistScaleFactor();
//!
//! \brief Initialize MMC state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS InitMmcState();
//!
//! \brief Get bidirectional weight
//!
//! \param [in] distScaleFactorRefID0List0
//! DistScaleFactorRefID0List0
//! \param [in] weightedBiPredIdc
//! Same as AVC syntax element.
//!
//! \return int32_t
//! Bidirectional weight
//!
int32_t GetBiWeight(
uint32_t distScaleFactorRefID0List0,
uint16_t weightedBiPredIdc);
//!
//! \brief Update the slice count according to the slice shutdown policy
//!
virtual void UpdateSSDSliceCount();
//!
//! \brief Build slices with header insertion
//! \param [in] cmdBuffer
//! command buffer
//! \param [in] params
//! VDBOX AVC slice state params
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SendSlice(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_AVC_SLICE_STATE params);
//!
//! \brief Store number passes
//!
//! \param [in] encodeStatusBuf
//! Encode status buffer
//! \param [in] miInterface
//! Mi interface
//! \param [in] cmdBuffer
//! Command buffer
//! \param [in] currPass
//! Curr pass
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS StoreNumPasses(
EncodeStatusBuffer *encodeStatusBuf,
MhwMiInterface *miInterface,
PMOS_COMMAND_BUFFER cmdBuffer,
uint32_t currPass);
virtual MOS_STATUS AddMfxAvcSlice(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_AVC_SLICE_STATE avcSliceState);
virtual MOS_STATUS AddVdencSliceStateCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_AVC_SLICE_STATE params);
#if USE_CODECHAL_DEBUG_TOOL
MOS_STATUS DumpSeqParams(
PCODEC_AVC_ENCODE_SEQUENCE_PARAMS seqParams,
PCODEC_AVC_IQ_MATRIX_PARAMS matrixParams);
MOS_STATUS DumpPicParams(
PCODEC_AVC_ENCODE_PIC_PARAMS picParams,
PCODEC_AVC_IQ_MATRIX_PARAMS matrixParams);
MOS_STATUS DumpFeiPicParams(
CodecEncodeAvcFeiPicParams *feiPicParams);
MOS_STATUS DumpSliceParams(
PCODEC_AVC_ENCODE_SLICE_PARAMS sliceParams,
PCODEC_AVC_ENCODE_PIC_PARAMS picParams);
MOS_STATUS DumpVuiParams(
PCODECHAL_ENCODE_AVC_VUI_PARAMS avcVuiParams);
#endif
protected:
//!
//! \brief Set MFX_PIPE_MODE_SELECT parameter
//!
//! \param [in] genericParam
//! CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS
//! \param [out] param
//! reference to MHW_VDBOX_PIPE_MODE_SELECT_PARAMS
//!
//! \return void
//!
virtual void SetMfxPipeModeSelectParams(
const CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS& genericParam,
MHW_VDBOX_PIPE_MODE_SELECT_PARAMS& param);
//!
//! \brief set MFX_PIPE_BUF_ADDR_STATE parameter
//!
//! \param [in] genericParam
//! CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS
//! \param [out] param
//! reference to MHW_VDBOX_PIPE_BUF_ADDR_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS SetMfxPipeBufAddrStateParams(
CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS genericParam,
MHW_VDBOX_PIPE_BUF_ADDR_PARAMS& param);
//!
//! \brief Set MFX_IND_OBJ_BASE_ADDR_STATE parameter
//!
//! \param [out] param
//! reference to MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS
//!
//! \return void
//!
virtual void SetMfxIndObjBaseAddrStateParams(MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS& param);
//!
//! \brief Set MHW_VDBOX_BSP_BUF_BASE_ADDR_STATE parameter
//!
//! \param [out] param
//! reference to MHW_VDBOX_BSP_BUF_BASE_ADDR_PARAMS
//!
//! \return void
//!
virtual void SetMfxBspBufBaseAddrStateParams(MHW_VDBOX_BSP_BUF_BASE_ADDR_PARAMS& param);
//!
//! \brief Set MHW_VDBOX_QM_STATE parameter
//!
//! \param [out] qmParams
//! reference to MHW_VDBOX_QM_PARAMS
//! \param [out] fqmParams
//! reference to MHW_VDBOX_QM_PARAMS
//!
//! \return void
//!
virtual void SetMfxQmStateParams(MHW_VDBOX_QM_PARAMS& qmParams, MHW_VDBOX_QM_PARAMS & fqmParams);
//!
//! \brief Set MHW_VDBOX_AVC_IMG_STATE parameter
//!
//! \param [out] param
//! reference to MHW_VDBOX_AVC_IMG_PARAMS
//!
//! \return void
//!
virtual void SetMfxAvcImgStateParams(MHW_VDBOX_AVC_IMG_PARAMS& param);
public:
PMOS_INTERFACE m_origOsInterface = nullptr; //!< Os Interface
CodechalHwInterface *m_origHwInterface = nullptr; //!< Hw Interface
PMHW_STATE_HEAP_INTERFACE m_origStateHeapInterface = nullptr; //!< StateHeap Interface
// Parameters passed by application
PCODEC_AVC_ENCODE_PIC_PARAMS m_avcPicParams[CODEC_AVC_MAX_PPS_NUM]; //!< Pointer to array of picture parameter, could be removed
PCODEC_AVC_ENCODE_SEQUENCE_PARAMS m_avcSeqParams[CODEC_AVC_MAX_SPS_NUM]; //!< Pointer to array of sequence parameter, could be removed
PCODEC_AVC_ENCODE_PIC_PARAMS m_avcPicParam = nullptr; //!< Pointer to AVC picture parameter
PCODEC_AVC_ENCODE_SEQUENCE_PARAMS m_avcSeqParam = nullptr; //!< Pointer to AVC sequence parameter
PCODECHAL_ENCODE_AVC_QUALITY_CTRL_PARAMS m_avcQCParams = nullptr; //!< Pointer to video quality control parameter
PCODECHAL_ENCODE_AVC_ROUNDING_PARAMS m_avcRoundingParams = nullptr; //!< Pointer to AVC rounding parameter
PCODECHAL_ENCODE_AVC_VUI_PARAMS m_avcVuiParams = nullptr; //!< Pointer to AVC Uvi parameter
PCODEC_AVC_ENCODE_SLICE_PARAMS m_avcSliceParams = nullptr; //!< Pointer to AVC slice parameter
CodecEncodeAvcFeiPicParams *m_avcFeiPicParams = nullptr; //!< Pointer to FEI picture parameter
PCODEC_AVC_IQ_MATRIX_PARAMS m_avcIQMatrixParams = nullptr; //!< Pointer to IQMaxtrix parameter
PCODEC_AVC_ENCODE_IQ_WEIGTHSCALE_LISTS m_avcIQWeightScaleLists = nullptr; //!< Pointer to IQWidght ScaleLists
CODEC_AVC_ENCODE_USER_FLAGS m_userFlags; //!< Encoder user flag settings
uint32_t m_reconFrameSurfaceId[CODEC_AVC_NUM_UNCOMPRESSED_SURFACE];
CODECHAL_ENCODE_AVC_ENCODER_USAGE m_encoderUsage = CODECHAL_ENCODE_AVC_SINGLE_PASS;
CODEC_PIC_ID m_picIdx[CODEC_AVC_MAX_NUM_REF_FRAME]; //!< Picture index
PCODEC_REF_LIST m_refList[CODEC_AVC_NUM_UNCOMPRESSED_SURFACE]; //!< Pointer to reference list
CODEC_AVC_FRAME_STORE_ID m_avcFrameStoreID[CODEC_AVC_MAX_NUM_REF_FRAME]; //!< Refer to CODEC_AVC_FRAME_STORE_ID
CODECHAL_ENCODE_AVC_NAL_UNIT_TYPE m_nalUnitType; //!< Nal unit type
PCODECHAL_NAL_UNIT_PARAMS *m_nalUnitParams = nullptr; //!< Pointers to NAL unit parameters array
uint16_t m_sliceHeight = 0; //!< Slice height
uint8_t m_biWeightNumB = 0; //!< Bi direction Weight B frames num
bool m_deblockingEnabled = false; //!< Enable deblocking flag
bool m_mbaffEnabled = false; //!< Enable MBAFF flag
bool m_firstFieldIdrPic = false; //!< First field IDR flag
bool m_hmeEnabled = false; //!< Enable HME flag
bool m_16xMeEnabled = false; //!< Enable 16x ME flag
bool m_32xMeEnabled = false; //!< Enable 32x ME flag
bool m_skipBiasAdjustmentEnable = false;//!< Enable SkipBiasAdjustment flag
bool m_staticFrameDetectionInUse = false;//!< Enable Static Frame Detection flag
uint32_t m_sliceStructCaps = 0; //!< Slice struct
CODECHAL_ENCODE_AVC_TQ_PARAMS m_trellisQuantParams; //!< Trellis Quantization params
// B-frame
uint32_t m_distScaleFactorList0[CODEC_AVC_MAX_NUM_REF_FRAME * 2]; //!< the DistScaleFactor used to derive temporal direct motion vector
uint32_t m_biWeight = 0; //!< Bidirectional Weight
// Batch Buffers
MHW_BATCH_BUFFER m_batchBufferForVdencImgStat[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; //!< VDEnc image state batch buffers
// ME
CodechalKernelHme *m_hmeKernel = nullptr; //!< ME kernel object
MOS_SURFACE m_4xMeMvDataBuffer; //!< 4x motion estimation MV data buffer
uint32_t m_meMvBottomFieldOffset = 0; //!< ME MV bottom filed offset
MOS_SURFACE m_16xMeMvDataBuffer; //!< 16x motion estimation MV data buffer
uint32_t m_meMv16xBottomFieldOffset = 0; //!< 16x motion estimation MV bottom filed offset
MOS_SURFACE m_32xMeMvDataBuffer; //!< 32x motion estimation MV data buffer
uint32_t m_meMv32xBottomFieldOffset = 0; //!< 32x motion estimation MV bottom filed offset
MOS_SURFACE m_4xMeDistortionBuffer; //!< 4x ME distortion buffer
uint32_t m_meDistortionBottomFieldOffset = 0; //!< ME distortion bottom field offset
uint8_t *m_bmeMethodTable = nullptr; //!< Point to BME Method table
uint8_t *m_meMethodTable = nullptr; //!< Pointer to ME Method table
// PAK Scratch Buffers
MOS_RESOURCE m_intraRowStoreScratchBuffer; //!< Handle of intra row store surface
MHW_BATCH_BUFFER m_batchBufferForPakSlices[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; //!< PAK Slice batch buffers
uint32_t m_pakSliceSize = 0; //!< PAK Slice Size
uint32_t m_pakSlicePatchListSize = 0; //!< PAK Slice patch list size
uint32_t m_currPakSliceIdx = 0; //!< Current PAK slice index
bool m_4xMeDistortionBufferSupported = false; //!< Generation Specific Support Flags & User Feature Key Reads
bool m_sliceSizeStreamoutSupported = false; //!< Enable PAK slice size streamout, valid for AVC VDEnc on KBL/CNL+
MOS_RESOURCE m_pakSliceSizeStreamoutBuffer; //!< PAK slice size streamout buffer
bool m_crePrefetchEnable = false; //!< Enable CRE prefetch flag
bool m_tlbPrefetchEnable = false; //!< Enable TLB prefetch flag
const uint8_t m_codechalEncodeAvcSfdCostTablePFrame[CODEC_AVC_NUM_QP] =
{
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 60, 60, 60, 60, 73, 73, 73, 76, 76, 76, 88, 89, 89, 91, 92, 93, 104, 104, 106, 107, 108, 109, 120, 120, 122, 123, 124, 125, 136, 136, 138, 139, 140, 141, 143, 143};
const uint8_t m_codechalEncodeAvcSfdCostTableBFrame[CODEC_AVC_NUM_QP] =
{
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 73, 73, 73, 73, 77, 77, 77, 89, 89, 89, 91, 93, 93, 95, 105, 106, 107, 108, 110, 111, 121, 122, 123, 124, 125, 127, 137, 138, 139, 140, 142, 143, 143, 143, 143, 143};
const uint8_t m_codechalEncodeAvcSfdCostTableVdEnc[CODEC_AVC_NUM_QP] =
{
45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 47, 56, 57, 59, 44, 45, 47, 56, 44, 47, 47, 45, 47, 47, 47, 47, 45, 47, 47, 56, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47};
#if USE_CODECHAL_DEBUG_TOOL
protected:
//!
//! \brief Create AVC PAR
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS CreateAvcPar();
//!
//! \brief Destroy AVC PAR
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS DestroyAvcPar();
//!
//! \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
//!
MOS_STATUS PopulateConstParam();
//!
//! \brief Populate target usage as the first parameter of dumped par file
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS PopulateTargetUsage();
//!
//! \brief Set MHW_VDBOX_AVC_IMG_STATE parameter
//!
//! \param [in] avcSeqParams
//! pointer to AVC encode sequence parameters
//! \param [in] avcPicParams
//! pointer to AVC encode picture parameters
//! \param [in] avcSlcParams
//! pointer to AVC encode slice parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS PopulateDdiParam(
PCODEC_AVC_ENCODE_SEQUENCE_PARAMS avcSeqParams,
PCODEC_AVC_ENCODE_PIC_PARAMS avcPicParams,
PCODEC_AVC_ENCODE_SLICE_PARAMS avcSlcParams);
//!
//! \brief Set MHW_VDBOX_AVC_IMG_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
//!
MOS_STATUS PopulateSliceStateParam(
bool adaptiveRoundingInterEnable,
PMHW_VDBOX_AVC_SLICE_STATE sliceState);
//!
//! \brief Set MHW_VDBOX_AVC_IMG_STATE parameter
//!
//! \param [in] *cmd
//! pointer to command
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS PopulateSfdParam(
void *cmd);
//!
//! \brief Set MHW_VDBOX_AVC_IMG_STATE parameter
//!
//! \param [in] is16xMeEnabled
//! 16x ME enabled flag
//! \param [in] is32xMeEnabled
//! 32x ME enabled flag
//! \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 PopulateHmeParam(
bool is16xMeEnabled,
bool is32xMeEnabled,
uint8_t meMethod,
void *cmd) { return MOS_STATUS_SUCCESS; }
//!
//! \brief Set MHW_VDBOX_AVC_IMG_STATE 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 MHW_VDBOX_AVC_IMG_STATE 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 MHW_VDBOX_AVC_IMG_STATE 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; }
EncodeAvcPar *m_avcPar = nullptr; //!< AVC PAR parameters
bool m_populateTargetUsage = false;
#endif
//!
//! \brief Set frame store Id for avc codec.
//! \details
//! \return frameIdx
//! [in] frame index
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetFrameStoreIds(uint8_t frameIdx);
};
#endif // __CODECHAL_ENCODE_AVC_BASE_H__