common.h 20.6 KB
Newer Older
F
Fabrice Bellard 已提交
1 2 3
#ifndef COMMON_H
#define COMMON_H

F
Fabrice Bellard 已提交
4 5
#define FFMPEG_VERSION_INT 0x000406
#define FFMPEG_VERSION     "0.4.6"
F
Fabrice Bellard 已提交
6

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

11
//#define ALT_BITSTREAM_WRITER
12
//#define ALIGNED_BITSTREAM_WRITER
13 14 15 16 17

#ifdef ARCH_ALPHA
#define ALT_BITSTREAM_READER
#endif

18
//#define ALIGNED_BITSTREAM
19
#define FAST_GET_FIRST_VLC
20
//#define DUMP_STREAM // only works with the ALT_BITSTREAM_READER
21

F
Fabrice Bellard 已提交
22
#ifdef HAVE_AV_CONFIG_H
F
Fabrice Bellard 已提交
23
/* only include the following when compiling package */
24
#include "config.h"
F
Fabrice Bellard 已提交
25 26 27 28 29

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
30
#include <math.h>
F
Fabrice Bellard 已提交
31 32 33 34 35

#ifndef ENODATA
#define ENODATA  61
#endif

36
#endif /* HAVE_AV_CONFIG_H */
F
Fabrice Bellard 已提交
37

38 39 40 41 42
/* Suppress restrict if it was not defined in config.h.  */
#ifndef restrict
#define restrict
#endif

F
Fabrice Bellard 已提交
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
#ifdef CONFIG_WIN32

/* windows */

typedef unsigned short UINT16;
typedef signed short INT16;
typedef unsigned char UINT8;
typedef unsigned int UINT32;
typedef unsigned __int64 UINT64;
typedef signed char INT8;
typedef signed int INT32;
typedef signed __int64 INT64;

typedef UINT8 uint8_t;
typedef INT8 int8_t;
typedef UINT16 uint16_t;
typedef INT16 int16_t;
typedef UINT32 uint32_t;
typedef INT32 int32_t;
F
Fabrice Bellard 已提交
62 63
typedef UINT64 uint64_t;
typedef INT64 int64_t;
F
Fabrice Bellard 已提交
64

F
Fabrice Bellard 已提交
65
#ifndef __MINGW32__
F
Fabrice Bellard 已提交
66 67 68 69 70
#define INT64_C(c)     (c ## i64)
#define UINT64_C(c)    (c ## i64)

#define inline __inline

F
Fabrice Bellard 已提交
71 72 73 74 75
#else
#define INT64_C(c)     (c ## LL)
#define UINT64_C(c)    (c ## ULL)
#endif /* __MINGW32__ */

F
Fabrice Bellard 已提交
76 77 78 79 80
#define M_PI    3.14159265358979323846
#define M_SQRT2 1.41421356237309504880  /* sqrt(2) */

#ifdef _DEBUG
#define DEBUG
F
Fabrice Bellard 已提交
81
#endif
F
Fabrice Bellard 已提交
82

F
Fabrice Bellard 已提交
83 84
#define snprintf _snprintf

F
Fabrice Bellard 已提交
85
#else /* CONFIG_WIN32 */
F
Fabrice Bellard 已提交
86 87 88

/* unix */

89
#include <inttypes.h>
F
Fabrice Bellard 已提交
90

91 92
#ifndef __WINE_WINDEF16_H
/* workaround for typedef conflict in MPlayer (wine typedefs) */
F
Fabrice Bellard 已提交
93 94 95 96 97 98 99 100 101 102 103
typedef unsigned short UINT16;
typedef signed short INT16;
#endif

typedef unsigned char UINT8;
typedef unsigned int UINT32;
typedef unsigned long long UINT64;
typedef signed char INT8;
typedef signed int INT32;
typedef signed long long INT64;

F
Fabrice Bellard 已提交
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
#ifdef HAVE_AV_CONFIG_H

#ifdef __FreeBSD__
#include <sys/param.h>
#endif

#ifndef INT64_C
#define INT64_C(c)     (c ## LL)
#define UINT64_C(c)    (c ## ULL)
#endif

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

F
Fabrice Bellard 已提交
119 120 121 122 123 124
#endif /* HAVE_AV_CONFIG_H */

#endif /* !CONFIG_WIN32 */

#ifdef HAVE_AV_CONFIG_H

125 126
#include "bswap.h"

F
Fabrice Bellard 已提交
127 128 129 130 131 132 133
#if defined(__MINGW32__) || defined(__CYGWIN__) || \
    defined(__OS2__) || defined (__OpenBSD__)
#define MANGLE(a) "_" #a
#else
#define MANGLE(a) #a
#endif

F
Fabrice Bellard 已提交
134 135
/* debug stuff */

F
Fabrice Bellard 已提交
136 137 138 139 140
#ifndef DEBUG
#define NDEBUG
#endif
#include <assert.h>

F
Fabrice Bellard 已提交
141 142 143 144 145 146 147 148 149 150 151 152
/* dprintf macros */
#if defined(CONFIG_WIN32) && !defined(__MINGW32__)

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

#else

#ifdef DEBUG
#define dprintf(fmt,args...) printf(fmt, ## args)
#else
#define dprintf(fmt,args...)
#endif
F
Fabrice Bellard 已提交
153 154 155

#endif /* !CONFIG_WIN32 */

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

158 159
/* assume b>0 */
#define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b))
M
Michael Niedermayer 已提交
160
#define ABS(a) ((a) >= 0 ? (a) : (-(a)))
M
sqrt  
Michael Niedermayer 已提交
161 162
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#define MIN(a,b) ((a) > (b) ? (b) : (a))
163

F
Fabrice Bellard 已提交
164 165 166 167 168 169 170
/* bit output */

struct PutBitContext;

typedef void (*WriteDataFunc)(void *, UINT8 *, int);

typedef struct PutBitContext {
171 172 173 174
#ifdef ALT_BITSTREAM_WRITER
    UINT8 *buf, *buf_end;
    int index;
#else
F
Fabrice Bellard 已提交
175
    UINT32 bit_buf;
176
    int bit_left;
177
    UINT8 *buf, *buf_ptr, *buf_end;
178 179
#endif
    INT64 data_out_size; /* in bytes */
F
Fabrice Bellard 已提交
180 181 182 183 184 185
} PutBitContext;

void init_put_bits(PutBitContext *s, 
                   UINT8 *buffer, int buffer_size,
                   void *opaque,
                   void (*write_data)(void *, UINT8 *, int));
186

F
Fabrice Bellard 已提交
187
INT64 get_bit_count(PutBitContext *s); /* XXX: change function name */
F
Fabrice Bellard 已提交
188 189
void align_put_bits(PutBitContext *s);
void flush_put_bits(PutBitContext *s);
190
void put_string(PutBitContext * pbc, char *s);
F
Fabrice Bellard 已提交
191 192 193 194 195 196 197

/* jpeg specific put_bits */
void jflush_put_bits(PutBitContext *s);

/* bit input */

typedef struct GetBitContext {
198 199 200 201
#ifdef ALT_BITSTREAM_READER
    int index;
    UINT8 *buffer;
#else
F
Fabrice Bellard 已提交
202
    UINT32 bit_buf;
203 204
    int bit_cnt;
    UINT8 *buf, *buf_ptr, *buf_end;
205
#endif
206
    int size;
F
Fabrice Bellard 已提交
207 208
} GetBitContext;

209 210
static inline int get_bits_count(GetBitContext *s);

F
Fabrice Bellard 已提交
211 212 213 214 215 216 217
typedef struct VLC {
    int bits;
    INT16 *table_codes;
    INT8 *table_bits;
    int table_size, table_allocated;
} VLC;

218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
/* used to avoid missaligned exceptions on some archs (alpha, ...) */
#ifdef ARCH_X86
#define unaligned32(a) (*(UINT32*)(a))
#else
#ifdef __GNUC__
static inline uint32_t unaligned32(const void *v) {
    struct Unaligned {
	uint32_t i;
    } __attribute__((packed));

    return ((const struct Unaligned *) v)->i;
}
#elif defined(__DECC)
static inline uint32_t unaligned32(const void *v) {
    return *(const __unaligned uint32_t *) v;
}
#else
static inline uint32_t unaligned32(const void *v) {
    return *(const uint32_t *) v;
}
#endif
#endif //!ARCH_X86

241 242 243 244 245 246 247 248 249 250 251
#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));
252
    
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
    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);
        *(UINT32 *)s->buf_ptr = be2me_32(bit_buf);
        //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


277
#ifdef ALT_BITSTREAM_WRITER
278
static inline void put_bits(PutBitContext *s, int n, unsigned int value)
279
{
280 281 282 283 284 285 286 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
#ifdef ALIGNED_BITSTREAM_WRITER
#ifdef ARCH_X86
    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"
    );
#else
    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;
#endif
#else //ALIGNED_BITSTREAM_WRITER
312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338
#ifdef ARCH_X86
    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"
    );
#else
    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;
#endif
339
#endif //!ALIGNED_BITSTREAM_WRITER
340 341 342
}
#endif

343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381
#ifndef ALT_BITSTREAM_WRITER
/* for jpeg : escape 0xff with 0x00 after it */
static inline void jput_bits(PutBitContext *s, int n, unsigned int value)
{
    unsigned int bit_buf, b;
    int bit_left, i;
    
    assert(n == 32 || value < (1U << n));

    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);
        /* handle escape */
        for(i=0;i<4;i++) {
            b = (bit_buf >> 24);
            *(s->buf_ptr++) = b;
            if (b == 0xff)
                *(s->buf_ptr++) = 0;
            bit_buf <<= 8;
        }

	bit_left+= 32 - n;
        bit_buf = value;
    }
    
    s->bit_buf = bit_buf;
    s->bit_left = bit_left;
}
#endif


382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440
#ifdef ALT_BITSTREAM_WRITER
static inline void jput_bits(PutBitContext *s, int n, int value)
{
    int index= s->index;
    uint32_t *ptr= (uint32_t*)(((uint8_t *)s->buf)+(index>>3));
    int v= ptr[0];
//if(n>24) printf("%d %d\n", n, value);
    
    v |= be2me_32(value<<(32-n-(index&7) ));
    if(((v+0x01010101)^0xFFFFFFFF)&v&0x80808080)
    {
	/* handle idiotic (m)jpeg escapes */
	uint8_t *bPtr= (uint8_t*)ptr;
	int numChecked= ((index+n)>>3) - (index>>3);
	
	v= be2me_32(v);

	*(bPtr++)= v>>24;
	if((v&0xFF000000)==0xFF000000 && numChecked>0){
		*(bPtr++)= 0x00;
		index+=8;
	}
	*(bPtr++)= (v>>16)&0xFF;
	if((v&0x00FF0000)==0x00FF0000 && numChecked>1){
		*(bPtr++)= 0x00;
		index+=8;
	}
	*(bPtr++)= (v>>8)&0xFF;
	if((v&0x0000FF00)==0x0000FF00 && numChecked>2){
		*(bPtr++)= 0x00;
		index+=8;
	}
	*(bPtr++)= v&0xFF;
	if((v&0x000000FF)==0x000000FF && numChecked>3){
		*(bPtr++)= 0x00;
		index+=8;
	}
	*((uint32_t*)bPtr)= 0;
    }
    else
    {
	ptr[0] = v;
	ptr[1] = 0;
    }

    index+= n;
    s->index= index;
 }
#endif

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

F
Fabrice Bellard 已提交
441 442 443
void init_get_bits(GetBitContext *s, 
                   UINT8 *buffer, int buffer_size);

444
#ifndef ALT_BITSTREAM_READER
445
unsigned int get_bits_long(GetBitContext *s, int n);
446
unsigned int show_bits_long(GetBitContext *s, int n);
447
#endif
448 449

static inline unsigned int get_bits(GetBitContext *s, int n){
450
#ifdef ALT_BITSTREAM_READER
451 452 453 454 455 456 457 458 459 460
#ifdef ALIGNED_BITSTREAM
    int index= s->index;
    uint32_t result1= be2me_32( ((uint32_t *)s->buffer)[index>>5] );
    uint32_t result2= be2me_32( ((uint32_t *)s->buffer)[(index>>5) + 1] );
#ifdef ARCH_X86
    asm ("shldl %%cl, %2, %0\n\t"
         : "=r" (result1)
	 : "0" (result1), "r" (result2), "c" (index));
#else
    result1<<= (index&0x1F);
461 462
    result2= (result2>>1) >> (31-(index&0x1F));
    result1|= result2;
463 464 465 466 467 468 469
#endif
    result1>>= 32 - n;
    index+= n;
    s->index= index;
    
    return result1;
#else //ALIGNED_BITSTREAM
470
    int index= s->index;
471
    uint32_t result= be2me_32( unaligned32( ((uint8_t *)s->buffer)+(index>>3) ) );
472 473 474 475 476

    result<<= (index&0x07);
    result>>= 32 - n;
    index+= n;
    s->index= index;
477 478 479 480 481 482 483
#ifdef DUMP_STREAM
    while(n){
        printf("%d", (result>>(n-1))&1);
        n--;
    }
    printf(" ");
#endif
484
    return result;
485 486
#endif //!ALIGNED_BITSTREAM
#else //ALT_BITSTREAM_READER
487 488 489 490 491 492 493 494 495 496 497
    if(s->bit_cnt>=n){
        /* most common case here */
        unsigned int val = s->bit_buf >> (32 - n);
        s->bit_buf <<= n;
	s->bit_cnt -= n;
#ifdef STATS
	st_bit_counts[st_current_index] += n;
#endif
	return val;
    }
    return get_bits_long(s,n);
498
#endif //!ALT_BITSTREAM_READER
499 500
}

501
static inline unsigned int get_bits1(GetBitContext *s){
502 503
#ifdef ALT_BITSTREAM_READER
    int index= s->index;
504
    uint8_t result= s->buffer[ index>>3 ];
505 506
    result<<= (index&0x07);
    result>>= 8 - 1;
507 508 509
    index++;
    s->index= index;
    
510 511 512
#ifdef DUMP_STREAM
    printf("%d ", result);
#endif
513 514
    return result;
#else
515 516 517 518 519 520 521 522 523 524 525
    if(s->bit_cnt>0){
        /* most common case here */
        unsigned int val = s->bit_buf >> 31;
        s->bit_buf <<= 1;
	s->bit_cnt--;
#ifdef STATS
	st_bit_counts[st_current_index]++;
#endif
	return val;
    }
    return get_bits_long(s,1);
526
#endif
527 528
}

529 530 531 532 533
/* This function is identical to get_bits(), the only */
/* diference is that it doesn't touch the buffer      */
/* it is usefull to see the buffer.                   */
static inline unsigned int show_bits(GetBitContext *s, int n)
{
534
#ifdef ALT_BITSTREAM_READER
535 536 537 538 539 540 541 542 543 544
#ifdef ALIGNED_BITSTREAM
    int index= s->index;
    uint32_t result1= be2me_32( ((uint32_t *)s->buffer)[index>>5] );
    uint32_t result2= be2me_32( ((uint32_t *)s->buffer)[(index>>5) + 1] );
#ifdef ARCH_X86
    asm ("shldl %%cl, %2, %0\n\t"
         : "=r" (result1)
	 : "0" (result1), "r" (result2), "c" (index));
#else
    result1<<= (index&0x1F);
545 546
    result2= (result2>>1) >> (31-(index&0x1F));
    result1|= result2;
547 548 549 550 551
#endif
    result1>>= 32 - n;
    
    return result1;
#else //ALIGNED_BITSTREAM
552
    int index= s->index;
553
    uint32_t result= be2me_32( unaligned32( ((uint8_t *)s->buffer)+(index>>3) ) );
554 555 556 557 558

    result<<= (index&0x07);
    result>>= 32 - n;
    
    return result;
559 560
#endif //!ALIGNED_BITSTREAM
#else //ALT_BITSTREAM_READER
561 562 563 564 565 566
    if(s->bit_cnt>=n) {
        /* most common case here */
        unsigned int val = s->bit_buf >> (32 - n);
        return val;
    }
    return show_bits_long(s,n);
567
#endif //!ALT_BITSTREAM_READER
568 569
}

570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606
static inline int show_aligned_bits(GetBitContext *s, int offset, int n)
{
#ifdef ALT_BITSTREAM_READER
#ifdef ALIGNED_BITSTREAM
    int index= (s->index + offset + 7)&(~7);
    uint32_t result1= be2me_32( ((uint32_t *)s->buffer)[index>>5] );
    uint32_t result2= be2me_32( ((uint32_t *)s->buffer)[(index>>5) + 1] );
#ifdef ARCH_X86
    asm ("shldl %%cl, %2, %0\n\t"
         : "=r" (result1)
	 : "0" (result1), "r" (result2), "c" (index));
#else
    result1<<= (index&0x1F);
    result2= (result2>>1) >> (31-(index&0x1F));
    result1|= result2;
#endif
    result1>>= 32 - n;
    
    return result1;
#else //ALIGNED_BITSTREAM
    int index= (s->index + offset + 7)>>3;
    uint32_t result= be2me_32( unaligned32( ((uint8_t *)s->buffer)+index ) );

    result>>= 32 - n;
    
    return result;
#endif //!ALIGNED_BITSTREAM
#else //ALT_BITSTREAM_READER
    int index= (get_bits_count(s) + offset + 7)>>3;
    uint32_t result= be2me_32( unaligned32( ((uint8_t *)s->buf)+index ) );

    result>>= 32 - n;
//printf(" %X %X %d \n", (int)(((uint8_t *)s->buf)+index ), (int)s->buf_ptr, s->bit_cnt);    
    return result;
#endif //!ALT_BITSTREAM_READER
}

607
static inline void skip_bits(GetBitContext *s, int n){
608 609
#ifdef ALT_BITSTREAM_READER
    s->index+= n;
610 611 612 613 614 615 616 617
#ifdef DUMP_STREAM
    {
        int result;
        s->index-= n;
        result= get_bits(s, n);
    }
#endif

618
#else
619 620 621 622 623 624 625 626 627 628
    if(s->bit_cnt>=n){
        /* most common case here */
        s->bit_buf <<= n;
	s->bit_cnt -= n;
#ifdef STATS
	st_bit_counts[st_current_index] += n;
#endif
    } else {
	get_bits_long(s,n);
    }
629
#endif
630 631 632
}

static inline void skip_bits1(GetBitContext *s){
633 634
#ifdef ALT_BITSTREAM_READER
    s->index++;
635 636 637 638
#ifdef DUMP_STREAM
    s->index--;
    printf("%d ", get_bits1(s));
#endif
639
#else
640 641 642 643 644 645 646 647 648 649
    if(s->bit_cnt>0){
        /* most common case here */
        s->bit_buf <<= 1;
	s->bit_cnt--;
#ifdef STATS
	st_bit_counts[st_current_index]++;
#endif
    } else {
	get_bits_long(s,1);
    }
650
#endif
651 652
}

F
Fabrice Bellard 已提交
653 654
static inline int get_bits_count(GetBitContext *s)
{
655 656 657
#ifdef ALT_BITSTREAM_READER
    return s->index;
#else
F
Fabrice Bellard 已提交
658
    return (s->buf_ptr - s->buf) * 8 - s->bit_cnt;
659
#endif
F
Fabrice Bellard 已提交
660
}
661

662
int check_marker(GetBitContext *s, char *msg);
F
Fabrice Bellard 已提交
663 664 665 666 667 668
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);

669
#ifdef ALT_BITSTREAM_READER
670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696
#ifdef ALIGNED_BITSTREAM
#ifdef ARCH_X86
#define SHOW_BITS(s, val, n) \
    val= be2me_32( ((uint32_t *)(s)->buffer)[bit_cnt>>5] );\
    {uint32_t result2= be2me_32( ((uint32_t *)(s)->buffer)[(bit_cnt>>5) + 1] );\
    asm ("shldl %%cl, %2, %0\n\t"\
         : "=r" (val)\
         : "0" (val), "r" (result2), "c" (bit_cnt));\
    ((uint32_t)val)>>= 32 - n;}
#else //ARCH_X86
#define SHOW_BITS(s, val, n) \
    val= be2me_32( ((uint32_t *)(s)->buffer)[bit_cnt>>5] );\
    {uint32_t result2= be2me_32( ((uint32_t *)(s)->buffer)[(bit_cnt>>5) + 1] );\
    val<<= (bit_cnt&0x1F);\
    result2= (result2>>1) >> (31-(bit_cnt&0x1F));\
    val|= result2;\
    ((uint32_t)val)>>= 32 - n;}
#endif //!ARCH_X86
#else //ALIGNED_BITSTREAM
#define SHOW_BITS(s, val, n) \
    val= be2me_32( unaligned32( ((uint8_t *)(s)->buffer)+(bit_cnt>>3) ) );\
    val<<= (bit_cnt&0x07);\
    ((uint32_t)val)>>= 32 - n;
#endif // !ALIGNED_BITSTREAM
#define FLUSH_BITS(n) bit_cnt+=n; 
#define SAVE_BITS(s) bit_cnt= (s)->index;
#define RESTORE_BITS(s) (s)->index= bit_cnt;
697 698
#else

F
Fabrice Bellard 已提交
699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738
/* macro to go faster */
/* n must be <= 24 */
/* XXX: optimize buffer end test */
#define SHOW_BITS(s, val, n)\
{\
    if (bit_cnt < n && buf_ptr < (s)->buf_end) {\
        bit_buf |= *buf_ptr++ << (24 - bit_cnt);\
        bit_cnt += 8;\
        if (bit_cnt < n && buf_ptr < (s)->buf_end) {\
            bit_buf |= *buf_ptr++ << (24 - bit_cnt);\
            bit_cnt += 8;\
            if (bit_cnt < n && buf_ptr < (s)->buf_end) {\
                bit_buf |= *buf_ptr++ << (24 - bit_cnt);\
                bit_cnt += 8;\
            }\
        }\
    }\
    val = bit_buf >> (32 - n);\
}

/* SHOW_BITS with n1 >= n must be been done before */
#define FLUSH_BITS(n)\
{\
    bit_buf <<= n;\
    bit_cnt -= n;\
}

#define SAVE_BITS(s) \
{\
    bit_cnt = (s)->bit_cnt;\
    bit_buf = (s)->bit_buf;\
    buf_ptr = (s)->buf_ptr;\
}

#define RESTORE_BITS(s) \
{\
    (s)->buf_ptr = buf_ptr;\
    (s)->bit_buf = bit_buf;\
    (s)->bit_cnt = bit_cnt;\
}
739
#endif // !ALT_BITSTREAM_READER
740 741 742 743 744 745 746

static inline int get_vlc(GetBitContext *s, VLC *vlc)
{
    int code, n, nb_bits, index;
    INT16 *table_codes;
    INT8 *table_bits;
    int bit_cnt;
747
#ifndef ALT_BITSTREAM_READER
748 749 750 751 752 753 754 755
    UINT32 bit_buf;
    UINT8 *buf_ptr;
#endif

    SAVE_BITS(s);
    nb_bits = vlc->bits;
    table_codes = vlc->table_codes;
    table_bits = vlc->table_bits;
756 757

#ifdef FAST_GET_FIRST_VLC
758 759 760 761 762 763
    SHOW_BITS(s, index, nb_bits);
    code = table_codes[index];
    n = table_bits[index];
    if (n > 0) {
        /* most common case (90%)*/
        FLUSH_BITS(n);
764 765 766 767 768 769 770
#ifdef DUMP_STREAM
        {
            int n= bit_cnt - s->index;
            skip_bits(s, n);
            RESTORE_BITS(s);
        }
#endif
771 772 773 774 775 776 777 778 779 780
        RESTORE_BITS(s);
        return code;
    } else if (n == 0) {
        return -1;
    } else {
        FLUSH_BITS(nb_bits);
        nb_bits = -n;
        table_codes = vlc->table_codes + code;
        table_bits = vlc->table_bits + code;
    }
781
#endif
782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804
    for(;;) {
        SHOW_BITS(s, index, nb_bits);
        code = table_codes[index];
        n = table_bits[index];
        if (n > 0) {
            /* most common case */
            FLUSH_BITS(n);
#ifdef STATS
            st_bit_counts[st_current_index] += n;
#endif
            break;
        } else if (n == 0) {
            return -1;
        } else {
            FLUSH_BITS(nb_bits);
#ifdef STATS
            st_bit_counts[st_current_index] += nb_bits;
#endif
            nb_bits = -n;
            table_codes = vlc->table_codes + code;
            table_bits = vlc->table_bits + code;
        }
    }
805 806 807 808 809 810 811
#ifdef DUMP_STREAM
    {
        int n= bit_cnt - s->index;
        skip_bits(s, n);
        RESTORE_BITS(s);
    }
#endif
812 813 814 815 816
    RESTORE_BITS(s);
    return code;
}


F
Fabrice Bellard 已提交
817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842
/* 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 */

843
static inline int av_log2(unsigned int v)
F
Fabrice Bellard 已提交
844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869
{
    int n;

    n = 0;
    if (v & 0xffff0000) {
        v >>= 16;
        n += 16;
    }
    if (v & 0xff00) {
        v >>= 8;
        n += 8;
    }
    if (v & 0xf0) {
        v >>= 4;
        n += 4;
    }
    if (v & 0xc) {
        v >>= 2;
        n += 2;
    }
    if (v & 0x2) {
        n++;
    }
    return n;
}

870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887
/* 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;
}

888 889 890 891 892 893 894 895 896 897
static inline int clip(int a, int amin, int amax)
{
    if (a < amin)
        return amin;
    else if (a > amax)
        return amax;
    else
        return a;
}

898 899 900
/* math */
int ff_gcd(int a, int b);

M
sqrt  
Michael Niedermayer 已提交
901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934
static inline int ff_sqrt(int a)
{
    int ret=0;
    int s;
    int ret_sq=0;

    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;
}
#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

935 936
#define CLAMP_TO_8BIT(d) ((d > 0xff) ? 0xff : (d < 0) ? 0 : d)

937 938 939
#endif /* HAVE_AV_CONFIG_H */

#endif /* COMMON_H */