/*
* Copyright (c) 2011-2017, Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
//!
//! \file     codechal_encode_avc.h
//! \brief    This file defines the base C++ class/interface for AVC DualPipe encoding
//!           to be used across CODECHAL components.
//!

#ifndef __CODECHAL_ENCODE_AVC_H__
#define __CODECHAL_ENCODE_AVC_H__

#include "codechal_encode_avc_base.h"

#define CODECHAL_ENCODE_AVC_MAX_LAMBDA                                  0xEFFF

// BRC Block Copy
#define CODECHAL_ENCODE_AVC_BRC_COPY_NUM_ROWS_PER_VME_SEND_MSG          8
#define CODECHAL_ENCODE_AVC_BRC_COPY_NUM_SEND_MSGS_PER_KERNEL           3
#define CODECHAL_ENCODE_AVC_BRC_COPY_BLOCK_WIDTH                        64

// SubMbPartMask defined in CURBE for AVC ENC
#define CODECHAL_ENCODE_AVC_DISABLE_4X4_SUB_MB_PARTITION                0x40
#define CODECHAL_ENCODE_AVC_DISABLE_4X8_SUB_MB_PARTITION                0x20
#define CODECHAL_ENCODE_AVC_DISABLE_8X4_SUB_MB_PARTITION                0x10

typedef enum _CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_BRC_INIT_RESET
{
    CODECHAL_ENCODE_AVC_BRC_INIT_RESET_HISTORY = 0,
    CODECHAL_ENCODE_AVC_BRC_INIT_RESET_DISTORTION,
    CODECHAL_ENCODE_AVC_BRC_INIT_RESET_NUM_SURFACES
} CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_BRC_INIT_RESET;

typedef enum _CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_BRC_BLOCK_COPY
{
    CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_INPUT = 0,
    CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_OUTPUT,
    CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_NUM_SURFACES
} CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_BRC_BLOCK_COPY;

typedef struct _CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS
{
    PMHW_KERNEL_STATE                       pKernelState;
    uint32_t                                dwBufferOffset;
    uint32_t                                dwBlockHeight;
} CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS;

typedef struct _CODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS
{
    PMOS_INTERFACE                              pOsInterface;
    PCODEC_AVC_ENCODE_SLICE_PARAMS              pAvcSlcParams;
    PCODEC_PIC_ID                               pAvcPicIdx;
    MOS_SURFACE                                 sBrcConstantDataBuffer; // sBrcConstantDataBuffer[uiCurrDSH]
    uint32_t                                    dwMbEncBlockBasedSkipEn;
    PCODEC_AVC_ENCODE_PIC_PARAMS                pPicParams;             // pAvcPicParams[ucPPSIdx]
    uint16_t                                    wPictureCodingType;
    bool                                        bSkipBiasAdjustmentEnable;
    bool                                        bAdaptiveIntraScalingEnable;
    bool                                        bOldModeCostEnable;
    PCODECHAL_ENCODE_AVC_QUALITY_CTRL_PARAMS    pAvcQCParams;
} CODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS, *PCODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS;

typedef struct _CODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS
{
    PMOS_RESOURCE                       presBrcHistoryBuffer;
    PMOS_SURFACE                        psMeBrcDistortionBuffer;
    uint32_t                            dwMeBrcDistortionBottomFieldOffset;
    uint32_t                            dwDownscaledWidthInMb4x;
    uint32_t                            dwDownscaledFrameFieldHeightInMb4x;
} CODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS;

typedef struct _CODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS
{
    double                                 *pdBrcInitCurrentTargetBufFullInBits;   // Passed back to Render Interface
    double                                 *pdBrcInitResetInputBitsPerFrame;       // Passed back to Render Interface
    uint32_t*                               pdwBrcInitResetBufSizeInBits;           // Passed back to Render Interface
    PMHW_KERNEL_STATE                       pKernelState;
} CODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS;

typedef struct _CODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS
{
    PMOS_INTERFACE                              pOsInterface;
    PMOS_RESOURCE                               presBrcConstantDataBuffer;
    uint32_t                                    dwMbEncBlockBasedSkipEn;
    PCODEC_AVC_ENCODE_PIC_PARAMS                pPicParams;             // pAvcPicParams[ucPPSIdx]
    uint16_t                                    wPictureCodingType;
    bool                                        bSkipBiasAdjustmentEnable;
    bool                                        bAdaptiveIntraScalingEnable;
    bool                                        bOldModeCostEnable;
    bool                                        bPreProcEnable;
    bool                                        bEnableKernelTrellis;
    PCODECHAL_ENCODE_AVC_QUALITY_CTRL_PARAMS    pAvcQCParams;
    uint32_t                                    Lambda[52][2];
} CODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS, *PCODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS;

typedef struct _CODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS
{
    PCODEC_AVC_ENCODE_SEQUENCE_PARAMS           pSeqParams;
    PCODEC_AVC_ENCODE_PIC_PARAMS                pPicParams;
    PCODEC_AVC_ENCODE_SLICE_PARAMS              pSlcParams;
    PCODEC_REF_LIST                             *ppRefList;
    PCODEC_PIC_ID                               pPicIdx;
    PCODECHAL_ENCODE_AVC_QUALITY_CTRL_PARAMS    pAvcQCParams;
    uint16_t                                    wPicWidthInMb;
    uint16_t                                    wFieldFrameHeightInMb;
    uint32_t*                                   pdwBlockBasedSkipEn; // To be returned to render interface
    bool                                        bBrcEnabled;
    bool                                        bMbEncIFrameDistEnabled;
    bool                                        bRoiEnabled;
    bool                                        bDirtyRoiEnabled;
    bool                                        bUseMbEncAdvKernel;
    bool                                        bMbDisableSkipMapEnabled;
    bool                                        bStaticFrameDetectionEnabled;   // static frame detection enable or not
    bool                                        bApdatvieSearchWindowSizeEnabled;
    bool                                        bSquareRollingIEnabled;
    uint16_t                                    usSliceHeight;
    PMHW_KERNEL_STATE                           pKernelState;
    uint8_t*                                    pCurbeBinary;
} CODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS;

typedef struct _CODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS
{
    double                                  *pdBrcInitCurrentTargetBufFullInBits;    // Passed in and back
    uint32_t                                dwNumSkipFrames;
    uint32_t                                dwSizeSkipFrames;
    uint8_t                                 ucMinQP;  // Limit min QP that the kernel can choose, based on app setting
    uint8_t                                 ucMaxQP;  // Limit max QP that the kernel can choose, based on app setting
    uint8_t                                 ucEnableROI;                            // ROI feature for BRC
    uint32_t                                dwIntraRefreshQpThreshold;
    bool                                    bSquareRollingIEnabled;
    PMHW_KERNEL_STATE                       pKernelState;
} CODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS;
typedef struct _CODECHAL_ENCODE_AVC_BINDING_TABLE_BRC_UPDATE
{
    uint32_t   dwFrameBrcHistoryBuffer;
    uint32_t   dwFrameBrcPakStatisticsOutputBuffer;
    uint32_t   dwFrameBrcImageStateReadBuffer;
    uint32_t   dwFrameBrcImageStateWriteBuffer;
    uint32_t   dwFrameBrcMbEncCurbeReadBuffer;
    uint32_t   dwFrameBrcMbEncCurbeWriteData;
    uint32_t   dwFrameBrcDistortionBuffer;
    uint32_t   dwFrameBrcConstantData;
    uint32_t   dwFrameBrcMbStatBuffer;
    uint32_t   dwFrameBrcMvDataBuffer;
    uint32_t   dwMbBrcHistoryBuffer;
    uint32_t   dwMbBrcDistortionBuffer;
    uint32_t   dwMbBrcMbQpBuffer;
    uint32_t   dwMbBrcROISurface;
    uint32_t   dwMbBrcIntraDistortionPBFrameSurface;
    uint32_t   dwMbBrcMbStatBuffer;
    uint32_t   dwBindingTableStartOffset;
    uint32_t   dwNumBindingTableEntries;
} CODECHAL_ENCODE_AVC_BINDING_TABLE_BRC_UPDATE, *PCODECHAL_ENCODE_AVC_BINDING_TABLE_BRC_UPDATE;

typedef struct _CODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS
{
    CODECHAL_MEDIA_STATE_TYPE                       MbEncMediaStateType;
    EncodeBrcBuffers*                               pBrcBuffers;
    uint32_t                                        dwDownscaledWidthInMb4x;
    uint32_t                                        dwDownscaledFrameFieldHeightInMb4x;
    bool                                            bMbBrcEnabled;
    bool                                            bUseAdvancedDsh;
    bool                                            bBrcRoiEnabled;
    PMOS_RESOURCE                                   presMbEncCurbeBuffer;
    PMOS_RESOURCE                                   presMbEncBRCBuffer; //extra surface on KBL BRC update
    PMOS_SURFACE                                    psRoiSurface;
    PMOS_RESOURCE                                   presMbStatBuffer;
    PMOS_SURFACE                                    psMvDataBuffer;
    uint32_t                                        dwBrcPakStatisticsSize;
    uint32_t                                        dwBrcHistoryBufferSize;
    uint32_t                                        dwMbEncBRCBufferSize;
    uint32_t                                        dwMvBottomFieldOffset;
    uint8_t                                         ucCurrRecycledBufIdx;
    PCODECHAL_ENCODE_AVC_BINDING_TABLE_BRC_UPDATE   pBrcUpdateBindingTable;
    PMHW_KERNEL_STATE                               pKernelState;
} CODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS;

typedef struct _CODECHAL_ENCODE_AVC_IPCM_THRESHOLD
{
    uint8_t   QP;
    uint16_t  Threshold;
} CODECHAL_ENCODE_AVC_IPCM_THRESHOLD;

// Force RepartitionCheck
typedef enum _CODECHAL_ENCODE_AVC_RPC
{
    CODECHAL_ENCODE_RPC_FOLLOW_DRIVER = 0,
    CODECHAL_ENCODE_RPC_FORCE_ENABLE,
    CODECHAL_ENCODE_RPC_FORCE_DISABLE
} CODECHAL_ENCODE_AVC_RPC;

typedef struct _CODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC
{
    uint32_t   dwAvcMBEncMfcAvcPakObj;
    uint32_t   dwAvcMBEncIndMVData;
    uint32_t   dwAvcVPPStatistics;
    uint32_t   dwAvcMBEncCurrY;
    uint32_t   dwAvcMBEncCurrUV;
    uint32_t   dwAvcMBEncMbSpecificData;
    uint32_t   dwAvcMBEncFwdRefY;
    uint32_t   dwAvcMBEncBwdRefY;
    uint32_t   dwAvcMBEncFwdRefMVData;
    uint32_t   dwAvcMBEncBwdRefMBData;
    uint32_t   dwAvcMBEncBwdRefMVData;
    uint32_t   dwAvcMBEncMVDataFromME;
    uint32_t   dwAvcMBEncRefPicSelectL0;
    uint32_t   dwAvcMBEncRefPicSelectL1;
    uint32_t   dwAvcMBEncCurrPic;
    uint32_t   dwAvcMBEncFwdPic;
    uint32_t   dwAvcMBEncBwdPic;
    uint32_t   dwAvcMBEncMbBrcConstData;
    uint32_t   dwAvcMBEncMEDist;
    uint32_t   dwAvcMBEncBRCDist;
    uint32_t   dwAvcMBEncDebugScratch;
    uint32_t   dwAvcMBEncFlatnessChk;
    uint32_t   dwAvcMBEncMBStats;
    uint32_t   dwAvcMBEncMADData;
    uint32_t   dwAvcMBEncVMEDistortion;
    uint32_t   dwAvcMbEncBRCCurbeData;
    uint32_t   dwAvcMBEncSliceMapData;
    uint32_t   dwAvcMBEncMvPrediction;
    uint32_t   dwAvcMBEncMbNonSkipMap;
    uint32_t   dwAvcMBEncAdv;
    uint32_t   dwAvcMBEncStaticDetectionCostTable;

    // Frame Binding Table Entries
    uint32_t   dwAvcMBEncCurrPicFrame[CODEC_AVC_NUM_REF_LISTS];
    uint32_t   dwAvcMBEncFwdPicFrame[CODECHAL_ENCODE_NUM_MAX_VME_L0_REF];
    uint32_t   dwAvcMBEncBwdPicFrame[CODECHAL_ENCODE_NUM_MAX_VME_L1_REF * 2];   // Bwd ref IDX0 and IDX1 are repeated, so include two extra to account for this
    uint32_t   dwAvcMBEncMbQpFrame;
    uint32_t   dwAvcMbEncMADFrame;
    uint32_t   dwAvcMBEncSliceMapFrame;
    uint32_t   dwAvcMBEncMbNonSkipMapFrame;

    // Field Binding Table Entries
    uint32_t   dwAvcMBEncFieldCurrPic[CODEC_AVC_NUM_REF_LISTS];
    uint32_t   dwAvcMBEncFwdPicTopField[CODECHAL_ENCODE_NUM_MAX_VME_L0_REF];
    uint32_t   dwAvcMBEncFwdPicBotField[CODECHAL_ENCODE_NUM_MAX_VME_L0_REF];
    uint32_t   dwAvcMBEncBwdPicTopField[CODECHAL_ENCODE_NUM_MAX_VME_L1_REF * 2];
    uint32_t   dwAvcMBEncBwdPicBotField[CODECHAL_ENCODE_NUM_MAX_VME_L1_REF * 2];
    uint32_t   dwAvcMBEncMbQpField;
    uint32_t   dwAvcMBEncMADField;
    uint32_t   dwAvcMBEncSliceMapField;
    uint32_t   dwAvcMBEncMbNonSkipMapField;

    uint32_t   dwBindingTableStartOffset;
    uint32_t   dwNumBindingTableEntries;
} CODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC, *PCODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC;

typedef struct _CODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS
{
    CODECHAL_MEDIA_STATE_TYPE                   MediaStateType;
    PCODEC_AVC_ENCODE_SLICE_PARAMS              pAvcSlcParams;
    CodecEncodeAvcFeiPicParams                  *pFeiPicParams;
    PCODEC_REF_LIST                             *ppRefList;
    PCODEC_PIC_ID                               pAvcPicIdx;
    PCODEC_PICTURE                              pCurrOriginalPic;
    PCODEC_PICTURE                              pCurrReconstructedPic;
    uint16_t                                    wPictureCodingType;
    PMOS_SURFACE                                psCurrPicSurface;
    uint32_t                                    dwCurrPicSurfaceOffset;
    uint32_t                                    dwMbCodeBottomFieldOffset;
    uint32_t                                    dwMvBottomFieldOffset;
    PMOS_SURFACE                                ps4xMeMvDataBuffer;
    CmSurface2D                                 *ps4xMeMvDataCmBuffer;
    uint32_t                                    dwMeMvBottomFieldOffset;
    PMOS_SURFACE                                ps4xMeDistortionBuffer;
    CmSurface2D                                 *ps4xMeDistortionCmBuffer;
    uint32_t                                    dwMeDistortionBottomFieldOffset;
    uint32_t                                    dwRefPicSelectBottomFieldOffset;
    PMOS_SURFACE                                psMeBrcDistortionBuffer;
    uint32_t                                    dwMeBrcDistortionBottomFieldOffset;
    PMOS_RESOURCE                               presMbBrcConstDataBuffer;
    PMOS_RESOURCE                               presMbSpecificDataBuffer;
    PMOS_SURFACE                                psMbQpBuffer;
    uint32_t                                    dwMbQpBottomFieldOffset;
    bool                                        bFlatnessCheckEnabled;
    PMOS_SURFACE                                psFlatnessCheckSurface;
    uint32_t                                    dwFlatnessCheckBottomFieldOffset;
    bool                                        bMBVProcStatsEnabled;
    PMOS_RESOURCE                               presMBVProcStatsBuffer;
    uint32_t                                    dwMBVProcStatsBottomFieldOffset;
    PMOS_RESOURCE                               presMADDataBuffer;
    bool                                        bMADEnabled;
    uint32_t                                    dwFrameWidthInMb;
    uint32_t                                    dwFrameFieldHeightInMb;
    uint32_t                                    dwFrameHeightInMb;
    uint32_t                                    dwVerticalLineStride;
    uint32_t                                    dwVerticalLineStrideOffset;
    bool                                        bHmeEnabled;
    bool                                        bMbEncIFrameDistInUse;
    bool                                        bMbQpBufferInUse;
    bool                                        bMbSpecificDataEnabled;
    bool                                        bMbConstDataBufferInUse;
    bool                                        bUsedAsRef;
    PMOS_RESOURCE                               presMbEncCurbeBuffer;
    PMOS_RESOURCE                               presMbEncBRCBuffer;  //extra surface on KBL BRC update
    uint32_t                                    dwMbEncBRCBufferSize;
    bool                                        bUseMbEncAdvKernel;
    bool                                        bArbitraryNumMbsInSlice;
    PMOS_SURFACE                                psSliceMapSurface;           // Slice map for arbitrary number of mbs in slice feature
    uint32_t                                    dwSliceMapBottomFieldOffset;
    bool                                        bBrcEnabled;
    PMHW_KERNEL_STATE                           pKernelState;
    bool                                        bUseAdvancedDsh;
    PCODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC    pMbEncBindingTable;
    bool                                        bMbDisableSkipMapEnabled;
    PMOS_SURFACE                                psMbDisableSkipMapSurface;
    bool                                        bStaticFrameDetectionEnabled;
    PMOS_RESOURCE                               presSFDOutputBuffer;
    PMOS_RESOURCE                               presSFDCostTableBuffer;
    PCODEC_AVC_REF_PIC_SELECT_LIST              pWeightedPredOutputPicSelectList;
    bool                                        bUseWeightedSurfaceForL0;
    bool                                        bUseWeightedSurfaceForL1;
    PMOS_RESOURCE                               presMbInlineData;
    PMOS_RESOURCE                               presVMEOutSurface;
} CODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS;

typedef struct _CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS
{
    uint32_t                                    submitNumber;
    PMHW_KERNEL_STATE                           pKernelState;
    PCODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC    pBindingTable;
} CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS;

typedef enum _CODECHAL_ENCODE_AVC_MULTIPRED
{
    CODECHAL_ENCODE_AVC_MULTIPRED_ENABLE            =   0x01,
    CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE           =   0x80
} CODECHAL_ENCODE_AVC_MULTIPRED;

typedef struct _CODECHAL_ENCODE_AVC_BINDING_TABLE_PREPROC
{
    uint32_t   dwAvcPreProcCurrY;
    uint32_t   dwAvcPreProcCurrUV;
    uint32_t   dwAvcPreProcMVDataFromHME;
    uint32_t   dwAvcPreProcMvPredictor;
    uint32_t   dwAvcPreProcMbQp;
    uint32_t   dwAvcPreProcMvDataOut;
    uint32_t   dwAvcPreProcMbStatsOut;

    uint32_t   dwAvcPreProcVMECurrPicFrame[CODEC_AVC_NUM_REF_LISTS];
    uint32_t   dwAvcPreProcVMEFwdPicFrame;
    uint32_t   dwAvcPreProcVMEBwdPicFrame[2];   // Bwd ref IDX0 and IDX1 are repeated, so include two to account for this
    uint32_t   dwAvcPreProcFtqLut;

    uint32_t   dwAvcPreProcVMECurrPicField[2];
    uint32_t   dwAvcPreProcVMEFwdPicField[2];
    uint32_t   dwAvcPreProcVMEBwdPicField[2];
    uint32_t   dwAvcPreProcFtqLutField;

    uint32_t   dwBindingTableStartOffset;
    uint32_t   dwNumBindingTableEntries;
} CODECHAL_ENCODE_AVC_BINDING_TABLE_PREPROC, *PCODECHAL_ENCODE_AVC_BINDING_TABLE_PREPROC;

typedef struct _CODECHAL_ENCOCDE_AVC_PREPROC_SURFACE_PARAMS
{
    FeiPreEncParams                             *pPreEncParams;
    PCODEC_REF_LIST                             *ppRefList;
    PCODEC_PICTURE                              pCurrOriginalPic;
    PMOS_SURFACE                                psCurrPicSurface;
    PMOS_SURFACE                                ps4xMeMvDataBuffer;
    PMOS_RESOURCE                               presFtqLutBuffer;
    uint32_t                                    dwMeMvBottomFieldOffset;
    uint32_t                                    dwMBVProcStatsBottomFieldOffset;
    uint32_t                                    dwFrameWidthInMb;
    uint32_t                                    dwFrameFieldHeightInMb;
    uint32_t                                    dwVerticalLineStride;
    uint32_t                                    dwVerticalLineStrideOffset;
    bool                                        bHmeEnabled;
    PMHW_KERNEL_STATE                           pKernelState;
    PCODECHAL_ENCODE_AVC_BINDING_TABLE_PREPROC  pPreProcBindingTable;
} CODECHAL_ENCODE_AVC_PREPROC_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_PREPROC_SURFACE_PARAMS;

typedef struct _CODECHAL_ENCODE_AVC_PREPROC_CURBE_PARAMS
{
    FeiPreEncParams                         *pPreEncParams;
    uint16_t                                wPicWidthInMb;
    uint16_t                                wFieldFrameHeightInMb;
    PMHW_KERNEL_STATE                       pKernelState;
    uint8_t*                                pCurbeBinary;
} CODECHAL_ENCODE_AVC_PREPROC_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_PREPROC_CURBE_PARAMS;

typedef struct _CODECHAL_ENCODE_AVC_WP_CURBE_PARAMS
{
    uint8_t   RefPicListIdx;
    uint32_t  WPIdx;
} CODECHAL_ENCODE_AVC_WP_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_WP_CURBE_PARAMS;

typedef struct _CODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS
{
    PMOS_SURFACE                       psInputRefBuffer;
    PMOS_SURFACE                       psOutputScaledBuffer;
    uint32_t                           dwVerticalLineStride;
    uint32_t                           dwVerticalLineStrideOffset;
    uint8_t                            ucVDirection;
    PMHW_KERNEL_STATE                  pKernelState;
} CODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS;

//!
//! \struct    CodechalEncodeAvcEnc
//! \brief     Codechal encode Avc Encode
//!
struct CodechalEncodeAvcEnc : public CodechalEncodeAvcBase
{

    typedef struct _CODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS
    {
        union
        {
            struct
            {
                uint32_t   ForceToIntra                                : MOS_BITFIELD_RANGE( 0, 0 );
                uint32_t   Reserved                                    : MOS_BITFIELD_RANGE( 1,31 );
            };
            struct
            {
                uint32_t   Value;
            };
        } DW0;

        union
        {
            struct
            {
                uint32_t   Reserved                                    : MOS_BITFIELD_RANGE(  0,31 );
            };
            struct
            {
                uint32_t   Value;
            };
        } DW1;

        union
        {
            struct
            {
                uint32_t   Reserved                                    : MOS_BITFIELD_RANGE(  0,31 );
            };
            struct
            {
                uint32_t   Value;
            };
        } DW2;

        union
        {
            struct
            {
                uint32_t   Reserved                                    : MOS_BITFIELD_RANGE(  0,31 );
            };
            struct
            {
                uint32_t   Value;
            };
        } DW3;
    } CODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS, *PCODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS;
    C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(CODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS)) == 4);

    // SEI
    CodechalEncodeSeiData               SeiData;                                            //!< Encode SEI data parameter.
    uint32_t                            dwSEIDataOffset;                                    //!< Encode SEI data offset.
    uint8_t*                            pSeiParamBuffer;                                    //!< Encode SEI data buffer.

    bool                                bMbEncCurbeSetInBrcUpdate;                          //!< bMbEncCurbeSetInBrcUpdate.
    bool                                bMbEncIFrameDistEnabled;                            //!< bMbEncIFrameDistEnabled.
    bool                                bBrcInit;                                           //!< BRC init enable flag.
    bool                                bBrcReset;                                          //!< BRC reset enable flag.
    bool                                bBrcEnabled;                                        //!< BRC enable flag.
    bool                                bMbBrcEnabled;                                      //!< MBBrc enable flag.
    bool                                bBrcRoiEnabled;                                     //!< BRC ROI feature enable flag.
    bool                                bROIValueInDeltaQP;                                 //!< ROI QP in delta QP flag.
    bool                                bROISmoothEnabled;                                  //!< ROI smooth area enable flag.
    bool                                bMbBrcUserFeatureKeyControl;                        //!< MBBRC user feature control enable flag.
    double                              dBrcTargetSize;                                     //!< BRC target size.
    uint32_t                            dwTrellis;                                          //!< Trellis Number.
    bool                                bAcceleratorHeaderPackingCaps;                      //!< Flag set by driver from driver caps.
    uint32_t                            dwIntraRefreshQpThreshold;                          //!< Intra Refresh QP Threshold.
    bool                                bSquareRollingIEnabled;                             //!< SquareRollingI enable flag.

    // VME Scratch Buffers
    MOS_RESOURCE                        resVMEScratchBuffer;                                //!< VME Scratch Buffer resource.
    bool                                bVMEScratchBuffer;                                  //!< VME ScratchBuffer enable flag.
    MOS_RESOURCE                        resVmeKernelDumpBuffer;                             //!< VME Kernel Dump resource.
    bool                                bVMEKernelDump;                                     //!< VME kernel dump flag.
    uint32_t                            ulVMEKernelDumpBottomFieldOffset;                   //!< VME Kernel Dump Bottom Field Offset

    // MbEnc
    PMHW_KERNEL_STATE                           pMbEncKernelStates;                                             //!< Pointer to MbEnc Kernel States.
    CODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC     MbEncBindingTable;                                              //!< Pointer to MbEnc BindingTable.
    uint32_t                                    dwNumMbEncEncKrnStates;                                         //!< MbEncEncKrnStates Number.
    CODEC_AVC_REF_PIC_SELECT_LIST               RefPicSelectList[CODECHAL_ENCODE_AVC_REF_PIC_SELECT_ENTRIES];   //!< Array of RefPicSelect.
    uint8_t                                     ucCurrRefPicSelectIndex;                                        //!< Current RefPic Select Index
    uint32_t                                    ulRefPicSelectBottomFieldOffset;                                //!< RefPic Select BottomField Offset
    uint32_t                                    dwMbEncBlockBasedSkipEn;                                        //!< MbEnc Block Based Skip enable flag.
    bool                                        bKernelTrellis;                                                 //!< Kernel controlled Trellis Quantization.
    bool                                        bExtendedMvCostRange;                                           //!< Extended MV Cost Range for Gen10+.

    //MFE MbEnc
    MHW_KERNEL_STATE                            mfeMbEncKernelState;                                             //!< Mfe MbEnc Kernel State.

    // Intra Distortion
    PMHW_KERNEL_STATE                           pIntraDistortionKernelStates;                                   //!< Point to Intra Distortion Kernel States.

    // WP
    PMHW_KERNEL_STATE                   pWPKernelState;                                                         //!< Point to WP Kernel State.
    CODEC_AVC_REF_PIC_SELECT_LIST       WeightedPredOutputPicSelectList[CODEC_AVC_NUM_WP_FRAME];                //!< Array of WeightedPredOutputPicSelectList.

    // BRC Params
    MHW_KERNEL_STATE                                BrcKernelStates[CODECHAL_ENCODE_BRC_IDX_NUM];               //!< Array of BrcKernelStates.
    CODECHAL_ENCODE_AVC_BINDING_TABLE_BRC_UPDATE    BrcUpdateBindingTable;                                      //!< BrcUpdate BindingTable

    // PreProc
    MHW_KERNEL_STATE                                PreProcKernelState;                                         //!< PreProc KernelState
    CODECHAL_ENCODE_AVC_BINDING_TABLE_PREPROC       PreProcBindingTable;                                        //!< PreProc BindingTable

    EncodeBrcBuffers                    BrcBuffers;                                                     //!< BRC related buffers
    uint16_t                            usAVBRAccuracy;                                                 //!< AVBR Accuracy
    uint16_t                            usAVBRConvergence;                                              //!< AVBR Convergence
    double                              dBrcInitCurrentTargetBufFullInBits;                             //!< BRC init current target buffer full in bits
    double                              dBrcInitResetInputBitsPerFrame;                                 //!< BrcInitReset Input Bits Per Frame
    uint32_t                            dwBrcInitResetBufSizeInBits;                                    //!< BrcInitReset Buffer Size In Bits
    uint32_t                            dwBrcInitPreviousTargetBufFullInBits;                           //!< BRC Init Previous Target Buffer Full In Bits
    // Below values will be set if qp control params are sent by app
    bool                                bMinMaxQPControlEnabled;                                        //!< Flag to indicate if min/max QP feature is enabled or not.
    uint8_t                             ucIMinQP;                                                       //!< I frame Minimum QP.
    uint8_t                             ucIMaxQP;                                                       //!< I frame Maximum QP.
    uint8_t                             ucPMinQP;                                                       //!< P frame Minimum QP.
    uint8_t                             ucPMaxQP;                                                       //!< P frame Maximum QP.
    uint8_t                             ucBMinQP;                                                       //!< B frame Minimum QP.
    uint8_t                             ucBMaxQP;                                                       //!< B frame Maximum QP.
    bool                                bPFrameMinMaxQPControl;                                         //!< Indicates min/max QP values for P-frames are set separately or not.
    bool                                bBFrameMinMaxQPControl;                                         //!< Indicates min/max QP values for B-frames are set separately or not.

    uint32_t                            dwSkipFrameBufferSize;                                          //!< size of skip frame packed data.
    MOS_RESOURCE                        resSkipFrameBuffer;                                             //!< copy skip frame packed data from DDI.
    // Mb Disable Skip Map
    bool                                bMbDisableSkipMapEnabled;                                       //!< MbDisableSkipMap Flag.
    PMOS_SURFACE                        psMbDisableSkipMapSurface;                                      //!< Point to MbDisableSkipMap Surface.

    // Mb Qp Data
    bool                                bMbQpDataEnabled;                                               //!< Mb Qp Data Enable Flag.
    MOS_SURFACE                         sMbQpDataSurface;                                               //!< Pointer to MOS_SURFACE of Mb Qp data surface, provided by DDI.

        // Mb specific Data
    bool                                bMbSpecificDataEnabled;
    MOS_RESOURCE                        resMbSpecificDataBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM];

    // Static frame detection
    bool                                bStaticFrameDetectionEnable;                                    //!< Static frame detection enable.
    bool                                bApdatvieSearchWindowEnable;                                    //!< allow search window size change when SFD enabled.
    bool                                bPerMbSFD;                                                      //!<
    MOS_RESOURCE                        resSFDOutputBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM];        //!< Array of SFDOutputBuffer.
    MOS_RESOURCE                        resSFDCostTablePFrameBuffer;                                    //!< SFD CostTable of P Frame.
    MOS_RESOURCE                        resSFDCostTableBFrameBuffer;                                    //!< SFD CostTable of B Frame.
    PMHW_KERNEL_STATE                   pSFDKernelState;                                                //!< Point to SFD kernel state.

    // Generation Specific Support Flags & User Feature Key Reads
    bool                                bBrcDistortionBufferSupported;                                  //!< BRC DistortionBuffer Support Flag.
    bool                                bRefPicSelectListSupported;                                     //!< RefPicSelectList Support Flag.
    uint8_t                             ucMbBrcSupportCaps;                                             //!< MbBrcSupport Capability.
    bool                                bMultiPredEnable;                                               //!< MultiPredictor enable, 6 predictors
    bool                                bFTQEnable;                                                     //!< FTQEnable
    bool                                bCAFSupported;                                                  //!< CAFSupported
    bool                                bCAFEnable;                                                     //!< CAFEnable
    bool                                bCAFDisableHD;                                                  //!< Disable CAF for HD
    bool                                bSkipBiasAdjustmentSupported;                                   //!< SkipBiasAdjustment support for P frame
    bool                                bAdaptiveIntraScalingEnable;                                    //!< Enable AdaptiveIntraScaling
    bool                                bOldModeCostEnable;                                             //!< Enable Old Mode Cost (HSW cost table for BDW)
    bool                                bMultiRefQpEnabled;                                             //!< BDW MultiRef QP
    bool                                bAdvancedDshInUse;                                              //!< Use MbEnc Adv kernel
    bool                                bUseMbEncAdvKernel;                                             //!< Use MbEnc Adv kernel
    bool                                bUseWeightedSurfaceForL0;                                       //!< Use WP Surface for L0
    bool                                bUseWeightedSurfaceForL1;                                       //!< Use WP Surface for L1
    bool                                bWeightedPredictionSupported;                                   //!< Weighted prediction support
    bool                                bBrcSplitEnable;                                                //!< starting GEN9 BRC kernel has split into frame-level and MB-level update.
    bool                                bDecoupleMbEncCurbeFromBRC;                                     //!< starting GEN95 BRC kernel write to extra surface instead of MBEnc curbe.
    bool                                bSliceLevelReportSupported;                                     //!< Slice Level Report support
    bool                                bFBRBypassEnable;                                               //!< FBRBypassEnable
    bool                                bBrcRoiSupported;                                               //!< BRC Roi Support Flag.
    bool                                bMvDataNeededByBRC;                                             //!< starting G95, mv data buffer from HME is needed by BRC frame update kernel.
    bool                                bHighTextureModeCostEnable;                                     //!< HighTexture ModeCost Enable Flag.

    bool                                bRoundingInterEnable;                                           //!< RoundingInter Enable Flag.
    bool                                bAdaptiveRoundingInterEnable;                                   //!< Adaptive Rounding Inter Enable Flag.
    uint32_t                            dwRoundingInterP;                                               //!< Rounding Inter for P frame
    uint32_t                            dwRoundingInterB;                                               //!< Rounding Inter for B frame
    uint32_t                            dwRoundingInterBRef;                                            //!< Rounding Inter for BRef frame
    uint32_t                            dwBrcConstantSurfaceWidth;                                      //!< Brc Constant Surface Width
    uint32_t                            dwBrcConstantSurfaceHeight;                                     //!< Brc Constant Surface Height

    uint32_t                            dwSlidingWindowSize;                                            //!< Sliding Window Size
    bool                                bForceToSkipEnable;                                             //!< ForceToSkip Enable Flag
    bool                                bBRCVarCompuBypass;                                             //!< Bypass variance computation in BRC kernel

    static const uint32_t MaxLenSP[NUM_TARGET_USAGE_MODES];
    static const uint32_t EnableAdaptiveSearch[NUM_TARGET_USAGE_MODES];
    static const uint32_t FTQBasedSkip[NUM_TARGET_USAGE_MODES];
    static const uint32_t HMEBCombineLen[NUM_TARGET_USAGE_MODES];
    static const uint32_t HMECombineLen[NUM_TARGET_USAGE_MODES];
    static const uint32_t SearchX[NUM_TARGET_USAGE_MODES];
    static const uint32_t SearchY[NUM_TARGET_USAGE_MODES];
    static const uint32_t BSearchX[NUM_TARGET_USAGE_MODES];
    static const uint32_t BSearchY[NUM_TARGET_USAGE_MODES];

    static const uint32_t InterRoundingP_TQ[NUM_TARGET_USAGE_MODES];
    static const uint32_t InterRoundingBRef_TQ[NUM_TARGET_USAGE_MODES];
    static const uint32_t InterRoundingB_TQ[NUM_TARGET_USAGE_MODES];
    static const uint32_t TrellisQuantizationEnable[NUM_TARGET_USAGE_MODES];
    static const uint32_t EnableAdaptiveTrellisQuantization[NUM_TARGET_USAGE_MODES];
    static const uint32_t TQ_LAMBDA_I_FRAME[CODEC_AVC_NUM_QP][2];
    static const uint32_t TQ_LAMBDA_P_FRAME[CODEC_AVC_NUM_QP][2];
    static const uint32_t TQ_LAMBDA_B_FRAME[CODEC_AVC_NUM_QP][2];
    static const uint8_t  IntraScalingFactor_Cm_Common[64];
    static const uint8_t  AdaptiveIntraScalingFactor_Cm_Common[64];
    static const uint32_t OldIntraModeCost_Cm_Common[CODEC_AVC_NUM_QP];
    static const uint32_t MvCost_PSkipAdjustment_Cm_Common[CODEC_AVC_NUM_QP];
    static const uint16_t SkipVal_B_Common[2][2][64];
    static const uint16_t SkipVal_P_Common[2][2][64];
    static const uint32_t PreProcFtqLut_Cm_Common[CODEC_AVC_NUM_QP][16];
    static const uint32_t MBBrcConstantData_Cm_Common[3][CODEC_AVC_NUM_QP][16];

    static const uint32_t ModeMvCost_Common[3][CODEC_AVC_NUM_QP][8];
    static const uint16_t RefCost_Common[3][64];
    static const uint8_t  MaxRefIdx0_Progressive_4K[NUM_TARGET_USAGE_MODES];
    static const uint8_t  MaxRefIdx0[NUM_TARGET_USAGE_MODES];
    static const uint8_t  MaxBRefIdx0[NUM_TARGET_USAGE_MODES];
    static const uint8_t  MaxRefIdx1[NUM_TARGET_USAGE_MODES];
    static const uint32_t SuperHME[NUM_TARGET_USAGE_MODES];
    static const uint32_t UltraHME[NUM_TARGET_USAGE_MODES];

    static const uint32_t ModeMvCost_Cm[3][52][8];

    static const uint8_t  m_qpDistMaxFrameAdjustmentCm[576];
    static const uint32_t MultiPred[NUM_TARGET_USAGE_MODES];
    static const uint32_t MRDisableQPCheck[NUM_TARGET_USAGE_MODES];
    static const uint16_t RefCost_MultiRefQp[NUM_PIC_TYPES][64];
    static const uint32_t CODECHAL_ENCODE_AVC_AllFractional_Common[NUM_TARGET_USAGE_MODES];
    static const uint32_t CODECHAL_ENCODE_AVC_DisableAllFractionalCheckForHighRes_Common[NUM_TARGET_USAGE_MODES];

    static const uint32_t m_refThreshold = 400;
    static const uint32_t m_mbencNumTargetUsages = 3;
    static const uint32_t m_brcConstantSurfaceEarlySkipTableSize = 128;
    static const uint32_t m_brcConstantSurfaceRefCostSize = 128;
    static const uint32_t m_brcConstantSurfacModeMvCostSize = 1664;

    typedef enum _ID_OFFSET_MBENC_CM
    {
        MBENC_I_OFFSET_CM = 0,
        MBENC_P_OFFSET_CM = 1,
        MBENC_B_OFFSET_CM = 2,
        MBENC_TARGET_USAGE_CM = 3
    } ID_OFFSET_MBENC_CM;

    //!
    //! \brief    Constructor
    //!
    CodechalEncodeAvcEnc(
        CodechalHwInterface *   hwInterface,
        CodechalDebugInterface *debugInterface,
        PCODECHAL_STANDARD_INFO standardInfo);

    //!
    //! \brief    Copy constructor
    //!
    CodechalEncodeAvcEnc(const CodechalEncodeAvcEnc&) = delete;

    //!
    //! \brief    Copy assignment operator
    //!
    CodechalEncodeAvcEnc& operator=(const CodechalEncodeAvcEnc&) = delete;

    //!
    //! \brief    Destructor
    //!
    virtual ~CodechalEncodeAvcEnc();

    //Encode interface implementations
    //!
    //! \brief    Initialize standard related members.
    //! \details  Initialize members, set proper value
    //!           to involved variables, allocate resources.
    //!
    //! \param    [in] settings
    //!           Encode settings.
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success
    //!
    virtual MOS_STATUS Initialize(
        CodechalSetting * settings) override;

    //!
    //! \brief    Initialize encoder related members.
    //! \details  Initialize members, set proper value
    //!           to involved variables, allocate resources.
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success
    //!
    virtual MOS_STATUS InitializePicture(const EncoderParams& params) override;

    //!
    //! \brief    Call media kernel functions.
    //! \details  Call to related encode kernel functions.
    //! 
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success
    //!
    virtual MOS_STATUS ExecuteKernelFunctions() override;

    //!
    //! \brief    Encode frame in picture level.
    //! \details  Call related encode functions to encode
    //!           one frame in picture level.
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success
    //!
    virtual MOS_STATUS ExecutePictureLevel() override;

    //!
    //! \brief    Encode frame in slice level.
    //! \details  Call related encode functions to encode
    //!           one frame in slice level.
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success
    //!
    virtual MOS_STATUS ExecuteSliceLevel() override;

    //!
    //! \brief    Encode User Feature Key Report.
    //! \details  Report user feature values set by encode.
    //! 
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success
    //!
    virtual MOS_STATUS UserFeatureKeyReport() override;

    virtual MOS_STATUS ExecutePreEnc(EncoderParams* encodeParams) override;
    //!
    //! \brief    Slice map surface programming
    //! \details  Set slice map data.
    //! 
    //! \param    [in] data
    //!           Encode interface
    //! \param    [in] avcSliceParams
    //!           Slice map command params
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success
    //!
    virtual MOS_STATUS EncodeGenerateSliceMap(
        uint8_t* data,
        PCODEC_AVC_ENCODE_SLICE_PARAMS avcSliceParams);

    //!
    //! \brief    Allocate necessary resources.
    //! 
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success
    //!
    virtual MOS_STATUS AllocateResources() override;

    //!
    //! \brief    Allocate necessary resources for BRC case.
    //! 
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success
    //!
    virtual MOS_STATUS AllocateResourcesBrc();

    //!
    //! \brief    Allocate necessary resources for MBBRC case.
    //! 
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success
    //!
    virtual MOS_STATUS AllocateResourcesMbBrc();

    //!
    //! \brief    Release allocated resources for BRC case.
    //! 
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success
    //!
    virtual MOS_STATUS ReleaseResourcesBrc();

    //!
    //! \brief    Release allocated resources for MBBRC case.
    //! 
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success
    //!
    virtual MOS_STATUS ReleaseResourcesMbBrc();

    //!
    //! \brief    AVC Enc State Initialization.
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success
    //!
    virtual MOS_STATUS Initialize() override;

    //!
    //! \brief    Generic State Picture Level Encoding..
    //!
    //! \param    [in] params
    //!           Pointer to the CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success
    //!
    virtual MOS_STATUS GenericEncodePictureLevel(
        PCODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS   params);

    //!
    //! \brief    Run Encode ME kernel
    //!
    //! \param    [in] brcBuffers
    //!           Pointer to the EncodeBrcBuffers
    //! \param    [in] hmeLevel
    //!           Hme level
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success
    //!
    virtual MOS_STATUS GenericEncodeMeKernel(EncodeBrcBuffers* brcBuffers, HmeLevel hmeLevel);

    //!
    //! \brief    Initialize Encode ME kernel state
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success
    //!
    virtual MOS_STATUS InitKernelStateMe() override;

    //!
    //! \brief    Set Encode ME kernel Curbe data.
    //!
    //! \param    [in] params
    //!           Pointer to the MeCurbeParams
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success
    //!
    virtual MOS_STATUS SetCurbeMe (
        MeCurbeParams* params) override;

    //!
    //! \brief    Set Encode ME kernel Surfaces
    //!
    //! \param    [in] cmdBuffer
    //!           Pointer to the PMOS_COMMAND_BUFFER
    //! \param    [in] params
    //!           Pointer to the CODECHAL_ME_SURFACE_PARAMS
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success
    //!
    virtual MOS_STATUS SendMeSurfaces (
        PMOS_COMMAND_BUFFER cmdBuffer,
        MeSurfaceParams* params) override;

    // AvcState functions.
    //!
    //! \brief    Initialize data members of AVC encoder instance
    //! 
    //! \return   void
    //!
    virtual void InitializeDataMember();

    // state related funcs
    //!
    //! \brief    Initialize encode state
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS InitializeState();

    //!
    //! \brief    Validate reference list L0 and L1.
    //!
    //! \param    [in] params
    //!           Pointer to CODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS ValidateNumReferences(
        PCODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS               params);

    //!
    //! \brief    Initialize brc constant buffer
    //!
    //! \param    [in] params
    //!           Pointer to CODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS InitBrcConstantBuffer(
        PCODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS        params);

    //!
    //! \brief    Initialize mbbrc constant buffer
    //!
    //! \param    [in] params
    //!           Pointer to CODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS InitMbBrcConstantDataBuffer(
        PCODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS params);

    //!
    //! \brief    Get inter rounding value.
    //!
    //! \param    [in] sliceState
    //!           Pointer to MHW_VDBOX_AVC_SLICE_STATE
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS GetInterRounding(
        PMHW_VDBOX_AVC_SLICE_STATE sliceState);

    //!
    //! \brief    Calculate lambda table.
    //!
    //! \param    [in] slice_type
    //!           Slice type.
    //! \param    [out] lambda
    //!           Lambda table.
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS CalcLambdaTable(
        uint16_t slice_type,
        uint32_t* lambda);

    //!
    //! \brief    Get Trellis Quantization mode/value enable or not.
    //!
    //! \param    [in] params
    //!           Pointer to CODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS.
    //! \param    [out] trellisQuantParams
    //!           Pointer to CODECHAL_ENCODE_AVC_TQ_PARAMS, mode & value setup.
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS GetTrellisQuantization(
        PCODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS    params,
        PCODECHAL_ENCODE_AVC_TQ_PARAMS          trellisQuantParams)
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Get Skip Bias Adjustment.
    //!
    //! \param    [in] sliceQP
    //!           Slice QP.
    //! \param    [in] gopRefDist
    //!           GOP reference dist.
    //! \param    [in] skipBiasAdjustmentEnable
    //!           Adjustable or not.
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS GetSkipBiasAdjustment(
        uint8_t sliceQP,
        uint16_t gopRefDist,
        bool* skipBiasAdjustmentEnable);

    //!
    //! \brief    Get Hme Supported Based On TU.
    //!
    //! \param    [in] hmeLevel
    //!           HME level
    //! \param    [out] supported
    //!           Supported or not
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS GetHmeSupportedBasedOnTU(
        HmeLevel hmeLevel,
        bool *supported);

    //!
    //! \brief    Get MbBrc status.
    //!
    //! \param    [in] targetUsage
    //!           Target Usage.
    //! \param    [out] mbBrcEnabled
    //!           MBBRC enabled or not
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS GetMbBrcEnabled(
        uint32_t                    targetUsage,
        bool                       *mbBrcEnabled);

    //!
    //! \brief    CAF enabled or not.
    //!
    //! \param    [out] cafEnable
    //!           CAF enabled or not
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS GetCAFEnabled(
        bool *cafEnable);

    //!
    //! \brief    ATD enabled or not.
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS GetATDEnabled();

    //!
    //! \brief    Init BRC reset kernel
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS BrcInitResetKernel();

    //!
    //! \brief    Init MbEnc kernel state
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS InitKernelStateMbEnc()
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Init Weight Prediction kernel state
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS InitKernelStateWP()
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Init BRC kernel state
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS InitKernelStateBrc()
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Init FEI PreProc kernel state
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS InitKernelStatePreProc()
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Init SFD(still frame detection) kernel state
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS InitKernelStateSFD();

    //!
    //! \brief    Init kernel state
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS InitKernelState();

    //!
    //! \brief    Insert RefPic Select List
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS InsertInRefPicSelectList();

    //!
    //! \brief    Run MbEnc Kernel.
    //!
    //! \param    [in] mbEncIFrameDistInUse
    //!           MbEncIFrameDist in use or not
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS MbEncKernel(
        bool mbEncIFrameDistInUse);

    //!
    //! \brief    Run Brc Frame Update Kernel.
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS BrcFrameUpdateKernel();

    //!
    //! \brief    Run Brc Copy Kernel.
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS BrcCopyKernel();

    //!
    //! \brief    Run Brc MB update Kernel.
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS BrcMbUpdateKernel();

    //!
    //! \brief    Run MbEnc Kernel.
    //!
    //! \param    [in] useRefPicList1
    //!           Use RefPicList 1 or Not.
    //! \param    [in] index
    //!           Index
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS WPKernel(
                    bool useRefPicList1,
                    uint32_t index);

    //!
    //! \brief    Run SFD(still frame detection) kernel
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SFDKernel();

    //!
    //! \brief    Get MbEnc kernel state Idx
    //!
    //! \param    [in] params
    //!           Pointer to the CodechalEncodeIdOffsetParams
    //! \param    [in] kernelOffset
    //!           kernel offset 
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS GetMbEncKernelStateIdx(
        CodechalEncodeIdOffsetParams*          params,
        uint32_t*                              kernelOffset)
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Get MbEnc kernel curbe data
    //!
    //! \param    [in] params
    //!           Pointer to CODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SetCurbeAvcMbEnc(
        PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS params)
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Set MFE MbEnc kernel curbe data
    //!
    //! \param    [in] mbEncIFrameDistInUse
    //!           MbEncIFrameDist in use or not
    //!
    //! \return   BOOL
    //!           true if MFE MbEnc is enabled, otherwise false
    //!
    virtual bool IsMfeMbEncEnabled(
        bool mbEncIFrameDistInUse)
    {
        return false;
    }

    //!
    //! \brief    Init Mfe MbEnc kernel state
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS InitKernelStateMfeMbEnc()
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Defer init MFE specific resoruces and flags.
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS InitMfe()
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Set MFE MbEnc kernel curbe data
    //!
    //! \param    [in] params
    //!           Pointer to CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SetCurbeAvcMfeMbEnc(
        PCODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS params)
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Update binding table for MFE MbEnc kernel
    //!
    //! \param    [in] submitIndex
    //!           Index in this mfe submission call
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS UpdateMfeMbEncBindingTable(
        uint32_t submitIndex)
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Get Weighted Prediction kernel curbe data
    //!
    //! \param    [in] params
    //!           Pointer to CODECHAL_ENCODE_AVC_WP_CURBE_PARAMS
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SetCurbeAvcWP(
        PCODECHAL_ENCODE_AVC_WP_CURBE_PARAMS params)
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Get FEI PreProc kernel curbe data
    //!
    //! \param    [in] params
    //!           Pointer to CODECHAL_ENCODE_AVC_PREPROC_CURBE_PARAMS
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SetCurbeAvcPreProc(
        PCODECHAL_ENCODE_AVC_PREPROC_CURBE_PARAMS params)
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Get BRC InitReset kernel curbe data
    //!
    //! \param    [in] params
    //!           Pointer to CODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SetCurbeAvcBrcInitReset(
        PCODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS params)
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Get FrameBRCUpdate kernel curbe data
    //!
    //! \param    [in] params
    //!           Pointer to CODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SetCurbeAvcFrameBrcUpdate(
        PCODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS params)
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Get MbBrcUpdate kernel curbe data
    //!
    //! \param    [in] params
    //!           Pointer to CODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SetCurbeAvcMbBrcUpdate(
        PCODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS params)
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Get Brc Block Copy kernel curbe data
    //!
    //! \param    [in] params
    //!           Pointer to CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SetCurbeAvcBrcBlockCopy(
        PCODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS params)
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Get SFD kernel curbe data
    //!
    //! \param    [in] params
    //!           Pointer to CODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SetCurbeAvcSFD(
        PCODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS params);

    //!
    //! \brief    Set Sequence Structs
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SetSequenceStructs() override;

    //!
    //! \brief    Set Sequence Structs
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SetPictureStructs() override;

    //!
    //! \brief    Set slice Structs
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS SetSliceStructs() override;

    //!
    //! \brief    Set BRC InitReset kernel Surface
    //!
    //! \param    [in] cmdBuffer
    //!           Cmd Buffer
    //! \param    [in] params
    //!           Pointer to CODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS SendBrcInitResetSurfaces(
        PMOS_COMMAND_BUFFER cmdBuffer,
        PCODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS params);

    //!
    //! \brief    Set MbEnc kernel Surface data
    //!
    //! \param    [in] cmdBuffer
    //!           Cmd Buffer
    //! \param    [in] params
    //!           Pointer to CODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SendAvcMbEncSurfaces(
        PMOS_COMMAND_BUFFER cmdBuffer,
        PCODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS params)
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Set Weighted Prediction kernel Surface state
    //!
    //! \param    [in] cmdBuffer
    //!           Cmd Buffer
    //! \param    [in] params
    //!           Pointer to CODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SendAvcWPSurfaces(
        PMOS_COMMAND_BUFFER cmdBuffer,
        PCODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS params)
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Set FEI PreProc kernel Surface state
    //!
    //! \param    [in] cmdBuffer
    //!           Cmd Buffer
    //! \param    [in] params
    //!           Pointer to CODECHAL_ENCODE_AVC_PREPROC_SURFACE_PARAMS
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SendAvcPreProcSurfaces(
        PMOS_COMMAND_BUFFER cmdBuffer,
        PCODECHAL_ENCODE_AVC_PREPROC_SURFACE_PARAMS params)
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Set BrcFrameUpdate kernel Surface state
    //!
    //! \param    [in] cmdBuffer
    //!           Cmd Buffer
    //! \param    [in] params
    //!           pointer to CODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SendAvcBrcFrameUpdateSurfaces(
        PMOS_COMMAND_BUFFER cmdBuffer,
        PCODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS params)
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Set BrcMbUpdate kernel Surface state
    //!
    //! \param    [in] cmdBuffer
    //!           Cmd Buffer
    //! \param    [in] params
    //!           Pointer to CODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SendAvcBrcMbUpdateSurfaces(
        PMOS_COMMAND_BUFFER cmdBuffer,
        PCODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS params)
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief    Set SFD kernel Surface state
    //!
    //! \param    [in] cmdBuffer
    //!           Cmd Buffer
    //! \param    [in] params
    //!           Pointer to CODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SendAvcSFDSurfaces(
        PMOS_COMMAND_BUFFER cmdBuffer,
        PCODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS params);

    //!
    //! \brief    Set ROI kernel Surface state
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SetupROISurface()
    {
        return MOS_STATUS_SUCCESS;
    }

    //!
    //! \brief  Inserts the generic prologue command for a command buffer
    //! \param  [in] cmdBuffer
    //!         Command buffer
    //! \param  [in] frameTracking
    //!         Indicate if frame tracking requested
    //! \return MOS_STATUS
    //!         MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SendPrologWithFrameTracking(
        PMOS_COMMAND_BUFFER         cmdBuffer,
        bool                        frameTracking,
        MHW_MI_MMIOREGISTERS       *mmioRegister = nullptr) override;

    //!
    //! \brief  Realize the scene change report
    //! \param  [in] cmdBuffer
    //!         Command buffer
    //!         [in]  params
    //!           Pointer to the CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS
    //! \return MOS_STATUS
    //!         MOS_STATUS_SUCCESS if success
    //!
    virtual MOS_STATUS SceneChangeReport(
        PMOS_COMMAND_BUFFER       cmdBuffer,
        PCODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS  params)
    {
        return MOS_STATUS_SUCCESS;
    };

    //! \brief    Dump encode kernel output
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS DumpEncodeKernelOutput();

    //!
    //! \brief    Calculate skip value
    //! \param    [in] encBlockBasedSkipEn
    //!           Indicate if encode block Based skip enabled
    //! \param    [in] transform8x8Flag
    //!           Indicate if transform8*8 makes effect
    //! \param    [in] skipVal
    //!           input Skip value
    //! \return   uint16_t
    //!           return the updated Skip value
    //!
    uint16_t CalcSkipVal(
        bool    encBlockBasedSkipEn,
        bool    transform8x8Flag,
        uint16_t  skipVal);

    //!
    //! \brief    Get Max MV value per 2 mbs based on LevelIdc
    //! \details  VDBOX private function to get max MV value per 2 mbs
    //! \param    [in] levelIdc
    //!           AVC level
    //! \return   uint32_t
    //!           return the max mv value per 2 mbs
    //!
    uint32_t GetMaxMvsPer2Mb(uint8_t levelIdc);

     //!
     //! \brief    Get QP value
     //! \param    [in] params 
     //!           AVC mbenc cubre params
     //! \param    [in] list
     //!           forword or backword reference
     //! \param    [in] index
     //!           reference frame index
     //! \return   uint8_t
     //!           return 0
    uint32_t GetRefPicFieldFlag(
        PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS     params,
        uint32_t                                    list,
        uint32_t                                    index);

     //!
     //! \brief    Get QP value
     //! \param    [in] params 
     //!           AVC mbenc cubre params
     //! \param    [list] list
     //!           forword or backword reference
     //! \param    [in] index
     //!           reference frame index
     //! \return   uint8_t
     //!           return 0
    uint8_t AVCGetQPValueFromRefList(
        PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS     params,
        uint32_t                                    list,
        uint32_t                                    index);

     //!
     //! \brief    Send surfaces for the AVC BRC Block Copy kernel
     //! \param    [in] hwInterface 
     //!           Hardware interface
     //! \param    [in] cmdBuffer
     //!           comand buffer
     //! \param    [in] mbEncKernelState 
     //!           MB encoder kernel state 
     //! \param    [in] kernelState 
     //!           Kernel State
     //! \param    [in] presAdvancedDsh
     //!           pmos resource
     //! \return   MOS_STATUS
     //!           MOS_STATUS_SUCCESS if success, else fail reason
     //!
    MOS_STATUS SendBrcBlockCopySurfaces(
        CodechalHwInterface    *hwInterface,
        PMOS_COMMAND_BUFFER     cmdBuffer,
        PMHW_KERNEL_STATE       mbEncKernelState,
        PMHW_KERNEL_STATE       kernelState,
        PMOS_RESOURCE           presAdvancedDsh);

#if USE_CODECHAL_DEBUG_TOOL
protected:
    virtual MOS_STATUS DumpSeqParFile()  override;
    virtual MOS_STATUS DumpFrameParFile() override;

    virtual MOS_STATUS PopulateHmeParam(
        bool    is16xMeEnabled,
        bool    is32xMeEnabled,
        uint8_t meMethod,
        void    *cmd) override;
#endif
};
#endif  // __CODECHAL_ENCODE_AVC_H__
