ffmpeg / libavutil / internal.h @ d71ad089
History | View | Annotate | Download (7.97 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 | 06be9d9d | Carl Eugen Hoyos | #if (!defined(__ICC) || __ICC > 1110) && 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 | ee155011 | Diego Biurrun | #define INT16_MIN (-0x7fff - 1) |
60 | cd107896 | Måns Rullgård | #endif
|
61 | |||
62 | #ifndef INT16_MAX
|
||
63 | #define INT16_MAX 0x7fff |
||
64 | #endif
|
||
65 | |||
66 | #ifndef INT32_MIN
|
||
67 | ee155011 | Diego Biurrun | #define INT32_MIN (-0x7fffffff - 1) |
68 | cd107896 | Måns Rullgård | #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 | ee155011 | Diego Biurrun | #define INT64_MIN (-0x7fffffffffffffffLL - 1) |
80 | cd107896 | Måns Rullgård | #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 | ee155011 | Diego Biurrun | # 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 | 1a918c08 | Loren Merritt | extern const uint32_t ff_inverse[257]; |
128 | 05020c89 | Reimar Döffinger | |
129 | b250f9c6 | Aurelien Jacobs | #if ARCH_X86
|
130 | 05020c89 | Reimar Döffinger | # define FASTDIV(a,b) \
|
131 | ({\ |
||
132 | ee155011 | Diego Biurrun | int ret, dmy;\
|
133 | be449fca | Diego Pettenò | __asm__ volatile(\
|
134 | 05020c89 | Reimar Döffinger | "mull %3"\
|
135 | ee155011 | Diego Biurrun | :"=d"(ret), "=a"(dmy)\ |
136 | :"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 | ee155011 | Diego Biurrun | __asm__ volatile("umull %1, %0, %2, %3" |
156 | : "=&r"(r), "=&r"(t) : "r"(a), "r"(ff_inverse[b])); |
||
157 | f8c5adaf | Måns Rullgård | return r;
|
158 | } |
||
159 | b250f9c6 | Aurelien Jacobs | #elif CONFIG_FASTDIV
|
160 | ee155011 | Diego Biurrun | # define FASTDIV(a,b) ((uint32_t)((((uint64_t)a) * ff_inverse[b]) >> 32)) |
161 | 05020c89 | Reimar Döffinger | #else
|
162 | ee155011 | Diego Biurrun | # define FASTDIV(a,b) ((a) / (b))
|
163 | 05020c89 | Reimar Döffinger | #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 | ee155011 | Diego Biurrun | 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 | ee155011 | Diego Biurrun | 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 | c448a096 | Michael Niedermayer | #endif
|
177 | ee155011 | Diego Biurrun | 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 | ee155011 | Diego Biurrun | 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 | ee155011 | Diego Biurrun | mask = level >> 31;\
|
198 | level = (level ^ mask) - mask; |
||
199 | 05020c89 | Reimar Döffinger | #endif
|
200 | |||
201 | b250f9c6 | Aurelien Jacobs | #if HAVE_CMOV
|
202 | ee155011 | Diego Biurrun | #define COPY3_IF_LT(x, y, a, b, c, d)\
|
203 | __asm__ volatile(\
|
||
204 | "cmpl %0, %3 \n\t"\
|
||
205 | 05020c89 | Reimar Döffinger | "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 | ee155011 | Diego Biurrun | #define COPY3_IF_LT(x, y, a, b, c, d)\
|
213 | if ((y) < (x)) {\
|
||
214 | (x) = (y);\ |
||
215 | (a) = (b);\ |
||
216 | (c) = (d);\ |
||
217 | 05020c89 | Reimar Döffinger | } |
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 | d31dbec3 | Ramiro Polla | #define FF_ALLOC_OR_GOTO(ctx, p, size, label)\
|
253 | e48a0966 | Ramiro Polla | {\ |
254 | ee155011 | Diego Biurrun | p = av_malloc(size);\ |
255 | if (p == NULL && (size) != 0) {\ |
||
256 | d31dbec3 | Ramiro Polla | av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\
|
257 | goto label;\
|
||
258 | e48a0966 | Ramiro Polla | }\ |
259 | } |
||
260 | |||
261 | d31dbec3 | Ramiro Polla | #define FF_ALLOCZ_OR_GOTO(ctx, p, size, label)\
|
262 | 05020c89 | Reimar Döffinger | {\ |
263 | ee155011 | Diego Biurrun | p = av_mallocz(size);\ |
264 | if (p == NULL && (size) != 0) {\ |
||
265 | d31dbec3 | Ramiro Polla | av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\
|
266 | goto label;\
|
||
267 | 05020c89 | Reimar Döffinger | }\ |
268 | } |
||
269 | |||
270 | b250f9c6 | Aurelien Jacobs | #if !HAVE_LLRINT
|
271 | 85074d3c | Zuxy Meng | static av_always_inline av_const long long llrint(double x) |
272 | a33cab3a | Michael Kostylev | { |
273 | return rint(x);
|
||
274 | } |
||
275 | #endif /* HAVE_LLRINT */ |
||
276 | 291fd18a | Alex Converse | |
277 | #if !HAVE_LOG2
|
||
278 | static av_always_inline av_const double log2(double x) |
||
279 | { |
||
280 | return log(x) * 1.44269504088896340736; |
||
281 | } |
||
282 | #endif /* HAVE_LOG2 */ |
||
283 | a33cab3a | Michael Kostylev | |
284 | b250f9c6 | Aurelien Jacobs | #if !HAVE_LRINT
|
285 | 85074d3c | Zuxy Meng | static av_always_inline av_const long int lrint(double x) |
286 | a33cab3a | Michael Kostylev | { |
287 | return rint(x);
|
||
288 | } |
||
289 | #endif /* HAVE_LRINT */ |
||
290 | |||
291 | b250f9c6 | Aurelien Jacobs | #if !HAVE_LRINTF
|
292 | 85074d3c | Zuxy Meng | static av_always_inline av_const long int lrintf(float x) |
293 | 05020c89 | Reimar Döffinger | { |
294 | return (int)(rint(x)); |
||
295 | } |
||
296 | #endif /* HAVE_LRINTF */ |
||
297 | |||
298 | b250f9c6 | Aurelien Jacobs | #if !HAVE_ROUND
|
299 | 85074d3c | Zuxy Meng | static av_always_inline av_const double round(double x) |
300 | a33cab3a | Michael Kostylev | { |
301 | return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5); |
||
302 | } |
||
303 | #endif /* HAVE_ROUND */ |
||
304 | |||
305 | b250f9c6 | Aurelien Jacobs | #if !HAVE_ROUNDF
|
306 | 85074d3c | Zuxy Meng | static av_always_inline av_const float roundf(float x) |
307 | a33cab3a | Michael Kostylev | { |
308 | return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5); |
||
309 | } |
||
310 | #endif /* HAVE_ROUNDF */ |
||
311 | |||
312 | b250f9c6 | Aurelien Jacobs | #if !HAVE_TRUNCF
|
313 | 7b04b8a0 | Michael Kostylev | static av_always_inline av_const float truncf(float x) |
314 | { |
||
315 | return (x > 0) ? floor(x) : ceil(x); |
||
316 | } |
||
317 | #endif /* HAVE_TRUNCF */ |
||
318 | |||
319 | d80a7fe5 | Aurelien Jacobs | /**
|
320 | bfe3676f | Diego Biurrun | * Returns NULL if CONFIG_SMALL is true, otherwise the argument
|
321 | * without modification. Used to disable the definition of strings
|
||
322 | d80a7fe5 | Aurelien Jacobs | * (for example AVCodec long_names).
|
323 | */
|
||
324 | #if CONFIG_SMALL
|
||
325 | # define NULL_IF_CONFIG_SMALL(x) NULL |
||
326 | #else
|
||
327 | # define NULL_IF_CONFIG_SMALL(x) x
|
||
328 | #endif
|
||
329 | |||
330 | 98790382 | Stefano Sabatini | #endif /* AVUTIL_INTERNAL_H */ |