/*
* Copyright (c) 2012-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_decode_hevc.h
//! \brief    Defines the decode interface extension for HEVC.
//! \details  Defines all types, macros, and functions required by CodecHal for HEVC decoding. Definitions are not externally facing.
//!

#ifndef __CODECHAL_DECODER_HEVC_H__
#define __CODECHAL_DECODER_HEVC_H__

#include "codechal.h"
#include "codechal_hw.h"
#include "codechal_decode_sfc_hevc.h"
#include "codechal_decoder.h"

class CodechalDecodeNV12ToP010;

typedef class CodechalDecodeHevc *PCODECHAL_DECODE_HEVC_STATE;

typedef struct _CODECHAL_DECODE_HEVC_MV_LIST
{
    uint8_t             u8FrameId;
    bool                bInUse;
    bool                bReUse;
} CODECHAL_DECODE_HEVC_MV_LIST, *PCODECHAL_DECODE_HEVC_MV_LIST;

typedef struct
{
    uint32_t    pic_width_in_min_cbs_y;
    uint32_t    pic_height_in_min_cbs_y;
    uint8_t     log2_min_luma_coding_block_size_minus3;
    uint8_t     log2_diff_max_min_luma_coding_block_size;
    uint16_t    chroma_format_idc                           : 2;  //!< range 0..3
    uint16_t    separate_colour_plane_flag                  : 1;
    uint16_t    bit_depth_luma_minus8                       : 4;
    uint16_t    bit_depth_chroma_minus8                     : 4;
    uint16_t    log2_max_pic_order_cnt_lsb_minus4           : 4;  //!< range 0..12
    uint16_t    sample_adaptive_offset_enabled_flag         : 1;
    uint8_t     num_short_term_ref_pic_sets;                      //!< range 0..64
    uint8_t     long_term_ref_pics_present_flag             : 1;
    uint8_t     num_long_term_ref_pics_sps                  : 6;  //!< range 0..32
    uint8_t     sps_temporal_mvp_enable_flag                : 1;

    uint8_t     num_ref_idx_l0_default_active_minus1        : 4;  //!< range 0..15
    uint8_t     num_ref_idx_l1_default_active_minus1        : 4;  //!< range 0..15
    int8_t      pic_init_qp_minus26;                              //!< range -62..25
    uint8_t     dependent_slice_segments_enabled_flag       : 1;
    uint8_t     cabac_init_present_flag                     : 1;
    uint8_t     pps_slice_chroma_qp_offsets_present_flag    : 1;
    uint8_t     weighted_pred_flag                          : 1;
    uint8_t     weighted_bipred_flag                        : 1;
    uint8_t     output_flag_present_flag                    : 1;
    uint8_t     tiles_enabled_flag                          : 1;
    uint8_t     entropy_coding_sync_enabled_flag            : 1;
    uint8_t     loop_filter_across_slices_enabled_flag      : 1;
    uint8_t     deblocking_filter_override_enabled_flag     : 1;
    uint8_t     pic_disable_deblocking_filter_flag          : 1;
    uint8_t     lists_modification_present_flag             : 1;
    uint8_t     slice_segment_header_extension_present_flag : 1;
    uint8_t     high_precision_offsets_enabled_flag         : 1;
    uint8_t     chroma_qp_offset_list_enabled_flag          : 1;
    uint8_t                                                 : 1;

    int32_t     CurrPicOrderCntVal;
    int32_t     PicOrderCntValList[CODEC_MAX_NUM_REF_FRAME_HEVC];
    uint8_t     RefPicSetStCurrBefore[8];
    uint8_t     RefPicSetStCurrAfter[8];
    uint8_t     RefPicSetLtCurr[8];
    uint16_t    RefFieldPicFlag;
    uint16_t    RefBottomFieldFlag;
    int8_t      pps_beta_offset_div2;
    int8_t      pps_tc_offset_div2;
    uint16_t    StRPSBits;

    uint8_t     num_tile_columns_minus1;
    uint8_t     num_tile_rows_minus1;
    uint16_t    column_width[HEVC_NUM_MAX_TILE_COLUMN];
    uint16_t    row_height[HEVC_NUM_MAX_TILE_ROW];

    uint16_t    NumSlices;
    uint8_t     num_extra_slice_header_bits;
    int8_t      RefIdxMapping[CODEC_MAX_NUM_REF_FRAME_HEVC];

    struct
    {
        uint8_t     reserve_0;
        uint16_t    reserve_1;
        uint32_t    reserve_2;
        uint32_t    reserve_3;
    } reserve;
} HUC_HEVC_S2L_PIC_BSS, *PHUC_HEVC_S2L_PIC_BSS;

typedef struct {
    uint32_t    BSNALunitDataLocation;
    uint32_t    SliceBytesInBuffer;

    struct
    {
        uint32_t    reserve_0;
        uint32_t    reserve_1;
        uint32_t    reserve_2;
        uint32_t    reserve_3;
    } reserve;
} HUC_HEVC_S2L_SLICE_BSS, *PHUC_HEVC_S2L_SLICE_BSS;

typedef struct {
    // Platfrom information
    uint32_t                    ProductFamily;
    uint16_t                    RevId;

    // Flag to indicate if create dummy HCP_REF_IDX_STATE or not
    uint32_t                    DummyRefIdxState;

    // Picture level DMEM data
    HUC_HEVC_S2L_PIC_BSS        PictureBss;

    // Slice level DMEM data
    HUC_HEVC_S2L_SLICE_BSS      SliceBss[CODECHAL_HEVC_MAX_NUM_SLICES_LVL_6];

} HUC_HEVC_S2L_BSS, *PHUC_HEVC_S2L_BSS;

//!
//! \class    CodechalDecodeHevc
//! \brief    Codechal decode HEVC
//!
class CodechalDecodeHevc : public CodechalDecode
{
public:

    typedef struct
    {
        PMHW_VDBOX_PIPE_MODE_SELECT_PARAMS   PipeModeSelectParams;
        PMHW_VDBOX_SURFACE_PARAMS            SurfaceParams;
        PMHW_VDBOX_PIPE_BUF_ADDR_PARAMS      PipeBufAddrParams;
        PMHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS  IndObjBaseAddrParams;
        PMHW_VDBOX_QM_PARAMS                 QmParams;
        PMHW_VDBOX_HEVC_PIC_STATE            HevcPicState;
        PMHW_VDBOX_HEVC_TILE_STATE           HevcTileState;
    } PIC_LONG_FORMAT_MHW_PARAMS;

    //!
    //! \brief    Constructor
    //! \param    [in] hwInterface
    //!           Hardware interface
    //! \param    [in] debugInterface
    //!           Debug interface
    //! \param    [in] standardInfo
    //!           The information of decode standard for this instance
    //!
    CodechalDecodeHevc(
        CodechalHwInterface   *hwInterface,
        CodechalDebugInterface* debugInterface,
        PCODECHAL_STANDARD_INFO standardInfo);

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

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

    //!
    //! \brief    Destructor
    //!
    ~CodechalDecodeHevc ();

    //!
    //! \brief    Allocate and initialize HEVC decoder standard
    //! \param    [in] settings
    //!           Pointer to CodechalSetting
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS  AllocateStandard (
        CodechalSetting *settings) override;

    //!
    //! \brief  Set states for each frame to prepare for HEVC decode
    //! \return MOS_STATUS
    //!         MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS  SetFrameStates () override;

    //!
    //! \brief    HEVC decoder state level function
    //! \details  State level function for HEVC decoder
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS  DecodeStateLevel () override;

    //!
    //! \brief    HEVC decoder primitive level function
    //! \details  Primitive level function for GEN specific HEVC decoder
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS  DecodePrimitiveLevel () override;

    //!
    //! \brief    HEVC decoder downsampling calc function
    //! \details  calc downsample param for GEN specific HEVC decoder
    //!
    //! \param    [in] picParams
    //!           Pointer to picture parameters
    //! \param    [out] refSurfWidth
    //!           Pointer to reference surface width
    //! \param    [out] refSurfHeight
    //!           Pointer to reference surface height
    //! \param    [out] format
    //!           Pointer to MOS_FORMAT returned
    //! \param    [out] frameIdx
    //!           Pointer to frame index
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS  CalcDownsamplingParams (
        void                        *picParams,
        uint32_t                    *refSurfWidth,
        uint32_t                    *refSurfHeight,
        MOS_FORMAT                  *format,
        uint8_t                     *frameIdx) override;

    MOS_STATUS  InitMmcState() override;

    //!
    //! \brief    Add S2L picture level commands to command buffer
    //! \details  Add S2L picture level commands to command buffer in HEVC decode driver
    //!
    //! \param    [out] cmdBufferInUse
    //!           Pointer to Command buffer
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS          AddPictureS2LCmds(
        PMOS_COMMAND_BUFFER             cmdBufferInUse);

    //!
    //! \brief    Send S2L picture level commands
    //! \details  Send S2L picture level commands in HEVC decode driver
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS  SendPictureS2L ();

    //!
    //! \brief    Send S2L Slice level commands
    //! \details  Send S2L Slice level commands in HEVC decode driver
    //!
    //! \param    [out] cmdBuffer
    //!           Pointer to Command buffer
    //! \param    [in] hevcSliceState
    //!           Pointer to HEVC Slice State
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS  SendSliceS2L (
        PMOS_COMMAND_BUFFER             cmdBuffer,
        PMHW_VDBOX_HEVC_SLICE_STATE     hevcSliceState);

    //!
    //! \brief    Get the Huc Dmem resource size
    //! \details  Return the Huc Dmem resource size in bytes.
    //!
    //! \return   uint32_t
    //!           the size of Dmem resource
    //!
    virtual uint32_t   GetDmemBufferSize();

    //!
    //! \brief    Set S2L picture level Dmem parameters
    //! \details  Set S2L HuC Dmem picture level paramters
    //!
    //! \param    [out] hucHevcS2LPicBss
    //!           Pointer to S2L Dmem picture Bss paramters
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SetHucDmemS2LPictureBss(
        PHUC_HEVC_S2L_PIC_BSS           hucHevcS2LPicBss);

    //!
    //! \brief    Set S2L Slice level Dmem parameters
    //! \details  Set S2L HuC Dmem slice related paramters
    //!
    //! \param    [out] hucHevcS2LSliceBss
    //!           Pointer to S2L Dmem Slice Bss paramters
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SetHucDmemS2LSliceBss(
        PHUC_HEVC_S2L_SLICE_BSS         hucHevcS2LSliceBss);

    //!
    //! \brief    Setup HuC DMEM buffer
    //! \details  Setup HuC DMEM buffer in HEVC decode driver
    //!
    //! \param    [in] dmemBuffer
    //!           Pointer to HuC DMEM resource buffer
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS  SetHucDmemParams(
        PMOS_RESOURCE               dmemBuffer);

    //!
    //! \brief    Initialize the picture level MHW parameters for long format
    //! \details  Initialize the picture level MHW parameters for long format in HEVC decode driver
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS  InitPicLongFormatMhwParams();

    //!
    //! \brief    Add long format picture level commands to command buffer
    //! \details  Add long format picture level commands to command buffer in HEVC decode driver
    //!
    //! \param    [out] cmdBufferInUse
    //!           Pointer to Command buffer
    //! \param    [in] picMhwParams
    //!           Pointer to the picture level MHW parameters
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS AddPictureLongFormatCmds(
        PMOS_COMMAND_BUFFER             cmdBufferInUse,
        PIC_LONG_FORMAT_MHW_PARAMS      *picMhwParams);

    //!
    //! \brief    Send long format picture level commands
    //! \details  Send long format picture level commands in HEVC decode driver
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS  SendPictureLongFormat ();

    //!
    //! \brief    Send long format Slice level commands
    //! \details  Send long format Slice level commands in HEVC decode driver
    //!
    //! \param    [out] cmdBuffer
    //!           Pointer to Command buffer
    //! \param    [in] hevcSliceState
    //!           Pointer to HEVC Slice State
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS          SendSliceLongFormat (
        PMOS_COMMAND_BUFFER             cmdBuffer,
        PMHW_VDBOX_HEVC_SLICE_STATE     hevcSliceState);

    //!
    //! \brief    Determine Decode Phase
    //! \details  Determine decode phase in hevc decode
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS          DetermineDecodePhase();

    //!
    //! \brief    Set Picture Struct
    //! \details  Set Picture Struct in HEVC decode driver
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS          SetPictureStructs();

    //!
    //! \brief    Concatenate the bitstreams and save them to locl buffer if multiple execution call
    //! \details  Concatenate the bitstreams and save them to locl buffer if multiple execution call in HEVC decode driver
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS          CheckAndCopyBitstream();

    //!
    //! \brief    Copy bitstream to local buffer
    //! \details  Copy bitstream to local buffer in HEVC decode driver
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS          CopyDataSurface();

    //!
    //! \brief    Initialize status for bitstream concatenating
    //! \details  Initialize status for bitstream concatenating in HEVC decode driver
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS          InitializeBitstreamCat ();

    //!
    //! \brief    Get all tile information
    //! \details  Get all tile information in HEVC decode driver
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS          GetAllTileInfo();

    //!
    //! \brief    Allocate variable sized resources
    //! \details  Allocate variable sized resources in HEVC decode driver
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS          AllocateResourcesVariableSizes();

    //!
    //! \brief    Allocate the MV Temporal buffer
    //!
    //! \param    [in] hevcMvBuffIndex
    //!           buff index for unused mv buffer
    //!
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS          AllocateMvTemporalBuffer(
        uint8_t                       hevcMvBuffIndex);

    //!
    //! \brief    Allocate fixed sized resources
    //! \details  Allocate fixed sized resources HEVC decode driver
    //! \return   MOS_STATUS
    //!           MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS          AllocateResourcesFixedSizes();

    //!
    //! \brief    Get mv buffer index
    //! \details  Find out an unused MvBuffer and get hte mv buffer index in HEVC decode driver
    //!
    //! \param    [in] frameIdx
    //!           frame idx associated with unused mv buffer
    //!
    //! \return   uint8_t
    //!           MV buffer index if success, else return CODEC_NUM_HEVC_MV_BUFFERS
    //!
    uint8_t             GetMvBufferIndex(
        uint8_t                         frameIdx);

#if USE_CODECHAL_DEBUG_TOOL
    MOS_STATUS DumpPicParams(
        PCODEC_HEVC_PIC_PARAMS     picParams,
        void*                      extPicParams);

    MOS_STATUS DumpSliceParams(
        PCODEC_HEVC_SLICE_PARAMS     sliceParams,
        void*                        extSliceParams,
        uint32_t                     numSlices,
        bool                         shortFormatInUse);

    MOS_STATUS DumpIQParams(
        PCODECHAL_HEVC_IQ_MATRIX_PARAMS matrixData);

#endif

    static const uint32_t  m_hucS2lKernelId = 1;             //!< VDBox Huc decode S2L kernel descriptoer

    // Parameters passed by application
    uint32_t                        m_minCtbSize;                                    //!< Min Luma Coding Block Size
    bool                            m_is10BitHevc;                                   //!< Indicate it is 10 bit HEVC
    bool                            m_is12BitHevc;                                   //!< Indicate it is 12 bit HEVC
    uint8_t                         m_chromaFormatinProfile;                         //!< Chrama format in profile
    bool                            m_shortFormatInUse;                              //!< Indicate short format is inuse
    uint32_t                        m_dataSize;                                      //!< Size of bitstream
    uint32_t                        m_dataOffset;                                    //!< Offset of bitstream
    uint32_t                        m_numSlices;                                     //!< Num of slices
    PCODEC_HEVC_PIC_PARAMS          m_hevcPicParams;                                 //!< Pointer to HEVC picture parameter
    PCODEC_HEVC_SLICE_PARAMS        m_hevcSliceParams;                               //!< Pointer to HEVC slice parameter
    PCODECHAL_HEVC_IQ_MATRIX_PARAMS m_hevcIqMatrixParams;                            //!< Pointer to HEVC IQ matrix parameter
    MOS_SURFACE                     m_destSurface;                                   //!< Handle of render surface
    PMOS_RESOURCE                   m_presReferences[CODEC_MAX_NUM_REF_FRAME_HEVC];  //!< Pointer to Handle of Reference Frames
    MOS_RESOURCE                    m_resDataBuffer;                                 //!< Handle of bitstream data surface

    bool        m_is8BitFrameIn10BitHevc;                                          //!< Indicate 8bit frame in 10bit HEVC stream
    MOS_SURFACE m_internalNv12RtSurfaces[CODECHAL_NUM_INTERNAL_NV12_RT_HEVC];      //!< Handles of internal NV12 render target
    uint32_t    m_internalNv12RtIndexMap[CODECHAL_NUM_UNCOMPRESSED_SURFACE_HEVC];  //!< Index map for internal NV12 render targets
    bool        m_internalNv12RtIndexMapInitilized;                                //!< Indicate the index map of internal NV12 render targets is intialized
    //! \brief Context for NV12ToP010 Kernel
    CodechalDecodeNV12ToP010        *m_decodeNV12ToP010 = nullptr;

    //Track for several row store buffer's max picture width in MB used for buffer allocation in past frames
    uint32_t m_mfdDeblockingFilterRowStoreScratchBufferPicWidth;  //!< max picture width for deblocking filter row store scratch buffer
    uint32_t m_metadataLineBufferPicWidth;                        //!< max picture width for meta data line buffer
    uint32_t m_saoLineBufferPicWidth;                             //!< max picture width for SAO line buffer

    // Internally maintained
    MOS_RESOURCE     m_resMfdDeblockingFilterRowStoreScratchBuffer;     //!< Handle of MFD Deblocking Filter Row Store Scratch data surface
    MOS_RESOURCE     m_resDeblockingFilterTileRowStoreScratchBuffer;    //!< Handle of Deblocking Filter Tile Row Store Scratch data surface
    MOS_RESOURCE     m_resDeblockingFilterColumnRowStoreScratchBuffer;  //!< Handle of Deblocking Filter Column Row Store Scratch data surface
    MOS_RESOURCE     m_resMetadataLineBuffer;                           //!< Handle of Metadata Line data buffer
    MOS_RESOURCE     m_resMetadataTileLineBuffer;                       //!< Handle of Metadata Tile Line data buffer
    MOS_RESOURCE     m_resMetadataTileColumnBuffer;                     //!< Handle of Metadata Tile Column data buffer
    MOS_RESOURCE     m_resSaoLineBuffer;                                //!< Handle of SAO Line data buffer
    MOS_RESOURCE     m_resSaoTileLineBuffer;                            //!< Handle of SAO Tile Line data buffer
    MOS_RESOURCE     m_resSaoTileColumnBuffer;                          //!< Handle of SAO Tile Column data buffer
    bool             m_mvBufferProgrammed;                              //!< Indicate mv buffer is programmed
    MOS_RESOURCE     m_resMvTemporalBuffer[CODEC_NUM_HEVC_MV_BUFFERS];  //!< Handles of MV Temporal data buffer
    uint32_t         m_secondLevelBatchBufferIndex;
    MHW_BATCH_BUFFER m_secondLevelBatchBuffer[CODEC_HEVC_NUM_SECOND_BB];//!< Handle of second level batch buffer
    uint32_t         m_dmemBufferIdx;                                   //!< Indicate current idx of DMEM buffer to program
    MOS_RESOURCE     m_resDmemBuffer[CODECHAL_HEVC_NUM_DMEM_BUFFERS];   //!< Handles of DMEM buffer
    uint32_t         m_dmemBufferSize;                                  //!< Size of DMEM buffer
    uint32_t         m_dmemTransferSize;                                //!< Transfer size of DMEM data
    bool             m_dmemBufferProgrammed;                            //!< Indicate DMEM buffer is programmed
    MOS_RESOURCE     m_resCopyDataBuffer;                               //!< Handle of copied bitstream buffer
    uint32_t         m_copyDataBufferSize;                              //!< Size of copied bitstream buffer
    uint32_t         m_copyDataOffset;                                  //!< Offset of copied bitstream
    bool             m_copyDataBufferInUse;                             //!< Indicate copied bistream is inuse
    uint32_t         m_estiBytesInBitstream;                            //!< Estimated size of bitstream

    MOS_RESOURCE m_resSyncObjectWaContextInUse;  //!< signals on the video WA context

    bool     m_curPicIntra;   //!< Indicate current picture is intra
    uint32_t m_mvBufferSize;  //!< Size of MV buffer

    CODEC_PICTURE                m_currPic;                                              //!< Current Picture Struct
    PCODEC_REF_LIST              m_hevcRefList[CODECHAL_NUM_UNCOMPRESSED_SURFACE_HEVC];  //!< Pointer to reference list
    uint8_t                      m_hevcMvBufferIndex;                                    //!< Index of MV buffer for current picture
    CODECHAL_DECODE_HEVC_MV_LIST m_hevcMvList[CODEC_NUM_HEVC_MV_BUFFERS];                //!< Status table of MV buffers
    bool                         m_frameUsedAsCurRef[CODEC_MAX_NUM_REF_FRAME_HEVC];      //!< Indicate frames used as reference of current picture
    int8_t                       m_refIdxMapping[CODEC_MAX_NUM_REF_FRAME_HEVC];          //!< Map table of indices of references
    uint32_t                     m_frameIdx;                                             //!< Decode order index of current frame
    bool                         m_enableSf2DmaSubmits;                                  //!< Indicate two DMA submits is enabled on short format

    uint16_t m_tileColWidth[HEVC_NUM_MAX_TILE_COLUMN];  //!< Table of tile column width
    uint16_t m_tileRowHeight[HEVC_NUM_MAX_TILE_ROW];    //!< Table of tile row height

    uint32_t m_widthLastMaxAlloced;   //!< Max Picture Width used for buffer allocation in past frames
    uint32_t m_heightLastMaxAlloced;  //!< Max Picture Height used for buffer allocation in past frames
    uint32_t m_ctbLog2SizeYMax;       //!< Max CtbLog2 size used for buffer allocation in past frames

    uint32_t m_hcpDecPhase;  //!< HCP decode phase

#ifdef _DECODE_PROCESSING_SUPPORTED
    // SFC
    CodechalHevcSfcState         *m_sfcState = nullptr;                                            //!< HEVC SFC State
#endif
    PIC_LONG_FORMAT_MHW_PARAMS      m_picMhwParams;                                         //!< picture parameters

    bool                         m_dummyReferenceSlot[CODECHAL_MAX_CUR_NUM_REF_FRAME_HEVC];
};

#endif  // __CODECHAL_DECODER_HEVC_H__
