common.h 27.4 KB
Newer Older
M
Michael Niedermayer 已提交
1 2 3 4 5
/**
 * @file common.h
 * common internal api header.
 */

F
Fabrice Bellard 已提交
6 7 8
#ifndef COMMON_H
#define COMMON_H

9
#if defined(WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)
10
#    define CONFIG_WIN32
F
Fabrice Bellard 已提交
11 12
#endif

13
//#define ALT_BITSTREAM_WRITER
14
//#define ALIGNED_BITSTREAM_WRITER
15

16 17 18
#define ALT_BITSTREAM_READER
//#define LIBMPEG2_BITSTREAM_READER
//#define A32_BITSTREAM_READER
19
#define LIBMPEG2_BITSTREAM_READER_HACK //add BERO
20

F
Fabrice Bellard 已提交
21
#ifdef HAVE_AV_CONFIG_H
F
Fabrice Bellard 已提交
22
/* only include the following when compiling package */
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
#    include "config.h"

#    include <stdlib.h>
#    include <stdio.h>
#    include <string.h>
#    ifndef __BEOS__
#        include <errno.h>
#    else
#        include "berrno.h"
#    endif
#    include <math.h>

#    ifndef ENODATA
#        define ENODATA  61
#    endif
F
Fabrice Bellard 已提交
38

F
Fabrice Bellard 已提交
39 40 41 42
#ifndef M_PI
#define M_PI    3.14159265358979323846
#endif

43 44 45 46 47 48 49
#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 }
Z
Zdenek Kabelac 已提交
50 51
#define AVOPTION_CODEC_DOUBLE(name, help, field, minv, maxv, defval) \
    { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_DOUBLE, minv, maxv, defval }
52 53 54 55 56 57 58 59
#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 }
Z
Zdenek Kabelac 已提交
60
#define AVOPTION_SUB(ptr) { .name = NULL, .help = (const char*)ptr }
61 62
#define AVOPTION_END() AVOPTION_SUB(NULL)

63 64 65 66 67 68 69 70
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];

71
#endif /* HAVE_AV_CONFIG_H */
F
Fabrice Bellard 已提交
72

73 74
/* Suppress restrict if it was not defined in config.h.  */
#ifndef restrict
75
#    define restrict
76 77
#endif

F
Falk Hüffner 已提交
78
#if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0)
79
#    define always_inline __attribute__((always_inline)) inline
F
Falk Hüffner 已提交
80
#else
81
#    define always_inline inline
F
Falk Hüffner 已提交
82 83
#endif

F
Fabrice Bellard 已提交
84 85 86 87
#ifdef CONFIG_WIN32

/* windows */

88 89 90 91 92 93 94 95
typedef unsigned short uint16_t;
typedef signed short int16_t;
typedef unsigned char uint8_t;
typedef unsigned int uint32_t;
typedef unsigned __int64 uint64_t;
typedef signed char int8_t;
typedef signed int int32_t;
typedef signed __int64 int64_t;
F
Fabrice Bellard 已提交
96

97
#    ifndef __MINGW32__
98 99
#        define int64_t_C(c)     (c ## i64)
#        define uint64_t_C(c)    (c ## i64)
F
Fabrice Bellard 已提交
100

101
#        define inline __inline
F
Fabrice Bellard 已提交
102

103
#    else
104 105
#        define int64_t_C(c)     (c ## LL)
#        define uint64_t_C(c)    (c ## ULL)
106
#    endif /* __MINGW32__ */
F
Fabrice Bellard 已提交
107

108 109 110
#    ifdef _DEBUG
#        define DEBUG
#    endif
F
Fabrice Bellard 已提交
111

112
#    define snprintf _snprintf
F
Fabrice Bellard 已提交
113
#    define vsnprintf _vsnprintf
F
Fabrice Bellard 已提交
114

115 116 117 118 119 120 121 122
/* CONFIG_WIN32 end */
#elif defined (CONFIG_OS2)
/* OS/2 EMX */

#include <inttypes.h>

#ifdef HAVE_AV_CONFIG_H

123 124 125
#ifndef int64_t_C
#define int64_t_C(c)     (c ## LL)
#define uint64_t_C(c)    (c ## ULL)
126 127 128 129 130 131 132 133 134 135 136 137
#endif

#ifdef USE_FASTMEMCPY
#include "fastmemcpy.h"
#endif

#include <float.h>

#endif /* HAVE_AV_CONFIG_H */

/* CONFIG_OS2 end */
#else
F
Fabrice Bellard 已提交
138 139 140

/* unix */

141
#    include <inttypes.h>
F
Fabrice Bellard 已提交
142

143
#    ifdef HAVE_AV_CONFIG_H
144 145 146
#        ifndef int64_t_C
#            define int64_t_C(c)     (c ## LL)
#            define uint64_t_C(c)    (c ## ULL)
147
#        endif
F
Fabrice Bellard 已提交
148

149 150 151 152
#        ifdef USE_FASTMEMCPY
#            include "fastmemcpy.h"
#        endif
#    endif /* HAVE_AV_CONFIG_H */
F
Fabrice Bellard 已提交
153

154
#endif /* !CONFIG_WIN32 && !CONFIG_OS2 */
F
Fabrice Bellard 已提交
155 156 157

#ifdef HAVE_AV_CONFIG_H

158
#    include "bswap.h"
159

160
#    if defined(__MINGW32__) || defined(__CYGWIN__) || \
161
        defined(__OS2__) || (defined (__OpenBSD__) && !defined(__ELF__))
162 163 164 165
#        define MANGLE(a) "_" #a
#    else
#        define MANGLE(a) #a
#    endif
F
Fabrice Bellard 已提交
166

F
Fabrice Bellard 已提交
167 168
/* debug stuff */

169 170 171 172
#    ifndef DEBUG
#        define NDEBUG
#    endif
#    include <assert.h>
F
Fabrice Bellard 已提交
173

F
Fabrice Bellard 已提交
174
/* dprintf macros */
175
#    if defined(CONFIG_WIN32) && !defined(__MINGW32__)
F
Fabrice Bellard 已提交
176 177 178

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

179
#    else
F
Fabrice Bellard 已提交
180

181 182 183 184 185
#        ifdef DEBUG
#            define dprintf(fmt,args...) printf(fmt, ## args)
#        else
#            define dprintf(fmt,args...)
#        endif
F
Fabrice Bellard 已提交
186

187
#    endif /* !CONFIG_WIN32 */
F
Fabrice Bellard 已提交
188

189
#    define av_abort()      do { fprintf(stderr, "Abort at %s:%d\n", __FILE__, __LINE__); abort(); } while (0)
190

191 192
//rounded divison & shift
#define RSHIFT(a,b) ((a) > 0 ? ((a) + (1<<((b)-1)))>>(b) : ((a) + (1<<((b)-1))-1)>>(b))
193 194
/* assume b>0 */
#define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b))
M
Michael Niedermayer 已提交
195
#define ABS(a) ((a) >= 0 ? (a) : (-(a)))
196

M
Michael Niedermayer 已提交
197 198
#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
199

200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
extern const uint32_t inverse[256];

#ifdef ARCH_X86
#    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
 
219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
#ifdef ARCH_X86
// avoid +32 for shift optimization (gcc should do that ...)
static inline  int32_t NEG_SSR32( int32_t a, int8_t s){
    asm ("sarl %1, %0\n\t"
         : "+r" (a)
         : "ic" ((uint8_t)(-s))
    );
    return a;
}
static inline uint32_t NEG_USR32(uint32_t a, int8_t s){
    asm ("shrl %1, %0\n\t"
         : "+r" (a)
         : "ic" ((uint8_t)(-s))
    );
    return a;
}
235
#else
236 237
#    define NEG_SSR32(a,s) ((( int32_t)(a))>>(32-(s)))
#    define NEG_USR32(a,s) (((uint32_t)(a))>>(32-(s)))
238 239
#endif

F
Fabrice Bellard 已提交
240 241 242 243
/* bit output */

struct PutBitContext;

244
typedef void (*WriteDataFunc)(void *, uint8_t *, int);
F
Fabrice Bellard 已提交
245 246

typedef struct PutBitContext {
247
#ifdef ALT_BITSTREAM_WRITER
248
    uint8_t *buf, *buf_end;
249 250
    int index;
#else
251
    uint32_t bit_buf;
252
    int bit_left;
253
    uint8_t *buf, *buf_ptr, *buf_end;
254
#endif
255
    int64_t data_out_size; /* in bytes */
F
Fabrice Bellard 已提交
256 257 258
} PutBitContext;

void init_put_bits(PutBitContext *s, 
259
                   uint8_t *buffer, int buffer_size,
F
Fabrice Bellard 已提交
260
                   void *opaque,
261
                   void (*write_data)(void *, uint8_t *, int));
262

263
int64_t get_bit_count(PutBitContext *s); /* XXX: change function name */
F
Fabrice Bellard 已提交
264 265
void align_put_bits(PutBitContext *s);
void flush_put_bits(PutBitContext *s);
266
void put_string(PutBitContext * pbc, char *s);
F
Fabrice Bellard 已提交
267 268 269 270

/* bit input */

typedef struct GetBitContext {
271
    const uint8_t *buffer, *buffer_end;
272 273
#ifdef ALT_BITSTREAM_READER
    int index;
274
#elif defined LIBMPEG2_BITSTREAM_READER
275 276
    uint8_t *buffer_ptr;
    uint32_t cache;
277 278
    int bit_count;
#elif defined A32_BITSTREAM_READER
279 280 281
    uint32_t *buffer_ptr;
    uint32_t cache0;
    uint32_t cache1;
282
    int bit_count;
283
#endif
284
    int size_in_bits;
F
Fabrice Bellard 已提交
285 286
} GetBitContext;

287 288
static inline int get_bits_count(GetBitContext *s);

289
#define VLC_TYPE int16_t
290

F
Fabrice Bellard 已提交
291 292
typedef struct VLC {
    int bits;
293
    VLC_TYPE (*table)[2]; ///< code, bits
F
Fabrice Bellard 已提交
294 295 296
    int table_size, table_allocated;
} VLC;

297 298 299 300 301 302
typedef struct RL_VLC_ELEM {
    int16_t level;
    int8_t len;
    uint8_t run;
} RL_VLC_ELEM;

303 304 305 306
#ifdef ARCH_SPARC64
#define UNALIGNED_STORES_ARE_BAD
#endif

307 308
/* used to avoid missaligned exceptions on some archs (alpha, ...) */
#ifdef ARCH_X86
309
#    define unaligned32(a) (*(uint32_t*)(a))
310
#else
311
#    ifdef __GNUC__
312 313 314 315 316 317 318
static inline uint32_t unaligned32(const void *v) {
    struct Unaligned {
	uint32_t i;
    } __attribute__((packed));

    return ((const struct Unaligned *) v)->i;
}
319
#    elif defined(__DECC)
320 321 322
static inline uint32_t unaligned32(const void *v) {
    return *(const __unaligned uint32_t *) v;
}
323
#    else
324 325 326
static inline uint32_t unaligned32(const void *v) {
    return *(const uint32_t *) v;
}
327
#    endif
328 329
#endif //!ARCH_X86

330 331 332 333 334 335 336 337 338 339 340
#ifndef ALT_BITSTREAM_WRITER
static inline void put_bits(PutBitContext *s, int n, unsigned int value)
{
    unsigned int bit_buf;
    int bit_left;

#ifdef STATS
    st_out_bit_counts[st_current_index] += n;
#endif
    //    printf("put_bits=%d %x\n", n, value);
    assert(n == 32 || value < (1U << n));
341
    
342 343 344 345 346 347 348 349 350 351 352
    bit_buf = s->bit_buf;
    bit_left = s->bit_left;

    //    printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf);
    /* XXX: optimize */
    if (n < bit_left) {
        bit_buf = (bit_buf<<n) | value;
        bit_left-=n;
    } else {
	bit_buf<<=bit_left;
        bit_buf |= value >> (n - bit_left);
353 354 355 356 357 358 359 360
#ifdef UNALIGNED_STORES_ARE_BAD
        if (3 & (int) s->buf_ptr) {
            s->buf_ptr[0] = bit_buf >> 24;
            s->buf_ptr[1] = bit_buf >> 16;
            s->buf_ptr[2] = bit_buf >>  8;
            s->buf_ptr[3] = bit_buf      ;
        } else
#endif
361
        *(uint32_t *)s->buf_ptr = be2me_32(bit_buf);
362 363 364 365 366 367 368 369 370 371 372 373
        //printf("bitbuf = %08x\n", bit_buf);
        s->buf_ptr+=4;
	bit_left+=32 - n;
        bit_buf = value;
    }

    s->bit_buf = bit_buf;
    s->bit_left = bit_left;
}
#endif


374
#ifdef ALT_BITSTREAM_WRITER
375
static inline void put_bits(PutBitContext *s, int n, unsigned int value)
376
{
377 378
#    ifdef ALIGNED_BITSTREAM_WRITER
#        ifdef ARCH_X86
379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395
    asm volatile(
	"movl %0, %%ecx			\n\t"
	"xorl %%eax, %%eax		\n\t"
	"shrdl %%cl, %1, %%eax		\n\t"
	"shrl %%cl, %1			\n\t"
	"movl %0, %%ecx			\n\t"
	"shrl $3, %%ecx			\n\t"
	"andl $0xFFFFFFFC, %%ecx	\n\t"
	"bswapl %1			\n\t"
	"orl %1, (%2, %%ecx)		\n\t"
	"bswapl %%eax			\n\t"
	"addl %3, %0			\n\t"
	"movl %%eax, 4(%2, %%ecx)	\n\t"
	: "=&r" (s->index), "=&r" (value)
	: "r" (s->buf), "r" (n), "0" (s->index), "1" (value<<(-n))
	: "%eax", "%ecx"
    );
396
#        else
397 398 399 400 401 402 403 404 405 406
    int index= s->index;
    uint32_t *ptr= ((uint32_t *)s->buf)+(index>>5);
    
    value<<= 32-n; 
    
    ptr[0] |= be2me_32(value>>(index&31));
    ptr[1]  = be2me_32(value<<(32-(index&31)));
//if(n>24) printf("%d %d\n", n, value);
    index+= n;
    s->index= index;
407 408 409
#        endif
#    else //ALIGNED_BITSTREAM_WRITER
#        ifdef ARCH_X86
410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425
    asm volatile(
	"movl $7, %%ecx			\n\t"
	"andl %0, %%ecx			\n\t"
	"addl %3, %%ecx			\n\t"
	"negl %%ecx			\n\t"
	"shll %%cl, %1			\n\t"
	"bswapl %1			\n\t"
	"movl %0, %%ecx			\n\t"
	"shrl $3, %%ecx			\n\t"
	"orl %1, (%%ecx, %2)		\n\t"
	"addl %3, %0			\n\t"
	"movl $0, 4(%%ecx, %2)		\n\t"
	: "=&r" (s->index), "=&r" (value)
	: "r" (s->buf), "r" (n), "0" (s->index), "1" (value)
	: "%ecx"
    );
426
#        else
427 428 429 430 431 432 433 434
    int index= s->index;
    uint32_t *ptr= (uint32_t*)(((uint8_t *)s->buf)+(index>>3));
    
    ptr[0] |= be2me_32(value<<(32-n-(index&7) ));
    ptr[1] = 0;
//if(n>24) printf("%d %d\n", n, value);
    index+= n;
    s->index= index;
435 436
#        endif
#    endif //!ALIGNED_BITSTREAM_WRITER
437 438 439 440 441 442 443 444 445 446 447 448 449
}
#endif


static inline uint8_t* pbBufPtr(PutBitContext *s)
{
#ifdef ALT_BITSTREAM_WRITER
	return s->buf + (s->index>>3);
#else
	return s->buf_ptr;
#endif
}

450 451 452
/* Bitstream reader API docs:
name
    abritary name which is used as prefix for the internal variables
F
Fabrice Bellard 已提交
453

454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493
gb
    getbitcontext

OPEN_READER(name, gb)
    loads gb into local variables

CLOSE_READER(name, gb)
    stores local vars in gb

UPDATE_CACHE(name, gb)
    refills the internal cache from the bitstream
    after this call at least MIN_CACHE_BITS will be available,

GET_CACHE(name, gb)
    will output the contents of the internal cache, next bit is MSB of 32 or 64 bit (FIXME 64bit)

SHOW_UBITS(name, gb, num)
    will return the nest num bits

SHOW_SBITS(name, gb, num)
    will return the nest num bits and do sign extension

SKIP_BITS(name, gb, num)
    will skip over the next num bits
    note, this is equinvalent to SKIP_CACHE; SKIP_COUNTER

SKIP_CACHE(name, gb, num)
    will remove the next num bits from the cache (note SKIP_COUNTER MUST be called before UPDATE_CACHE / CLOSE_READER)

SKIP_COUNTER(name, gb, num)
    will increment the internal bit counter (see SKIP_CACHE & SKIP_BITS)

LAST_SKIP_CACHE(name, gb, num)
    will remove the next num bits from the cache if it is needed for UPDATE_CACHE otherwise it will do nothing

LAST_SKIP_BITS(name, gb, num)
    is equinvalent to SKIP_LAST_CACHE; SKIP_COUNTER

for examples see get_bits, show_bits, skip_bits, get_vlc
*/
494

495 496 497 498 499 500 501 502 503 504
static inline int unaligned32_be(const void *v)
{
#ifdef CONFIG_ALIGN
	const uint8_t *p=v;
	return (((p[0]<<8) | p[1])<<16) | (p[2]<<8) | (p[3]);
#else
	return be2me_32( unaligned32(v)); //original
#endif
}

505
#ifdef ALT_BITSTREAM_READER
506
#   define MIN_CACHE_BITS 25
507

508 509 510 511 512 513 514 515
#   define OPEN_READER(name, gb)\
        int name##_index= (gb)->index;\
        int name##_cache= 0;\

#   define CLOSE_READER(name, gb)\
        (gb)->index= name##_index;\

#   define UPDATE_CACHE(name, gb)\
516
        name##_cache= unaligned32_be( ((uint8_t *)(gb)->buffer)+(name##_index>>3) ) << (name##_index&0x07);\
517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534

#   define SKIP_CACHE(name, gb, num)\
        name##_cache <<= (num);\

// FIXME name?
#   define SKIP_COUNTER(name, gb, num)\
        name##_index += (num);\

#   define SKIP_BITS(name, gb, num)\
        {\
            SKIP_CACHE(name, gb, num)\
            SKIP_COUNTER(name, gb, num)\
        }\

#   define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num)
#   define LAST_SKIP_CACHE(name, gb, num) ;

#   define SHOW_UBITS(name, gb, num)\
535
        NEG_USR32(name##_cache, num)
536 537

#   define SHOW_SBITS(name, gb, num)\
538
        NEG_SSR32(name##_cache, num)
539 540 541 542 543 544

#   define GET_CACHE(name, gb)\
        ((uint32_t)name##_cache)

static inline int get_bits_count(GetBitContext *s){
    return s->index;
545
}
546 547 548
#elif defined LIBMPEG2_BITSTREAM_READER
//libmpeg2 like reader

549
#   define MIN_CACHE_BITS 17
550 551 552 553 554 555 556 557 558 559 560

#   define OPEN_READER(name, gb)\
        int name##_bit_count=(gb)->bit_count;\
        int name##_cache= (gb)->cache;\
        uint8_t * name##_buffer_ptr=(gb)->buffer_ptr;\

#   define CLOSE_READER(name, gb)\
        (gb)->bit_count= name##_bit_count;\
        (gb)->cache= name##_cache;\
        (gb)->buffer_ptr= name##_buffer_ptr;\

561 562 563 564
#ifdef LIBMPEG2_BITSTREAM_READER_HACK

#   define UPDATE_CACHE(name, gb)\
    if(name##_bit_count >= 0){\
565 566
        name##_cache+= (int)be2me_16(*(uint16_t*)name##_buffer_ptr) << name##_bit_count;\
        ((uint16_t*)name##_buffer_ptr)++;\
567 568 569 570 571
        name##_bit_count-= 16;\
    }\

#else

572
#   define UPDATE_CACHE(name, gb)\
573
    if(name##_bit_count >= 0){\
574 575 576 577
        name##_cache+= ((name##_buffer_ptr[0]<<8) + name##_buffer_ptr[1]) << name##_bit_count;\
        name##_buffer_ptr+=2;\
        name##_bit_count-= 16;\
    }\
578

579 580
#endif

581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596
#   define SKIP_CACHE(name, gb, num)\
        name##_cache <<= (num);\

#   define SKIP_COUNTER(name, gb, num)\
        name##_bit_count += (num);\

#   define SKIP_BITS(name, gb, num)\
        {\
            SKIP_CACHE(name, gb, num)\
            SKIP_COUNTER(name, gb, num)\
        }\

#   define LAST_SKIP_BITS(name, gb, num) SKIP_BITS(name, gb, num)
#   define LAST_SKIP_CACHE(name, gb, num) SKIP_CACHE(name, gb, num)

#   define SHOW_UBITS(name, gb, num)\
597
        NEG_USR32(name##_cache, num)
598 599

#   define SHOW_SBITS(name, gb, num)\
600
        NEG_SSR32(name##_cache, num)
601 602 603 604 605 606

#   define GET_CACHE(name, gb)\
        ((uint32_t)name##_cache)

static inline int get_bits_count(GetBitContext *s){
    return (s->buffer_ptr - s->buffer)*8 - 16 + s->bit_count;
607 608
}

609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627
#elif defined A32_BITSTREAM_READER

#   define MIN_CACHE_BITS 32

#   define OPEN_READER(name, gb)\
        int name##_bit_count=(gb)->bit_count;\
        uint32_t name##_cache0= (gb)->cache0;\
        uint32_t name##_cache1= (gb)->cache1;\
        uint32_t * name##_buffer_ptr=(gb)->buffer_ptr;\

#   define CLOSE_READER(name, gb)\
        (gb)->bit_count= name##_bit_count;\
        (gb)->cache0= name##_cache0;\
        (gb)->cache1= name##_cache1;\
        (gb)->buffer_ptr= name##_buffer_ptr;\

#   define UPDATE_CACHE(name, gb)\
    if(name##_bit_count > 0){\
        const uint32_t next= be2me_32( *name##_buffer_ptr );\
628
        name##_cache0 |= NEG_USR32(next,name##_bit_count);\
629 630 631 632 633
        name##_cache1 |= next<<name##_bit_count;\
        name##_buffer_ptr++;\
        name##_bit_count-= 32;\
    }\

634
#ifdef ARCH_X86
635 636 637 638 639 640 641
#   define SKIP_CACHE(name, gb, num)\
        asm(\
            "shldl %2, %1, %0		\n\t"\
            "shll %2, %1		\n\t"\
            : "+r" (name##_cache0), "+r" (name##_cache1)\
            : "Ic" ((uint8_t)num)\
           );
642
#else
643 644
#   define SKIP_CACHE(name, gb, num)\
        name##_cache0 <<= (num);\
645
        name##_cache0 |= NEG_USR32(name##_cache1,num);\
646
        name##_cache1 <<= (num);
647
#endif
648

649 650 651 652 653 654 655 656 657 658 659 660 661
#   define SKIP_COUNTER(name, gb, num)\
        name##_bit_count += (num);\

#   define SKIP_BITS(name, gb, num)\
        {\
            SKIP_CACHE(name, gb, num)\
            SKIP_COUNTER(name, gb, num)\
        }\

#   define LAST_SKIP_BITS(name, gb, num) SKIP_BITS(name, gb, num)
#   define LAST_SKIP_CACHE(name, gb, num) SKIP_CACHE(name, gb, num)

#   define SHOW_UBITS(name, gb, num)\
662
        NEG_USR32(name##_cache0, num)
663 664

#   define SHOW_SBITS(name, gb, num)\
665
        NEG_SSR32(name##_cache0, num)
666 667 668 669 670 671

#   define GET_CACHE(name, gb)\
        (name##_cache0)

static inline int get_bits_count(GetBitContext *s){
    return ((uint8_t*)s->buffer_ptr - s->buffer)*8 - 32 + s->bit_count;
672 673
}

674 675
#endif

676 677 678 679 680 681
/**
 * read mpeg1 dc style vlc (sign bit + mantisse with no MSB).
 * if MSB not set it is negative 
 * @param n length in bits
 * @author BERO  
 */
682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709
static inline int get_xbits(GetBitContext *s, int n){
    register int tmp;
    register int32_t cache;
    OPEN_READER(re, s)
    UPDATE_CACHE(re, s)
    cache = GET_CACHE(re,s);
    if ((int32_t)cache<0) { //MSB=1
        tmp = NEG_USR32(cache,n);
    } else {
    //   tmp = (-1<<n) | NEG_USR32(cache,n) + 1; mpeg12.c algo
    //   tmp = - (NEG_USR32(cache,n) ^ ((1 << n) - 1)); h263.c algo
        tmp = - NEG_USR32(~cache,n);
    }
    LAST_SKIP_BITS(re, s, n)
    CLOSE_READER(re, s)
    return tmp;
}

static inline int get_sbits(GetBitContext *s, int n){
    register int tmp;
    OPEN_READER(re, s)
    UPDATE_CACHE(re, s)
    tmp= SHOW_SBITS(re, s, n);
    LAST_SKIP_BITS(re, s, n)
    CLOSE_READER(re, s)
    return tmp;
}

710 711 712 713
/**
 * reads 0-17 bits.
 * Note, the alt bitstream reader can read upto 25 bits, but the libmpeg2 reader cant
 */
714 715 716 717 718 719 720 721 722
static inline unsigned int get_bits(GetBitContext *s, int n){
    register int tmp;
    OPEN_READER(re, s)
    UPDATE_CACHE(re, s)
    tmp= SHOW_UBITS(re, s, n);
    LAST_SKIP_BITS(re, s, n)
    CLOSE_READER(re, s)
    return tmp;
}
723

724 725 726 727 728 729
unsigned int get_bits_long(GetBitContext *s, int n);

/**
 * shows 0-17 bits.
 * Note, the alt bitstream reader can read upto 25 bits, but the libmpeg2 reader cant
 */
730 731 732 733 734 735 736
static inline unsigned int show_bits(GetBitContext *s, int n){
    register int tmp;
    OPEN_READER(re, s)
    UPDATE_CACHE(re, s)
    tmp= SHOW_UBITS(re, s, n);
//    CLOSE_READER(re, s)
    return tmp;
737 738
}

739 740
unsigned int show_bits_long(GetBitContext *s, int n);

741
static inline void skip_bits(GetBitContext *s, int n){
742 743 744 745 746 747 748 749
 //Note gcc seems to optimize this to s->index+=n for the ALT_READER :))
    OPEN_READER(re, s)
    UPDATE_CACHE(re, s)
    LAST_SKIP_BITS(re, s, n)
    CLOSE_READER(re, s)
}

static inline unsigned int get_bits1(GetBitContext *s){
750
#ifdef ALT_BITSTREAM_READER
751 752 753 754 755 756
    int index= s->index;
    uint8_t result= s->buffer[ index>>3 ];
    result<<= (index&0x07);
    result>>= 8 - 1;
    index++;
    s->index= index;
757

758
    return result;
759
#else
760
    return get_bits(s, 1);
761
#endif
762 763
}

764 765
static inline unsigned int show_bits1(GetBitContext *s){
    return show_bits(s, 1);
766 767
}

768 769
static inline void skip_bits1(GetBitContext *s){
    skip_bits(s, 1);
F
Fabrice Bellard 已提交
770
}
771

772
void init_get_bits(GetBitContext *s,
773
                   const uint8_t *buffer, int buffer_size);
774

775
int check_marker(GetBitContext *s, const char *msg);
F
Fabrice Bellard 已提交
776 777 778 779 780 781
void align_get_bits(GetBitContext *s);
int init_vlc(VLC *vlc, int nb_bits, int nb_codes,
             const void *bits, int bits_wrap, int bits_size,
             const void *codes, int codes_wrap, int codes_size);
void free_vlc(VLC *vlc);

782 783 784 785 786 787
/**
 *
 * if the vlc code is invalid and max_depth=1 than no bits will be removed
 * if the vlc code is invalid and max_depth>1 than the number of bits removed
 * is undefined
 */
M
Michael Niedermayer 已提交
788 789 790 791 792 793 794 795 796 797 798 799 800 801
#define GET_VLC(code, name, gb, table, bits, max_depth)\
{\
    int n, index, nb_bits;\
\
    index= SHOW_UBITS(name, gb, bits);\
    code = table[index][0];\
    n    = table[index][1];\
\
    if(max_depth > 1 && n < 0){\
        LAST_SKIP_BITS(name, gb, bits)\
        UPDATE_CACHE(name, gb)\
\
        nb_bits = -n;\
\
802
        index= SHOW_UBITS(name, gb, nb_bits) + code;\
M
Michael Niedermayer 已提交
803 804 805 806 807 808 809 810
        code = table[index][0];\
        n    = table[index][1];\
        if(max_depth > 2 && n < 0){\
            LAST_SKIP_BITS(name, gb, nb_bits)\
            UPDATE_CACHE(name, gb)\
\
            nb_bits = -n;\
\
811
            index= SHOW_UBITS(name, gb, nb_bits) + code;\
M
Michael Niedermayer 已提交
812 813 814 815 816 817 818
            code = table[index][0];\
            n    = table[index][1];\
        }\
    }\
    SKIP_BITS(name, gb, n)\
}

819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840
#define GET_RL_VLC(level, run, name, gb, table, bits, max_depth)\
{\
    int n, index, nb_bits;\
\
    index= SHOW_UBITS(name, gb, bits);\
    level = table[index].level;\
    n     = table[index].len;\
\
    if(max_depth > 1 && n < 0){\
        LAST_SKIP_BITS(name, gb, bits)\
        UPDATE_CACHE(name, gb)\
\
        nb_bits = -n;\
\
        index= SHOW_UBITS(name, gb, nb_bits) + level;\
        level = table[index].level;\
        n     = table[index].len;\
    }\
    run= table[index].run;\
    SKIP_BITS(name, gb, n)\
}

M
Michael Niedermayer 已提交
841
// deprecated, dont use get_vlc for new code, use get_vlc2 instead or use GET_VLC directly
842 843
static inline int get_vlc(GetBitContext *s, VLC *vlc)
{
M
Michael Niedermayer 已提交
844 845 846
    int code;
    VLC_TYPE (*table)[2]= vlc->table;
    
847 848
    OPEN_READER(re, s)
    UPDATE_CACHE(re, s)
849

M
Michael Niedermayer 已提交
850
    GET_VLC(code, re, s, table, vlc->bits, 3)    
851

M
Michael Niedermayer 已提交
852 853 854 855
    CLOSE_READER(re, s)
    return code;
}

M
Michael Niedermayer 已提交
856 857 858 859 860 861 862 863
/**
 * parses a vlc code, faster then get_vlc()
 * @param bits is the number of bits which will be read at once, must be 
 *             identical to nb_bits in init_vlc()
 * @param max_depth is the number of times bits bits must be readed to completly
 *                  read the longest vlc code 
 *                  = (max_vlc_length + bits - 1) / bits
 */
F
Falk Hüffner 已提交
864 865
static always_inline int get_vlc2(GetBitContext *s, VLC_TYPE (*table)[2],
                                  int bits, int max_depth)
M
Michael Niedermayer 已提交
866 867 868 869 870 871 872 873
{
    int code;
    
    OPEN_READER(re, s)
    UPDATE_CACHE(re, s)

    GET_VLC(code, re, s, table, bits, max_depth)

874
    CLOSE_READER(re, s)
875 876 877
    return code;
}

M
Michael Niedermayer 已提交
878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910
//#define TRACE

#ifdef TRACE

static inline void print_bin(int bits, int n){
    int i;
    
    for(i=n-1; i>=0; i--){
        printf("%d", (bits>>i)&1);
    }
    for(i=n; i<24; i++)
        printf(" ");
}

static inline int get_bits_trace(GetBitContext *s, int n, char *file, char *func, int line){
    int r= get_bits(s, n);
    
    print_bin(r, n);
    printf("%5d %2d %3d bit @%5d in %s %s:%d\n", r, n, r, get_bits_count(s)-n, file, func, line);
    return r;
}
static inline int get_vlc_trace(GetBitContext *s, VLC_TYPE (*table)[2], int bits, int max_depth, char *file, char *func, int line){
    int show= show_bits(s, 24);
    int pos= get_bits_count(s);
    int r= get_vlc2(s, table, bits, max_depth);
    int len= get_bits_count(s) - pos;
    int bits2= show>>(24-len);
    
    print_bin(bits2, len);
    
    printf("%5d %2d %3d vlc @%5d in %s %s:%d\n", bits2, len, r, pos, file, func, line);
    return r;
}
M
Michael Niedermayer 已提交
911 912 913 914 915 916 917 918
static inline int get_xbits_trace(GetBitContext *s, int n, char *file, char *func, int line){
    int show= show_bits(s, n);
    int r= get_xbits(s, n);
    
    print_bin(show, n);
    printf("%5d %2d %3d xbt @%5d in %s %s:%d\n", show, n, r, get_bits_count(s)-n, file, func, line);
    return r;
}
M
Michael Niedermayer 已提交
919 920 921

#define get_bits(s, n)  get_bits_trace(s, n, __FILE__, __PRETTY_FUNCTION__, __LINE__)
#define get_bits1(s)    get_bits_trace(s, 1, __FILE__, __PRETTY_FUNCTION__, __LINE__)
M
Michael Niedermayer 已提交
922
#define get_xbits(s, n) get_xbits_trace(s, n, __FILE__, __PRETTY_FUNCTION__, __LINE__)
M
10l  
Michael Niedermayer 已提交
923
#define get_vlc(s, vlc)            get_vlc_trace(s, (vlc)->table, (vlc)->bits, 3, __FILE__, __PRETTY_FUNCTION__, __LINE__)
M
Michael Niedermayer 已提交
924 925
#define get_vlc2(s, tab, bits, max) get_vlc_trace(s, tab, bits, max, __FILE__, __PRETTY_FUNCTION__, __LINE__)

926 927 928
#define tprintf printf

#else //TRACE
929
#define tprintf(_arg...) {}
930
#endif
931

F
Fabrice Bellard 已提交
932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956
/* 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 */
M
Michael Niedermayer 已提交
957
extern const uint8_t ff_log2_tab[256];
F
Fabrice Bellard 已提交
958

959
static inline int av_log2(unsigned int v)
F
Fabrice Bellard 已提交
960 961 962 963 964 965 966 967 968 969 970 971
{
    int n;

    n = 0;
    if (v & 0xffff0000) {
        v >>= 16;
        n += 16;
    }
    if (v & 0xff00) {
        v >>= 8;
        n += 8;
    }
M
Michael Niedermayer 已提交
972 973 974 975 976 977 978 979 980 981 982 983 984
    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;
F
Fabrice Bellard 已提交
985
    }
M
Michael Niedermayer 已提交
986 987
    n += ff_log2_tab[v];

F
Fabrice Bellard 已提交
988 989 990
    return n;
}

M
Michael Niedermayer 已提交
991

992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009
/* median of 3 */
static inline int mid_pred(int a, int b, int c)
{
    int vmin, vmax;
    vmax = vmin = a;
    if (b < vmin)
        vmin = b;
    else
	vmax = b;

    if (c < vmin)
        vmin = c;
    else if (c > vmax)
        vmax = c;

    return a + b + c - vmin - vmax;
}

1010 1011 1012 1013 1014 1015 1016 1017 1018 1019
static inline int clip(int a, int amin, int amax)
{
    if (a < amin)
        return amin;
    else if (a > amax)
        return amax;
    else
        return a;
}

1020
/* math */
M
Michael Niedermayer 已提交
1021
extern const uint8_t ff_sqrt_tab[128];
M
Michael Niedermayer 已提交
1022

1023
int64_t ff_gcd(int64_t a, int64_t b);
1024

M
sqrt  
Michael Niedermayer 已提交
1025 1026 1027 1028 1029
static inline int ff_sqrt(int a)
{
    int ret=0;
    int s;
    int ret_sq=0;
M
Michael Niedermayer 已提交
1030 1031 1032
    
    if(a<128) return ff_sqrt_tab[a];
    
M
sqrt  
Michael Niedermayer 已提交
1033 1034 1035 1036 1037 1038 1039 1040 1041
    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;
}
1042 1043 1044 1045

/**
 * converts fourcc string to int
 */
Z
Zdenek Kabelac 已提交
1046
static inline int ff_get_fourcc(const char *s){
1047
    assert( strlen(s)==4 );
1048
#ifndef WORDS_BIGENDIAN
1049
    return (s[0]) + (s[1]<<8) + (s[2]<<16) + (s[3]<<24);
1050 1051 1052
#else
    return (s[3]) + (s[2]<<8) + (s[1]<<16) + (s[0]<<24);
#endif
1053 1054
}

1055 1056 1057 1058
#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))


M
Michael Niedermayer 已提交
1059 1060
void ff_float2fraction(int *nom_arg, int *denom_arg, double f, int max);

1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076

#ifdef ARCH_X86
#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


M
sqrt  
Michael Niedermayer 已提交
1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095
#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

M
Michael Niedermayer 已提交
1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124
#ifdef ARCH_X86
static inline long long rdtsc()
{
	long long l;
	asm volatile(	"rdtsc\n\t"
		: "=A" (l)
	);
	return l;
}

#define START_TIMER \
static uint64_t tsum=0;\
static int tcount=0;\
static int tskip_count=0;\
uint64_t tend;\
uint64_t tstart= rdtsc();\

#define STOP_TIMER(id) \
tend= rdtsc();\
if(tcount<2 || tend - tstart < 4*tsum/tcount){\
    tsum+= tend - tstart;\
    tcount++;\
}else\
    tskip_count++;\
if(256*256*256*64%(tcount+tskip_count)==0){\
    fprintf(stderr, "%Ld dezicycles in %s, %d runs, %d skips\n", tsum*10/tcount, id, tcount, tskip_count);\
}
#endif

1125 1126
#define CLAMP_TO_8BIT(d) ((d > 0xff) ? 0xff : (d < 0) ? 0 : d)

1127 1128 1129 1130 1131
/* avoid usage of various functions */
#define malloc please_use_av_malloc
#define free please_use_av_free
#define realloc please_use_av_realloc

1132 1133 1134
#define CHECKED_ALLOCZ(p, size)\
{\
    p= av_mallocz(size);\
M
Michael Niedermayer 已提交
1135
    if(p==NULL && (size)!=0){\
1136 1137 1138 1139 1140
        perror("malloc");\
        goto fail;\
    }\
}

1141 1142 1143
#endif /* HAVE_AV_CONFIG_H */

#endif /* COMMON_H */