1 /*
2 * Copyright (c) 2017, Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 //!
23 //! \file      cm_rt_def_os.h
24 //! \brief     Contains linux-specific Definitions for CM
25 //!
26 
27 #ifndef __CM_RT_DEF_OS_H__
28 #define __CM_RT_DEF_OS_H__
29 
30 #include <time.h>
31 #include <va/va.h>
32 
33 #define _tmain main
34 
35 #include <stdio.h>
36 #include <stdlib.h>
37 #include <stdint.h>
38 #include <math.h>
39 #include <string.h>
40 #include <sys/time.h>
41 #include <pthread.h>
42 #include <x86intrin.h>
43 #include <iostream>
44 
45 #ifndef CM_NOINLINE
46     #define CM_NOINLINE __attribute__((noinline))
47 #endif
48 
49 typedef int BOOL;
50 typedef char byte;
51 typedef unsigned char BYTE;
52 typedef unsigned int UINT32;
53 typedef UINT32 DWORD;
54 typedef int INT;
55 typedef unsigned int UINT;
56 typedef signed char INT8;
57 typedef unsigned char UINT8;
58 typedef signed short INT16;
59 typedef unsigned short UINT16;
60 typedef signed int INT32;
61 typedef signed long long INT64;
62 typedef unsigned long long UINT64;
63 
64 typedef enum _VACMTEXTUREADDRESS {
65     VACMTADDRESS_WRAP            = 1,
66     VACMTADDRESS_MIRROR          = 2,
67     VACMTADDRESS_CLAMP           = 3,
68     VACMTADDRESS_BORDER          = 4,
69     VACMTADDRESS_MIRRORONCE      = 5,
70 
71     VACMTADDRESS_FORCE_DWORD     = 0x7fffffff
72 } VACMTEXTUREADDRESS;
73 
74 typedef enum _VACMTEXTUREFILTERTYPE {
75     VACMTEXF_NONE            = 0,
76     VACMTEXF_POINT           = 1,
77     VACMTEXF_LINEAR          = 2,
78     VACMTEXF_ANISOTROPIC     = 3,
79     VACMTEXF_FLATCUBIC       = 4,
80     VACMTEXF_GAUSSIANCUBIC   = 5,
81     VACMTEXF_PYRAMIDALQUAD   = 6,
82     VACMTEXF_GAUSSIANQUAD    = 7,
83     VACMTEXF_CONVOLUTIONMONO = 8,    // Convolution filter for monochrome textures
84     VACMTEXF_FORCE_DWORD     = 0x7fffffff
85 } VACMTEXTUREFILTERTYPE;
86 
87 #define CM_ATTRIBUTE(attribute) __attribute__((attribute))
88 
89 typedef enum _VA_CM_FORMAT {
90 
91     VA_CM_FMT_UNKNOWN              =   0,
92 
93     VA_CM_FMT_A8R8G8B8             =  21,
94     VA_CM_FMT_X8R8G8B8             =  22,
95     VA_CM_FMT_A8                   =  28,
96     VA_CM_FMT_A2B10G10R10          =  31,
97     VA_CM_FMT_A8B8G8R8             =  32,
98     VA_CM_FMT_R16G16UN             =  35,
99     VA_CM_FMT_A16B16G16R16         =  36,
100     VA_CM_FMT_A8P8                 =  40,
101     VA_CM_FMT_P8                   =  41,
102     VA_CM_FMT_R32U                 =  42,
103     VA_CM_FMT_R8G8UN               =  49,
104     VA_CM_FMT_L8                   =  50,
105     VA_CM_FMT_A8L8                 =  51,
106     VA_CM_FMT_R16UN                =  56,
107     VA_CM_FMT_R16U                 =  57,
108     VA_CM_FMT_V8U8                 =  60,
109     VA_CM_FMT_R8UN                 =  61,
110     VA_CM_FMT_R8U                  =  62,
111     VA_CM_FMT_R32S                 =  71,
112     VA_CM_FMT_D16                  =  80,
113     VA_CM_FMT_L16                  =  81,
114     VA_CM_FMT_R16F                 = 111,
115     VA_CM_FMT_IA44                 = 112,
116     VA_CM_FMT_A16B16G16R16F        = 113,
117     VA_CM_FMT_R32F                 = 114,
118     VA_CM_FMT_R32G32B32A32F        = 115,
119     VA_CM_FMT_I420                 =  VA_FOURCC('I','4','2','0'),
120     VA_CM_FMT_P216                 =  VA_FOURCC('P','2','1','6'),
121     VA_CM_FMT_400P                 =  VA_FOURCC('4','0','0','P'),
122     VA_CM_FMT_Y8UN                 =  VA_FOURCC('Y','8','U','N'),
123     VA_CM_FMT_NV12                 =  VA_FOURCC_NV12,
124     VA_CM_FMT_UYVY                 =  VA_FOURCC_UYVY,
125     VA_CM_FMT_YUY2                 =  VA_FOURCC_YUY2,
126     VA_CM_FMT_444P                 =  VA_FOURCC_444P,
127     VA_CM_FMT_411P                 =  VA_FOURCC_411P,
128     VA_CM_FMT_422H                 =  VA_FOURCC_422H,
129     VA_CM_FMT_422V                 =  VA_FOURCC_422V,
130     VA_CM_FMT_411R                 =  VA_FOURCC_411R,
131     VA_CM_FMT_RGBP                 =  VA_FOURCC_RGBP,
132     VA_CM_FMT_BGRP                 =  VA_FOURCC_BGRP,
133     VA_CM_FMT_IMC3                 =  VA_FOURCC_IMC3,
134     VA_CM_FMT_YV12                 =  VA_FOURCC_YV12,
135     VA_CM_FMT_P010                 =  VA_FOURCC_P010,
136     VA_CM_FMT_P012                 =  VA_FOURCC_P012,
137     VA_CM_FMT_P016                 =  VA_FOURCC_P016,
138     VA_CM_FMT_P208                 =  VA_FOURCC_P208,
139     VA_CM_FMT_AYUV                 =  VA_FOURCC_AYUV,
140 #if VA_CHECK_VERSION(1, 13, 0)
141     VA_CM_FMT_XYUV                 =  VA_FOURCC_XYUV,
142 #endif
143     VA_CM_FMT_Y210                 =  VA_FOURCC_Y210,
144 #if VA_CHECK_VERSION(1, 9, 0)
145     VA_CM_FMT_Y212                 =  VA_FOURCC_Y212,
146 #endif
147     VA_CM_FMT_Y410                 =  VA_FOURCC_Y410,
148 #if VA_CHECK_VERSION(1, 9, 0)
149     VA_CM_FMT_Y412                 =  VA_FOURCC_Y412,
150 #endif
151     VA_CM_FMT_Y216                 =  VA_FOURCC_Y216,
152     VA_CM_FMT_Y416                 =  VA_FOURCC_Y416,
153     VA_CM_FMT_AI44                 =  VA_FOURCC_AI44,
154 
155     VA_CM_FMT_MAX                  =  0xFFFFFFFF
156 } VA_CM_FORMAT;
157 
158 template<typename T>
159 inline const char * CM_TYPE_NAME_UNMANGLED();
160 
161 template<> inline const char * CM_TYPE_NAME_UNMANGLED<char>() { return "char"; }
162 template<> inline const char * CM_TYPE_NAME_UNMANGLED<signed char>() { return "signed char"; }
163 template<> inline const char * CM_TYPE_NAME_UNMANGLED<unsigned char>() { return "unsigned char"; }
164 template<> inline const char * CM_TYPE_NAME_UNMANGLED<short>() { return "short"; }
165 template<> inline const char * CM_TYPE_NAME_UNMANGLED<unsigned short>() { return "unsigned short"; }
166 template<> inline const char * CM_TYPE_NAME_UNMANGLED<int>() { return "int"; }
167 template<> inline const char * CM_TYPE_NAME_UNMANGLED<unsigned int>() { return "unsigned int"; }
168 template<> inline const char * CM_TYPE_NAME_UNMANGLED<long>() { return "long"; }
169 template<> inline const char * CM_TYPE_NAME_UNMANGLED<unsigned long>() { return "unsigned long"; }
170 template<> inline const char * CM_TYPE_NAME_UNMANGLED<float>() { return "float"; }
171 template<> inline const char * CM_TYPE_NAME_UNMANGLED<double>() { return "double"; }
172 
173 #define CM_TYPE_NAME(type)   CM_TYPE_NAME_UNMANGLED<type>()
174 
CM_ALIGNED_MALLOC(size_t size,size_t alignment)175 inline void * CM_ALIGNED_MALLOC(size_t size, size_t alignment)
176 {
177   return aligned_alloc(alignment, size);
178 }
179 
CM_ALIGNED_FREE(void * memory)180 inline void CM_ALIGNED_FREE(void * memory)
181 {
182   free(memory);
183 }
184 
185 //multi-thread API:
186 #define THREAD_HANDLE pthread_t
CM_THREAD_CREATE(THREAD_HANDLE * handle,void * start_routine,void * arg)187 inline void CM_THREAD_CREATE(THREAD_HANDLE *handle, void * start_routine, void * arg)
188 {
189     int err = 0;
190     err = pthread_create(handle , NULL, (void * (*)(void *))start_routine, arg);
191     if (err) {
192         printf(" cm create thread failed! \n");
193         exit(-1);
194     }
195 }
CM_THREAD_EXIT(void * retval)196 inline void CM_THREAD_EXIT(void * retval)
197 {
198     pthread_exit(retval);
199 }
200 
CM_THREAD_JOIN(THREAD_HANDLE * handle_array,int thread_cnt)201 inline int CM_THREAD_JOIN(THREAD_HANDLE *handle_array, int thread_cnt)
202 {
203     void *tret;
204     for(int i = 0; i < thread_cnt; i++)
205     {
206         pthread_join( handle_array[i], &tret);
207     }
208     return 0;
209 }
210 
211 #define CM_SURFACE_FORMAT                       VA_CM_FORMAT
212 
213 #define CM_SURFACE_FORMAT_UNKNOWN               VA_CM_FMT_UNKNOWN
214 #define CM_SURFACE_FORMAT_A8R8G8B8              VA_CM_FMT_A8R8G8B8
215 #define CM_SURFACE_FORMAT_X8R8G8B8              VA_CM_FMT_X8R8G8B8
216 #define CM_SURFACE_FORMAT_A8B8G8R8              VA_CM_FMT_A8B8G8R8
217 #define CM_SURFACE_FORMAT_A8                    VA_CM_FMT_A8
218 #define CM_SURFACE_FORMAT_P8                    VA_CM_FMT_P8
219 #define CM_SURFACE_FORMAT_R32F                  VA_CM_FMT_R32F
220 #define CM_SURFACE_FORMAT_NV12                  VA_CM_FMT_NV12
221 #define CM_SURFACE_FORMAT_UYVY                  VA_CM_FMT_UYVY
222 #define CM_SURFACE_FORMAT_YUY2                  VA_CM_FMT_YUY2
223 #define CM_SURFACE_FORMAT_V8U8                  VA_CM_FMT_V8U8
224 
225 #define CM_SURFACE_FORMAT_R8_UINT               VA_CM_FMT_R8U
226 #define CM_SURFACE_FORMAT_R16_UINT              VA_CM_FMT_R16U
227 #define CM_SURFACE_FORMAT_R16_SINT              VA_CM_FMT_A8L8
228 #define CM_SURFACE_FORMAT_D16                   VA_CM_FMT_D16
229 #define CM_SURFACE_FORMAT_L16                   VA_CM_FMT_L16
230 #define CM_SURFACE_FORMAT_A16B16G16R16          VA_CM_FMT_A16B16G16R16
231 #define CM_SURFACE_FORMAT_R10G10B10A2           VA_CM_FMT_A2B10G10R10
232 #define CM_SURFACE_FORMAT_A16B16G16R16F         VA_CM_FMT_A16B16G16R16F
233 #define CM_SURFACE_FORMAT_R32G32B32A32F         VA_CM_FMT_R32G32B32A32F
234 
235 #define CM_SURFACE_FORMAT_444P                  VA_CM_FMT_444P
236 #define CM_SURFACE_FORMAT_422H                  VA_CM_FMT_422H
237 #define CM_SURFACE_FORMAT_422V                  VA_CM_FMT_422V
238 #define CM_SURFACE_FORMAT_411P                  VA_CM_FMT_411P
239 #define CM_SURFACE_FORMAT_411R                  VA_CM_FMT_411R
240 #define CM_SURFACE_FORMAT_RGBP                  VA_CM_FMT_RGBP
241 #define CM_SURFACE_FORMAT_BGRP                  VA_CM_FMT_BGRP
242 #define CM_SURFACE_FORMAT_IMC3                  VA_CM_FMT_IMC3
243 #define CM_SURFACE_FORMAT_YV12                  VA_CM_FMT_YV12
244 #define CM_SURFACE_FORMAT_P010                  VA_CM_FMT_P010
245 #define CM_SURFACE_FORMAT_P016                  VA_CM_FMT_P016
246 #define CM_SURFACE_FORMAT_P208                  VA_CM_FMT_P208
247 #define CM_SURFACE_FORMAT_AYUV                  VA_CM_FMT_AYUV
248 #define CM_SURFACE_FORMAT_Y210                  VA_CM_FMT_Y210
249 #define CM_SURFACE_FORMAT_Y410                  VA_CM_FMT_Y410
250 #define CM_SURFACE_FORMAT_Y216                  VA_CM_FMT_Y216
251 #define CM_SURFACE_FORMAT_Y416                  VA_CM_FMT_Y416
252 
253 #define CM_SURFACE_FORMAT_IA44                  VA_CM_FMT_IA44
254 #define CM_SURFACE_FORMAT_AI44                  VA_CM_FMT_AI44
255 #define CM_SURFACE_FORMAT_I420                  VA_CM_FMT_I420
256 #define CM_SURFACE_FORMAT_P216                  VA_CM_FMT_P216
257 #define CM_SURFACE_FORMAT_400P                  VA_CM_FMT_400P
258 #define CM_SURFACE_FORMAT_R16_FLOAT             VA_CM_FMT_R16F
259 #define CM_SURFACE_FORMAT_Y8_UNORM              VA_CM_FMT_Y8UN
260 #define CM_SURFACE_FORMAT_A8P8                  VA_CM_FMT_A8P8
261 #define CM_SURFACE_FORMAT_R32_SINT              VA_CM_FMT_R32S
262 #define CM_SURFACE_FORMAT_R32_UINT              VA_CM_FMT_R32U
263 #define CM_SURFACE_FORMAT_R8G8_UNORM            VA_CM_FMT_R8G8UN
264 #define CM_SURFACE_FORMAT_R8_UNORM              VA_CM_FMT_R8UN
265 #define CM_SURFACE_FORMAT_R16G16_UNORM          VA_CM_FMT_R16G16UN
266 #define CM_SURFACE_FORMAT_R16_UNORM             VA_CM_FMT_R16UN
267 
268 
269 #define CM_TEXTURE_ADDRESS_TYPE                 VACMTEXTUREADDRESS
270 #define CM_TEXTURE_ADDRESS_WRAP                 VACMTADDRESS_WRAP
271 #define CM_TEXTURE_ADDRESS_MIRROR               VACMTADDRESS_MIRROR
272 #define CM_TEXTURE_ADDRESS_CLAMP                VACMTADDRESS_CLAMP
273 #define CM_TEXTURE_ADDRESS_BORDER               VACMTADDRESS_BORDER
274 #define CM_TEXTURE_ADDRESS_MIRRORONCE           VACMTADDRESS_MIRRORONCE
275 
276 #define CM_TEXTURE_FILTER_TYPE                  VACMTEXTUREFILTERTYPE
277 #define CM_TEXTURE_FILTER_TYPE_NONE             VACMTEXF_NONE
278 #define CM_TEXTURE_FILTER_TYPE_POINT            VACMTEXF_POINT
279 #define CM_TEXTURE_FILTER_TYPE_LINEAR           VACMTEXF_LINEAR
280 #define CM_TEXTURE_FILTER_TYPE_ANISOTROPIC      VACMTEXF_ANISOTROPIC
281 #define CM_TEXTURE_FILTER_TYPE_FLATCUBIC        VACMTEXF_FLATCUBIC
282 #define CM_TEXTURE_FILTER_TYPE_GAUSSIANCUBIC    VACMTEXF_GAUSSIANCUBIC
283 #define CM_TEXTURE_FILTER_TYPE_PYRAMIDALQUAD    VACMTEXF_PYRAMIDALQUAD
284 #define CM_TEXTURE_FILTER_TYPE_GAUSSIANQUAD     VACMTEXF_GAUSSIANQUAD
285 #define CM_TEXTURE_FILTER_TYPE_CONVOLUTIONMONO  VACMTEXF_CONVOLUTIONMONO
286 
287 /* Surrport for common-used data type */
288 #define  _TCHAR char
289 #define __cdecl
290 #ifndef TRUE
291 #define TRUE 1
292 #endif
293 
294 typedef int HKEY;
295 
296 typedef unsigned int uint;
297 typedef unsigned int* PUINT;
298 
299 typedef float FLOAT;
300 typedef unsigned long long DWORDLONG;
301 #ifndef ULONG_PTR
302     #define ULONG_PTR unsigned long
303 #endif
304 
305 /* Handle Type */
306 typedef void *HMODULE;
307 typedef void *HINSTANCE;
308 typedef int HANDLE;
309 typedef void *PVOID;
310 typedef int WINBOOL;
311 typedef BOOL *PBOOL;
312 typedef unsigned long ULONG;
313 typedef ULONG *PULONG;
314 typedef unsigned short USHORT;
315 typedef USHORT *PUSHORT;
316 typedef unsigned char UCHAR;
317 typedef UCHAR *PUCHAR;
318 typedef char CHAR;
319 typedef short SHORT;
320 typedef long LONG;
321 typedef double DOUBLE;
322 
323 #define __int8 char
324 #define __int16 short
325 #define __int32 int
326 #define __int64 long long
327 
328 typedef unsigned short WORD;
329 typedef float FLOAT;
330 typedef FLOAT *PFLOAT;
331 typedef BYTE *PBYTE;
332 typedef int *PINT;
333 typedef WORD *PWORD;
334 typedef DWORD *PDWORD;
335 typedef unsigned int *PUINT;
336 typedef LONG HRESULT;
337 typedef long long LONGLONG;
338 
339 typedef union _LARGE_INTEGER {
340     struct {
341         uint32_t LowPart;
342         int32_t HighPart;
343     } u;
344     int64_t QuadPart;
345 } LARGE_INTEGER;
346 
347 //Performance
348 EXTERN_C INT QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
349 EXTERN_C INT QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);
350 
351 struct BITMAPFILEHEADER
352 {
353   WORD  bfType;
354   DWORD bfSize;
355   WORD  bfReserved1;
356   WORD  bfReserved2;
357   DWORD bfOffBits;
358 }  __attribute__((packed)) ;
359 
360 struct BITMAPINFOHEADER
361 {
362   DWORD biSize;
363   DWORD  biWidth;
364   DWORD  biHeight;
365   WORD  biPlanes;
366   WORD  biBitCount;
367   DWORD biCompression;
368   DWORD biSizeImage;
369   DWORD  biXPelsPerMeter;
370   DWORD  biYPelsPerMeter;
371   DWORD biClrUsed;
372   DWORD biClrImportant;
373 };
374 
375 struct RGBQUAD
376 {
377   BYTE rgbBlue;
378   BYTE rgbGreen;
379   BYTE rgbRed;
380   BYTE rgbReserved;
381 };
382 
383 #define CM_KERNEL_FUNCTION2(...) #__VA_ARGS__
384 #define _NAME(...) #__VA_ARGS__
385 
386 #endif //__CM_RT_DEF_OS_H__
387