common.h 11.3 KB
Newer Older
Michael Niedermayer's avatar
Michael Niedermayer committed
1 2 3 4 5
/**
 * @file common.h
 * common internal api header.
 */

Fabrice Bellard's avatar
Fabrice Bellard committed
6 7 8
#ifndef COMMON_H
#define COMMON_H

9
#if defined(WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)
10
#    define CONFIG_WIN32
Fabrice Bellard's avatar
Fabrice Bellard committed
11 12
#endif

13 14 15 16
#ifndef M_PI
#define M_PI    3.14159265358979323846
#endif

Fabrice Bellard's avatar
Fabrice Bellard committed
17
#ifdef HAVE_AV_CONFIG_H
Fabrice Bellard's avatar
Fabrice Bellard committed
18
/* only include the following when compiling package */
19 20 21 22 23
#    include "config.h"

#    include <stdlib.h>
#    include <stdio.h>
#    include <string.h>
24
#    include <ctype.h>
Michael Niedermayer's avatar
Michael Niedermayer committed
25
#    include <limits.h>
26 27 28 29 30 31 32 33 34 35
#    ifndef __BEOS__
#        include <errno.h>
#    else
#        include "berrno.h"
#    endif
#    include <math.h>

#    ifndef ENODATA
#        define ENODATA  61
#    endif
Fabrice Bellard's avatar
Fabrice Bellard committed
36

37 38 39 40 41 42 43
#include <stddef.h>
#ifndef offsetof
# define offsetof(T,F) ((unsigned int)((char *)&((T *)0)->F))
#endif

#define AVOPTION_CODEC_BOOL(name, help, field) \
    { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_BOOL }
Zdenek Kabelac's avatar
Zdenek Kabelac committed
44 45
#define AVOPTION_CODEC_DOUBLE(name, help, field, minv, maxv, defval) \
    { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_DOUBLE, minv, maxv, defval }
46 47 48 49 50 51 52 53
#define AVOPTION_CODEC_FLAG(name, help, field, flag, defval) \
    { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_FLAG, flag, 0, defval }
#define AVOPTION_CODEC_INT(name, help, field, minv, maxv, defval) \
    { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_INT, minv, maxv, defval }
#define AVOPTION_CODEC_STRING(name, help, field, str, val) \
    { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_STRING, .defval = val, .defstr = str }
#define AVOPTION_CODEC_RCOVERRIDE(name, help, field) \
    { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_RCOVERRIDE, .defval = 0, .defstr = NULL }
54
#define AVOPTION_SUB(ptr) { .name = NULL, .help = (const char*)ptr }
55 56
#define AVOPTION_END() AVOPTION_SUB(NULL)

57 58 59 60 61 62 63 64
struct AVOption;
#ifdef HAVE_MMX
extern const struct AVOption avoptions_common[3 + 5];
#else
extern const struct AVOption avoptions_common[3];
#endif
extern const struct AVOption avoptions_workaround_bug[11];

65
#endif /* HAVE_AV_CONFIG_H */
Fabrice Bellard's avatar
Fabrice Bellard committed
66

67 68
/* Suppress restrict if it was not defined in config.h.  */
#ifndef restrict
69
#    define restrict
70 71
#endif

Alex Beregszaszi's avatar
Alex Beregszaszi committed
72
#ifndef always_inline
73
#if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0)
74
#    define always_inline __attribute__((always_inline)) inline
75
#else
76
#    define always_inline inline
77
#endif
Alex Beregszaszi's avatar
Alex Beregszaszi committed
78
#endif
79

Alex Beregszaszi's avatar
Alex Beregszaszi committed
80
#ifndef attribute_used
81 82 83 84 85
#if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0)
#    define attribute_used __attribute__((used))
#else
#    define attribute_used
#endif
Alex Beregszaszi's avatar
Alex Beregszaszi committed
86
#endif
87

88
#ifndef EMULATE_INTTYPES
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
#   include <inttypes.h>
#else
    typedef signed char  int8_t;
    typedef signed short int16_t;
    typedef signed int   int32_t;
    typedef unsigned char  uint8_t;
    typedef unsigned short uint16_t;
    typedef unsigned int   uint32_t;

#   ifdef CONFIG_WIN32
        typedef signed __int64   int64_t;
        typedef unsigned __int64 uint64_t;
#   else /* other OS */
        typedef signed long long   int64_t;
        typedef unsigned long long uint64_t;
#   endif /* other OS */
#endif /* HAVE_INTTYPES_H */

107 108 109 110 111 112 113 114 115 116 117 118
#ifndef INT16_MIN
#define INT16_MIN       (-0x7fff-1)
#endif

#ifndef INT16_MAX
#define INT16_MAX       0x7fff
#endif

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

119
#ifndef INT64_MAX
120
#define INT64_MAX int64_t_C(9223372036854775807)
121 122
#endif

Michael Niedermayer's avatar
Michael Niedermayer committed
123 124 125 126
#ifndef UINT64_MAX
#define UINT64_MAX uint64_t_C(0xFFFFFFFFFFFFFFFF)
#endif

127 128 129 130 131 132 133 134 135 136
#ifdef EMULATE_FAST_INT
/* note that we don't emulate 64bit ints */
typedef signed char int_fast8_t;
typedef signed int  int_fast16_t;
typedef signed int  int_fast32_t;
typedef unsigned char uint_fast8_t;
typedef unsigned int  uint_fast16_t;
typedef unsigned int  uint_fast32_t;
#endif

Michael Niedermayer's avatar
Michael Niedermayer committed
137
#ifndef INT_BIT
Michael Niedermayer's avatar
Michael Niedermayer committed
138
#    if INT_MAX != 2147483647
Michael Niedermayer's avatar
Michael Niedermayer committed
139 140 141 142 143 144
#        define INT_BIT 64
#    else
#        define INT_BIT 32
#    endif
#endif

145 146 147 148 149 150
#if defined(CONFIG_OS2) || defined(CONFIG_SUNOS)
static inline float floorf(float f) { 
    return floor(f); 
}
#endif

Fabrice Bellard's avatar
Fabrice Bellard committed
151 152 153 154
#ifdef CONFIG_WIN32

/* windows */

155
#    if !defined(__MINGW32__) && !defined(__CYGWIN__)
156 157
#        define int64_t_C(c)     (c ## i64)
#        define uint64_t_C(c)    (c ## i64)
Fabrice Bellard's avatar
Fabrice Bellard committed
158

Michael Niedermayer's avatar
Michael Niedermayer committed
159 160 161
#    ifdef HAVE_AV_CONFIG_H
#            define inline __inline
#    endif
Fabrice Bellard's avatar
Fabrice Bellard committed
162

163
#    else
164 165
#        define int64_t_C(c)     (c ## LL)
#        define uint64_t_C(c)    (c ## ULL)
166
#    endif /* __MINGW32__ */
Fabrice Bellard's avatar
Fabrice Bellard committed
167

Michael Niedermayer's avatar
Michael Niedermayer committed
168 169 170 171
#    ifdef HAVE_AV_CONFIG_H
#        ifdef _DEBUG
#            define DEBUG
#        endif
Fabrice Bellard's avatar
Fabrice Bellard committed
172

Michael Niedermayer's avatar
Michael Niedermayer committed
173 174 175
#        define snprintf _snprintf
#        define vsnprintf _vsnprintf
#    endif
Fabrice Bellard's avatar
Fabrice Bellard committed
176

177 178 179 180
/* CONFIG_WIN32 end */
#elif defined (CONFIG_OS2)
/* OS/2 EMX */

181 182 183
#ifndef int64_t_C
#define int64_t_C(c)     (c ## LL)
#define uint64_t_C(c)    (c ## ULL)
184 185
#endif

186 187
#ifdef HAVE_AV_CONFIG_H

188 189 190 191 192 193 194 195 196 197
#ifdef USE_FASTMEMCPY
#include "fastmemcpy.h"
#endif

#include <float.h>

#endif /* HAVE_AV_CONFIG_H */

/* CONFIG_OS2 end */
#else
Fabrice Bellard's avatar
Fabrice Bellard committed
198 199 200

/* unix */

201 202 203 204 205 206
#ifndef int64_t_C
#define int64_t_C(c)     (c ## LL)
#define uint64_t_C(c)    (c ## ULL)
#endif

#ifdef HAVE_AV_CONFIG_H
Fabrice Bellard's avatar
Fabrice Bellard committed
207

208 209 210 211
#        ifdef USE_FASTMEMCPY
#            include "fastmemcpy.h"
#        endif
#    endif /* HAVE_AV_CONFIG_H */
Fabrice Bellard's avatar
Fabrice Bellard committed
212

213
#endif /* !CONFIG_WIN32 && !CONFIG_OS2 */
Fabrice Bellard's avatar
Fabrice Bellard committed
214 215 216

#ifdef HAVE_AV_CONFIG_H

217
#    include "bswap.h"
218

219
// Use rip-relative addressing if compiling PIC code on x86-64.
220
#    if defined(__MINGW32__) || defined(__CYGWIN__) || \
221
        defined(__OS2__) || (defined (__OpenBSD__) && !defined(__ELF__))
222 223 224 225 226
#        if defined(ARCH_X86_64) && defined(PIC)
#            define MANGLE(a) "_" #a"(%%rip)"
#        else
#            define MANGLE(a) "_" #a
#        endif
227
#    else
228 229 230 231 232
#        if defined(ARCH_X86_64) && defined(PIC)
#            define MANGLE(a) #a"(%%rip)"
#        else
#            define MANGLE(a) #a
#        endif
233
#    endif
Fabrice Bellard's avatar
Fabrice Bellard committed
234

Fabrice Bellard's avatar
Fabrice Bellard committed
235 236
/* debug stuff */

237 238 239 240
#    ifndef DEBUG
#        define NDEBUG
#    endif
#    include <assert.h>
Fabrice Bellard's avatar
Fabrice Bellard committed
241

Fabrice Bellard's avatar
Fabrice Bellard committed
242
/* dprintf macros */
243
#    if defined(CONFIG_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)
Fabrice Bellard's avatar
Fabrice Bellard committed
244 245 246

inline void dprintf(const char* fmt,...) {}

247
#    else
Fabrice Bellard's avatar
Fabrice Bellard committed
248

249
#        ifdef DEBUG
250
#            define dprintf(fmt,...) av_log(NULL, AV_LOG_DEBUG, fmt, __VA_ARGS__)
251
#        else
252
#            define dprintf(fmt,...)
253
#        endif
Fabrice Bellard's avatar
Fabrice Bellard committed
254

255
#    endif /* !CONFIG_WIN32 */
Fabrice Bellard's avatar
Fabrice Bellard committed
256

257
#    define av_abort()      do { av_log(NULL, AV_LOG_ERROR, "Abort at %s:%d\n", __FILE__, __LINE__); abort(); } while (0)
258

259
//rounded divison & shift
Michael Niedermayer's avatar
Michael Niedermayer committed
260
#define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b))
261 262
/* assume b>0 */
#define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b))
263
#define ABS(a) ((a) >= 0 ? (a) : (-(a)))
264

265 266
#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
267

268 269
extern const uint32_t inverse[256];

270
#if defined(ARCH_X86) || defined(ARCH_X86_64)
271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
#    define FASTDIV(a,b) \
    ({\
        int ret,dmy;\
        asm volatile(\
            "mull %3"\
            :"=d"(ret),"=a"(dmy)\
            :"1"(a),"g"(inverse[b])\
            );\
        ret;\
    })
#elif defined(CONFIG_FASTDIV)
#    define FASTDIV(a,b)   ((uint32_t)((((uint64_t)a)*inverse[b])>>32))
#else
#    define FASTDIV(a,b)   ((a)/(b))
#endif
 
Fabrice Bellard's avatar
Fabrice Bellard committed
287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311
/* define it to include statistics code (useful only for optimizing
   codec efficiency */
//#define STATS

#ifdef STATS

enum {
    ST_UNKNOWN,
    ST_DC,
    ST_INTRA_AC,
    ST_INTER_AC,
    ST_INTRA_MB,
    ST_INTER_MB,
    ST_MV,
    ST_NB,
};

extern int st_current_index;
extern unsigned int st_bit_counts[ST_NB];
extern unsigned int st_out_bit_counts[ST_NB];

void print_stats(void);
#endif

/* misc math functions */
Michael Niedermayer's avatar
Michael Niedermayer committed
312
extern const uint8_t ff_log2_tab[256];
Fabrice Bellard's avatar
Fabrice Bellard committed
313

314
static inline int av_log2(unsigned int v)
Fabrice Bellard's avatar
Fabrice Bellard committed
315 316 317 318 319 320 321 322 323 324 325 326
{
    int n;

    n = 0;
    if (v & 0xffff0000) {
        v >>= 16;
        n += 16;
    }
    if (v & 0xff00) {
        v >>= 8;
        n += 8;
    }
Michael Niedermayer's avatar
Michael Niedermayer committed
327 328 329 330 331 332 333 334 335 336 337 338 339
    n += ff_log2_tab[v];

    return n;
}

static inline int av_log2_16bit(unsigned int v)
{
    int n;

    n = 0;
    if (v & 0xff00) {
        v >>= 8;
        n += 8;
Fabrice Bellard's avatar
Fabrice Bellard committed
340
    }
Michael Niedermayer's avatar
Michael Niedermayer committed
341 342
    n += ff_log2_tab[v];

Fabrice Bellard's avatar
Fabrice Bellard committed
343 344 345
    return n;
}

346 347 348
/* median of 3 */
static inline int mid_pred(int a, int b, int c)
{
Michael Niedermayer's avatar
Michael Niedermayer committed
349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370
#if 0
    int t= (a-b)&((a-b)>>31);
    a-=t;
    b+=t;
    b-= (b-c)&((b-c)>>31);
    b+= (a-b)&((a-b)>>31);

    return b;
#else
    if(a>b){
        if(c>b){
            if(c>a) b=a;
            else    b=c;
        }
    }else{
        if(b>c){
            if(c>a) b=c;
            else    b=a;
        }
    }
    return b;
#endif
371 372
}

373 374 375 376 377 378 379 380 381 382
static inline int clip(int a, int amin, int amax)
{
    if (a < amin)
        return amin;
    else if (a > amax)
        return amax;
    else
        return a;
}

383 384 385 386 387 388
static inline int clip_uint8(int a)
{
    if (a&(~255)) return (-a)>>31;
    else          return a;
}

389
/* math */
Michael Niedermayer's avatar
Michael Niedermayer committed
390
extern const uint8_t ff_sqrt_tab[128];
Michael Niedermayer's avatar
Michael Niedermayer committed
391

392
int64_t ff_gcd(int64_t a, int64_t b);
393

Michael Niedermayer's avatar
Michael Niedermayer committed
394 395 396 397 398
static inline int ff_sqrt(int a)
{
    int ret=0;
    int s;
    int ret_sq=0;
Michael Niedermayer's avatar
Michael Niedermayer committed
399 400 401
    
    if(a<128) return ff_sqrt_tab[a];
    
Michael Niedermayer's avatar
Michael Niedermayer committed
402 403 404 405 406 407 408 409 410
    for(s=15; s>=0; s--){
        int b= ret_sq + (1<<(s*2)) + (ret<<s)*2;
        if(b<=a){
            ret_sq=b;
            ret+= 1<<s;
        }
    }
    return ret;
}
411 412 413 414

/**
 * converts fourcc string to int
 */
Zdenek Kabelac's avatar
Zdenek Kabelac committed
415
static inline int ff_get_fourcc(const char *s){
416
    assert( strlen(s)==4 );
Mike Melanson's avatar
Mike Melanson committed
417

418 419 420
    return (s[0]) + (s[1]<<8) + (s[2]<<16) + (s[3]<<24);
}

421 422 423 424
#define MKTAG(a,b,c,d) (a | (b << 8) | (c << 16) | (d << 24))
#define MKBETAG(a,b,c,d) (d | (c << 8) | (b << 16) | (a << 24))


425
#if defined(ARCH_X86) || defined(ARCH_X86_64)
426 427 428 429 430 431 432 433 434 435 436 437 438 439
#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


Michael Niedermayer's avatar
Michael Niedermayer committed
440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458
#if __CPU__ >= 686 && !defined(RUNTIME_CPUDETECT)
#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"\
    : "+r" (x), "+r" (a), "+r" (c)\
    : "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

459
#if defined(ARCH_X86) || defined(ARCH_X86_64)
460
static inline long long rdtsc(void)
461 462 463 464 465 466 467 468 469 470 471 472 473 474
{
	long long l;
	asm volatile(	"rdtsc\n\t"
		: "=A" (l)
	);
	return l;
}

#define START_TIMER \
uint64_t tend;\
uint64_t tstart= rdtsc();\

#define STOP_TIMER(id) \
tend= rdtsc();\
475 476 477 478 479 480 481 482 483 484 485 486
{\
  static uint64_t tsum=0;\
  static int tcount=0;\
  static int tskip_count=0;\
  if(tcount<2 || tend - tstart < 8*tsum/tcount){\
      tsum+= tend - tstart;\
      tcount++;\
  }else\
      tskip_count++;\
  if(256*256*256*64%(tcount+tskip_count)==0){\
      av_log(NULL, AV_LOG_DEBUG, "%Ld dezicycles in %s, %d runs, %d skips\n", tsum*10/tcount, id, tcount, tskip_count);\
  }\
487
}
488 489 490
#else
#define START_TIMER 
#define STOP_TIMER(id) {}
491 492
#endif

493 494
#define CLAMP_TO_8BIT(d) ((d > 0xff) ? 0xff : (d < 0) ? 0 : d)

495 496 497 498
/* avoid usage of various functions */
#define malloc please_use_av_malloc
#define free please_use_av_free
#define realloc please_use_av_realloc
499 500 501
#define time time_is_forbidden_due_to_security_issues
#define rand rand_is_forbidden_due_to_state_trashing
#define srand srand_is_forbidden_due_to_state_trashing
Michael Niedermayer's avatar
Michael Niedermayer committed
502
#define sprintf sprintf_is_forbidden_due_to_security_issues_use_snprintf
503 504 505 506
#if !(defined(LIBAVFORMAT_BUILD) || defined(_FRAMEHOOK_H))
#define printf please_use_av_log
#define fprintf please_use_av_log
#endif
507

508 509 510
#define CHECKED_ALLOCZ(p, size)\
{\
    p= av_mallocz(size);\
511
    if(p==NULL && (size)!=0){\
512 513 514 515 516
        perror("malloc");\
        goto fail;\
    }\
}

517 518 519
#endif /* HAVE_AV_CONFIG_H */

#endif /* COMMON_H */