/*
* Copyright (c) 2009-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      media_libva_encoder.h
//! \brief     libva(and its extension) encoder head file
//!

#ifndef  __MEDIA_LIBVA_ENCODER_H__
#define  __MEDIA_LIBVA_ENCODER_H__

#include "media_libva.h"
#include "media_libva_cp_interface.h"
#include <vector>

// change to 0x1000 for memory optimization, double check when implement slice header packing in app
#define PACKED_HEADER_SIZE_PER_ROW      0x1000

#define DDI_ENCODE_MAX_STATUS_REPORT_BUFFER    CODECHAL_ENCODE_STATUS_NUM

typedef enum _DDI_ENCODE_FEI_ENC_BUFFER_TYPE
{
    FEI_ENC_BUFFER_TYPE_MVDATA     = 0,
    FEI_ENC_BUFFER_TYPE_MBCODE     = 1,
    FEI_ENC_BUFFER_TYPE_DISTORTION = 2,
    FEI_ENC_BUFFER_TYPE_MAX        = 3
} DDI_ENCODE_FEI_ENC_BUFFER_TYPE;

typedef enum _DDI_ENCODE_PRE_ENC_BUFFER_TYPE
{
    PRE_ENC_BUFFER_TYPE_MVDATA     = 0,
    PRE_ENC_BUFFER_TYPE_STATS      = 1,
    PRE_ENC_BUFFER_TYPE_STATS_BOT  = 2,
    PRE_ENC_BUFFER_TYPE_MAX        = 3
} DDI_ENCODE_PRE_ENC_BUFFER_TYPE;

typedef struct _DDI_ENCODE_STATUS_REPORT_INFO
{
    void           *pCodedBuf;              //encoded buffer address
    uint32_t        uiSize;                 //encoded frame size
    uint32_t        uiStatus;               // Encode frame status
    uint32_t        uiInputCtr[4];          // Counter for HDCP2 session
} DDI_ENCODE_STATUS_REPORT_INFO;

// ENC output buffer checking for FEI_ENC case only
typedef struct _DDI_ENCODE_STATUS_REPORT_ENC_INFO
{
    void           *pEncBuf[3];             // ENC buffers address for Mvdata, MbCode and Distortion
    uint32_t        uiBuffers;              // rendered ENC buffers
    uint32_t        uiStatus;               // ENC frame status
} DDI_ENCODE_STATUS_REPORT_ENC_INFO;

// PREENC output buffer checking
typedef struct _DDI_ENCODE_STATUS_REPORT_PREENC_INFO
{
    void           *pPreEncBuf[3];          // PREENC buffers address for Mvdata and Statistics, Statistics of Bottom Field
    uint32_t        uiBuffers;              // rendered ENC buffers
    uint32_t        uiStatus;               // PREENC frame status
} DDI_ENCODE_STATUS_REPORT_PREENC_INFO;

typedef struct _DDI_ENCODE_STATUS_REPORT_INFO_BUF
{
    DDI_ENCODE_STATUS_REPORT_INFO          infos[DDI_ENCODE_MAX_STATUS_REPORT_BUFFER];
    DDI_ENCODE_STATUS_REPORT_ENC_INFO      encInfos[DDI_ENCODE_MAX_STATUS_REPORT_BUFFER];
    DDI_ENCODE_STATUS_REPORT_PREENC_INFO   preencInfos[DDI_ENCODE_MAX_STATUS_REPORT_BUFFER];
    uint32_t                               ulHeadPosition;
    uint32_t                               ulUpdatePosition;
} DDI_ENCODE_STATUS_REPORT_INFO_BUF;

class DdiEncodeBase;

typedef struct _DDI_ENCODE_CONTEXT
{
    DdiEncodeBase                    *m_encode;
    Codechal                         *pCodecHal;
    CODECHAL_MODE                     wModeType;
    CODECHAL_FUNCTION                 codecFunction;
    VAProfile                         vaProfile;
    VAEntrypoint                      vaEntrypoint;
    void                             *pSeqParams;
    void                             *pVuiParams;
    void                             *pPicParams;
    void                             *pSliceParams;
    void                             *pEncodeStatusReport;
    void                             *pQmatrixParams;
    void                             *pFeiPicParams;
    void                             *pVpxSegParams;
    bool                              bMbDisableSkipMapEnabled;
    MOS_RESOURCE                      resPerMBSkipMapBuffer;
    void                             *pPreEncParams;
    DDI_ENCODE_STATUS_REPORT_INFO_BUF statusReportBuf;
    MOS_RESOURCE                      resBitstreamBuffer;
    MOS_RESOURCE                      resMbCodeBuffer;
    MOS_RESOURCE                      resProbCoeffBuffer;
    MOS_SURFACE                       sCoeffSurface;
    MOS_RESOURCE                      resMBQpBuffer;
    //CP related
    DdiCpInterface                   *pCpDdiInterface;

    uint32_t                          indexNALUnit;
    uint8_t                           PicParamId;
    MOS_SURFACE                       segMapBuffer;
    uint16_t                          wPicWidthInMB;          // Picture Width in MB width count
    uint16_t                          wPicHeightInMB;         // Picture Height in MB height count
    uint16_t                          wOriPicWidthInMB;
    uint16_t                          wOriPicHeightInMB;
    uint16_t                          wContextPicWidthInMB;
    uint16_t                          wContextPicHeightInMB;
    uint32_t                          dworiFrameWidth;        // Original Frame width in luma samples
    uint32_t                          dworiFrameHeight;       // Original Frame height in luma samples
    uint32_t                          dwFrameWidth;           // Frame width in luma samples
    uint32_t                          dwFrameHeight;          // Frame height in luma samples
    PBSBuffer                         pbsBuffer;
    uint32_t                          dwNumSlices;
    bool                              bNewSeq;
    bool                              bPicQuant;
    bool                              bNewQmatrixData;
    bool                              bNewVuiData;
    uint32_t                          uFrameRate;

    PCODECHAL_NAL_UNIT_PARAMS        *ppNALUnitParams;
    PCODEC_ENCODER_SLCDATA            pSliceHeaderData;
    uint32_t                          uiSliceHeaderCnt;
    // For square region based rolling I
    uint32_t                          uiIntraRefreshFrameCnt;
    uint32_t                          uiIntraRefreshMBx;
    uint32_t                          uiIntraRefreshMBy;

    // whether packed slice headers are passed from application;
    bool                              bHavePackedSliceHdr;

    // whether the latest packed header type is for slice header
    bool                              bLastPackedHdrIsSlice;

    // SEI stream passed by app
    CodechalEncodeSeiData            *pSEIFromApp;
    uint32_t                          uiRCMethod;

    uint32_t                          uiTargetBitRate;
    uint32_t                          uiMaxBitRate;

    EncoderParams                     EncodeParams;

    //VDENC Enable flag
    bool                              bVdencActive;
    //VDENC Dynamic slice enabling
    bool                              EnableSliceLevelRateCtrl;
    //Per-MB Qp control
    bool                              bMBQpEnable;

    DDI_CODEC_RENDER_TARGET_TABLE     RTtbl;
    DDI_CODEC_COM_BUFFER_MGR          BufMgr;
    PDDI_MEDIA_CONTEXT                pMediaCtx;

    uint8_t                           targetUsage;

} DDI_ENCODE_CONTEXT, *PDDI_ENCODE_CONTEXT;

typedef struct _DDI_ENCODE_MFE_CONTEXT
{
    std::vector<PDDI_ENCODE_CONTEXT> pDdiEncodeContexts;            // Container to keep sub contexts
    MEDIA_MUTEX_T                    encodeMfeMutex;
    uint32_t                         currentStreamId;               // Current allocated id, increased monotonically
    MfeSharedState                   *mfeEncodeSharedState;         // Keep shared state across sub contexts
    bool                             isFEI;                         // Support legacy only or FEI only
}DDI_ENCODE_MFE_CONTEXT, *PDDI_ENCODE_MFE_CONTEXT;

static __inline PDDI_ENCODE_CONTEXT DdiEncode_GetEncContextFromPVOID (void *encCtx)
{
    return (PDDI_ENCODE_CONTEXT)encCtx;
}

//!
//! \brief  Get encode context from context ID
//!
//! \param  [in] ctx
//!     Pointer to VA driver context
//! \param  [in] vaCtxID
//!     VA context ID
//!
//! \return PDDI_ENCODE_CONTEXT
//!     Pointer to ddi encode context
//!
PDDI_ENCODE_CONTEXT DdiEncode_GetEncContextFromContextID (VADriverContextP ctx, VAContextID vaCtxID);

//!
//! \brief  Remove from status report queue
//!
//! \param  [in] encCtx
//!     Pointer to ddi encode context
//! \param  [in] buf
//!     Pointer to ddi media buffer
//!
//! \return VAStatus
//!     VA_STATUS_SUCCESS if success, else fail reason
//!
VAStatus DdiEncode_RemoveFromStatusReportQueue(PDDI_ENCODE_CONTEXT  encCtx, PDDI_MEDIA_BUFFER buf);

//!
//! \brief  Remove from encode status report queue
//!
//! \param  [in] encCtx
//!     Pointer to ddi encode context
//! \param  [in] buf
//!     Pointer to ddi media buffer
//! \param  [in] idx
//!     Ddi encode FEI encode buffer type
//!
//! \return VAStatus
//!     VA_STATUS_SUCCESS if success, else fail reason
//!
VAStatus DdiEncode_RemoveFromEncStatusReportQueue(PDDI_ENCODE_CONTEXT encCtx, PDDI_MEDIA_BUFFER buf, DDI_ENCODE_FEI_ENC_BUFFER_TYPE idx);

//!
//! \brief  Remove form preencode status report queue
//!
//! \param  [in] encCtx
//!     Pointer to ddi encode context
//! \param  [in] buf
//!     Pointer to ddi media buffer
//! \param  [in] idx
//!     Ddi encode PRE encode buffer type
//!
//! \return VAStatus
//!     VA_STATUS_SUCCESS if success, else fail reason
//!
VAStatus DdiEncode_RemoveFromPreEncStatusReportQueue(PDDI_ENCODE_CONTEXT encCtx, PDDI_MEDIA_BUFFER buf, DDI_ENCODE_PRE_ENC_BUFFER_TYPE idx);

//!
//! \brief  Get encode context from context ID
//!
//! \param  [in] ctx
//!     Pointer to VA driver context
//! \param  [in] vaCtxID
//!     VA context ID
//!
//! \return PDDI_ENCODE_CONTEXT
//!     Pointer to ddi encode context
//!
PDDI_ENCODE_CONTEXT DdiEncode_GetEncContextFromContextID (VADriverContextP ctx, VAContextID vaCtxID);

//!
//! \brief  Coded buffer exist in status report
//!
//! \param  [in] encCtx
//!     Pointer to ddi encode context
//! \param  [in] buf
//!     Pointer to ddi media buffer
//!
//! \return bool
//!     true if call success, else false
//!
bool DdiEncode_CodedBufferExistInStatusReport(
    PDDI_ENCODE_CONTEXT     encCtx,
    PDDI_MEDIA_BUFFER       buf);

//!
//! \brief  Encode buffer exist in status report
//!
//! \param  [in] encCtx
//!     Pointer to ddi encode context
//! \param  [in] buf
//!     Pointer to ddi media buffer
//! \param  [in] typeIdx
//!     Ddi encode FEI encode buffer type
//!
//! \return bool
//!     true if call success, else false
//!
bool DdiEncode_EncBufferExistInStatusReport(
    PDDI_ENCODE_CONTEXT             encCtx,
    PDDI_MEDIA_BUFFER               buf,
    DDI_ENCODE_FEI_ENC_BUFFER_TYPE  typeIdx);

//!
//! \brief  Pre encode buffer exist in status report
//!
//! \param  [in] encCtx
//!     Pointer to ddi encode context
//! \param  [in] buf
//!     Pointer to ddi media buffer
//! \param  [in] typeIdx
//!     Ddi encode PRE encode buffer type
//!
//! \return bool
//!     true if call success, else false
//!
bool DdiEncode_PreEncBufferExistInStatusReport(
    PDDI_ENCODE_CONTEXT             encCtx,
    PDDI_MEDIA_BUFFER               buf,
    DDI_ENCODE_PRE_ENC_BUFFER_TYPE  typeIdx);

//!
//! \brief  Encode status report
//!
//! \param  [in] encCtx
//!     Pointer to ddi encode context
//! \param  [in] mediaBuf
//!     Ddi media buffer
//! \param  [out] pbuf
//!     Pointer buffer
//!
//! \return VAStatus
//!     VA_STATUS_SUCCESS if success, else fail reason
//!
VAStatus DdiEncode_EncStatusReport (
    PDDI_ENCODE_CONTEXT encCtx,
    DDI_MEDIA_BUFFER    *mediaBuf,
    void                **pbuf
);

//!
//! \brief  Pre encode status report
//!
//! \param  [in] encCtx
//!     Pointer to ddi encode context
//! \param  [in] mediaBuf
//!     Ddi media buffer
//! \param  [out] pbuf
//!     Pointer buffer
//!
//! \return VAStatus
//!     VA_STATUS_SUCCESS if success, else fail reason
//!
VAStatus DdiEncode_PreEncStatusReport (
    PDDI_ENCODE_CONTEXT encCtx,
    DDI_MEDIA_BUFFER    *mediaBuf,
    void                **pbuf
);

//!
//! \brief  Status report
//!
//! \param  [in] encCtx
//!     Pointer to ddi encode context
//! \param  [in] mediaBuf
//!     Ddi media buffer
//! \param  [out] pbuf
//!     Pointer buffer
//!
//! \return VAStatus
//!     VA_STATUS_SUCCESS if success, else fail reason
//!
VAStatus DdiEncode_StatusReport (
    PDDI_ENCODE_CONTEXT encCtx,
    DDI_MEDIA_BUFFER    *mediaBuf,
    void                **pbuf
);

//!
//! \brief  Create context
//!
//! \param  [in] ctx
//!     Pointer to VA driver context
//! \param  [in] config_id
//!     VA configuration ID
//! \param  [in] picture_width
//!     The width of picture
//! \param  [in] picture_height
//!     The height of picture
//! \param  [in] flag
//!     Flag
//! \param  [in] render_targets
//!     Render targets
//! \param  [in] num_render_targets
//!     Number of render targets
//! \param  [in] context
//!     VA context ID
//!
//! \return VAStatus
//!     VA_STATUS_SUCCESS if success, else fail reason
//!
VAStatus DdiEncode_CreateContext (
    VADriverContextP    ctx,
    VAConfigID          config_id,
    int32_t             picture_width,
    int32_t             picture_height,
    int32_t             flag,
    VASurfaceID        *render_targets,
    int32_t             num_render_targets,
    VAContextID        *context
);

//!
//! \brief  Destroy context
//!
//! \param  [in] ctx
//!     Pointer to VA driver context
//! \param  [in] context
//!     VA context ID
//!
//! \return VAStatus
//!     VA_STATUS_SUCCESS if success, else fail reason
//!
VAStatus DdiEncode_DestroyContext (
    VADriverContextP    ctx,
    VAContextID         context);

//!
//! \brief  Create buffer
//!
//! \param  [in] ctx
//!     Pointer to VA driver context
//! \param  [in] context
//!     VA context ID
//! \param  [in] type
//!     VA buffer type
//! \param  [in] size
//!     Size
//! \param  [in] num_elements
//!     Number of elements
//! \param  [in] data
//!     Data
//! \param  [in] buf_id
//!     VA buffer ID 
//!
//! \return VAStatus
//!     VA_STATUS_SUCCESS if success, else fail reason
//!
VAStatus DdiEncode_CreateBuffer (
    VADriverContextP    ctx,
    VAContextID         context,
    VABufferType        type,
    uint32_t            size,
    uint32_t            num_elements,
    void               *data,
    VABufferID         *buf_id
);

//!
//! \brief  Begin picture
//!
//! \param  [in] ctx
//!     Pointer to VA driver context
//! \param  [in] context
//!     VA context ID
//! \param  [in] render_target
//!     VA surface ID
//!
//! \return VAStatus
//!     VA_STATUS_SUCCESS if success, else fail reason
//!
VAStatus DdiEncode_BeginPicture (
    VADriverContextP    ctx,
    VAContextID         context,
    VASurfaceID         render_target
);

//!
//! \brief  Begin Picture
//!
//! \param  [in] ctx
//!     Pointer to VA driver context
//! \param  [in] context
//!     VA context ID
//! \param  [in] render_target
//!     VA surface ID
//!
//! \return VAStatus
//!     VA_STATUS_SUCCESS if success, else fail reason
//!
VAStatus vDdiEncode_BeginPicture (
    VADriverContextP    ctx,
    VAContextID         context,
    VASurfaceID         render_target
);

//!
//! \brief  Render picture
//!
//! \param  [in] ctx
//!     Pointer to VA driver context
//! \param  [in] context
//!     VA context ID
//! \param  [in] buffers
//!     VA buffer ID
//! \param  [in] num_buffers
//!     Number of buffers
//!
//! \return VAStatus
//!     VA_STATUS_SUCCESS if success, else fail reason
//!
VAStatus DdiEncode_RenderPicture (
    VADriverContextP    ctx,
    VAContextID         context,
    VABufferID         *buffers,
    int32_t             num_buffers
);

//!
//! \brief  End picture
//!
//! \param  [in] ctx
//!     Pointer to VA driver context
//! \param  [in] context
//!     VA context ID
//!
//! \return VAStatus
//!     VA_STATUS_SUCCESS if success, else fail reason
//!
VAStatus DdiEncode_EndPicture(
    VADriverContextP    ctx,
    VAContextID         context);

//!
//! \brief  MFE submit
//!
//! \param  [in] ctx
//!     Pointer to VA driver context
//! \param  [in] mfe_context
//!     VA MF context ID
//! \param  [in] contexts
//!     VA context ID
//! \param  [in] num_contexts
//!     Number of contexts
//!
//! \return VAStatus
//!     VA_STATUS_SUCCESS if success, else fail reason
//!
VAStatus DdiEncode_MfeSubmit(
    VADriverContextP    ctx,
    VAMFContextID       mfe_context,
    VAContextID        *contexts,
    int32_t             num_contexts
);

//!
//! \brief  Set Encode Gpu Priority
//!
//! \param  [in] encode context
//!     Pointer to encode context
//! \param  [in] priority
//!     priority
//! \return VAStatus
//!
VAStatus DdiEncode_SetGpuPriority(
    PDDI_ENCODE_CONTEXT encCtx,
    int32_t             priority
);
#endif
