simplify
[libav.git] / libavutil / internal.h
CommitLineData
04d7f601
DB
1/*
2 * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
3 *
b78e7197
DB
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
04d7f601
DB
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
b78e7197 9 * version 2.1 of the License, or (at your option) any later version.
04d7f601 10 *
b78e7197 11 * FFmpeg is distributed in the hope that it will be useful,
04d7f601
DB
12 * 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
b78e7197 17 * License along with FFmpeg; if not, write to the Free Software
04d7f601
DB
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
05020c89
RD
21/**
22 * @file internal.h
23 * common internal api header.
24 */
25
26#ifndef INTERNAL_H
27#define INTERNAL_H
28
5403f857
MR
29#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
40628be0 38#if defined(__GNUC__)
5403f857
MR
39# define attribute_unused __attribute__((unused))
40#else
41# define attribute_unused
42#endif
43#endif
44
cd107896
MR
45#ifndef M_PI
46#define M_PI 3.14159265358979323846
47#endif
48
cd107896
MR
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
8da9266c 74#define INT64_MAX INT64_C(9223372036854775807)
cd107896
MR
75#endif
76
77#ifndef UINT64_MAX
8da9266c 78#define UINT64_MAX UINT64_C(0xFFFFFFFFFFFFFFFF)
cd107896
MR
79#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
05020c89
RD
89#if ( defined(__PIC__) || defined(__pic__) ) && ! defined(PIC)
90# define PIC
91#endif
92
cf1e119b 93#include "intreadwrite.h"
aab77159
RD
94#include "bswap.h"
95
05020c89
RD
96#include <stddef.h>
97#ifndef offsetof
635eb0cc 98# define offsetof(T,F) ((unsigned int)((char *)&((T *)0)->F))
05020c89
RD
99#endif
100
05020c89
RD
101#ifdef __MINGW32__
102# ifdef _DEBUG
103# define DEBUG
104# endif
105
106# define snprintf _snprintf
107# define vsnprintf _vsnprintf
108
05020c89
RD
109/* __MINGW32__ end */
110#elif defined (CONFIG_OS2)
111/* OS/2 EMX */
112
635eb0cc 113# include <float.h>
05020c89
RD
114
115#endif /* !__MINGW32__ && CONFIG_OS2 */
116
635eb0cc
MR
117#ifdef USE_FASTMEMCPY
118# include "libvo/fastmemcpy.h"
119#endif
05020c89
RD
120
121// Use rip-relative addressing if compiling PIC code on x86-64.
635eb0cc
MR
122#if defined(__MINGW32__) || defined(__CYGWIN__) || \
123 defined(__OS2__) || (defined (__OpenBSD__) && !defined(__ELF__))
124# if defined(ARCH_X86_64) && defined(PIC)
125# define MANGLE(a) "_" #a"(%%rip)"
05020c89 126# else
635eb0cc 127# define MANGLE(a) "_" #a
05020c89 128# endif
635eb0cc
MR
129#else
130# if defined(ARCH_X86_64) && defined(PIC)
131# define MANGLE(a) #a"(%%rip)"
132# elif defined(CONFIG_DARWIN)
133# define MANGLE(a) "_" #a
134# else
135# define MANGLE(a) #a
136# endif
137#endif
05020c89
RD
138
139/* debug stuff */
140
635eb0cc
MR
141#if !defined(DEBUG) && !defined(NDEBUG)
142# define NDEBUG
143#endif
144#include <assert.h>
05020c89
RD
145
146/* dprintf macros */
635eb0cc 147#ifdef DEBUG
318c5e05 148# define dprintf(pctx, ...) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__)
635eb0cc 149#else
318c5e05 150# define dprintf(pctx, ...)
635eb0cc 151#endif
05020c89 152
635eb0cc 153#define av_abort() do { av_log(NULL, AV_LOG_ERROR, "Abort at %s:%d\n", __FILE__, __LINE__); abort(); } while (0)
05020c89 154
7e5f82dc
MR
155/* math */
156
36cd3069 157extern const uint32_t ff_inverse[256];
05020c89 158
3cd52279 159#if defined(ARCH_X86)
05020c89
RD
160# define FASTDIV(a,b) \
161 ({\
162 int ret,dmy;\
163 asm volatile(\
164 "mull %3"\
165 :"=d"(ret),"=a"(dmy)\
36cd3069 166 :"1"(a),"g"(ff_inverse[b])\
05020c89
RD
167 );\
168 ret;\
169 })
eeebe6ad
SS
170#elif defined(ARCH_ARMV4L)
171# define FASTDIV(a,b) \
172 ({\
173 int ret,dmy;\
174 asm volatile(\
175 "umull %1, %0, %2, %3"\
176 :"=&r"(ret),"=&r"(dmy)\
36cd3069 177 :"r"(a),"r"(ff_inverse[b])\
eeebe6ad
SS
178 );\
179 ret;\
180 })
05020c89 181#elif defined(CONFIG_FASTDIV)
36cd3069 182# define FASTDIV(a,b) ((uint32_t)((((uint64_t)a)*ff_inverse[b])>>32))
05020c89
RD
183#else
184# define FASTDIV(a,b) ((a)/(b))
185#endif
186
a77caa4d 187extern const uint8_t ff_sqrt_tab[128];
05020c89
RD
188
189static inline int ff_sqrt(int a)
190{
191 int ret=0;
192 int s;
05020c89
RD
193
194 if(a<128) return ff_sqrt_tab[a];
195
196 for(s=15; s>=0; s--){
fd735e4b 197 int b= (1<<(s*2)) + (ret<<s)*2;
05020c89 198 if(b<=a){
fd735e4b 199 a-=b;
05020c89
RD
200 ret+= 1<<s;
201 }
202 }
203 return ret;
204}
205
3cd52279 206#if defined(ARCH_X86)
05020c89
RD
207#define MASK_ABS(mask, level)\
208 asm volatile(\
209 "cdq \n\t"\
210 "xorl %1, %0 \n\t"\
211 "subl %1, %0 \n\t"\
212 : "+a" (level), "=&d" (mask)\
213 );
214#else
215#define MASK_ABS(mask, level)\
216 mask= level>>31;\
217 level= (level^mask)-mask;
218#endif
219
94e4c3a3 220#ifdef HAVE_CMOV
05020c89
RD
221#define COPY3_IF_LT(x,y,a,b,c,d)\
222asm volatile (\
223 "cmpl %0, %3 \n\t"\
224 "cmovl %3, %0 \n\t"\
225 "cmovl %4, %1 \n\t"\
226 "cmovl %5, %2 \n\t"\
8c2e2040 227 : "+&r" (x), "+&r" (a), "+r" (c)\
05020c89
RD
228 : "r" (y), "r" (b), "r" (d)\
229);
230#else
231#define COPY3_IF_LT(x,y,a,b,c,d)\
232if((y)<(x)){\
233 (x)=(y);\
234 (a)=(b);\
235 (c)=(d);\
236}
237#endif
238
239/* avoid usage of various functions */
240#define malloc please_use_av_malloc
241#define free please_use_av_free
242#define realloc please_use_av_realloc
243#define time time_is_forbidden_due_to_security_issues
244#define rand rand_is_forbidden_due_to_state_trashing
245#define srand srand_is_forbidden_due_to_state_trashing
246#define sprintf sprintf_is_forbidden_due_to_security_issues_use_snprintf
247#define strcat strcat_is_forbidden_due_to_security_issues_use_pstrcat
c367d067 248#define exit exit_is_forbidden
05020c89
RD
249#if !(defined(LIBAVFORMAT_BUILD) || defined(_FRAMEHOOK_H))
250#define printf please_use_av_log
251#define fprintf please_use_av_log
252#endif
253
254#define CHECKED_ALLOCZ(p, size)\
255{\
256 p= av_mallocz(size);\
257 if(p==NULL && (size)!=0){\
258 perror("malloc");\
259 goto fail;\
260 }\
261}
262
263#ifndef HAVE_LRINTF
264/* XXX: add ISOC specific test to avoid specific BSD testing. */
265/* better than nothing implementation. */
266/* btw, rintf() is existing on fbsd too -- alex */
849f1035 267static av_always_inline long int lrintf(float x)
05020c89
RD
268{
269#ifdef __MINGW32__
419b8784 270# ifdef ARCH_X86_32
05020c89
RD
271 int32_t i;
272 asm volatile(
273 "fistpl %0\n\t"
274 : "=m" (i) : "t" (x) : "st"
275 );
276 return i;
277# else
278 /* XXX: incorrect, but make it compile */
279 return (int)(x + (x < 0 ? -0.5 : 0.5));
419b8784 280# endif /* ARCH_X86_32 */
05020c89
RD
281#else
282 return (int)(rint(x));
283#endif /* __MINGW32__ */
284}
285#endif /* HAVE_LRINTF */
286
287#endif /* INTERNAL_H */