blob: 595bfca7d010951b6e762b45a0d7247c7e2cae33 [file] [log] [blame]
/*
* Copyright (c) 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.
*/
#ifndef CMRTLIB_LINUX_SHARE_CM_DEF_OS_H_
#define CMRTLIB_LINUX_SHARE_CM_DEF_OS_H_
#include "cm_include.h"
#ifndef ANDROID
#include "va/va.h"
#else
#include <va/va_android.h>
#define Display unsigned int
#endif
#include <cstring>
#include "pthread.h"
////////////////////////////////////////////////////////////////////////////////////
// Platform dependent macros (Start)
////////////////////////////////////////////////////////////////////////////////////
#define CM_STRCPY(dst, sizeInBytes, src) strcpy(dst, src)
#define CM_STRNCPY(dst, sizeOfDst, src, count) strncpy(dst, src, count)
#define CM_STRCAT(dst, sizeOfDst, src) strcat(dst, src)
#define CM_GETENV(dst, name) dst = getenv(name)
#define CM_GETENV_FREE(dst)
#define CM_FOPEN(pFile, filename, mode) pFile = fopen(filename, mode)
#ifdef __cplusplus
# define EXTERN_C extern "C"
#else
# define EXTERN_C
#endif
#define SUCCEEDED(hr) (hr == VA_STATUS_SUCCESS)
#define FAILED(hr) (hr != VA_STATUS_SUCCESS)
typedef enum _VACMTEXTUREADDRESS {
VACMTADDRESS_WRAP = 1,
VACMTADDRESS_MIRROR = 2,
VACMTADDRESS_CLAMP = 3,
VACMTADDRESS_BORDER = 4,
VACMTADDRESS_MIRRORONCE = 5,
VACMTADDRESS_FORCE_DWORD = 0x7fffffff
} VACMTEXTUREADDRESS;
typedef enum _VACMTEXTUREFILTERTYPE {
VACMTEXF_NONE = 0,
VACMTEXF_POINT = 1,
VACMTEXF_LINEAR = 2,
VACMTEXF_ANISOTROPIC = 3,
VACMTEXF_FLATCUBIC = 4,
VACMTEXF_GAUSSIANCUBIC = 5,
VACMTEXF_PYRAMIDALQUAD = 6,
VACMTEXF_GAUSSIANQUAD = 7,
VACMTEXF_CONVOLUTIONMONO = 8, // Convolution filter for monochrome textures
VACMTEXF_FORCE_DWORD = 0x7fffffff
} VACMTEXTUREFILTERTYPE;
////////////////////////////////////////////////////////////////////////////////////
// Platform dependent macros (End)
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// Platform dependent definitions (Start)
////////////////////////////////////////////////////////////////////////////////////
#define VAExtModuleCMRT 2
typedef enum _VA_CM_FORMAT {
VA_CM_FMT_UNKNOWN = 0,
VA_CM_FMT_A8R8G8B8 = 21,
VA_CM_FMT_X8R8G8B8 = 22,
VA_CM_FMT_A8 = 28,
VA_CM_FMT_A2B10G10R10 = 31,
VA_CM_FMT_A8B8G8R8 = 32,
VA_CM_FMT_A16B16G16R16 = 36,
VA_CM_FMT_P8 = 41,
VA_CM_FMT_L8 = 50,
VA_CM_FMT_A8L8 = 51,
VA_CM_FMT_R16U = 57,
VA_CM_FMT_V8U8 = 60,
VA_CM_FMT_R8U = 62,
VA_CM_FMT_D16 = 80,
VA_CM_FMT_L16 = 81,
VA_CM_FMT_A16B16G16R16F = 113,
VA_CM_FMT_R32F = 114,
VA_CM_FMT_NV12 = VA_FOURCC_NV12,
VA_CM_FMT_UYVY = VA_FOURCC_UYVY,
VA_CM_FMT_YUY2 = VA_FOURCC_YUY2,
VA_CM_FMT_444P = VA_FOURCC_444P,
VA_CM_FMT_411P = VA_FOURCC_411P,
VA_CM_FMT_422H = VA_FOURCC_422H,
VA_CM_FMT_422V = VA_FOURCC_422V,
VA_CM_FMT_IMC3 = VA_FOURCC_IMC3,
VA_CM_FMT_YV12 = VA_FOURCC_YV12,
VA_CM_FMT_P010 = VA_FOURCC_P010,
VA_CM_FMT_P016 = VA_FOURCC_P016,
VA_CM_FMT_P208 = VA_FOURCC_P208,
VA_CM_FMT_Y216 = VA_FOURCC_Y216,
VA_CM_FMT_Y416 = VA_FOURCC_Y416,
VA_CM_FMT_MAX = 0xFFFFFFFF
} VA_CM_FORMAT;
#define CM_SURFACE_FORMAT VA_CM_FORMAT
#define CM_SURFACE_FORMAT_UNKNOWN VA_CM_FMT_UNKNOWN
#define CM_SURFACE_FORMAT_A8R8G8B8 VA_CM_FMT_A8R8G8B8
#define CM_SURFACE_FORMAT_X8R8G8B8 VA_CM_FMT_X8R8G8B8
#define CM_SURFACE_FORMAT_A8B8G8R8 VA_CM_FMT_A8B8G8R8
#define CM_SURFACE_FORMAT_A8 VA_CM_FMT_A8
#define CM_SURFACE_FORMAT_P8 VA_CM_FMT_P8
#define CM_SURFACE_FORMAT_R32F VA_CM_FMT_R32F
#define CM_SURFACE_FORMAT_NV12 VA_CM_FMT_NV12
#define CM_SURFACE_FORMAT_UYVY VA_CM_FMT_UYVY
#define CM_SURFACE_FORMAT_YUY2 VA_CM_FMT_YUY2
#define CM_SURFACE_FORMAT_V8U8 VA_CM_FMT_V8U8
#define CM_SURFACE_FORMAT_R8_UINT VA_CM_FMT_R8U
#define CM_SURFACE_FORMAT_R16_SINT VA_CM_FMT_A8L8
#define CM_SURFACE_FORMAT_R16_UINT VA_CM_FMT_R16U
#define CM_SURFACE_FORMAT_D16 VA_CM_FMT_D16
#define CM_SURFACE_FORMAT_L16 VA_CM_FMT_L16
#define CM_SURFACE_FORMAT_A16B16G16R16 VA_CM_FMT_A16B16G16R16
#define CM_SURFACE_FORMAT_R10G10B10A2 VA_CM_FMT_A2B10G10R10
#define CM_SURFACE_FORMAT_A16B16G16R16F VA_CM_FMT_A16B16G16R16F
#define CM_SURFACE_FORMAT_444P VA_CM_FMT_444P
#define CM_SURFACE_FORMAT_422H VA_CM_FMT_422H
#define CM_SURFACE_FORMAT_422V VA_CM_FMT_422V
#define CM_SURFACE_FORMAT_411P VA_CM_FMT_411P
#define CM_SURFACE_FORMAT_IMC3 VA_CM_FMT_IMC3
#define CM_SURFACE_FORMAT_YV12 VA_CM_FMT_YV12
#define CM_SURFACE_FORMAT_P010 VA_CM_FMT_P010
#define CM_SURFACE_FORMAT_P016 VA_CM_FMT_P016
#define CM_SURFACE_FORMAT_P208 VA_CM_FMT_P208
#define CM_SURFACE_FORMAT_Y216 VA_CM_FMT_Y216
#define CM_SURFACE_FORMAT_Y416 VA_CM_FMT_Y416
#define CM_TEXTURE_ADDRESS_TYPE VACMTEXTUREADDRESS
#define CM_TEXTURE_ADDRESS_WRAP VACMTADDRESS_WRAP
#define CM_TEXTURE_ADDRESS_MIRROR VACMTADDRESS_MIRROR
#define CM_TEXTURE_ADDRESS_CLAMP VACMTADDRESS_CLAMP
#define CM_TEXTURE_ADDRESS_BORDER VACMTADDRESS_BORDER
#define CM_TEXTURE_ADDRESS_MIRRORONCE VACMTADDRESS_MIRRORONCE
#define CM_TEXTURE_FILTER_TYPE VACMTEXTUREFILTERTYPE
#define CM_TEXTURE_FILTER_TYPE_NONE VACMTEXF_NONE
#define CM_TEXTURE_FILTER_TYPE_POINT VACMTEXF_POINT
#define CM_TEXTURE_FILTER_TYPE_LINEAR VACMTEXF_LINEAR
#define CM_TEXTURE_FILTER_TYPE_ANISOTROPIC VACMTEXF_ANISOTROPIC
#define CM_TEXTURE_FILTER_TYPE_FLATCUBIC VACMTEXF_FLATCUBIC
#define CM_TEXTURE_FILTER_TYPE_GAUSSIANCUBIC VACMTEXF_GAUSSIANCUBIC
#define CM_TEXTURE_FILTER_TYPE_PYRAMIDALQUAD VACMTEXF_PYRAMIDALQUAD
#define CM_TEXTURE_FILTER_TYPE_GAUSSIANQUAD VACMTEXF_GAUSSIANQUAD
#define CM_TEXTURE_FILTER_TYPE_CONVOLUTIONMONO VACMTEXF_CONVOLUTIONMONO
////////////////////////////////////////////////////////////////////////////////////
// Platform dependent definitions (End)
////////////////////////////////////////////////////////////////////////////////////
typedef enum _REGISTRATION_OP
{
REG_IGNORE = 0,
REG_REGISTER = 1,
REG_UNREGISTER = 2,
REG_REGISTER_INDEX = 3 // Register surface for Cm
} REGISTRATION_OP;
class CSync
{
public:
CSync() { pthread_mutex_init(&m_criticalSection, nullptr); }
~CSync() { pthread_mutex_destroy(&m_criticalSection); }
void Acquire() { pthread_mutex_lock(&m_criticalSection); }
void Release() {pthread_mutex_unlock(&m_criticalSection); }
private:
pthread_mutex_t m_criticalSection;
};
//The communication function for CM to call into UMD, get function pointer by libVA::vaGetLibFunc()
typedef VAStatus (__cdecl *pvaCmExtSendReqMsg)(VADisplay dpy, void *moduleType,
uint32_t *inputFunId, void *inputData, uint32_t *inputDataLen,
uint32_t *outputFunId, void *outputData, uint32_t *outputDataLen);
typedef struct _CM_CREATESURFACE2D_PARAM
{
uint32_t width; // [in] width of 2D texture in pixel
uint32_t height; // [in] height of 2D texture in pixel
CM_SURFACE_FORMAT format; // [in] DXGI format of 2D texture
union
{
uint32_t index2DinLookupTable; // [in] surface 2d's index in look up table.
uint32_t vaSurfaceID; // [in] libva-surface 2d's index in media driver
};
VASurfaceID *vaSurface; // [in] Pointer to a Libva Surface.
void *cmSurface2DHandle; // [out] pointer of CmSurface2D used in driver
bool isCmCreated;
int32_t returnValue; // [out] the return value from driver
bool isLibvaCreated; // [in] if the surface created via libva
void *vaDpy; // [in] VaDisplay used to free va sruface
}CM_CREATESURFACE2D_PARAM, *PCM_CREATESURFACE2D_PARAM;
//The communication function for CM to call into UMD, get function pointer by libVA::vaGetLibFunc()
typedef VAStatus (__cdecl *pvaCmExtSendReqMsg)(
VADisplay dpy,
void *moduleType,
uint32_t *inputFunId,
void *inputData,
uint32_t *inputDataLen,
uint32_t *outputFunId,
void *outputData,
uint32_t *outputDataLen);
typedef VADisplay (*pfVAGetDisplayDRM) (int32_t fd); //vaGetDisplayDRM from libva-drm.so
#ifndef CMRT_NOINLINE
#define CMRT_NOINLINE __attribute__((noinline))
#endif
#ifdef _DEBUG
#define CmAssert(expr) \
if( !(expr) ) \
{ \
__builtin_trap(); \
}
#else
#define CmAssert(expr)
#endif
#endif // #ifndef CMRTLIB_LINUX_SHARE_CM_DEF_OS_H_