1*abb65b4bSAndroid Build Coastguard Worker /*
2*abb65b4bSAndroid Build Coastguard Worker * Copyright (c) 2022 Samsung Electronics Co., Ltd.
3*abb65b4bSAndroid Build Coastguard Worker * All Rights Reserved.
4*abb65b4bSAndroid Build Coastguard Worker *
5*abb65b4bSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
6*abb65b4bSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met:
7*abb65b4bSAndroid Build Coastguard Worker *
8*abb65b4bSAndroid Build Coastguard Worker * - Redistributions of source code must retain the above copyright notice,
9*abb65b4bSAndroid Build Coastguard Worker * this list of conditions and the following disclaimer.
10*abb65b4bSAndroid Build Coastguard Worker *
11*abb65b4bSAndroid Build Coastguard Worker * - Redistributions in binary form must reproduce the above copyright notice,
12*abb65b4bSAndroid Build Coastguard Worker * this list of conditions and the following disclaimer in the documentation
13*abb65b4bSAndroid Build Coastguard Worker * and/or other materials provided with the distribution.
14*abb65b4bSAndroid Build Coastguard Worker *
15*abb65b4bSAndroid Build Coastguard Worker * - Neither the name of the copyright owner, nor the names of its contributors
16*abb65b4bSAndroid Build Coastguard Worker * may be used to endorse or promote products derived from this software
17*abb65b4bSAndroid Build Coastguard Worker * without specific prior written permission.
18*abb65b4bSAndroid Build Coastguard Worker *
19*abb65b4bSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20*abb65b4bSAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*abb65b4bSAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*abb65b4bSAndroid Build Coastguard Worker * ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23*abb65b4bSAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*abb65b4bSAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*abb65b4bSAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*abb65b4bSAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*abb65b4bSAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*abb65b4bSAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*abb65b4bSAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE.
30*abb65b4bSAndroid Build Coastguard Worker */
31*abb65b4bSAndroid Build Coastguard Worker
32*abb65b4bSAndroid Build Coastguard Worker #ifndef _OAPV_PORT_H_
33*abb65b4bSAndroid Build Coastguard Worker #define _OAPV_PORT_H_
34*abb65b4bSAndroid Build Coastguard Worker
35*abb65b4bSAndroid Build Coastguard Worker #include <stdio.h>
36*abb65b4bSAndroid Build Coastguard Worker #include <stdlib.h>
37*abb65b4bSAndroid Build Coastguard Worker #include <string.h>
38*abb65b4bSAndroid Build Coastguard Worker #include <limits.h>
39*abb65b4bSAndroid Build Coastguard Worker #include <stdint.h>
40*abb65b4bSAndroid Build Coastguard Worker #include <stdbool.h>
41*abb65b4bSAndroid Build Coastguard Worker
42*abb65b4bSAndroid Build Coastguard Worker /*****************************************************************************
43*abb65b4bSAndroid Build Coastguard Worker * types
44*abb65b4bSAndroid Build Coastguard Worker *****************************************************************************/
45*abb65b4bSAndroid Build Coastguard Worker typedef int8_t s8;
46*abb65b4bSAndroid Build Coastguard Worker typedef uint8_t u8;
47*abb65b4bSAndroid Build Coastguard Worker typedef int16_t s16;
48*abb65b4bSAndroid Build Coastguard Worker typedef uint16_t u16;
49*abb65b4bSAndroid Build Coastguard Worker typedef int32_t s32;
50*abb65b4bSAndroid Build Coastguard Worker typedef uint32_t u32;
51*abb65b4bSAndroid Build Coastguard Worker typedef int64_t s64;
52*abb65b4bSAndroid Build Coastguard Worker typedef uint64_t u64;
53*abb65b4bSAndroid Build Coastguard Worker
54*abb65b4bSAndroid Build Coastguard Worker typedef s16 pel;
55*abb65b4bSAndroid Build Coastguard Worker typedef s32 dpel;
56*abb65b4bSAndroid Build Coastguard Worker
57*abb65b4bSAndroid Build Coastguard Worker /*****************************************************************************
58*abb65b4bSAndroid Build Coastguard Worker * inline attribute
59*abb65b4bSAndroid Build Coastguard Worker *****************************************************************************/
60*abb65b4bSAndroid Build Coastguard Worker #ifndef force_inline
61*abb65b4bSAndroid Build Coastguard Worker #if defined(_MSC_VER)
62*abb65b4bSAndroid Build Coastguard Worker #define force_inline __forceinline
63*abb65b4bSAndroid Build Coastguard Worker #elif defined(__GNUC__)
64*abb65b4bSAndroid Build Coastguard Worker #define force_inline __attribute__((always_inline)) inline
65*abb65b4bSAndroid Build Coastguard Worker #else
66*abb65b4bSAndroid Build Coastguard Worker #define force_inline inline
67*abb65b4bSAndroid Build Coastguard Worker #endif
68*abb65b4bSAndroid Build Coastguard Worker #endif
69*abb65b4bSAndroid Build Coastguard Worker
70*abb65b4bSAndroid Build Coastguard Worker /*****************************************************************************
71*abb65b4bSAndroid Build Coastguard Worker * memory operations
72*abb65b4bSAndroid Build Coastguard Worker *****************************************************************************/
73*abb65b4bSAndroid Build Coastguard Worker #define oapv_malloc(size) malloc((size))
74*abb65b4bSAndroid Build Coastguard Worker #define oapv_malloc_fast(size) oapv_malloc((size))
75*abb65b4bSAndroid Build Coastguard Worker
76*abb65b4bSAndroid Build Coastguard Worker #define oapv_mfree(m) \
77*abb65b4bSAndroid Build Coastguard Worker { \
78*abb65b4bSAndroid Build Coastguard Worker if(m) { \
79*abb65b4bSAndroid Build Coastguard Worker free(m); \
80*abb65b4bSAndroid Build Coastguard Worker } \
81*abb65b4bSAndroid Build Coastguard Worker }
82*abb65b4bSAndroid Build Coastguard Worker #define oapv_mfree_fast(m) \
83*abb65b4bSAndroid Build Coastguard Worker { \
84*abb65b4bSAndroid Build Coastguard Worker if(m) { \
85*abb65b4bSAndroid Build Coastguard Worker oapv_mfree(m); \
86*abb65b4bSAndroid Build Coastguard Worker } \
87*abb65b4bSAndroid Build Coastguard Worker }
88*abb65b4bSAndroid Build Coastguard Worker
89*abb65b4bSAndroid Build Coastguard Worker void *oapv_malloc_align32(int size);
90*abb65b4bSAndroid Build Coastguard Worker void oapv_mfree_align32(void *p);
91*abb65b4bSAndroid Build Coastguard Worker
92*abb65b4bSAndroid Build Coastguard Worker #define oapv_mcpy(dst, src, size) memcpy((dst), (src), (size))
93*abb65b4bSAndroid Build Coastguard Worker #define oapv_mset(dst, v, size) memset((dst), (v), (size))
94*abb65b4bSAndroid Build Coastguard Worker #define oapv_mset_x64a(dst, v, size) memset((dst), (v), (size))
95*abb65b4bSAndroid Build Coastguard Worker #define oapv_mset_x128(dst, v, size) memset((dst), (v), (size))
96*abb65b4bSAndroid Build Coastguard Worker #define oapv_mcmp(dst, src, size) memcmp((dst), (src), (size))
97*abb65b4bSAndroid Build Coastguard Worker
oapv_mset_16b(s16 * dst,s16 v,int cnt)98*abb65b4bSAndroid Build Coastguard Worker static __inline void oapv_mset_16b(s16 *dst, s16 v, int cnt)
99*abb65b4bSAndroid Build Coastguard Worker {
100*abb65b4bSAndroid Build Coastguard Worker int i;
101*abb65b4bSAndroid Build Coastguard Worker for(i = 0; i < cnt; i++)
102*abb65b4bSAndroid Build Coastguard Worker dst[i] = v;
103*abb65b4bSAndroid Build Coastguard Worker }
104*abb65b4bSAndroid Build Coastguard Worker
105*abb65b4bSAndroid Build Coastguard Worker /*****************************************************************************
106*abb65b4bSAndroid Build Coastguard Worker * trace and assert
107*abb65b4bSAndroid Build Coastguard Worker *****************************************************************************/
108*abb65b4bSAndroid Build Coastguard Worker void oapv_trace0(char *filename, int line, const char *fmt, ...);
109*abb65b4bSAndroid Build Coastguard Worker void oapv_trace_line(char *pre);
110*abb65b4bSAndroid Build Coastguard Worker #ifndef OAPV_TRACE
111*abb65b4bSAndroid Build Coastguard Worker #define OAPV_TRACE 0
112*abb65b4bSAndroid Build Coastguard Worker #endif
113*abb65b4bSAndroid Build Coastguard Worker
114*abb65b4bSAndroid Build Coastguard Worker /* trace function */
115*abb65b4bSAndroid Build Coastguard Worker #if OAPV_TRACE
116*abb65b4bSAndroid Build Coastguard Worker #if defined(__GNUC__)
117*abb65b4bSAndroid Build Coastguard Worker #define __FILENAME__ \
118*abb65b4bSAndroid Build Coastguard Worker (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
119*abb65b4bSAndroid Build Coastguard Worker #define oapv_trace(args...) oapv_trace0(__FILENAME__, __LINE__, args)
120*abb65b4bSAndroid Build Coastguard Worker #else
121*abb65b4bSAndroid Build Coastguard Worker #define __FILENAME__ \
122*abb65b4bSAndroid Build Coastguard Worker (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)
123*abb65b4bSAndroid Build Coastguard Worker #define oapv_trace(args, ...) oapv_trace0(__FILENAME__, __LINE__, args, __VA_ARGS__)
124*abb65b4bSAndroid Build Coastguard Worker #endif
125*abb65b4bSAndroid Build Coastguard Worker #else
126*abb65b4bSAndroid Build Coastguard Worker #define oapv_trace(args, ...) \
127*abb65b4bSAndroid Build Coastguard Worker {}
128*abb65b4bSAndroid Build Coastguard Worker #endif
129*abb65b4bSAndroid Build Coastguard Worker #if defined(__GNUC__)
130*abb65b4bSAndroid Build Coastguard Worker #define oapv_print(args, ...) oapv_trace0(NULL, -1, args)
131*abb65b4bSAndroid Build Coastguard Worker #else
132*abb65b4bSAndroid Build Coastguard Worker #define oapv_print(args, ...) oapv_trace0(NULL, -1, args, __VA_ARGS__)
133*abb65b4bSAndroid Build Coastguard Worker #endif
134*abb65b4bSAndroid Build Coastguard Worker
135*abb65b4bSAndroid Build Coastguard Worker /* assert function */
136*abb65b4bSAndroid Build Coastguard Worker #include <assert.h>
137*abb65b4bSAndroid Build Coastguard Worker #define oapv_assert(x) assert(x)
138*abb65b4bSAndroid Build Coastguard Worker #define oapv_assert_r(x) \
139*abb65b4bSAndroid Build Coastguard Worker { \
140*abb65b4bSAndroid Build Coastguard Worker if(!(x)) { \
141*abb65b4bSAndroid Build Coastguard Worker oapv_assert(x); \
142*abb65b4bSAndroid Build Coastguard Worker return; \
143*abb65b4bSAndroid Build Coastguard Worker } \
144*abb65b4bSAndroid Build Coastguard Worker }
145*abb65b4bSAndroid Build Coastguard Worker #define oapv_assert_rv(x, r) \
146*abb65b4bSAndroid Build Coastguard Worker { \
147*abb65b4bSAndroid Build Coastguard Worker if(!(x)) { \
148*abb65b4bSAndroid Build Coastguard Worker oapv_assert(x); \
149*abb65b4bSAndroid Build Coastguard Worker return (r); \
150*abb65b4bSAndroid Build Coastguard Worker } \
151*abb65b4bSAndroid Build Coastguard Worker }
152*abb65b4bSAndroid Build Coastguard Worker #define oapv_assert_g(x, g) \
153*abb65b4bSAndroid Build Coastguard Worker { \
154*abb65b4bSAndroid Build Coastguard Worker if(!(x)) { \
155*abb65b4bSAndroid Build Coastguard Worker oapv_assert(x); \
156*abb65b4bSAndroid Build Coastguard Worker goto g; \
157*abb65b4bSAndroid Build Coastguard Worker } \
158*abb65b4bSAndroid Build Coastguard Worker }
159*abb65b4bSAndroid Build Coastguard Worker #define oapv_assert_gv(x, r, v, g) \
160*abb65b4bSAndroid Build Coastguard Worker { \
161*abb65b4bSAndroid Build Coastguard Worker if(!(x)) { \
162*abb65b4bSAndroid Build Coastguard Worker oapv_assert(x); \
163*abb65b4bSAndroid Build Coastguard Worker (r) = (v); \
164*abb65b4bSAndroid Build Coastguard Worker goto g; \
165*abb65b4bSAndroid Build Coastguard Worker } \
166*abb65b4bSAndroid Build Coastguard Worker }
167*abb65b4bSAndroid Build Coastguard Worker
168*abb65b4bSAndroid Build Coastguard Worker #if defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || \
169*abb65b4bSAndroid Build Coastguard Worker defined(_M_X64) || defined(__amd64__) || defined(_M_AMD64) || \
170*abb65b4bSAndroid Build Coastguard Worker defined(__i386__)
171*abb65b4bSAndroid Build Coastguard Worker #define X86_SSE 1
172*abb65b4bSAndroid Build Coastguard Worker #elif defined(__aarch64__)
173*abb65b4bSAndroid Build Coastguard Worker #define ARM_NEON 1
174*abb65b4bSAndroid Build Coastguard Worker #endif
175*abb65b4bSAndroid Build Coastguard Worker
176*abb65b4bSAndroid Build Coastguard Worker #if X86_SSE
177*abb65b4bSAndroid Build Coastguard Worker #ifdef _WIN32
178*abb65b4bSAndroid Build Coastguard Worker #include <emmintrin.h>
179*abb65b4bSAndroid Build Coastguard Worker #include <xmmintrin.h>
180*abb65b4bSAndroid Build Coastguard Worker #include <tmmintrin.h>
181*abb65b4bSAndroid Build Coastguard Worker #include <smmintrin.h>
182*abb65b4bSAndroid Build Coastguard Worker #else
183*abb65b4bSAndroid Build Coastguard Worker #include <x86intrin.h>
184*abb65b4bSAndroid Build Coastguard Worker #endif
185*abb65b4bSAndroid Build Coastguard Worker #endif
186*abb65b4bSAndroid Build Coastguard Worker
187*abb65b4bSAndroid Build Coastguard Worker #if ARM_NEON
188*abb65b4bSAndroid Build Coastguard Worker #include <arm_neon.h>
189*abb65b4bSAndroid Build Coastguard Worker #endif
190*abb65b4bSAndroid Build Coastguard Worker
191*abb65b4bSAndroid Build Coastguard Worker /* Buffer Alignement */
192*abb65b4bSAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(__GNUC__)
193*abb65b4bSAndroid Build Coastguard Worker #define DECLARE_ALIGNED(var, n) __declspec(align(n)) var
194*abb65b4bSAndroid Build Coastguard Worker #else
195*abb65b4bSAndroid Build Coastguard Worker #define DECLARE_ALIGNED(var, n) var __attribute__((aligned(n)))
196*abb65b4bSAndroid Build Coastguard Worker #endif
197*abb65b4bSAndroid Build Coastguard Worker
198*abb65b4bSAndroid Build Coastguard Worker #define ALIGNED_16(var) DECLARE_ALIGNED(var, 16)
199*abb65b4bSAndroid Build Coastguard Worker #define ALIGNED_32(var) DECLARE_ALIGNED(var, 32)
200*abb65b4bSAndroid Build Coastguard Worker #define ALIGNED_128(var) DECLARE_ALIGNED(var, 128)
201*abb65b4bSAndroid Build Coastguard Worker
202*abb65b4bSAndroid Build Coastguard Worker #endif /* _OAPV_PORT_H_ */
203