/*
* Copyright (c) 2014-2020, 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     mhw_vdbox_hcp_interface.h
//! \brief    MHW interface for constructing HCP commands for the Vdbox engine
//! \details  Defines the interfaces for constructing MHW Vdbox HCP commands across all platforms
//!

#ifndef _MHW_VDBOX_HCP_INTERFACE_H_
#define _MHW_VDBOX_HCP_INTERFACE_H_

#include "mhw_vdbox.h"
#include "mhw_mi.h"
#include "codec_def_encode_hevc.h"

#define MHW_HCP_WORST_CASE_LCU_CU_TU_INFO        (26 * MHW_CACHELINE_SIZE) // 18+4+4
#define MHW_HCP_WORST_CASE_LCU_CU_TU_INFO_REXT   (35 * MHW_CACHELINE_SIZE) // 27+4+4

#define MHW_HCP_WORST_CASE_CU_TU_INFO            (4 * MHW_CACHELINE_SIZE) // 2+1+1
#define MHW_HCP_WORST_CASE_CU_TU_INFO_REXT       (6 * MHW_CACHELINE_SIZE) // 4+1+1

struct MHW_VDBOX_HEVC_PIC_STATE
{
    // Decode
    PCODEC_HEVC_PIC_PARAMS                  pHevcPicParams = nullptr;

    // Encode
    PCODEC_HEVC_ENCODE_SEQUENCE_PARAMS      pHevcEncSeqParams = nullptr;
    PCODEC_HEVC_ENCODE_PICTURE_PARAMS       pHevcEncPicParams = nullptr;
    bool                                    bSAOEnable = false;
    bool                                    bNotFirstPass = false;
    bool                                    bHevcRdoqEnabled = false;
    bool                                    bUseVDEnc = false;
    bool                                    sseEnabledInVmeEncode = false;
    PMHW_BATCH_BUFFER                       pBatchBuffer = nullptr;
    bool                                    bBatchBufferInUse = false;
    bool                                    bRDOQIntraTUDisable = false;
    uint16_t                                wRDOQIntraTUThreshold = 0;
    uint32_t                                brcNumPakPasses = 0;
    bool                                    rhodomainRCEnable = false;
    bool                                    bTransformSkipEnable = false;

    //FEI multiple passes PAK ---max frame size
    uint16_t                                currPass = 0;
    uint8_t                                *deltaQp = nullptr;
    uint32_t                                maxFrameSize = 0;
    virtual ~MHW_VDBOX_HEVC_PIC_STATE(){}
};
using PMHW_VDBOX_HEVC_PIC_STATE = MHW_VDBOX_HEVC_PIC_STATE * ;

typedef struct _MHW_VDBOX_HEVC_TILE_STATE
{
    PCODEC_HEVC_PIC_PARAMS          pHevcPicParams;
    uint16_t                       *pTileColWidth;
    uint16_t                       *pTileRowHeight;
} MHW_VDBOX_HEVC_TILE_STATE, *PMHW_VDBOX_HEVC_TILE_STATE;

typedef struct _MHW_VDBOX_HCP_BUFFER_SIZE_PARAMS
{
    uint8_t    ucMaxBitDepth;
    uint8_t    ucChromaFormat;
    uint32_t   dwCtbLog2SizeY;
    uint32_t   dwPicWidth;
    uint32_t   dwPicHeight;
    uint32_t   dwBufferSize;
    uint32_t   dwMaxFrameSize;
}MHW_VDBOX_HCP_BUFFER_SIZE_PARAMS, *PMHW_VDBOX_HCP_BUFFER_SIZE_PARAMS;

typedef struct _MHW_VDBOX_HCP_BUFFER_REALLOC_PARAMS
{
    uint8_t    ucMaxBitDepth;
    uint8_t    ucChromaFormat;
    uint32_t   dwPicWidth;
    uint32_t   dwPicHeight;
    uint32_t   dwPicWidthAlloced;
    uint32_t   dwPicHeightAlloced;
    uint32_t   dwCtbLog2SizeY;
    uint32_t   dwCtbLog2SizeYMax;
    uint32_t   dwFrameSize;
    uint32_t   dwFrameSizeAlloced;
    bool       bNeedBiggerSize;
}MHW_VDBOX_HCP_BUFFER_REALLOC_PARAMS, *PMHW_VDBOX_HCP_BUFFER_REALLOC_PARAMS;

struct MHW_VDBOX_HEVC_REF_IDX_PARAMS
{
    CODEC_PICTURE                   CurrPic = {};
    bool                            isEncode = false;
    uint8_t                         ucList = 0;
    uint8_t                         ucNumRefForList = 0;
    CODEC_PICTURE                   RefPicList[2][CODEC_MAX_NUM_REF_FRAME_HEVC] = {};
    void                            **hevcRefList = nullptr;
    int32_t                         poc_curr_pic = 0;
    int32_t                         poc_list[CODEC_MAX_NUM_REF_FRAME_HEVC] = {};
    int8_t                         *pRefIdxMapping = 0;
    uint16_t                        RefFieldPicFlag = 0;
    uint16_t                        RefBottomFieldFlag = 0;
    bool                            bDummyReference = false;
    virtual ~MHW_VDBOX_HEVC_REF_IDX_PARAMS(){}
};
using PMHW_VDBOX_HEVC_REF_IDX_PARAMS = MHW_VDBOX_HEVC_REF_IDX_PARAMS * ;

typedef struct _MHW_VDBOX_HEVC_WEIGHTOFFSET_PARAMS
{
    uint8_t                         ucList;
    char                            LumaWeights[2][15];
    int16_t                         LumaOffsets[2][15];
    char                            ChromaWeights[2][15][2];
    int16_t                         ChromaOffsets[2][15][2];
} MHW_VDBOX_HEVC_WEIGHTOFFSET_PARAMS, *PMHW_VDBOX_HEVC_WEIGHTOFFSET_PARAMS;

typedef struct _MHW_VDBOX_ENCODE_HEVC_TRANSFORM_SKIP_PARAMS
{
    bool     Transformskip_enabled;
    uint16_t Transformskip_lambda;
    uint8_t  Transformskip_Numzerocoeffs_Factor0;
    uint8_t  Transformskip_Numnonzerocoeffs_Factor0;
    uint8_t  Transformskip_Numzerocoeffs_Factor1;
    uint8_t  Transformskip_Numnonzerocoeffs_Factor1;
}MHW_VDBOX_ENCODE_HEVC_TRANSFORM_SKIP_PARAMS, *PMHW_VDBOX_ENCODE_HEVC_TRANSFORM_SKIP_PARAMS;

struct MHW_VDBOX_HEVC_SLICE_STATE
{
    PCODEC_PIC_ID                   pHevcPicIdx = nullptr;
    PMOS_RESOURCE                   presDataBuffer = nullptr;
    uint32_t                        dwDataBufferOffset = 0;
    uint32_t                        dwOffset = 0;
    uint32_t                        dwLength = 0;
    uint32_t                        dwSliceIndex = 0;
    bool                            bLastSlice = false;
    bool                            bLastSliceInTile = false;
    bool                            bLastSliceInTileColumn = false;
    bool                            bHucStreamOut = false;
    int8_t                         *pRefIdxMapping = nullptr;
    bool                            bSaoLumaFlag = false;
    bool                            bSaoChromaFlag = false;

    PCODEC_HEVC_SLICE_PARAMS        pHevcSliceParams = nullptr;
    PCODEC_HEVC_PIC_PARAMS          pHevcPicParams = nullptr;

    // Encoding Only
    PCODEC_HEVC_ENCODE_SEQUENCE_PARAMS      pEncodeHevcSeqParams = nullptr;
    PCODEC_HEVC_ENCODE_PICTURE_PARAMS       pEncodeHevcPicParams = nullptr;
    PCODEC_HEVC_ENCODE_SLICE_PARAMS         pEncodeHevcSliceParams = nullptr;
    PBSBuffer                               pBsBuffer = nullptr;
    PCODECHAL_NAL_UNIT_PARAMS              *ppNalUnitParams = nullptr;
    bool                                    bFirstPass = false;
    bool                                    bLastPass = false;
    bool                                    bIntraRefFetchDisable = false;
    bool                                    bBrcEnabled = false;
    uint32_t                                dwHeaderBytesInserted = 0;
    uint32_t                                dwHeaderDummyBytes = 0;
    uint32_t                                uiSkipEmulationCheckCount = 0;
    bool                                    bInsertBeforeSliceHeaders = false;
    bool                                    bIsLowDelay = false;
    // Encoding + BRC only
    PMHW_BATCH_BUFFER                       pBatchBufferForPakSlices = nullptr;
    bool                                    bSingleTaskPhaseSupported = false;
    uint32_t                                dwBatchBufferForPakSlicesStartOffset = 0;
    bool                                    bVdencInUse = false;
    bool                                    bVdencHucInUse = false;
    bool                                    bWeightedPredInUse = false;
    PMHW_BATCH_BUFFER                       pVdencBatchBuffer = nullptr;

    //Pak related params
    MHW_VDBOX_ENCODE_HEVC_TRANSFORM_SKIP_PARAMS EncodeHevcTransformSkipParams = {};
    bool                                    DeblockingFilterDisable = false;
    char                                    TcOffsetDiv2 = 0;
    char                                    BetaOffsetDiv2 = 0;

    uint8_t                                 RoundingIntra = 0;
    uint8_t                                 RoundingInter = 0;
    virtual ~MHW_VDBOX_HEVC_SLICE_STATE(){}
};
using PMHW_VDBOX_HEVC_SLICE_STATE = MHW_VDBOX_HEVC_SLICE_STATE * ;

typedef struct _MHW_VDBOX_VP9_ENCODE_PIC_STATE
{
    PCODEC_VP9_ENCODE_PIC_PARAMS        pVp9PicParams;
    PCODEC_REF_LIST                    *ppVp9RefList;
    PCODEC_VP9_ENCODE_SEQUENCE_PARAMS   pVp9SeqParams;

    union
    {
        struct
        {
            uint8_t                    KeyFrame : 1;        // [0..1]
            uint8_t                    IntraOnly : 1;        // [0..1]
            uint8_t                    Display : 1;        // [0..1]
            uint8_t                    ReservedField : 5;        // [0]
        } fields;
        uint8_t                        value;
    } PrevFrameParams;

    uint32_t                        dwPrevFrmWidth;
    uint32_t                        dwPrevFrmHeight;
    uint8_t                         ucTxMode;
    bool                            bUseDysRefSurface;
    bool                            bNonFirstPassFlag;
    bool                            bSSEEnable;
    bool                            bVdencPakOnlyPassFlag;
    uint32_t                        uiMaxBitRate;
    uint32_t                        uiMinBitRate;

} MHW_VDBOX_VP9_ENCODE_PIC_STATE, *PMHW_VDBOX_VP9_ENCODE_PIC_STATE;

typedef struct _MHW_VDBOX_VP9_PIC_STATE
{
    // Decode
    PCODEC_VP9_PIC_PARAMS              pVp9PicParams;
    PCODEC_REF_LIST                   *ppVp9RefList;

    union
    {
        struct
        {
            uint8_t                    KeyFrame : 1;        // [0..1]
            uint8_t                    IntraOnly : 1;        // [0..1]
            uint8_t                    Display : 1;        // [0..1]
            uint8_t                    ReservedField : 5;        // [0]
        } fields;
        uint8_t                        value;
    } PrevFrameParams;

    uint32_t                           dwPrevFrmWidth;
    uint32_t                           dwPrevFrmHeight;

} MHW_VDBOX_VP9_PIC_STATE, *PMHW_VDBOX_VP9_PIC_STATE;

typedef struct _MHW_VDBOX_IMAGE_STATUS_CONTROL
{
    union
    {
        struct
        {
            uint32_t   MaxMbConformanceFlag : 1;
            uint32_t   FrameBitcountFlag : 1;
            uint32_t   Panic : 1;
            uint32_t   MissingHuffmanCode : 1; // new addition for JPEG encode
            uint32_t   : 4;
            uint32_t   TotalNumPass : 4;
            uint32_t   VDENCSliceOverflowErrorOccurred : 1;
            uint32_t   NumPassPolarityChange : 2;
            uint32_t   CumulativeSliceQpPolarityChange : 1;
            uint32_t   SuggestedSliceQPDelta : 8;
            uint32_t   CumulativeSliceDeltaQP : 8;
        };

        struct
        {
            uint32_t   hcpLCUMaxSizeViolate : 1;
            uint32_t   hcpFrameBitCountViolateOverRun : 1;
            uint32_t   hcpFrameBitCountViolateUnderRun : 1;
            uint32_t   : 5;
            uint32_t   hcpTotalPass : 4;
            uint32_t   : 4;
            uint32_t   hcpCumulativeFrameDeltaLF : 7;
            uint32_t   : 1;
            uint32_t   hcpCumulativeFrameDeltaQp : 8;
        };

        struct
        {
            uint32_t   Value;
        };
    };
}MHW_VDBOX_IMAGE_STATUS_CONTROL, *PMHW_VDBOX_IMAGE_STATUS_CONTROL;

typedef struct _MHW_VDBOX_PAK_NUM_OF_SLICES
{
    // Num Slices
    union
    {
        struct
        {
            uint32_t   NumberOfSlices : 16;
            uint32_t   Reserved : 16;
        };

        struct
        {
            uint32_t   Value;
        };
    };
}MHW_VDBOX_PAK_NUM_OF_SLICES, *PMHW_VDBOX_PAK_NUM_OF_SLICES;

// definition for HEVC/VP9 internal buffer type
typedef enum _MHW_VDBOX_HCP_INTERNAL_BUFFER_TYPE
{
    MHW_VDBOX_HCP_INTERNAL_BUFFER_DBLK_LINE = 0x0,
    MHW_VDBOX_HCP_INTERNAL_BUFFER_DBLK_TILE_LINE,
    MHW_VDBOX_HCP_INTERNAL_BUFFER_DBLK_TILE_COL,
    MHW_VDBOX_HCP_INTERNAL_BUFFER_MV_UP_RT_COL,
    MHW_VDBOX_HCP_INTERNAL_BUFFER_META_LINE,
    MHW_VDBOX_HCP_INTERNAL_BUFFER_META_TILE_LINE,
    MHW_VDBOX_HCP_INTERNAL_BUFFER_META_TILE_COL,
    MHW_VDBOX_HCP_INTERNAL_BUFFER_TR_NBR,
    MHW_VDBOX_HCP_INTERNAL_BUFFER_SAO_LINE,
    MHW_VDBOX_HCP_INTERNAL_BUFFER_SAO_TILE_LINE,
    MHW_VDBOX_HCP_INTERNAL_BUFFER_SAO_TILE_COL,
    MHW_VDBOX_HCP_INTERNAL_BUFFER_HSSE_RS,
    MHW_VDBOX_HCP_INTERNAL_BUFFER_HSAO_RS,
    MHW_VDBOX_HCP_INTERNAL_BUFFER_CURR_MV_TEMPORAL,
    MHW_VDBOX_HCP_INTERNAL_BUFFER_COLL_MV_TEMPORAL,
    MHW_VDBOX_HCP_INTERNAL_BUFFER_SLC_STATE_STREAMOUT,
    MHW_VDBOX_HCP_INTERNAL_BUFFER_CABAC_STREAMOUT,
    MHW_VDBOX_HCP_INTERNAL_BUFFER_MV_UP_RIGHT_COL,
    MHW_VDBOX_HCP_INTERNAL_BUFFER_INTRA_PRED_UP_RIGHT_COL,
    MHW_VDBOX_HCP_INTERNAL_BUFFER_INTRA_PRED_LFT_RECON_COL,
    MHW_VDBOX_VP9_INTERNAL_BUFFER_SEGMENT_ID,
    MHW_VDBOX_VP9_INTERNAL_BUFFER_HVD_LINE,
    MHW_VDBOX_VP9_INTERNAL_BUFFER_HVD_TILE
} MHW_VDBOX_HCP_INTERNAL_BUFFER_TYPE;



//!  MHW Vdbox Hcp interface
/*!
This class defines the interfaces for constructing Vdbox Hcp commands across all platforms
*/
class MhwVdboxHcpInterface
{
public:
    //!
    //! \enum     HevcSliceType
    //! \brief    HEVC slice type
    //!
    enum HevcSliceType
    {
        hevcSliceB  = 0,
        hevcSliceP  = 1,
        hevcSliceI  = 2
    };

protected:
    PMOS_INTERFACE              m_osInterface = nullptr; //!< Pointer to OS interface
    MhwMiInterface              *m_miInterface = nullptr; //!< Pointer to MI interface
    MhwCpInterface              *m_cpInterface = nullptr; //!< Pointer to CP interface
    MEDIA_FEATURE_TABLE         *m_skuTable = nullptr; //!< Pointer to SKU table
    MEDIA_WA_TABLE              *m_waTable = nullptr; //!< Pointer to WA table
    bool                        m_decodeInUse = false; //!< Flag to indicate if the interface is for decoder or encoder use

    MHW_MEMORY_OBJECT_CONTROL_PARAMS m_cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_END_CODEC] = {}; //!< Cacheability settings

    bool                        m_rhoDomainStatsEnabled = false; //!< Flag to indicate if Rho domain stats is enabled
    bool                        m_rowstoreCachingSupported = false; //!< Flag to indicate if row store cache is supported
    uint32_t                    m_brcNumPakPasses = 4; //!< Number of brc pak passes

    MHW_VDBOX_ROWSTORE_CACHE    m_hevcDatRowStoreCache = {};
    MHW_VDBOX_ROWSTORE_CACHE    m_hevcDfRowStoreCache = {};
    MHW_VDBOX_ROWSTORE_CACHE    m_hevcSaoRowStoreCache = {};
    MHW_VDBOX_ROWSTORE_CACHE    m_hevcHSaoRowStoreCache = {};
    MHW_VDBOX_ROWSTORE_CACHE    m_vp9HvdRowStoreCache = {};
    MHW_VDBOX_ROWSTORE_CACHE    m_vp9DfRowStoreCache = {};
    MHW_VDBOX_ROWSTORE_CACHE    m_vp9DatRowStoreCache = {};

    uint32_t                    m_hevcEncCuRecordSize = 0; //!< size of hevc enc cu record
    uint32_t                    m_pakHWTileSizeRecordSize = 0; //! pak HW tile size recored size

    static const uint32_t       m_timeStampCountsPerMillisecond = (12000048 / 1000);  //<! Time stamp coounts per millisecond
    static const uint32_t       m_hcpCabacErrorFlagsMask = 0x0879; //<! Hcp CABAC error flags mask

    MmioRegistersHcp            m_mmioRegisters[MHW_VDBOX_NODE_MAX] = {};  //!< hcp mmio registers

    static const HevcSliceType  m_hevcBsdSliceType[3]; //!< HEVC Slice Types for Long Format

    //!
    //! \brief    Constructor
    //!
    MhwVdboxHcpInterface(
        PMOS_INTERFACE osInterface,
        MhwMiInterface *miInterface,
        MhwCpInterface *cpInterface,
        bool decodeInUse);

    //!
    //! \brief    Add a resource to the command buffer
    //! \details  Internal function to add either a graphics address of a resource or
    //!           add the resource to the patch list for the requested buffer
    //!
    //! \param    [in] osInterface
    //!           OS interface
    //! \param    [in] cmdBuffer
    //!           Command buffer to which resource is added
    //! \param    [in] params
    //!           Parameters necessary to add the resource
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS(*pfnAddResourceToCmd) (
        PMOS_INTERFACE osInterface,
        PMOS_COMMAND_BUFFER cmdBuffer,
        PMHW_RESOURCE_PARAMS params);

    //!
    //! \brief    Convert to Sign Magnitude
    //! \details  Implementation of signed bitfield as specified
    //!
    //! \param    [in] val
    //!           Input value to calculate
    //! \param    [in] signBitPos
    //!           The position of sign bit
    //!
    //! \return   uint16_t
    //!           value calculated
    //!
    uint16_t Convert2SignMagnitude(
        int32_t val,
        uint32_t signBitPos);

public:

    //!
    //! \brief    Destructor
    //!
    virtual ~MhwVdboxHcpInterface() {}

    //!
    //! \brief    Get OS interface
    //!
    //! \return   [out] PMOS_INTERFACE
    //!           Pointer to the OS interface.
    //!
    inline PMOS_INTERFACE GetOsInterface()
    {
        return m_osInterface;
    }

    //!
    //! \brief    Get mmio registers
    //!
    //! \param    [in] index
    //!           mmio registers index.
    //!
    //! \return   [out] MmioRegistersHcp*
    //!           mmio registers got.
    //!
    inline MmioRegistersHcp* GetMmioRegisters(MHW_VDBOX_NODE_IND index)
    {
        if (index < MHW_VDBOX_NODE_MAX)
        {
            return &m_mmioRegisters[index];
        }
        else
        {
            MHW_ASSERT("index is out of range!");
            return &m_mmioRegisters[MHW_VDBOX_NODE_1];
        }
    }

    //!
    //! \brief    Get Hcp Cabac Error Flags Mask
    //!
    //! \return   [out] uint32_t
    //!           Mask got.
    //!
    virtual inline uint32_t GetHcpCabacErrorFlagsMask()
    {
        return m_hcpCabacErrorFlagsMask;
    }

    //!
    //! \brief    Get Watch Dog Timer Threhold
    //!
    //! \return   [out] uint32_t
    //!           Threhold got.
    //!
    virtual inline uint32_t GetWatchDogTimerThrehold()
    {
        return 0;
    }

    //!
    //! \brief    Get Time Stamp Counts Per Millisecond
    //!
    //! \return   [out] uint32_t
    //!           Counts got.
    //!
    inline uint32_t GetTimeStampCountsPerMillisecond()
    {
        return m_timeStampCountsPerMillisecond;
    }

    //!
    //! \brief    Get hevc enc cu record size
    //! \return   [out] uint32_t
    //!           Brc pak passes num.
    //!
    inline uint32_t GetHevcEncCuRecordSize()
    {
        return m_hevcEncCuRecordSize;
    }

    //!
    //! \brief    Get pak HW tile size record size
    //! \return   [out] uint32_t
    //!           Brc pak passes num.
    //!
    inline uint32_t GetPakHWTileSizeRecordSize()
    {
        return m_pakHWTileSizeRecordSize;
    }

    //!
    //! \brief    Judge if row store caching supported
    //!
    //! \return   bool
    //!           true if supported, else false
    //!
    inline bool IsRowStoreCachingSupported()
    {
        return m_rowstoreCachingSupported;
    }

    //!
    //! \brief    Judge if hevc dat store caching enabled
    //!
    //! \return   bool
    //!           true if enabled, else false
    //!
    inline bool IsHevcDatRowstoreCacheEnabled()
    {
        return m_hevcDatRowStoreCache.bEnabled ? true : false;
    }

    //!
    //! \brief    Judge if hevc df row store caching enabled
    //!
    //! \return   bool
    //!           true if enabled, else false
    //!
    inline bool IsHevcDfRowstoreCacheEnabled()
    {
        return m_hevcDfRowStoreCache.bEnabled ? true : false;
    }

    //!
    //! \brief    Judge if hevc sao row store caching enabled
    //!
    //! \return   bool
    //!           true if enabled, else false
    //!
    inline bool IsHevcSaoRowstoreCacheEnabled()
    {
        return m_hevcSaoRowStoreCache.bEnabled ? true : false;
    }

    //!
    //! \brief    Judge if vp9 hvd row store caching enabled
    //!
    //! \return   bool
    //!           true if enabled, else false
    //!
    inline bool IsVp9HvdRowstoreCacheEnabled()
    {
        return m_vp9HvdRowStoreCache.bEnabled ? true : false;
    }

    //!
    //! \brief    Judge if vp9 df row store caching enabled
    //!
    //! \return   bool
    //!           true if enabled, else false
    //!
    inline bool IsVp9DfRowstoreCacheEnabled()
    {
        return m_vp9DfRowStoreCache.bEnabled ? true : false;
    }

    //!
    //! \brief    Judge if vp9 dat row store caching enabled
    //!
    //! \return   bool
    //!           true if enabled, else false
    //!
    inline bool IsVp9DatRowstoreCacheEnabled()
    {
        return m_vp9DatRowStoreCache.bEnabled ? true : false;
    }

    //!
    //! \brief    Set cacheability settings
    //!
    //! \param    [in] cacheabilitySettings
    //!           Cacheability settings
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS SetCacheabilitySettings(
        MHW_MEMORY_OBJECT_CONTROL_PARAMS cacheabilitySettings[MOS_CODEC_RESOURCE_USAGE_END_CODEC])
    {
        MHW_FUNCTION_ENTER;

        uint32_t size = MOS_CODEC_RESOURCE_USAGE_END_CODEC * sizeof(MHW_MEMORY_OBJECT_CONTROL_PARAMS);
        MOS_STATUS eStatus = MOS_SecureMemcpy(m_cacheabilitySettings, size,
            cacheabilitySettings, size);

        return eStatus;
    }

    //!
    //! \brief    Determines if the slice is P slice
    //! \param    [in] sliceType
    //!           slice type
    //! \return   bool
    //!           True if it's P slice, otherwise return false
    //!
    inline bool IsHevcPSlice(uint8_t sliceType)
    {
        return (sliceType < MHW_ARRAY_SIZE(m_hevcBsdSliceType)) ?
            (m_hevcBsdSliceType[sliceType] == hevcSliceP) : false;
    }

    //!
    //! \brief    Determines if the slice is B slice
    //! \param    [in] sliceType
    //!           slice type
    //! \return   bool
    //!           True if it's B slice, otherwise return false
    //!
    inline bool IsHevcBSlice(uint8_t sliceType)
    {
        return (sliceType < MHW_ARRAY_SIZE(m_hevcBsdSliceType)) ?
            (m_hevcBsdSliceType[sliceType] == hevcSliceB) : false;
    }

    //!
    //! \brief    Determines if the slice is I slice
    //! \param    [in] sliceType
    //!           slice type
    //! \return   bool
    //!           True if it's I slice, otherwise return false
    //!
    inline bool IsHevcISlice(uint8_t sliceType)
    {
        return (sliceType < MHW_ARRAY_SIZE(m_hevcBsdSliceType)) ?
            (m_hevcBsdSliceType[sliceType] == hevcSliceI) : false;
    }

    //!
    //! \brief    Get pak object size
    //!
    //! \return   uint32_t
    //!           The size got
    //!
    virtual uint32_t GetHcpPakObjSize() = 0;

    //!
    //! \brief    Calculates the maximum size for HCP picture level commands
    //! \details  Client facing function to calculate the maximum size for HCP picture level commands
    //! \param    [in] mode
    //!           Indicate the codec mode
    //! \param    [out] commandsSize
    //!           The maximum command buffer size
    //! \param    [out] patchListSize
    //!           The maximum command patch list size
    //! \param    [in] params
    //!           Indicate the command size parameters
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS GetHcpStateCommandSize(
        uint32_t                        mode,
        uint32_t                        *commandsSize,
        uint32_t                        *patchListSize,
        PMHW_VDBOX_STATE_CMDSIZE_PARAMS params) = 0;

    //!
    //! \brief    Calculates maximum size for HCP slice/MB level commands
    //! \details  Client facing function to calculate maximum size for HCP slice/MB level commands
    //! \param    [in] mode
    //!           Indicate the codec mode
    //! \param    [out] commandsSize
    //!            The maximum command buffer size
    //! \param    [out] patchListSize
    //!           The maximum command patch list size
    //! \param    [in] modeSpecific
    //!           Indicate the long or short format
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS GetHcpPrimitiveCommandSize(
        uint32_t                        mode,
        uint32_t                        *commandsSize,
        uint32_t                        *patchListSize,
        bool                            modeSpecific) = 0;

    //!
    //! \brief    get the size of hw command
    //! \details  Internal function to get the size of HEVC_VP9_RDOQ_STATE_CMD
    //! \return   commandSize
    //!           The command size
    //!
    virtual uint32_t GetHcpHevcVp9RdoqStateCommandSize() = 0;

    //!
    //! \brief    get the size of hw command
    //! \details  Internal function to get the size of HCP_VP9_PIC_STATE_CMD
    //! \return   commandSize
    //!           The command size
    //!
    virtual uint32_t GetHcpVp9PicStateCommandSize() = 0;

    //!
    //! \brief    get the size of hw command
    //! \details  Internal function to get the size of HCP_VP9_SEGMENT_STATE_CMD
    //! \return   commandSize
    //!           The command size
    //!
    virtual uint32_t GetHcpVp9SegmentStateCommandSize() = 0;

    //!
    //! \brief    Get the required buffer size for VDBOX
    //! \details  Internal function to get required buffer size for HEVC codec (both dual pipe and vdenc, enc and dec)
    //!
    //! \param    [in] bufferType
    //!           HEVC Buffer type
    //! \param    [in, out] hcpBufSizeParam
    //!           HCP buffer size parameters
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS GetHevcBufferSize(
        MHW_VDBOX_HCP_INTERNAL_BUFFER_TYPE  bufferType,
        PMHW_VDBOX_HCP_BUFFER_SIZE_PARAMS   hcpBufSizeParam) = 0;

    //!
    //! \brief    Get the required buffer size for VDBOX
    //! \details  Internal function to get required buffer size for VP9 codec
    //!
    //! \param    [in] bufferType
    //!           HEVC Buffer type
    //! \param    [in, out] hcpBufSizeParam
    //!           HCP buffer size parameters
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS GetVp9BufferSize(
        MHW_VDBOX_HCP_INTERNAL_BUFFER_TYPE  bufferType,
        PMHW_VDBOX_HCP_BUFFER_SIZE_PARAMS   hcpBufSizeParam) = 0;

    //!
    //! \brief    Get the required buffer size for VDBOX
    //! \details  Internal function to judge if buffer realloc is needed for HEVC codec
    //!
    //! \param    [in] bufferType
    //!          HEVC Buffer type
    //! \param    [in, out] reallocParam
    //!          HCP Re-allocate parameters
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS IsHevcBufferReallocNeeded(
        MHW_VDBOX_HCP_INTERNAL_BUFFER_TYPE   bufferType,
        PMHW_VDBOX_HCP_BUFFER_REALLOC_PARAMS reallocParam) = 0;

    //!
    //! \brief    Get the required buffer size for VDBOX
    //! \details  Internal function to judge if buffer realloc is needed for VP9 codec
    //!
    //! \param    [in] bufferType
    //!           HEVC Buffer type
    //! \param    [in, out] reallocParam
    //!           HCP Re-allocate parameters
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS IsVp9BufferReallocNeeded(
        MHW_VDBOX_HCP_INTERNAL_BUFFER_TYPE   bufferType,
        PMHW_VDBOX_HCP_BUFFER_REALLOC_PARAMS reallocParam) = 0;

    //!
    //! \brief    Adds HCP Pipe Pipe Mode Select command in command buffer
    //! \details  Client facing function to add HCP Pipe Mode Select command in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] params
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS AddHcpSurfaceCmd(
        PMOS_COMMAND_BUFFER                  cmdBuffer,
        PMHW_VDBOX_SURFACE_PARAMS            params);

    //!
    //! \brief    Adds HCP slice state command in command buffer
    //! \details  Client facing function to add HCP slice state command in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] hevcSliceState
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS AddHcpSliceStateCmd(
        PMOS_COMMAND_BUFFER              cmdBuffer,
        PMHW_VDBOX_HEVC_SLICE_STATE      hevcSliceState);

    //!
    //! \brief    Adds HCP picture State command in command buffer
    //! \details  Client facing function to add HCP picture State command for encode in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] params
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS AddHcpPicStateCmd(
        PMOS_COMMAND_BUFFER              cmdBuffer,
        PMHW_VDBOX_HEVC_PIC_STATE        params);

    //!
    //! \brief    Adds HCP Protect State command in command buffer
    //! \details  Client facing function to add HCP picture State command for encode in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] hevcSliceState
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS AddHcpProtectStateCmd(
        PMOS_COMMAND_BUFFER              cmdBuffer,
        PMHW_VDBOX_HEVC_SLICE_STATE      hevcSliceState);

    //!
    //! \brief    Programs base address of rowstore scratch buffers
    //! \details  Internal function to get base address of rowstore scratch buffers
    //!
    //! \param    [in] rowstoreParams
    //!           Rowstore parameters
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS GetRowstoreCachingAddrs(
        PMHW_VDBOX_ROWSTORE_PARAMS rowstoreParams) = 0;

    //!
    //! \brief    Adds HCP Pipe Pipe Mode Select command in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] params
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddHcpPipeModeSelectCmd(
        PMOS_COMMAND_BUFFER                  cmdBuffer,
        PMHW_VDBOX_PIPE_MODE_SELECT_PARAMS   params) = 0;

    //!
    //! \brief    Adds HCP Surface State command for decode in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] params
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddHcpDecodeSurfaceStateCmd(
        PMOS_COMMAND_BUFFER                  cmdBuffer,
        PMHW_VDBOX_SURFACE_PARAMS            params) = 0;

    //!
    //! \brief    Adds HCP Surface State command for encode in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] params
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddHcpEncodeSurfaceStateCmd(
        PMOS_COMMAND_BUFFER                  cmdBuffer,
        PMHW_VDBOX_SURFACE_PARAMS            params) = 0;

    //!
    //! \brief    Adds HCP Pipe Buffer Address State command in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] params
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddHcpPipeBufAddrCmd(
        PMOS_COMMAND_BUFFER                  cmdBuffer,
        PMHW_VDBOX_PIPE_BUF_ADDR_PARAMS      params) = 0;

    //!
    //! \brief    Adds HCP Indirect Object Base Address State command in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] params
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddHcpIndObjBaseAddrCmd(
        PMOS_COMMAND_BUFFER                  cmdBuffer,
        PMHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS  params) = 0;

    //!
    //! \brief    Adds HCP QM State command in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!          Command buffer to which HW command is added
    //! \param    [in] params
    //!          Params structure used to populate the HW command
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddHcpQmStateCmd(
        PMOS_COMMAND_BUFFER                  cmdBuffer,
        PMHW_VDBOX_QM_PARAMS                 params) = 0;

    //!
    //! \brief    Adds HCP FQM State command in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] params
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddHcpFqmStateCmd(
        PMOS_COMMAND_BUFFER                  cmdBuffer,
        PMHW_VDBOX_QM_PARAMS                 params) = 0;

    //!
    //! \brief    Adds HCP picture State command for decode in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] params
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddHcpDecodePicStateCmd(
        PMOS_COMMAND_BUFFER              cmdBuffer,
        PMHW_VDBOX_HEVC_PIC_STATE        params) = 0;

    //!
    //! \brief    Adds HCP picture State command for encode in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] params
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddHcpEncodePicStateCmd(
        PMOS_COMMAND_BUFFER              cmdBuffer,
        PMHW_VDBOX_HEVC_PIC_STATE        params) = 0;

    //!
    //! \brief    Adds HCP tile State command in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] params
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddHcpTileStateCmd(
        PMOS_COMMAND_BUFFER              cmdBuffer,
        PMHW_VDBOX_HEVC_TILE_STATE       params) = 0;

    //!
    //! \brief    Adds HCP reference frame index command in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] batchBuffer
    //!           Batch buffer to add to VDBOX_BUFFER_START
    //! \param    [in] params
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddHcpRefIdxStateCmd(
        PMOS_COMMAND_BUFFER              cmdBuffer,
        PMHW_BATCH_BUFFER                batchBuffer,
        PMHW_VDBOX_HEVC_REF_IDX_PARAMS   params) = 0;

    //!
    //! \brief    Adds HCP weight offset state command in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] batchBuffer
    //!           Batch buffer to add to VDBOX_BUFFER_START
    //! \param    [in] params
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddHcpWeightOffsetStateCmd(
        PMOS_COMMAND_BUFFER                  cmdBuffer,
        PMHW_BATCH_BUFFER                    batchBuffer,
        PMHW_VDBOX_HEVC_WEIGHTOFFSET_PARAMS  params) = 0;

    //!
    //! \brief    Adds HCP slice state command for decode in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] hevcSliceState
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddHcpDecodeSliceStateCmd(
        PMOS_COMMAND_BUFFER              cmdBuffer,
        PMHW_VDBOX_HEVC_SLICE_STATE      hevcSliceState) = 0;

    //!
    //! \brief    Adds HCP slice state command for encode in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] hevcSliceState
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddHcpEncodeSliceStateCmd(
        PMOS_COMMAND_BUFFER              cmdBuffer,
        PMHW_VDBOX_HEVC_SLICE_STATE      hevcSliceState) = 0;

    //!
    //! \brief    Adds HCP Protect state command for decode in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] hevcSliceState
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddHcpDecodeProtectStateCmd(
        PMOS_COMMAND_BUFFER              cmdBuffer,
        PMHW_VDBOX_HEVC_SLICE_STATE      hevcSliceState) = 0;

    //!
    //! \brief    Adds HCP BSD object state command in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] params
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddHcpBsdObjectCmd(
        PMOS_COMMAND_BUFFER              cmdBuffer,
        PMHW_VDBOX_HCP_BSD_PARAMS        params) = 0;

    //!
    //! \brief    Adds HCP Pak insert object State command foe encode in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] params
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddHcpPakInsertObject(
        PMOS_COMMAND_BUFFER              cmdBuffer,
        PMHW_VDBOX_PAK_INSERT_PARAMS     params) = 0;

    //!
    //! \brief    Adds VP9 picture state command for decode in command buffer
    //!
    //! \param    [in]  cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in]  batchBuffer
    //!           Batch buffer to which HW command is added
    //! \param    [in]  params
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddHcpVp9PicStateCmd(
        PMOS_COMMAND_BUFFER              cmdBuffer,
        PMHW_BATCH_BUFFER                batchBuffer,
        PMHW_VDBOX_VP9_PIC_STATE         params) = 0;

    //!
    //! \brief    Adds VP9 picture state command for encode in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] batchBuffer
    //!           Batch buffer to which HW command is added
    //! \param    [in] params
    //!           Params structure used to populate the HW command
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddHcpVp9PicStateEncCmd(
        PMOS_COMMAND_BUFFER              cmdBuffer,
        PMHW_BATCH_BUFFER                batchBuffer,
        PMHW_VDBOX_VP9_ENCODE_PIC_STATE  params) = 0;

    //!
    //! \brief    Adds VP9 segment state command for decode in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] batchBuffer
    //!           Batch buffer to which HW command is added
    //! \param    [in] params
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddHcpVp9SegmentStateCmd(
        PMOS_COMMAND_BUFFER              cmdBuffer,
        PMHW_BATCH_BUFFER                batchBuffer,
        PMHW_VDBOX_VP9_SEGMENT_STATE     params) = 0;

    //!
    //! \brief    Adds VP9 RDOQ state command for encode in command buffer
    //!
    //! \param    [in] cmdBuffer
    //!           Command buffer to which HW command is added
    //! \param    [in] params
    //!           Params structure used to populate the HW command
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddHcpHevcVp9RdoqStateCmd(
        PMOS_COMMAND_BUFFER              cmdBuffer,
        PMHW_VDBOX_HEVC_PIC_STATE        params) = 0;

    //!
    //! \brief    Adds HEVC Brc buffer
    //!
    //! \param    [in] hcpImgStates
    //!           Resource to which Brc buffer is added
    //! \param    [in] hevcPicState
    //!           Params structure used to add the Brc buffer
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddHcpHevcPicBrcBuffer(
        PMOS_RESOURCE                    hcpImgStates,
        PMHW_VDBOX_HEVC_PIC_STATE         hevcPicState) = 0;

    //!
    //! \brief    Get OsResLaceOrAceOrRgbHistogramBuffer Size
    //!
    //! \param    [in] width
    //!           Width of Surface
    //! \param    [in] height
    //!           Height of Surface
    //! \param    [out] size
    //!           Size of OsResLaceOrAceOrRgbHistogramBuffer
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS GetOsResLaceOrAceOrRgbHistogramBufferSize(
        uint32_t                         width,
        uint32_t                         height,
        uint32_t                        *size) = 0;

    //!
    //! \brief    Get OsResStatisticsOutputBuffer Size
    //!
    //! \param    [in] width
    //!           Width of Surface
    //! \param    [in] height
    //!           Height of Surface
    //! \param    [out] size
    //!           Size of OsResStatisticsOutputBuffer
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS GetOsResStatisticsOutputBufferSize(
        uint32_t                         width,
        uint32_t                         height,
        uint32_t                        *size) = 0;
};

#endif
