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