/*
* 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_util.h
//! \brief     libva(and its extension) utility head file
//!
#ifndef __MEDIA_LIBVA_UTIL_H__
#define __MEDIA_LIBVA_UTIL_H__

#include "media_libva_common.h"
#include "mos_util_debug.h"
#include "mos_bufmgr.h"

#define DEVICE_NAME "/dev/dri/renderD128"   // For Gen, it is always /dev/dri/renderD128 node

//!
//! \brief  Media print frame per second
//!
void     DdiMediaUtil_MediaPrintFps();

//!
//! \brief  Create surface
//! 
//! \param  [in] surface
//!         Ddi media surface
//! \param  [in] mediaDrvCtx
//!         Pointer to ddi media context
//!         
//! \return VAStatus
//!     VA_STATUS_SUCCESS if success, else fail reason
//!
VAStatus DdiMediaUtil_CreateSurface(DDI_MEDIA_SURFACE  *surface, PDDI_MEDIA_CONTEXT mediaDrvCtx);

//!
//! \brief  Create buffer
//! 
//! \param  [out] buffer
//!         Ddi media buffer
//! \param  [in] bufmgr
//!         Mos buffer manager
//!         
//! \return VAStatus
//!     VA_STATUS_SUCCESS if success, else fail reason
//!
VAStatus DdiMediaUtil_CreateBuffer(DDI_MEDIA_BUFFER *buffer, mos_bufmgr *bufmgr);

//!
//! \brief  Lock surface
//! 
//! \param  [in] surface
//!         Ddi media surface
//! \param  [in] flag
//!         Flag
//!
//! \return void*
//!     Pointer to lock surface data
//!
void*    DdiMediaUtil_LockSurface(DDI_MEDIA_SURFACE  *surface, uint32_t flag);

//!
//! \brief  Unlock surface
//! 
//! \param  [in] surface
//!         Ddi media surface
//!
void     DdiMediaUtil_UnlockSurface(DDI_MEDIA_SURFACE  *surface);

//!
//! \brief  Lock buffer
//! 
//! \param  [in] buf
//!         Ddi media buffer
//! \param  [in] flag
//!         Flag
//!         
//! \return void*
//!     Pointer to lock buffer data
//!
void*    DdiMediaUtil_LockBuffer(DDI_MEDIA_BUFFER *buf, uint32_t flag);

//!
//! \brief  Unlock buffer
//! 
//! \param  [in] buf
//!         Ddi media buffer
//!
void     DdiMediaUtil_UnlockBuffer(DDI_MEDIA_BUFFER *buf);

//!
//! \brief  Free surface
//! 
//! \param  [in] surface
//!         Ddi media surface
//!
void     DdiMediaUtil_FreeSurface(DDI_MEDIA_SURFACE *surface);

//!
//! \brief  Free buffer
//! 
//! \param  [in] buf
//!         Ddi media buffer
//!
void     DdiMediaUtil_FreeBuffer(DDI_MEDIA_BUFFER  *buf);

//!
//! \brief  Init mutex
//! 
//! \param  [in] mutex
//!         Pointer to media mutex thread
//!
void     DdiMediaUtil_InitMutex(PMEDIA_MUTEX_T  mutex);

//!
//! \brief  Destroy mutex
//! 
//! \param  [in] mutex
//!         Pointer to media mutex thread
//!
void     DdiMediaUtil_DestroyMutex(PMEDIA_MUTEX_T  mutex);
//!
//! \brief  Lock mutex
//! 
//! \param  [in] mutex
//!         Pointer to media mutex thread
//!
void     DdiMediaUtil_LockMutex(PMEDIA_MUTEX_T  mutex);

//!
//! \brief  Unlock mutex
//! 
//! \param  [in] mutex
//!         Pointer to media mutex thread
//!
void     DdiMediaUtil_UnLockMutex(PMEDIA_MUTEX_T  mutex);

//!
//! \brief  Helper inline class intended to simplify mutex lock/unlock
//!         operations primarily used as a stack-allocated object.
//!         In that case, the compiler guarantees to call the destructor
//!         leaving the scope. The class becomes handy in functions
//!         where there are several return statements with different
//!         exit code value.
//!
class DdiMediaUtil_LockGuard {
private:
    PMEDIA_MUTEX_T m_pMutex;
public:
    DdiMediaUtil_LockGuard(PMEDIA_MUTEX_T pMutex):m_pMutex(pMutex)
    {
        DdiMediaUtil_LockMutex(m_pMutex);
    }
    ~DdiMediaUtil_LockGuard()
    {
        DdiMediaUtil_UnLockMutex(m_pMutex);
    }
};

//!
//! \brief  Destroy semaphore
//! 
//! \param  [in] sem
//!         Pointer to media semaphore thread
//!
void     DdiMediaUtil_DestroySemaphore(PMEDIA_SEM_T  sem);

//!
//! \brief  Wait semaphore
//! 
//! \param  [in] sem
//!         Pointer to media semaphore thread
//!
void     DdiMediaUtil_WaitSemaphore(PMEDIA_SEM_T  sem);
//!
//! \brief  Try wait semaphore
//! 
//! \param  [in] sem
//!         Pointer to media semaphore thread
//!
//! \return int32_t 
//!     Try wait for semaphore. Return 0 if success, else -1 if fail        
//!
int32_t  DdiMediaUtil_TryWaitSemaphore(PMEDIA_SEM_T  sem);

//!
//! \brief  Post semaphore
//! 
//! \param  [in] sem
//!         Pointer to media semaphore thread
//!
void     DdiMediaUtil_PostSemaphore(PMEDIA_SEM_T  sem);

//!
//! \brief  Fill a rect structure with the regsion specified by parameters
//! 
//! \param  [in] rect
//!         Input pointer to the rect
//! \param  [in] offset_x
//!         X offset of the region
//! \param  [in] offset_y
//!         Y offset of the region
//! \param  [in] width
//!         Width of the region
//! \param  [in] height
//!         Height of the region
//!         
//! \return VAStatus
//!     VA_STATUS_SUCCESS if success, else fail reason
//!
VAStatus DdiMediaUtil_FillPositionToRect(RECT *rect, int16_t offset_x, int16_t offset_y, int16_t width, int16_t height);

//!
//! \brief  Is external surface
//! \details    If the bo of media surface was allocated from App,
//!     should return true, otherwise, false. In current implemeation
//!     external buffer passed with pSurfDesc.
//! 
//! \param  [in] surface
//!         Pointer to ddi media surface
//!         
//! \return bool
//!     true if surface is external, else false
//!
bool     DdiMediaUtil_IsExternalSurface(PDDI_MEDIA_SURFACE surface);

//!
//! \brief  Allocate pmedia surface from heap
//! 
//! \param  [in] surfaceHeap
//!         Pointer to ddi media heap
//!         
//! \return PDDI_MEDIA_SURFACE_HEAP_ELEMENT
//!     Pointer to ddi media surface heap element
//!
PDDI_MEDIA_SURFACE_HEAP_ELEMENT DdiMediaUtil_AllocPMediaSurfaceFromHeap(PDDI_MEDIA_HEAP surfaceHeap);

//!
//! \brief  Release pmedia surface from heap
//! 
//! \param  [in] surfaceHeap
//!         Pointer to ddi media heap
//! \param  [in] vaSurfaceID
//!         VA surface ID
//!
void     DdiMediaUtil_ReleasePMediaSurfaceFromHeap(PDDI_MEDIA_HEAP surfaceHeap, uint32_t vaSurfaceID);

//!
//! \brief  Allocate pmedia buffer from heap
//! 
//! \param  [in] bufferHeap
//!         Pointer to ddi media heap
//!         
//! \return PDDI_MEDIA_BUFFER_HEAP_ELEMENT
//!     Pointer to ddi media buffer heap element
//!
PDDI_MEDIA_BUFFER_HEAP_ELEMENT  DdiMediaUtil_AllocPMediaBufferFromHeap(PDDI_MEDIA_HEAP bufferHeap);

//!
//! \brief  Release pmedia buffer from heap
//! 
//! \param  [in] bufferHeap
//!         Pointer to ddi media heap
//! \param  [in] vaBufferID
//!         VA buffer ID
//!
void     DdiMediaUtil_ReleasePMediaBufferFromHeap(PDDI_MEDIA_HEAP bufferHeap, uint32_t vaBufferID);

//!
//! \brief  Allocate PVA image from heap
//! 
//! \param  [in] imageHeap
//!         Pointer to ddi media heap
//!         
//! \return PDDI_MEDIA_IMAGE_HEAP_ELEMENT
//!     Pointer to ddi media image heap element
//!
PDDI_MEDIA_IMAGE_HEAP_ELEMENT  DdiMediaUtil_AllocPVAImageFromHeap(PDDI_MEDIA_HEAP imageHeap);

//!
//! \brief  Release PVA image from heap
//! 
//! \param  [in] imageHeap
//!         Pointer to ddi media heap
//! \param  [in] vaImageID
//!         VA image ID
//!
void     DdiMediaUtil_ReleasePVAImageFromHeap(PDDI_MEDIA_HEAP imageHeap, uint32_t vaImageID);

//!
//! \brief  Allocate PVA context from heap
//! 
//! \param  [in] vaContextHeap
//!         Pointer to ddi media heap
//!         
//! \return PDDI_MEDIA_VACONTEXT_HEAP_ELEMENT
//!     Pointer to ddi media vacontext heap element
//!
PDDI_MEDIA_VACONTEXT_HEAP_ELEMENT DdiMediaUtil_AllocPVAContextFromHeap(PDDI_MEDIA_HEAP vaContextHeap);

//!
//! \brief  Release PVA context from heap
//! 
//! \param  [in] vaContextHeap
//!         Pointer to ddi media heap
//! \param  [in] vaContextID
//!         VA context ID
//!
void     DdiMediaUtil_ReleasePVAContextFromHeap(PDDI_MEDIA_HEAP vaContextHeap, uint32_t vaContextID);

//!
//! \brief  Unreference buf object media buffer
//! 
//! \param  [in] buf
//!         Pointer to ddi media buffer
//!
void     DdiMediaUtil_UnRefBufObjInMediaBuffer(PDDI_MEDIA_BUFFER buf);

//!
//! \brief  Open Intel's Graphics Device to get the file descriptor
//! 
//! \param  [in] devName
//!         Device name
//!         
//! \return int32_t 
//!     Device name header. Return 0 if success, else -1 if fail.
//!
int32_t  DdiMediaUtil_OpenGraphicsAdaptor(char *devName);

//!
//! \brief  Unregister RT surfaces
//!
//! \param  [in] ctx
//!     Pointer to VA driver context
//! \param  [in] surface
//!     Pointer to ddi media surface
//!     
//! \return     VAStatus
//!     VA_STATUS_SUCCESS if success, else fail reason
//!
VAStatus DdiMediaUtil_UnRegisterRTSurfaces(VADriverContextP    ctx,PDDI_MEDIA_SURFACE surface);

//!
//! \brief  Determine whethere media reset is anabled
//!
//! \param  [in] mediaCtx
//!     Pointer to VA driver context
//!
//! \return     VAStatus
//!     VA_STATUS_SUCCESS if success, else fail reason
//!
VAStatus DdiMediaUtil_SetMediaResetEnableFlag(PDDI_MEDIA_CONTEXT mediaCtx);

//------------------------------------------------------------------------------
// Macros for debug messages, Assert, Null check and condition check within ddi files
//------------------------------------------------------------------------------

#define DDI_ASSERT(_expr)                                                   \
    MOS_ASSERT(MOS_COMPONENT_DDI, MOS_DDI_SUBCOMP_SELF, _expr)

#define DDI_ASSERTMESSAGE(_message, ...)                                    \
    MOS_ASSERTMESSAGE(MOS_COMPONENT_DDI, MOS_DDI_SUBCOMP_SELF, _message, ##__VA_ARGS__)

#define DDI_NORMALMESSAGE(_message, ...)                                    \
    MOS_NORMALMESSAGE(MOS_COMPONENT_DDI, MOS_DDI_SUBCOMP_SELF, _message, ##__VA_ARGS__)

#define DDI_VERBOSEMESSAGE(_message, ...)                                   \
    MOS_VERBOSEMESSAGE(MOS_COMPONENT_DDI, MOS_DDI_SUBCOMP_SELF, _message, ##__VA_ARGS__)

#ifdef ANDROID
#define DDI_FUNCTION_ENTER()            UMD_ATRACE_BEGIN(__FUNCTION__)
#define DDI_FUNCTION_EXIT(status)       UMD_ATRACE_END
#else
#define DDI_FUNCTION_ENTER()                                                \
    MOS_FUNCTION_ENTER(MOS_COMPONENT_DDI, MOS_DDI_SUBCOMP_SELF)

#define DDI_FUNCTION_EXIT(status)                                               \
    MOS_FUNCTION_EXIT(MOS_COMPONENT_DDI, MOS_DDI_SUBCOMP_SELF, status)
#endif

// If pointer is nullptr, print the error message and return the specified value.
#define DDI_CHK_NULL(_ptr, _str, _ret)                                      \
    DDI_CHK_CONDITION((nullptr == (_ptr)), _str, _ret)

#define DDI_CHK_LARGER(p, bottom, str, ret)                                 \
    DDI_CHK_CONDITION((p <= bottom),str,ret)

#define DDI_CHK_LESS(p, upper, str, ret)                                    \
    DDI_CHK_CONDITION((p >= upper),str,ret)

// Check the return value of function.
// If failed,  print the error message and return,
// do nothing otherwise.
#define DDI_CHK_RET(_ret, _str)                                           \
{                                                                             \
    VAStatus tmpRet = _ret;                                                   \
    if (VA_STATUS_SUCCESS != tmpRet) {                                        \
        DDI_ASSERTMESSAGE("%s [%d].", _str, tmpRet);                        \
        return tmpRet;                                                        \
    }                                                                         \
}

// Check the return status of parse function in renderPicture
// If failed, assign new status and break
// do nothing otherwise.
#define DDI_CHK_STATUS(_ret, _newret)                                       \
{                                                                             \
    if (VA_STATUS_SUCCESS != _ret) {                                          \
        vaStatus = _newret;                                                   \
        break;                                                                \
    }                                                                         \
}

// Check the condition, if true, print the error message
// and return the specified value, do nothing otherwise.
#define DDI_CHK_CONDITION(condition, _str, _ret)                            \
    if (condition) {                                                          \
        DDI_ASSERTMESSAGE(_str);                                            \
        return _ret;                                                          \
    }

#define DDI_CHK_STATUS_MESSAGE(_ptr, _message, ...)                         \
    MOS_CHK_STATUS_MESSAGE(MOS_COMPONENT_DDI, MOS_DDI_SUBCOMP_SELF, _ptr, _message, ##__VA_ARGS__)

#define DDI_CHK_HR_MESSAGE(_ptr, _message, ...)                             \
    MOS_CHK_HR_MESSAGE(MOS_COMPONENT_DDI, MOS_DDI_SUBCOMP_SELF, _ptr, _message, ##__VA_ARGS__)

#ifdef ANDROID
// Enable new specification for video formats
// \see memo "Color format Usage on Android"
#ifndef UFO_GRALLOC_NEW_FORMAT
#define UFO_GRALLOC_NEW_FORMAT 1
#endif
#endif

#endif
