ffmpeg / libavutil / internal.h @ 7d9beec7
History | View | Annotate | Download (8.28 KB)
1 | 04d7f601 | Diego Biurrun | /*
|
---|---|---|---|
2 | * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
|
||
3 | *
|
||
4 | b78e7197 | Diego Biurrun | * This file is part of FFmpeg.
|
5 | *
|
||
6 | * FFmpeg is free software; you can redistribute it and/or
|
||
7 | 04d7f601 | Diego Biurrun | * modify it under the terms of the GNU Lesser General Public
|
8 | * License as published by the Free Software Foundation; either
|
||
9 | b78e7197 | Diego Biurrun | * version 2.1 of the License, or (at your option) any later version.
|
10 | 04d7f601 | Diego Biurrun | *
|
11 | b78e7197 | Diego Biurrun | * FFmpeg is distributed in the hope that it will be useful,
|
12 | 04d7f601 | Diego Biurrun | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
14 | * Lesser General Public License for more details.
|
||
15 | *
|
||
16 | * You should have received a copy of the GNU Lesser General Public
|
||
17 | b78e7197 | Diego Biurrun | * License along with FFmpeg; if not, write to the Free Software
|
18 | 04d7f601 | Diego Biurrun | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
19 | */
|
||
20 | |||
21 | 05020c89 | Reimar Döffinger | /**
|
22 | bad5537e | Diego Biurrun | * @file libavutil/internal.h
|
23 | 89c9ff50 | Diego Biurrun | * common internal API header
|
24 | 05020c89 | Reimar Döffinger | */
|
25 | |||
26 | 98790382 | Stefano Sabatini | #ifndef AVUTIL_INTERNAL_H
|
27 | #define AVUTIL_INTERNAL_H
|
||
28 | 05020c89 | Reimar Döffinger | |
29 | 318049b8 | Måns Rullgård | #if !defined(DEBUG) && !defined(NDEBUG)
|
30 | # define NDEBUG
|
||
31 | #endif
|
||
32 | |||
33 | ed0fd852 | Diego Biurrun | #include <limits.h> |
34 | 99545457 | Måns Rullgård | #include <stdint.h> |
35 | 318049b8 | Måns Rullgård | #include <stddef.h> |
36 | #include <assert.h> |
||
37 | dbef3f46 | Diego Biurrun | #include "config.h" |
38 | 52476c1b | Carl Eugen Hoyos | #include "common.h" |
39 | 9d52d54d | Diego Biurrun | #include "mem.h" |
40 | 2f5421d5 | Aurelien Jacobs | #include "timer.h" |
41 | 99545457 | Måns Rullgård | |
42 | 5e4c7ca2 | Ramiro Polla | #ifndef attribute_align_arg
|
43 | af4c0bcb | Carl Eugen Hoyos | #if (!defined(__ICC) || __ICC > 1100) && AV_GCC_VERSION_AT_LEAST(4,2) |
44 | 5e4c7ca2 | Ramiro Polla | # define attribute_align_arg __attribute__((force_align_arg_pointer))
|
45 | #else
|
||
46 | # define attribute_align_arg
|
||
47 | #endif
|
||
48 | #endif
|
||
49 | |||
50 | 5403f857 | Måns Rullgård | #ifndef attribute_used
|
51 | 52476c1b | Carl Eugen Hoyos | #if AV_GCC_VERSION_AT_LEAST(3,1) |
52 | 5403f857 | Måns Rullgård | # define attribute_used __attribute__((used))
|
53 | #else
|
||
54 | # define attribute_used
|
||
55 | #endif
|
||
56 | #endif
|
||
57 | |||
58 | cd107896 | Måns Rullgård | #ifndef INT16_MIN
|
59 | #define INT16_MIN (-0x7fff-1) |
||
60 | #endif
|
||
61 | |||
62 | #ifndef INT16_MAX
|
||
63 | #define INT16_MAX 0x7fff |
||
64 | #endif
|
||
65 | |||
66 | #ifndef INT32_MIN
|
||
67 | #define INT32_MIN (-0x7fffffff-1) |
||
68 | #endif
|
||
69 | |||
70 | #ifndef INT32_MAX
|
||
71 | #define INT32_MAX 0x7fffffff |
||
72 | #endif
|
||
73 | |||
74 | #ifndef UINT32_MAX
|
||
75 | #define UINT32_MAX 0xffffffff |
||
76 | #endif
|
||
77 | |||
78 | #ifndef INT64_MIN
|
||
79 | #define INT64_MIN (-0x7fffffffffffffffLL-1) |
||
80 | #endif
|
||
81 | |||
82 | #ifndef INT64_MAX
|
||
83 | 8da9266c | Måns Rullgård | #define INT64_MAX INT64_C(9223372036854775807) |
84 | cd107896 | Måns Rullgård | #endif
|
85 | |||
86 | #ifndef UINT64_MAX
|
||
87 | 8da9266c | Måns Rullgård | #define UINT64_MAX UINT64_C(0xFFFFFFFFFFFFFFFF) |
88 | cd107896 | Måns Rullgård | #endif
|
89 | |||
90 | #ifndef INT_BIT
|
||
91 | 28499cc8 | Måns Rullgård | # define INT_BIT (CHAR_BIT * sizeof(int)) |
92 | cd107896 | Måns Rullgård | #endif
|
93 | |||
94 | 05020c89 | Reimar Döffinger | #if ( defined(__PIC__) || defined(__pic__) ) && ! defined(PIC)
|
95 | # define PIC
|
||
96 | #endif
|
||
97 | |||
98 | #ifndef offsetof
|
||
99 | 635eb0cc | Måns Rullgård | # define offsetof(T,F) ((unsigned int)((char *)&((T *)0)->F)) |
100 | 05020c89 | Reimar Döffinger | #endif
|
101 | |||
102 | 7d9beec7 | Ramiro Polla | /* Use to export labels from asm. */
|
103 | #define LABEL_MANGLE(a) EXTERN_PREFIX #a |
||
104 | |||
105 | 05020c89 | Reimar Döffinger | // Use rip-relative addressing if compiling PIC code on x86-64.
|
106 | b250f9c6 | Aurelien Jacobs | #if ARCH_X86_64 && defined(PIC)
|
107 | df22c35d | Alexander Strange | # define LOCAL_MANGLE(a) #a "(%%rip)" |
108 | edfd6975 | Diego Biurrun | #else
|
109 | df22c35d | Alexander Strange | # define LOCAL_MANGLE(a) #a |
110 | 635eb0cc | Måns Rullgård | #endif
|
111 | 05020c89 | Reimar Döffinger | |
112 | df22c35d | Alexander Strange | #define MANGLE(a) EXTERN_PREFIX LOCAL_MANGLE(a)
|
113 | |||
114 | 05020c89 | Reimar Döffinger | /* debug stuff */
|
115 | |||
116 | /* dprintf macros */
|
||
117 | 635eb0cc | Måns Rullgård | #ifdef DEBUG
|
118 | 318c5e05 | Michel Bardiaux | # define dprintf(pctx, ...) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__)
|
119 | 635eb0cc | Måns Rullgård | #else
|
120 | 318c5e05 | Michel Bardiaux | # define dprintf(pctx, ...)
|
121 | 635eb0cc | Måns Rullgård | #endif
|
122 | 05020c89 | Reimar Döffinger | |
123 | 635eb0cc | Måns Rullgård | #define av_abort() do { av_log(NULL, AV_LOG_ERROR, "Abort at %s:%d\n", __FILE__, __LINE__); abort(); } while (0) |
124 | 05020c89 | Reimar Döffinger | |
125 | 7e5f82dc | Måns Rullgård | /* math */
|
126 | |||
127 | 36cd3069 | Måns Rullgård | extern const uint32_t ff_inverse[256]; |
128 | 05020c89 | Reimar Döffinger | |
129 | b250f9c6 | Aurelien Jacobs | #if ARCH_X86
|
130 | 05020c89 | Reimar Döffinger | # define FASTDIV(a,b) \
|
131 | ({\ |
||
132 | int ret,dmy;\
|
||
133 | be449fca | Diego Pettenò | __asm__ volatile(\
|
134 | 05020c89 | Reimar Döffinger | "mull %3"\
|
135 | :"=d"(ret),"=a"(dmy)\ |
||
136 | 36cd3069 | Måns Rullgård | :"1"(a),"g"(ff_inverse[b])\ |
137 | 05020c89 | Reimar Döffinger | );\ |
138 | ret;\ |
||
139 | }) |
||
140 | 35690321 | Måns Rullgård | #elif HAVE_ARMV6 && HAVE_INLINE_ASM
|
141 | 6651ce17 | Måns Rullgård | static inline av_const int FASTDIV(int a, int b) |
142 | { |
||
143 | b98f10c0 | Måns Rullgård | int r, t;
|
144 | __asm__ volatile("cmp %3, #2 \n\t" |
||
145 | "ldr %1, [%4, %3, lsl #2] \n\t"
|
||
146 | "lsrle %0, %2, #1 \n\t"
|
||
147 | "smmulgt %0, %1, %2 \n\t"
|
||
148 | : "=&r"(r), "=&r"(t) : "r"(a), "r"(b), "r"(ff_inverse)); |
||
149 | 6651ce17 | Måns Rullgård | return r;
|
150 | } |
||
151 | 35690321 | Måns Rullgård | #elif ARCH_ARM && HAVE_INLINE_ASM
|
152 | f8c5adaf | Måns Rullgård | static inline av_const int FASTDIV(int a, int b) |
153 | { |
||
154 | int r, t;
|
||
155 | __asm__ volatile ("umull %1, %0, %2, %3" |
||
156 | : "=&r"(r), "=&r"(t) : "r"(a), "r"(ff_inverse[b])); |
||
157 | return r;
|
||
158 | } |
||
159 | b250f9c6 | Aurelien Jacobs | #elif CONFIG_FASTDIV
|
160 | 36cd3069 | Måns Rullgård | # define FASTDIV(a,b) ((uint32_t)((((uint64_t)a)*ff_inverse[b])>>32)) |
161 | 05020c89 | Reimar Döffinger | #else
|
162 | # define FASTDIV(a,b) ((a)/(b))
|
||
163 | #endif
|
||
164 | |||
165 | c448a096 | Michael Niedermayer | extern const uint8_t ff_sqrt_tab[256]; |
166 | 05020c89 | Reimar Döffinger | |
167 | 85074d3c | Zuxy Meng | static inline av_const unsigned int ff_sqrt(unsigned int a) |
168 | 05020c89 | Reimar Döffinger | { |
169 | c448a096 | Michael Niedermayer | unsigned int b; |
170 | |||
171 | if(a<255) return (ff_sqrt_tab[a+1]-1)>>4; |
||
172 | else if(a<(1<<12)) b= ff_sqrt_tab[a>>4 ]>>2; |
||
173 | b250f9c6 | Aurelien Jacobs | #if !CONFIG_SMALL
|
174 | c448a096 | Michael Niedermayer | else if(a<(1<<14)) b= ff_sqrt_tab[a>>6 ]>>1; |
175 | else if(a<(1<<16)) b= ff_sqrt_tab[a>>8 ] ; |
||
176 | #endif
|
||
177 | else{
|
||
178 | int s= av_log2_16bit(a>>16)>>1; |
||
179 | unsigned int c= a>>(s+2); |
||
180 | b= ff_sqrt_tab[c>>(s+8)];
|
||
181 | b= FASTDIV(c,b) + (b<<s); |
||
182 | 05020c89 | Reimar Döffinger | } |
183 | c448a096 | Michael Niedermayer | |
184 | return b - (a<b*b);
|
||
185 | 05020c89 | Reimar Döffinger | } |
186 | |||
187 | b250f9c6 | Aurelien Jacobs | #if ARCH_X86
|
188 | 05020c89 | Reimar Döffinger | #define MASK_ABS(mask, level)\
|
189 | be449fca | Diego Pettenò | __asm__ volatile(\
|
190 | 7e14b808 | Reimar Döffinger | "cltd \n\t"\
|
191 | 05020c89 | Reimar Döffinger | "xorl %1, %0 \n\t"\
|
192 | "subl %1, %0 \n\t"\
|
||
193 | : "+a" (level), "=&d" (mask)\ |
||
194 | ); |
||
195 | #else
|
||
196 | #define MASK_ABS(mask, level)\
|
||
197 | mask= level>>31;\
|
||
198 | level= (level^mask)-mask; |
||
199 | #endif
|
||
200 | |||
201 | b250f9c6 | Aurelien Jacobs | #if HAVE_CMOV
|
202 | 05020c89 | Reimar Döffinger | #define COPY3_IF_LT(x,y,a,b,c,d)\
|
203 | be449fca | Diego Pettenò | __asm__ volatile (\
|
204 | 05020c89 | Reimar Döffinger | "cmpl %0, %3 \n\t"\
|
205 | "cmovl %3, %0 \n\t"\
|
||
206 | "cmovl %4, %1 \n\t"\
|
||
207 | "cmovl %5, %2 \n\t"\
|
||
208 | 8c2e2040 | Ramiro Polla | : "+&r" (x), "+&r" (a), "+r" (c)\ |
209 | 05020c89 | Reimar Döffinger | : "r" (y), "r" (b), "r" (d)\ |
210 | ); |
||
211 | #else
|
||
212 | #define COPY3_IF_LT(x,y,a,b,c,d)\
|
||
213 | if((y)<(x)){\
|
||
214 | (x)=(y);\ |
||
215 | (a)=(b);\ |
||
216 | (c)=(d);\ |
||
217 | } |
||
218 | #endif
|
||
219 | |||
220 | 7d685b48 | Diego Biurrun | /* avoid usage of dangerous/inappropriate system functions */
|
221 | 84662c01 | Måns Rullgård | #undef malloc
|
222 | 05020c89 | Reimar Döffinger | #define malloc please_use_av_malloc
|
223 | 84662c01 | Måns Rullgård | #undef free
|
224 | 05020c89 | Reimar Döffinger | #define free please_use_av_free
|
225 | 84662c01 | Måns Rullgård | #undef realloc
|
226 | 05020c89 | Reimar Döffinger | #define realloc please_use_av_realloc
|
227 | 84662c01 | Måns Rullgård | #undef time
|
228 | 05020c89 | Reimar Döffinger | #define time time_is_forbidden_due_to_security_issues
|
229 | 84662c01 | Måns Rullgård | #undef rand
|
230 | 9f5da4d1 | Diego Biurrun | #define rand rand_is_forbidden_due_to_state_trashing_use_av_lfg_get
|
231 | 84662c01 | Måns Rullgård | #undef srand
|
232 | 9f5da4d1 | Diego Biurrun | #define srand srand_is_forbidden_due_to_state_trashing_use_av_lfg_init
|
233 | 84662c01 | Måns Rullgård | #undef random
|
234 | 9f5da4d1 | Diego Biurrun | #define random random_is_forbidden_due_to_state_trashing_use_av_lfg_get
|
235 | 84662c01 | Måns Rullgård | #undef sprintf
|
236 | 05020c89 | Reimar Döffinger | #define sprintf sprintf_is_forbidden_due_to_security_issues_use_snprintf
|
237 | 84662c01 | Måns Rullgård | #undef strcat
|
238 | 272605c7 | Reimar Döffinger | #define strcat strcat_is_forbidden_due_to_security_issues_use_av_strlcat
|
239 | 84662c01 | Måns Rullgård | #undef exit
|
240 | c367d067 | Michael Niedermayer | #define exit exit_is_forbidden
|
241 | 6123abad | Stefano Sabatini | #ifndef LIBAVFORMAT_BUILD
|
242 | 84662c01 | Måns Rullgård | #undef printf
|
243 | b58f29a1 | Diego Biurrun | #define printf please_use_av_log_instead_of_printf
|
244 | 84662c01 | Måns Rullgård | #undef fprintf
|
245 | b58f29a1 | Diego Biurrun | #define fprintf please_use_av_log_instead_of_fprintf
|
246 | 59ec6991 | Diego Biurrun | #undef puts
|
247 | b58f29a1 | Diego Biurrun | #define puts please_use_av_log_instead_of_puts
|
248 | c5a2fe8f | Luca Abeni | #undef perror
|
249 | #define perror please_use_av_log_instead_of_perror
|
||
250 | 05020c89 | Reimar Döffinger | #endif
|
251 | |||
252 | #define CHECKED_ALLOCZ(p, size)\
|
||
253 | {\ |
||
254 | p= av_mallocz(size);\ |
||
255 | if(p==NULL && (size)!=0){\ |
||
256 | 7f0cd6a5 | Luca Abeni | av_log(NULL, AV_LOG_ERROR, "Cannot allocate memory.");\ |
257 | 05020c89 | Reimar Döffinger | goto fail;\
|
258 | }\ |
||
259 | } |
||
260 | |||
261 | 4ce94923 | Diego Biurrun | #if defined(__ICC) || defined(__SUNPRO_C)
|
262 | #define DECLARE_ALIGNED(n,t,v) t v __attribute__ ((aligned (n)))
|
||
263 | #define DECLARE_ASM_CONST(n,t,v) const t __attribute__ ((aligned (n))) v |
||
264 | #elif defined(__GNUC__)
|
||
265 | #define DECLARE_ALIGNED(n,t,v) t v __attribute__ ((aligned (n)))
|
||
266 | #define DECLARE_ASM_CONST(n,t,v) static const t v attribute_used __attribute__ ((aligned (n))) |
||
267 | 0f73b510 | Diego Biurrun | #elif defined(_MSC_VER)
|
268 | #define DECLARE_ALIGNED(n,t,v) __declspec(align(n)) t v
|
||
269 | #define DECLARE_ASM_CONST(n,t,v) __declspec(align(n)) static const t v |
||
270 | 4ce94923 | Diego Biurrun | #elif HAVE_INLINE_ASM
|
271 | #error The asm code needs alignment, but we do not know how to do it for this compiler. |
||
272 | #else
|
||
273 | #define DECLARE_ALIGNED(n,t,v) t v
|
||
274 | #define DECLARE_ASM_CONST(n,t,v) static const t v |
||
275 | #endif
|
||
276 | |||
277 | |||
278 | b250f9c6 | Aurelien Jacobs | #if !HAVE_LLRINT
|
279 | 85074d3c | Zuxy Meng | static av_always_inline av_const long long llrint(double x) |
280 | a33cab3a | Michael Kostylev | { |
281 | return rint(x);
|
||
282 | } |
||
283 | #endif /* HAVE_LLRINT */ |
||
284 | |||
285 | b250f9c6 | Aurelien Jacobs | #if !HAVE_LRINT
|
286 | 85074d3c | Zuxy Meng | static av_always_inline av_const long int lrint(double x) |
287 | a33cab3a | Michael Kostylev | { |
288 | return rint(x);
|
||
289 | } |
||
290 | #endif /* HAVE_LRINT */ |
||
291 | |||
292 | b250f9c6 | Aurelien Jacobs | #if !HAVE_LRINTF
|
293 | 85074d3c | Zuxy Meng | static av_always_inline av_const long int lrintf(float x) |
294 | 05020c89 | Reimar Döffinger | { |
295 | return (int)(rint(x)); |
||
296 | } |
||
297 | #endif /* HAVE_LRINTF */ |
||
298 | |||
299 | b250f9c6 | Aurelien Jacobs | #if !HAVE_ROUND
|
300 | 85074d3c | Zuxy Meng | static av_always_inline av_const double round(double x) |
301 | a33cab3a | Michael Kostylev | { |
302 | return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5); |
||
303 | } |
||
304 | #endif /* HAVE_ROUND */ |
||
305 | |||
306 | b250f9c6 | Aurelien Jacobs | #if !HAVE_ROUNDF
|
307 | 85074d3c | Zuxy Meng | static av_always_inline av_const float roundf(float x) |
308 | a33cab3a | Michael Kostylev | { |
309 | return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5); |
||
310 | } |
||
311 | #endif /* HAVE_ROUNDF */ |
||
312 | |||
313 | b250f9c6 | Aurelien Jacobs | #if !HAVE_TRUNCF
|
314 | 7b04b8a0 | Michael Kostylev | static av_always_inline av_const float truncf(float x) |
315 | { |
||
316 | return (x > 0) ? floor(x) : ceil(x); |
||
317 | } |
||
318 | #endif /* HAVE_TRUNCF */ |
||
319 | |||
320 | d80a7fe5 | Aurelien Jacobs | /**
|
321 | bfe3676f | Diego Biurrun | * Returns NULL if CONFIG_SMALL is true, otherwise the argument
|
322 | * without modification. Used to disable the definition of strings
|
||
323 | d80a7fe5 | Aurelien Jacobs | * (for example AVCodec long_names).
|
324 | */
|
||
325 | #if CONFIG_SMALL
|
||
326 | # define NULL_IF_CONFIG_SMALL(x) NULL |
||
327 | #else
|
||
328 | # define NULL_IF_CONFIG_SMALL(x) x
|
||
329 | #endif
|
||
330 | |||
331 | 98790382 | Stefano Sabatini | #endif /* AVUTIL_INTERNAL_H */ |