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