/* * Copyright (c) 2007-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 cm_def_os.h //! \brief Contains CM definitions //! #pragma once #pragma GCC diagnostic ignored "-Wdelete-non-virtual-dtor" #pragma GCC diagnostic ignored "-Wnon-virtual-dtor" #include #include #include #include #include #include #include #include #include #include "dlfcn.h" #include "media_libva_cm.h" #ifndef SUCCEEDED #define SUCCEEDED(hr) (hr == VA_STATUS_SUCCESS) #endif // !SUCCEEDED #ifndef FAILED #define FAILED(hr) (hr != VA_STATUS_SUCCESS) #endif // !FAILED #define CM_DRIVER_EXPOSED __attribute__ ((visibility ("default"))) #ifdef __cplusplus #define EXTERN_C extern "C" #else #define EXTERN_C #endif static inline char * strtok_s(char *strToken, const char *strDelimit, char **context) { return strtok_r(strToken, strDelimit, context); } inline int memcpy_s(void *dst, size_t numberOfElements, const void *src, size_t count) { if ((dst == nullptr) || (src == nullptr)) { return EINVAL; } if (numberOfElements < count) { return ERANGE; } std::memcpy(dst, src, count); return 0; } #define CM_CONTEXT_DATA CM_CONTEXT #define PCM_CONTEXT_DATA PCM_CONTEXT #define CM_MAX_SURFACE2D_FORMAT_COUNT 29 #define CM_MAX_SURFACE2D_FORMAT_COUNT_INTERNAL (CM_MAX_SURFACE2D_FORMAT_COUNT-1) // max resolution for surface 2D #define CM_MAX_2D_SURF_WIDTH 16384 #define CM_MAX_2D_SURF_HEIGHT 16384 typedef enum _CM_TEXTURE_ADDRESS_TYPE { CM_TEXTURE_ADDRESS_WRAP = 1, CM_TEXTURE_ADDRESS_MIRROR = 2, CM_TEXTURE_ADDRESS_CLAMP = 3, CM_TEXTURE_ADDRESS_BORDER = 4, CM_TEXTURE_ADDRESS_MIRRORONCE = 5 } CM_TEXTURE_ADDRESS_TYPE; typedef enum _CM_TEXTURE_FILTER_TYPE { CM_TEXTURE_FILTER_TYPE_NONE = 0, CM_TEXTURE_FILTER_TYPE_POINT = 1, CM_TEXTURE_FILTER_TYPE_LINEAR = 2, CM_TEXTURE_FILTER_TYPE_ANISOTROPIC = 3, CM_TEXTURE_FILTER_TYPE_FLATCUBIC = 4, CM_TEXTURE_FILTER_TYPE_GAUSSIANCUBIC = 5, CM_TEXTURE_FILTER_TYPE_PYRAMIDALQUAD = 6, CM_TEXTURE_FILTER_TYPE_GAUSSIANQUAD = 7 } CM_TEXTURE_FILTER_TYPE; // From Compiler #define CM_NOINLINE __attribute__((noinline)) namespace CMRT_UMD { class SurfaceIndex { public: CM_NOINLINE SurfaceIndex() { index = 0; extraByte = 0; }; CM_NOINLINE SurfaceIndex(const SurfaceIndex& src) { index = src.index; extraByte = src.extraByte; }; CM_NOINLINE SurfaceIndex(const unsigned int& n) { index = n; extraByte = 0; }; CM_NOINLINE SurfaceIndex& operator = (const unsigned int& n) { this->index = n; return *this; }; CM_NOINLINE SurfaceIndex& operator + (const unsigned int& n) { this->index += n; return *this; }; CM_NOINLINE SurfaceIndex& operator= (const SurfaceIndex& other) { this->index = other.index; return *this; }; virtual unsigned int get_data(void) { return index; }; //g++ warning: class has virtual functions but non-virtual destructor virtual ~SurfaceIndex() {}; private: unsigned int index; /* * Do not delete this line: * SurfaceIndex is commonly used as CM kernel function's parameter. * It has virutal table and has copy constructor, so GNU calling convention will pass the object's pointer to kernel function. * This is different from MSVC, which always copies the entire object transferred on the callee's stack. * * Depending on the special object size after adding below "extraByte", * SetKernelArg and SetThreadArg can recognize this object and follow GNU's convention to construct kernel function's stack. */ unsigned char extraByte; }; class SamplerIndex { public: CM_NOINLINE SamplerIndex() { index = 0; extraByte = 0;}; CM_NOINLINE SamplerIndex(SamplerIndex& src) { index = src.get_data(); extraByte = src.extraByte; }; CM_NOINLINE SamplerIndex(const unsigned int& n) { index = n; extraByte = 0; }; CM_NOINLINE SamplerIndex& operator = (const unsigned int& n) { this->index = n; return *this; }; virtual unsigned int get_data(void) { return index; }; virtual ~SamplerIndex(){}; private: unsigned int index; /* * Do not delete this line: * Same reason as SurfaceIndex. */ unsigned char extraByte; SamplerIndex& operator= (const SamplerIndex& other); }; } #ifndef _SYSTEMTIME_DEFINE_PROTECTOR_ #define _SYSTEMTIME_DEFINE_PROTECTOR_ typedef struct _SYSTEMTIME { uint16_t wYear; uint16_t wMonth; uint16_t wDayOfWeek; uint16_t wDay; uint16_t wHour; uint16_t wMinute; uint16_t wSecond; uint16_t wMilliseconds; } SYSTEMTIME, *PSYSTEMTIME; inline void GetLocalTime(PSYSTEMTIME sysTime) { time_t temp; struct tm *localTime; time(&temp); localTime=localtime(&temp); sysTime->wYear = localTime->tm_year; sysTime->wMonth = localTime->tm_mon; sysTime->wDayOfWeek = localTime->tm_wday; sysTime->wDay = localTime->tm_mday; sysTime->wHour = localTime->tm_hour; sysTime->wMinute = localTime->tm_min; sysTime->wSecond = localTime->tm_sec; sysTime->wMilliseconds = 0; } #endif