Statistics
| Branch: | Revision:

ffmpeg / libavutil / internal.h @ 0b006599

History | View | Annotate | Download (6.57 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
#ifndef INTERNAL_H
27
#define INTERNAL_H
28
29 5403f857 Måns Rullgård
#ifndef attribute_used
30
#if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0)
31
#    define attribute_used __attribute__((used))
32
#else
33
#    define attribute_used
34
#endif
35
#endif
36
37
#ifndef attribute_unused
38 40628be0 Luca Abeni
#if defined(__GNUC__)
39 5403f857 Måns Rullgård
#    define attribute_unused __attribute__((unused))
40
#else
41
#    define attribute_unused
42
#endif
43
#endif
44
45 cd107896 Måns Rullgård
#ifndef M_PI
46
#define M_PI    3.14159265358979323846
47
#endif
48
49
#ifndef INT16_MIN
50
#define INT16_MIN       (-0x7fff-1)
51
#endif
52
53
#ifndef INT16_MAX
54
#define INT16_MAX       0x7fff
55
#endif
56
57
#ifndef INT32_MIN
58
#define INT32_MIN       (-0x7fffffff-1)
59
#endif
60
61
#ifndef INT32_MAX
62
#define INT32_MAX       0x7fffffff
63
#endif
64
65
#ifndef UINT32_MAX
66
#define UINT32_MAX      0xffffffff
67
#endif
68
69
#ifndef INT64_MIN
70
#define INT64_MIN       (-0x7fffffffffffffffLL-1)
71
#endif
72
73
#ifndef INT64_MAX
74 8da9266c Måns Rullgård
#define INT64_MAX INT64_C(9223372036854775807)
75 cd107896 Måns Rullgård
#endif
76
77
#ifndef UINT64_MAX
78 8da9266c Måns Rullgård
#define UINT64_MAX UINT64_C(0xFFFFFFFFFFFFFFFF)
79 cd107896 Måns Rullgård
#endif
80
81
#ifndef INT_BIT
82
#    if INT_MAX != 2147483647
83
#        define INT_BIT 64
84
#    else
85
#        define INT_BIT 32
86
#    endif
87
#endif
88
89 05020c89 Reimar Döffinger
#if ( defined(__PIC__) || defined(__pic__) ) && ! defined(PIC)
90
#    define PIC
91
#endif
92
93 cf1e119b Reimar Döffinger
#include "intreadwrite.h"
94 aab77159 Reimar Döffinger
#include "bswap.h"
95
96 05020c89 Reimar Döffinger
#include <stddef.h>
97
#ifndef offsetof
98 635eb0cc Måns Rullgård
#    define offsetof(T,F) ((unsigned int)((char *)&((T *)0)->F))
99 05020c89 Reimar Döffinger
#endif
100
101
#ifdef __MINGW32__
102
#    ifdef _DEBUG
103
#        define DEBUG
104
#    endif
105
106
#    define snprintf _snprintf
107
#    define vsnprintf _vsnprintf
108
109
#    ifdef CONFIG_WINCE
110
#        define perror(a)
111 f940f7c9 Måns Rullgård
#        define abort()
112 05020c89 Reimar Döffinger
#    endif
113
114
/* __MINGW32__ end */
115
#elif defined (CONFIG_OS2)
116
/* OS/2 EMX */
117
118 635eb0cc Måns Rullgård
#    include <float.h>
119 05020c89 Reimar Döffinger
120
#endif /* !__MINGW32__ && CONFIG_OS2 */
121
122 635eb0cc Måns Rullgård
#ifdef USE_FASTMEMCPY
123
#    include "libvo/fastmemcpy.h"
124
#endif
125 05020c89 Reimar Döffinger
126
// Use rip-relative addressing if compiling PIC code on x86-64.
127 635eb0cc Måns Rullgård
#if defined(__MINGW32__) || defined(__CYGWIN__) || \
128
    defined(__OS2__) || (defined (__OpenBSD__) && !defined(__ELF__))
129
#    if defined(ARCH_X86_64) && defined(PIC)
130
#        define MANGLE(a) "_" #a"(%%rip)"
131 05020c89 Reimar Döffinger
#    else
132 635eb0cc Måns Rullgård
#        define MANGLE(a) "_" #a
133 05020c89 Reimar Döffinger
#    endif
134 635eb0cc Måns Rullgård
#else
135
#    if defined(ARCH_X86_64) && defined(PIC)
136
#        define MANGLE(a) #a"(%%rip)"
137
#    elif defined(CONFIG_DARWIN)
138
#        define MANGLE(a) "_" #a
139
#    else
140
#        define MANGLE(a) #a
141
#    endif
142
#endif
143 05020c89 Reimar Döffinger
144
/* debug stuff */
145
146 635eb0cc Måns Rullgård
#if !defined(DEBUG) && !defined(NDEBUG)
147
#    define NDEBUG
148
#endif
149
#include <assert.h>
150 05020c89 Reimar Döffinger
151
/* dprintf macros */
152 635eb0cc Måns Rullgård
#ifdef DEBUG
153
#    define dprintf(fmt,...) av_log(NULL, AV_LOG_DEBUG, fmt, __VA_ARGS__)
154
#else
155
#    define dprintf(fmt,...)
156
#endif
157 05020c89 Reimar Döffinger
158 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)
159 05020c89 Reimar Döffinger
160 7e5f82dc Måns Rullgård
/* math */
161
162 36cd3069 Måns Rullgård
extern const uint32_t ff_inverse[256];
163 05020c89 Reimar Döffinger
164 3cd52279 Diego Biurrun
#if defined(ARCH_X86)
165 05020c89 Reimar Döffinger
#    define FASTDIV(a,b) \
166
    ({\
167
        int ret,dmy;\
168
        asm volatile(\
169
            "mull %3"\
170
            :"=d"(ret),"=a"(dmy)\
171 36cd3069 Måns Rullgård
            :"1"(a),"g"(ff_inverse[b])\
172 05020c89 Reimar Döffinger
            );\
173
        ret;\
174
    })
175 eeebe6ad Siarhei Siamashka
#elif defined(ARCH_ARMV4L)
176
#    define FASTDIV(a,b) \
177
    ({\
178
        int ret,dmy;\
179
        asm volatile(\
180
            "umull %1, %0, %2, %3"\
181
            :"=&r"(ret),"=&r"(dmy)\
182 36cd3069 Måns Rullgård
            :"r"(a),"r"(ff_inverse[b])\
183 eeebe6ad Siarhei Siamashka
            );\
184
        ret;\
185
    })
186 05020c89 Reimar Döffinger
#elif defined(CONFIG_FASTDIV)
187 36cd3069 Måns Rullgård
#    define FASTDIV(a,b)   ((uint32_t)((((uint64_t)a)*ff_inverse[b])>>32))
188 05020c89 Reimar Döffinger
#else
189
#    define FASTDIV(a,b)   ((a)/(b))
190
#endif
191
192 a77caa4d Måns Rullgård
extern const uint8_t ff_sqrt_tab[128];
193 05020c89 Reimar Döffinger
194
static inline int ff_sqrt(int a)
195
{
196
    int ret=0;
197
    int s;
198
    int ret_sq=0;
199
200
    if(a<128) return ff_sqrt_tab[a];
201
202
    for(s=15; s>=0; s--){
203
        int b= ret_sq + (1<<(s*2)) + (ret<<s)*2;
204
        if(b<=a){
205
            ret_sq=b;
206
            ret+= 1<<s;
207
        }
208
    }
209
    return ret;
210
}
211
212 3cd52279 Diego Biurrun
#if defined(ARCH_X86)
213 05020c89 Reimar Döffinger
#define MASK_ABS(mask, level)\
214
            asm volatile(\
215
                "cdq                    \n\t"\
216
                "xorl %1, %0            \n\t"\
217
                "subl %1, %0            \n\t"\
218
                : "+a" (level), "=&d" (mask)\
219
            );
220
#else
221
#define MASK_ABS(mask, level)\
222
            mask= level>>31;\
223
            level= (level^mask)-mask;
224
#endif
225
226 94e4c3a3 Guillaume Poirier
#ifdef HAVE_CMOV
227 05020c89 Reimar Döffinger
#define COPY3_IF_LT(x,y,a,b,c,d)\
228
asm volatile (\
229
    "cmpl %0, %3        \n\t"\
230
    "cmovl %3, %0       \n\t"\
231
    "cmovl %4, %1       \n\t"\
232
    "cmovl %5, %2       \n\t"\
233
    : "+r" (x), "+r" (a), "+r" (c)\
234
    : "r" (y), "r" (b), "r" (d)\
235
);
236
#else
237
#define COPY3_IF_LT(x,y,a,b,c,d)\
238
if((y)<(x)){\
239
     (x)=(y);\
240
     (a)=(b);\
241
     (c)=(d);\
242
}
243
#endif
244
245
/* avoid usage of various functions */
246
#define malloc please_use_av_malloc
247
#define free please_use_av_free
248
#define realloc please_use_av_realloc
249
#define time time_is_forbidden_due_to_security_issues
250
#define rand rand_is_forbidden_due_to_state_trashing
251
#define srand srand_is_forbidden_due_to_state_trashing
252
#define sprintf sprintf_is_forbidden_due_to_security_issues_use_snprintf
253
#define strcat strcat_is_forbidden_due_to_security_issues_use_pstrcat
254
#if !(defined(LIBAVFORMAT_BUILD) || defined(_FRAMEHOOK_H))
255
#define printf please_use_av_log
256
#define fprintf please_use_av_log
257
#endif
258
259
#define CHECKED_ALLOCZ(p, size)\
260
{\
261
    p= av_mallocz(size);\
262
    if(p==NULL && (size)!=0){\
263
        perror("malloc");\
264
        goto fail;\
265
    }\
266
}
267
268
#ifndef HAVE_LRINTF
269
/* XXX: add ISOC specific test to avoid specific BSD testing. */
270
/* better than nothing implementation. */
271
/* btw, rintf() is existing on fbsd too -- alex */
272 849f1035 Måns Rullgård
static av_always_inline long int lrintf(float x)
273 05020c89 Reimar Döffinger
{
274
#ifdef __MINGW32__
275 419b8784 Diego Biurrun
#  ifdef ARCH_X86_32
276 05020c89 Reimar Döffinger
    int32_t i;
277
    asm volatile(
278
        "fistpl %0\n\t"
279
        : "=m" (i) : "t" (x) : "st"
280
    );
281
    return i;
282
#  else
283
    /* XXX: incorrect, but make it compile */
284
    return (int)(x + (x < 0 ? -0.5 : 0.5));
285 419b8784 Diego Biurrun
#  endif /* ARCH_X86_32 */
286 05020c89 Reimar Döffinger
#else
287
    return (int)(rint(x));
288
#endif /* __MINGW32__ */
289
}
290
#endif /* HAVE_LRINTF */
291
292
#endif /* INTERNAL_H */