/*
* Copyright (c) 2019, 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     decode_basic_feature.h
//! \brief    Defines the common interface for decode badic feature
//! \details  The decode basic feature interface is further sub-divided by codec standard,
//!           this file is for the base interface which is shared by all codecs.
//!
#ifndef __DECODE_BASIC_FEATURE_H__
#define __DECODE_BASIC_FEATURE_H__

#include "codec_def_decode.h"
#include "decode_allocator.h"
#include "media_feature.h"
#include "codechal_hw.h"
#include "codechal_setting.h"

namespace decode {

class DecodeBasicFeature: public MediaFeature
{
public:
    DecodeBasicFeature(DecodeAllocator *allocator, CodechalHwInterface *hwInterface);
    virtual ~DecodeBasicFeature();

    //!
    //! \brief  Init decode basic parameter
    //! \param  [in] setting
    //!         Pointer to CodechalSetting
    //! \return MOS_STATUS
    //!         MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS Init(void *setting);

    //!
    //! \brief  Update decode basic feature
    //! \param  [in] params
    //!         Pointer to DecoderParams
    //! \return MOS_STATUS
    //!         MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS Update(void *params);

    //!
    //! \brief  Update decode dest surface
    //! \param  [in] destSurface
    //!         Decode render target from DDI
    //! \return MOS_STATUS
    //!         MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS UpdateDestSurface(MOS_SURFACE &destSurface);

#ifdef _MMC_SUPPORTED
    //!
    //! \brief  Set MMC state
    //! \param  [in] isMmcEnabled
    //!         Flag to indicate if the MMC is enabled
    //! \return MOS_STATUS
    //!         MOS_STATUS_SUCCESS if success, else fail reason
    //!
    MOS_STATUS SetMmcState(bool isMmcEnabled)
    {
        m_isMmcEnabled = isMmcEnabled;
        return MOS_STATUS_SUCCESS;
    }
#endif

    //!
    //! \brief  Get MMC state
    //! \return bool
    //!         Return true if MMC enabled
    //!
    bool IsMmcEnabled()
    {
#ifdef _MMC_SUPPORTED
        return m_isMmcEnabled;
#else
        return false;
#endif
    }

    uint32_t            m_width = 0;                                    //!< Frame width in luma samples
    uint32_t            m_height = 0;                                   //!< Frame height in luma samples
    uint16_t            m_picWidthInMb = 0;                             //!< Picture Width in MB width count
    uint16_t            m_picHeightInMb = 0;                            //!< Picture Height in MB height count

    uint32_t            m_frameNum = 0;                                 //!< Frame number, inc by each codec pipeline
    bool                m_secondField = false;                          //!< Indicates if current field is second field(bottom field)
    uint16_t            m_pictureCodingType = 0;                        //!< I, P, B or mixed frame

    CODEC_PICTURE       m_curRenderPic = {0};                           //!< picture information of current render target

    CODECHAL_STANDARD   m_standard = CODECHAL_UNDEFINED;                //!< Decode standard
    CODECHAL_MODE       m_mode = CODECHAL_UNSUPPORTED_MODE;             //!< Decode mode
    CODECHAL_FUNCTION   m_codecFunction = CODECHAL_FUNCTION_INVALID;    //!< Decode function

    HCP_CHROMA_FORMAT_IDC m_chromaFormat = HCP_CHROMA_FORMAT_YUV420;    //!< Chroma format(420, 422 etc)
    uint8_t             m_bitDepth = 8;                                 //!< Bit depth
    bool                m_is10Bit = false;

    uint32_t            m_numSlices = 0;                                //!< [VLD mode] Number of slices to be decoded

    MOS_SURFACE         m_destSurface;                                  //!< Decode render target

    MOS_BUFFER          m_resDataBuffer;                                //!< Decode input bitstream
    uint32_t            m_dataOffset = 0;
    uint32_t            m_dataSize = 0;                                 //!< Size of the bitstream required on this picture
    PMOS_SURFACE        m_refFrameSurface = nullptr;                    //!< Handle of reference frame surface
    uint32_t            m_refSurfaceNum = 0;                            //!< Number of reference frame surface

    bool                m_reportFrameCrc = false;                       //!< Flag to indicate if report frame CRC

    bool                m_disableDecodeSyncLock = false;                //!< Indicates if decode sync lock is disabled

    bool                m_setMarkerEnabled = false;                     //!< [SetMarker] Indicates whether or not SetMarker is enabled
    PMOS_RESOURCE       m_presSetMarker = nullptr;                      //!< [SetMarker] Resource for SetMarker

    bool                            m_useDummyReference = false;        //!< Indicates if use dummy reference
    MOS_SURFACE                     m_dummyReference;                   //!< Dummy reference surface
    CODECHAL_DUMMY_REFERENCE_STATUS m_dummyReferenceStatus = CODECHAL_DUMMY_REFERENCE_INVALID; //!< Indicate the status of dummy reference
    constexpr static uint8_t m_invalidFrameIndex = 0xff;                //!< Invalid frame index
    constexpr static uint8_t m_maxFrameIndex = CODECHAL_NUM_UNCOMPRESSED_SURFACE_HEVC; //!< Max frame index

protected:
    //!
    //! \brief  Set required bitstream size by each codec
    //! \param  [in] requiredSize
    //!         required size for current frame
    //! \return MOS_STATUS
    //!         MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS SetRequiredBitstreamSize(uint32_t requiredSize) = 0;

    CodechalHwInterface *  m_hwInterface = nullptr;
    DecodeAllocator *      m_allocator   = nullptr;

#ifdef _MMC_SUPPORTED
    bool                   m_isMmcEnabled = false;   //!< Indicate MMC enabled for current picture
#endif

MEDIA_CLASS_DEFINE_END(DecodeBasicFeature)
};

}//decode

#endif // !__DECODE_BASIC_FEATURE_H__
