ffmpeg / libavutil / internal.h @ f8c5adaf
History | View | Annotate | Download (7.1 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 | * @file internal.h
|
||
23 | * common internal api header.
|
||
24 | */
|
||
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 | 99545457 | Måns Rullgård | #include <stdint.h> |
34 | 318049b8 | Måns Rullgård | #include <stddef.h> |
35 | #include <assert.h> |
||
36 | 99545457 | Måns Rullgård | |
37 | 5e4c7ca2 | Ramiro Polla | #ifndef attribute_align_arg
|
38 | #if defined(__GNUC__) && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__>1) |
||
39 | # define attribute_align_arg __attribute__((force_align_arg_pointer))
|
||
40 | #else
|
||
41 | # define attribute_align_arg
|
||
42 | #endif
|
||
43 | #endif
|
||
44 | |||
45 | 5403f857 | Måns Rullgård | #ifndef attribute_used
|
46 | #if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0) |
||
47 | # define attribute_used __attribute__((used))
|
||
48 | #else
|
||
49 | # define attribute_used
|
||
50 | #endif
|
||
51 | #endif
|
||
52 | |||
53 | cd107896 | Måns Rullgård | #ifndef INT16_MIN
|
54 | #define INT16_MIN (-0x7fff-1) |
||
55 | #endif
|
||
56 | |||
57 | #ifndef INT16_MAX
|
||
58 | #define INT16_MAX 0x7fff |
||
59 | #endif
|
||
60 | |||
61 | #ifndef INT32_MIN
|
||
62 | #define INT32_MIN (-0x7fffffff-1) |
||
63 | #endif
|
||
64 | |||
65 | #ifndef INT32_MAX
|
||
66 | #define INT32_MAX 0x7fffffff |
||
67 | #endif
|
||
68 | |||
69 | #ifndef UINT32_MAX
|
||
70 | #define UINT32_MAX 0xffffffff |
||
71 | #endif
|
||
72 | |||
73 | #ifndef INT64_MIN
|
||
74 | #define INT64_MIN (-0x7fffffffffffffffLL-1) |
||
75 | #endif
|
||
76 | |||
77 | #ifndef INT64_MAX
|
||
78 | 8da9266c | Måns Rullgård | #define INT64_MAX INT64_C(9223372036854775807) |
79 | cd107896 | Måns Rullgård | #endif
|
80 | |||
81 | #ifndef UINT64_MAX
|
||
82 | 8da9266c | Måns Rullgård | #define UINT64_MAX UINT64_C(0xFFFFFFFFFFFFFFFF) |
83 | cd107896 | Måns Rullgård | #endif
|
84 | |||
85 | #ifndef INT_BIT
|
||
86 | # if INT_MAX != 2147483647 |
||
87 | # define INT_BIT 64 |
||
88 | # else
|
||
89 | # define INT_BIT 32 |
||
90 | # endif
|
||
91 | #endif
|
||
92 | |||
93 | 05020c89 | Reimar Döffinger | #if ( defined(__PIC__) || defined(__pic__) ) && ! defined(PIC)
|
94 | # define PIC
|
||
95 | #endif
|
||
96 | |||
97 | a087028a | Diego Biurrun | #include "config.h" |
98 | cf1e119b | Reimar Döffinger | #include "intreadwrite.h" |
99 | aab77159 | Reimar Döffinger | #include "bswap.h" |
100 | |||
101 | 05020c89 | Reimar Döffinger | #ifndef offsetof
|
102 | 635eb0cc | Måns Rullgård | # define offsetof(T,F) ((unsigned int)((char *)&((T *)0)->F)) |
103 | 05020c89 | Reimar Döffinger | #endif
|
104 | |||
105 | // Use rip-relative addressing if compiling PIC code on x86-64.
|
||
106 | b4d96ba2 | Måns Rullgård | #if defined(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 | 3cd52279 | Diego Biurrun | #if defined(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 | 6651ce17 | Måns Rullgård | #elif defined(HAVE_ARMV6)
|
141 | 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 | a2fc0f6a | Måns Rullgård | #elif defined(ARCH_ARM)
|
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 | 05020c89 | Reimar Döffinger | #elif defined(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 | c448a096 | Michael Niedermayer | static inline int av_log2_16bit(unsigned int v); |
168 | |||
169 | 85074d3c | Zuxy Meng | static inline av_const unsigned int ff_sqrt(unsigned int a) |
170 | 05020c89 | Reimar Döffinger | { |
171 | c448a096 | Michael Niedermayer | unsigned int b; |
172 | |||
173 | if(a<255) return (ff_sqrt_tab[a+1]-1)>>4; |
||
174 | else if(a<(1<<12)) b= ff_sqrt_tab[a>>4 ]>>2; |
||
175 | #ifndef CONFIG_SMALL
|
||
176 | else if(a<(1<<14)) b= ff_sqrt_tab[a>>6 ]>>1; |
||
177 | else if(a<(1<<16)) b= ff_sqrt_tab[a>>8 ] ; |
||
178 | #endif
|
||
179 | else{
|
||
180 | int s= av_log2_16bit(a>>16)>>1; |
||
181 | unsigned int c= a>>(s+2); |
||
182 | b= ff_sqrt_tab[c>>(s+8)];
|
||
183 | b= FASTDIV(c,b) + (b<<s); |
||
184 | 05020c89 | Reimar Döffinger | } |
185 | c448a096 | Michael Niedermayer | |
186 | return b - (a<b*b);
|
||
187 | 05020c89 | Reimar Döffinger | } |
188 | |||
189 | 3cd52279 | Diego Biurrun | #if defined(ARCH_X86)
|
190 | 05020c89 | Reimar Döffinger | #define MASK_ABS(mask, level)\
|
191 | be449fca | Diego Pettenò | __asm__ volatile(\
|
192 | 7e14b808 | Reimar Döffinger | "cltd \n\t"\
|
193 | 05020c89 | Reimar Döffinger | "xorl %1, %0 \n\t"\
|
194 | "subl %1, %0 \n\t"\
|
||
195 | : "+a" (level), "=&d" (mask)\ |
||
196 | ); |
||
197 | #else
|
||
198 | #define MASK_ABS(mask, level)\
|
||
199 | mask= level>>31;\
|
||
200 | level= (level^mask)-mask; |
||
201 | #endif
|
||
202 | |||
203 | 94e4c3a3 | Guillaume Poirier | #ifdef HAVE_CMOV
|
204 | 05020c89 | Reimar Döffinger | #define COPY3_IF_LT(x,y,a,b,c,d)\
|
205 | be449fca | Diego Pettenò | __asm__ volatile (\
|
206 | 05020c89 | Reimar Döffinger | "cmpl %0, %3 \n\t"\
|
207 | "cmovl %3, %0 \n\t"\
|
||
208 | "cmovl %4, %1 \n\t"\
|
||
209 | "cmovl %5, %2 \n\t"\
|
||
210 | 8c2e2040 | Ramiro Polla | : "+&r" (x), "+&r" (a), "+r" (c)\ |
211 | 05020c89 | Reimar Döffinger | : "r" (y), "r" (b), "r" (d)\ |
212 | ); |
||
213 | #else
|
||
214 | #define COPY3_IF_LT(x,y,a,b,c,d)\
|
||
215 | if((y)<(x)){\
|
||
216 | (x)=(y);\ |
||
217 | (a)=(b);\ |
||
218 | (c)=(d);\ |
||
219 | } |
||
220 | #endif
|
||
221 | |||
222 | /* avoid usage of various functions */
|
||
223 | 84662c01 | Måns Rullgård | #undef malloc
|
224 | 05020c89 | Reimar Döffinger | #define malloc please_use_av_malloc
|
225 | 84662c01 | Måns Rullgård | #undef free
|
226 | 05020c89 | Reimar Döffinger | #define free please_use_av_free
|
227 | 84662c01 | Måns Rullgård | #undef realloc
|
228 | 05020c89 | Reimar Döffinger | #define realloc please_use_av_realloc
|
229 | 84662c01 | Måns Rullgård | #undef time
|
230 | 05020c89 | Reimar Döffinger | #define time time_is_forbidden_due_to_security_issues
|
231 | 84662c01 | Måns Rullgård | #undef rand
|
232 | 3299fb45 | Vitor Sessak | #define rand rand_is_forbidden_due_to_state_trashing_use_av_random
|
233 | 84662c01 | Måns Rullgård | #undef srand
|
234 | 3299fb45 | Vitor Sessak | #define srand srand_is_forbidden_due_to_state_trashing_use_av_init_random
|
235 | 84662c01 | Måns Rullgård | #undef random
|
236 | 3299fb45 | Vitor Sessak | #define random random_is_forbidden_due_to_state_trashing_use_av_random
|
237 | 84662c01 | Måns Rullgård | #undef sprintf
|
238 | 05020c89 | Reimar Döffinger | #define sprintf sprintf_is_forbidden_due_to_security_issues_use_snprintf
|
239 | 84662c01 | Måns Rullgård | #undef strcat
|
240 | 272605c7 | Reimar Döffinger | #define strcat strcat_is_forbidden_due_to_security_issues_use_av_strlcat
|
241 | 84662c01 | Måns Rullgård | #undef exit
|
242 | c367d067 | Michael Niedermayer | #define exit exit_is_forbidden
|
243 | 6123abad | Stefano Sabatini | #ifndef LIBAVFORMAT_BUILD
|
244 | 84662c01 | Måns Rullgård | #undef printf
|
245 | 05020c89 | Reimar Döffinger | #define printf please_use_av_log
|
246 | 84662c01 | Måns Rullgård | #undef fprintf
|
247 | 05020c89 | Reimar Döffinger | #define fprintf please_use_av_log
|
248 | 59ec6991 | Diego Biurrun | #undef puts
|
249 | #define puts please_use_av_log
|
||
250 | c5a2fe8f | Luca Abeni | #undef perror
|
251 | #define perror please_use_av_log_instead_of_perror
|
||
252 | 05020c89 | Reimar Döffinger | #endif
|
253 | |||
254 | #define CHECKED_ALLOCZ(p, size)\
|
||
255 | {\ |
||
256 | p= av_mallocz(size);\ |
||
257 | if(p==NULL && (size)!=0){\ |
||
258 | 7f0cd6a5 | Luca Abeni | av_log(NULL, AV_LOG_ERROR, "Cannot allocate memory.");\ |
259 | 05020c89 | Reimar Döffinger | goto fail;\
|
260 | }\ |
||
261 | } |
||
262 | |||
263 | a33cab3a | Michael Kostylev | #ifndef HAVE_LLRINT
|
264 | 85074d3c | Zuxy Meng | static av_always_inline av_const long long llrint(double x) |
265 | a33cab3a | Michael Kostylev | { |
266 | return rint(x);
|
||
267 | } |
||
268 | #endif /* HAVE_LLRINT */ |
||
269 | |||
270 | #ifndef HAVE_LRINT
|
||
271 | 85074d3c | Zuxy Meng | static av_always_inline av_const long int lrint(double x) |
272 | a33cab3a | Michael Kostylev | { |
273 | return rint(x);
|
||
274 | } |
||
275 | #endif /* HAVE_LRINT */ |
||
276 | |||
277 | 05020c89 | Reimar Döffinger | #ifndef HAVE_LRINTF
|
278 | 85074d3c | Zuxy Meng | static av_always_inline av_const long int lrintf(float x) |
279 | 05020c89 | Reimar Döffinger | { |
280 | return (int)(rint(x)); |
||
281 | } |
||
282 | #endif /* HAVE_LRINTF */ |
||
283 | |||
284 | a33cab3a | Michael Kostylev | #ifndef HAVE_ROUND
|
285 | 85074d3c | Zuxy Meng | static av_always_inline av_const double round(double x) |
286 | a33cab3a | Michael Kostylev | { |
287 | return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5); |
||
288 | } |
||
289 | #endif /* HAVE_ROUND */ |
||
290 | |||
291 | #ifndef HAVE_ROUNDF
|
||
292 | 85074d3c | Zuxy Meng | static av_always_inline av_const float roundf(float x) |
293 | a33cab3a | Michael Kostylev | { |
294 | return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5); |
||
295 | } |
||
296 | #endif /* HAVE_ROUNDF */ |
||
297 | |||
298 | 98790382 | Stefano Sabatini | #endif /* AVUTIL_INTERNAL_H */ |