internal.h 7.01 KB
Newer Older
1 2 3
/*
 * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
 *
4 5 6
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
7 8
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
9
 * version 2.1 of the License, or (at your option) any later version.
10
 *
11
 * FFmpeg is distributed in the hope that it will be useful,
12 13 14 15 16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with FFmpeg; if not, write to the Free Software
18 19 20
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

21 22 23 24 25
/**
 * @file internal.h
 * common internal api header.
 */

26 27
#ifndef FFMPEG_INTERNAL_H
#define FFMPEG_INTERNAL_H
28

29 30 31 32
#if !defined(DEBUG) && !defined(NDEBUG)
#    define NDEBUG
#endif

33
#include <stdint.h>
34 35
#include <stddef.h>
#include <assert.h>
36

37 38 39 40 41 42 43 44
#ifndef attribute_align_arg
#if defined(__GNUC__) && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__>1)
#    define attribute_align_arg __attribute__((force_align_arg_pointer))
#else
#    define attribute_align_arg
#endif
#endif

45 46 47 48 49 50 51 52
#ifndef attribute_used
#if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0)
#    define attribute_used __attribute__((used))
#else
#    define attribute_used
#endif
#endif

53 54 55 56 57 58 59
/* Use Apple-specific AltiVec syntax for vector declarations when necessary. */
#ifdef __APPLE_CC__
#define AVV(x...) (x)
#else
#define AVV(x...) {x}
#endif

mru's avatar
mru committed
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
#ifndef M_PI
#define M_PI    3.14159265358979323846
#endif

#ifndef INT16_MIN
#define INT16_MIN       (-0x7fff-1)
#endif

#ifndef INT16_MAX
#define INT16_MAX       0x7fff
#endif

#ifndef INT32_MIN
#define INT32_MIN       (-0x7fffffff-1)
#endif

#ifndef INT32_MAX
#define INT32_MAX       0x7fffffff
#endif

#ifndef UINT32_MAX
#define UINT32_MAX      0xffffffff
#endif

#ifndef INT64_MIN
#define INT64_MIN       (-0x7fffffffffffffffLL-1)
#endif

#ifndef INT64_MAX
89
#define INT64_MAX INT64_C(9223372036854775807)
mru's avatar
mru committed
90 91 92
#endif

#ifndef UINT64_MAX
93
#define UINT64_MAX UINT64_C(0xFFFFFFFFFFFFFFFF)
mru's avatar
mru committed
94 95 96 97 98 99 100 101 102 103
#endif

#ifndef INT_BIT
#    if INT_MAX != 2147483647
#        define INT_BIT 64
#    else
#        define INT_BIT 32
#    endif
#endif

104 105 106 107
#if ( defined(__PIC__) || defined(__pic__) ) && ! defined(PIC)
#    define PIC
#endif

108
#include "intreadwrite.h"
109 110
#include "bswap.h"

111
#ifndef offsetof
mru's avatar
mru committed
112
#    define offsetof(T,F) ((unsigned int)((char *)&((T *)0)->F))
113 114
#endif

mru's avatar
mru committed
115 116
#ifdef USE_FASTMEMCPY
#    include "libvo/fastmemcpy.h"
reimar's avatar
reimar committed
117
#    define memcpy(a,b,c) fast_memcpy(a,b,c)
mru's avatar
mru committed
118
#endif
119 120

// Use rip-relative addressing if compiling PIC code on x86-64.
diego's avatar
diego committed
121
#if defined(__MINGW32__) || defined(__CYGWIN__) || defined(__DJGPP__) || \
mru's avatar
mru committed
122 123 124
    defined(__OS2__) || (defined (__OpenBSD__) && !defined(__ELF__))
#    if defined(ARCH_X86_64) && defined(PIC)
#        define MANGLE(a) "_" #a"(%%rip)"
125
#    else
mru's avatar
mru committed
126
#        define MANGLE(a) "_" #a
127
#    endif
mru's avatar
mru committed
128 129 130
#else
#    if defined(ARCH_X86_64) && defined(PIC)
#        define MANGLE(a) #a"(%%rip)"
131
#    elif defined(__APPLE__)
mru's avatar
mru committed
132 133 134 135 136
#        define MANGLE(a) "_" #a
#    else
#        define MANGLE(a) #a
#    endif
#endif
137 138 139 140

/* debug stuff */

/* dprintf macros */
mru's avatar
mru committed
141
#ifdef DEBUG
mbardiaux's avatar
mbardiaux committed
142
#    define dprintf(pctx, ...) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__)
mru's avatar
mru committed
143
#else
mbardiaux's avatar
mbardiaux committed
144
#    define dprintf(pctx, ...)
mru's avatar
mru committed
145
#endif
146

mru's avatar
mru committed
147
#define av_abort()      do { av_log(NULL, AV_LOG_ERROR, "Abort at %s:%d\n", __FILE__, __LINE__); abort(); } while (0)
148

mru's avatar
mru committed
149 150
/* math */

mru's avatar
mru committed
151
extern const uint32_t ff_inverse[256];
152

153
#if defined(ARCH_X86)
154 155 156 157 158 159
#    define FASTDIV(a,b) \
    ({\
        int ret,dmy;\
        asm volatile(\
            "mull %3"\
            :"=d"(ret),"=a"(dmy)\
mru's avatar
mru committed
160
            :"1"(a),"g"(ff_inverse[b])\
161 162 163
            );\
        ret;\
    })
164 165 166 167 168 169 170
#elif defined(ARCH_ARMV4L)
#    define FASTDIV(a,b) \
    ({\
        int ret,dmy;\
        asm volatile(\
            "umull %1, %0, %2, %3"\
            :"=&r"(ret),"=&r"(dmy)\
mru's avatar
mru committed
171
            :"r"(a),"r"(ff_inverse[b])\
172 173 174
            );\
        ret;\
    })
175
#elif defined(CONFIG_FASTDIV)
mru's avatar
mru committed
176
#    define FASTDIV(a,b)   ((uint32_t)((((uint64_t)a)*ff_inverse[b])>>32))
177 178 179 180
#else
#    define FASTDIV(a,b)   ((a)/(b))
#endif

181
extern const uint8_t ff_sqrt_tab[128];
182 183 184 185

static inline int ff_sqrt(int a)
{
    int ret=0;
michael's avatar
michael committed
186
    int s, b;
187 188 189

    if(a<128) return ff_sqrt_tab[a];

michael's avatar
michael committed
190 191 192
    for(s=30; s>=0; s-=2){
        ret+=ret;
        b= (1+2*ret)<<s;
193
        if(b<=a){
michael's avatar
michael committed
194
            a-=b;
michael's avatar
michael committed
195
            ret++;
196 197 198 199 200
        }
    }
    return ret;
}

201
#if defined(ARCH_X86)
202 203 204 205 206 207 208 209 210 211 212 213 214
#define MASK_ABS(mask, level)\
            asm volatile(\
                "cdq                    \n\t"\
                "xorl %1, %0            \n\t"\
                "subl %1, %0            \n\t"\
                : "+a" (level), "=&d" (mask)\
            );
#else
#define MASK_ABS(mask, level)\
            mask= level>>31;\
            level= (level^mask)-mask;
#endif

215
#ifdef HAVE_CMOV
216 217 218 219 220 221
#define COPY3_IF_LT(x,y,a,b,c,d)\
asm volatile (\
    "cmpl %0, %3        \n\t"\
    "cmovl %3, %0       \n\t"\
    "cmovl %4, %1       \n\t"\
    "cmovl %5, %2       \n\t"\
222
    : "+&r" (x), "+&r" (a), "+r" (c)\
223 224 225 226 227 228 229 230 231 232 233 234
    : "r" (y), "r" (b), "r" (d)\
);
#else
#define COPY3_IF_LT(x,y,a,b,c,d)\
if((y)<(x)){\
     (x)=(y);\
     (a)=(b);\
     (c)=(d);\
}
#endif

/* avoid usage of various functions */
235
#undef  malloc
236
#define malloc please_use_av_malloc
237
#undef  free
238
#define free please_use_av_free
239
#undef  realloc
240
#define realloc please_use_av_realloc
241
#undef  time
242
#define time time_is_forbidden_due_to_security_issues
243
#undef  rand
244
#define rand rand_is_forbidden_due_to_state_trashing_use_av_random
245
#undef  srand
246
#define srand srand_is_forbidden_due_to_state_trashing_use_av_init_random
247
#undef  random
248
#define random random_is_forbidden_due_to_state_trashing_use_av_random
249
#undef  sprintf
250
#define sprintf sprintf_is_forbidden_due_to_security_issues_use_snprintf
251
#undef  strcat
reimar's avatar
reimar committed
252
#define strcat strcat_is_forbidden_due_to_security_issues_use_av_strlcat
253
#undef  exit
michael's avatar
michael committed
254
#define exit exit_is_forbidden
benoit's avatar
benoit committed
255
#if !(defined(LIBAVFORMAT_BUILD) || defined(FFMPEG_FRAMEHOOK_H))
256
#undef  printf
257
#define printf please_use_av_log
258
#undef  fprintf
259
#define fprintf please_use_av_log
260 261
#undef  perror
#define perror please_use_av_log_instead_of_perror
262 263 264 265 266 267
#endif

#define CHECKED_ALLOCZ(p, size)\
{\
    p= av_mallocz(size);\
    if(p==NULL && (size)!=0){\
268
        av_log(NULL, AV_LOG_ERROR, "Cannot allocate memory.");\
269 270 271 272
        goto fail;\
    }\
}

273 274 275 276 277 278 279 280 281 282 283 284 285 286
#ifndef HAVE_LLRINT
static av_always_inline long long llrint(double x)
{
    return rint(x);
}
#endif /* HAVE_LLRINT */

#ifndef HAVE_LRINT
static av_always_inline long int lrint(double x)
{
    return rint(x);
}
#endif /* HAVE_LRINT */

287
#ifndef HAVE_LRINTF
288
static av_always_inline long int lrintf(float x)
289 290 291 292 293
{
    return (int)(rint(x));
}
#endif /* HAVE_LRINTF */

294 295 296 297 298 299 300 301 302 303 304 305 306 307
#ifndef HAVE_ROUND
static av_always_inline double round(double x)
{
    return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5);
}
#endif /* HAVE_ROUND */

#ifndef HAVE_ROUNDF
static av_always_inline float roundf(float x)
{
    return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5);
}
#endif /* HAVE_ROUNDF */

308
#endif /* FFMPEG_INTERNAL_H */