common.h 15.1 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 ALT_BITSTREAM_READER
13
//#define ALIGNED_BITSTREAM
14
#define FAST_GET_FIRST_VLC
15

F
Fabrice Bellard 已提交
16
#ifdef HAVE_AV_CONFIG_H
F
Fabrice Bellard 已提交
17
/* only include the following when compiling package */
F
Fabrice Bellard 已提交
18
#include "../config.h"
F
Fabrice Bellard 已提交
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

#ifndef ENODATA
#define ENODATA  61
#endif

#endif

#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 已提交
51
#ifndef __MINGW32__
F
Fabrice Bellard 已提交
52 53 54 55 56 57 58 59 60 61 62 63 64
#define INT64_C(c)     (c ## i64)
#define UINT64_C(c)    (c ## i64)

#define inline __inline

/*
  Disable warning messages:
    warning C4244: '=' : conversion from 'double' to 'float', possible loss of data
    warning C4305: 'argument' : truncation from 'const double' to 'float'
*/
#pragma warning( disable : 4244 )
#pragma warning( disable : 4305 )

F
Fabrice Bellard 已提交
65 66 67 68 69
#else
#define INT64_C(c)     (c ## LL)
#define UINT64_C(c)    (c ## ULL)
#endif /* __MINGW32__ */

F
Fabrice Bellard 已提交
70 71 72 73 74
#define M_PI    3.14159265358979323846
#define M_SQRT2 1.41421356237309504880  /* sqrt(2) */

#ifdef _DEBUG
#define DEBUG
F
Fabrice Bellard 已提交
75
#endif
F
Fabrice Bellard 已提交
76

F
Fabrice Bellard 已提交
77 78 79 80 81 82 83 84
// code from bits/byteswap.h (C) 1997, 1998 Free Software Foundation, Inc.
#define bswap_32(x) \
     ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) | \
      (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))
#define be2me_32(x) bswap_32(x)

#define snprintf _snprintf

F
Fabrice Bellard 已提交
85 86
#ifndef __MINGW32__
/* no config.h with VC */
F
Fabrice Bellard 已提交
87 88 89
#define CONFIG_ENCODERS 1
#define CONFIG_DECODERS 1
#define CONFIG_AC3      1
F
Fabrice Bellard 已提交
90
#endif
F
Fabrice Bellard 已提交
91 92 93 94 95 96 97

#else

/* unix */

#include <inttypes.h>

98 99
#ifndef __WINE_WINDEF16_H
/* workaround for typedef conflict in MPlayer (wine typedefs) */
F
Fabrice Bellard 已提交
100 101 102 103 104 105 106 107 108 109 110
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 已提交
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
#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

#include "../bswap.h"

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

F
Fabrice Bellard 已提交
128 129 130 131
#endif /* HAVE_AV_CONFIG_H */

#endif /* !CONFIG_WIN32 */

132

F
Fabrice Bellard 已提交
133 134 135
/* debug stuff */
#ifdef HAVE_AV_CONFIG_H

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 */

F
Fabrice Bellard 已提交
156 157
#endif /* HAVE_AV_CONFIG_H */

F
Fabrice Bellard 已提交
158 159 160 161 162 163 164
/* bit output */

struct PutBitContext;

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

typedef struct PutBitContext {
165 166 167 168
#ifdef ALT_BITSTREAM_WRITER
    UINT8 *buf, *buf_end;
    int index;
#else
F
Fabrice Bellard 已提交
169
    UINT32 bit_buf;
170 171
    int bit_cnt;
    UINT8 *buf, *buf_ptr, *buf_end;
F
Fabrice Bellard 已提交
172 173
    void *opaque;
    WriteDataFunc write_data;
174 175
#endif
    INT64 data_out_size; /* in bytes */
F
Fabrice Bellard 已提交
176 177 178 179 180 181
} PutBitContext;

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

#ifndef ALT_BITSTREAM_WRITER
F
Fabrice Bellard 已提交
184
void put_bits(PutBitContext *s, int n, unsigned int value);
185 186
#endif

F
Fabrice Bellard 已提交
187
INT64 get_bit_count(PutBitContext *s); /* XXX: change function name */
F
Fabrice Bellard 已提交
188 189 190 191
void align_put_bits(PutBitContext *s);
void flush_put_bits(PutBitContext *s);

/* jpeg specific put_bits */
192
#ifndef ALT_BITSTREAM_WRITER
F
Fabrice Bellard 已提交
193
void jput_bits(PutBitContext *s, int n, unsigned int value);
194
#endif
F
Fabrice Bellard 已提交
195 196 197 198 199
void jflush_put_bits(PutBitContext *s);

/* bit input */

typedef struct GetBitContext {
200 201 202 203
#ifdef ALT_BITSTREAM_READER
    int index;
    UINT8 *buffer;
#else
F
Fabrice Bellard 已提交
204
    UINT32 bit_buf;
205 206
    int bit_cnt;
    UINT8 *buf, *buf_ptr, *buf_end;
207
#endif
F
Fabrice Bellard 已提交
208 209 210 211 212 213 214 215 216
} GetBitContext;

typedef struct VLC {
    int bits;
    INT16 *table_codes;
    INT8 *table_bits;
    int table_size, table_allocated;
} VLC;

217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
/* 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

240 241 242 243 244 245 246 247 248 249 250 251 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 277 278 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 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332
#ifdef ALT_BITSTREAM_WRITER
static inline void put_bits(PutBitContext *s, int n, int value)
{
#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
}
#endif

#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 已提交
333 334 335
void init_get_bits(GetBitContext *s, 
                   UINT8 *buffer, int buffer_size);

336
#ifndef ALT_BITSTREAM_READER
337
unsigned int get_bits_long(GetBitContext *s, int n);
338
unsigned int show_bits_long(GetBitContext *s, int n);
339
#endif
340 341

static inline unsigned int get_bits(GetBitContext *s, int n){
342
#ifdef ALT_BITSTREAM_READER
343 344 345 346 347 348 349 350 351 352
#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);
353 354
    result2= (result2>>1) >> (31-(index&0x1F));
    result1|= result2;
355 356 357 358 359 360 361
#endif
    result1>>= 32 - n;
    index+= n;
    s->index= index;
    
    return result1;
#else //ALIGNED_BITSTREAM
362
    int index= s->index;
363
    uint32_t result= be2me_32( unaligned32( ((uint8_t *)s->buffer)+(index>>3) ) );
364 365 366 367 368 369 370

    result<<= (index&0x07);
    result>>= 32 - n;
    index+= n;
    s->index= index;
    
    return result;
371 372
#endif //!ALIGNED_BITSTREAM
#else //ALT_BITSTREAM_READER
373 374 375 376 377 378 379 380 381 382 383
    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);
384
#endif //!ALT_BITSTREAM_READER
385 386
}

387
static inline unsigned int get_bits1(GetBitContext *s){
388 389
#ifdef ALT_BITSTREAM_READER
    int index= s->index;
390
    uint8_t result= s->buffer[ index>>3 ];
391 392
    result<<= (index&0x07);
    result>>= 8 - 1;
393 394 395 396 397
    index++;
    s->index= index;
    
    return result;
#else
398 399 400 401 402 403 404 405 406 407 408
    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);
409
#endif
410 411
}

412 413 414 415 416
/* 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)
{
417
#ifdef ALT_BITSTREAM_READER
418 419 420 421 422 423 424 425 426 427
#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);
428 429
    result2= (result2>>1) >> (31-(index&0x1F));
    result1|= result2;
430 431 432 433 434
#endif
    result1>>= 32 - n;
    
    return result1;
#else //ALIGNED_BITSTREAM
435
    int index= s->index;
436
    uint32_t result= be2me_32( unaligned32( ((uint8_t *)s->buffer)+(index>>3) ) );
437 438 439 440 441

    result<<= (index&0x07);
    result>>= 32 - n;
    
    return result;
442 443
#endif //!ALIGNED_BITSTREAM
#else //ALT_BITSTREAM_READER
444 445 446 447 448 449
    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);
450
#endif //!ALT_BITSTREAM_READER
451 452
}

453
static inline void skip_bits(GetBitContext *s, int n){
454 455 456
#ifdef ALT_BITSTREAM_READER
    s->index+= n;
#else
457 458 459 460 461 462 463 464 465 466
    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);
    }
467
#endif
468 469 470
}

static inline void skip_bits1(GetBitContext *s){
471 472 473
#ifdef ALT_BITSTREAM_READER
    s->index++;
#else
474 475 476 477 478 479 480 481 482 483
    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);
    }
484
#endif
485 486
}

F
Fabrice Bellard 已提交
487 488
static inline int get_bits_count(GetBitContext *s)
{
489 490 491
#ifdef ALT_BITSTREAM_READER
    return s->index;
#else
F
Fabrice Bellard 已提交
492
    return (s->buf_ptr - s->buf) * 8 - s->bit_cnt;
493
#endif
F
Fabrice Bellard 已提交
494
}
495

F
Fabrice Bellard 已提交
496 497 498 499 500 501
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);

502
#ifdef ALT_BITSTREAM_READER
503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529
#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;
530 531
#else

F
Fabrice Bellard 已提交
532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571
/* 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;\
}
572
#endif // !ALT_BITSTREAM_READER
573 574 575 576 577 578 579

static inline int get_vlc(GetBitContext *s, VLC *vlc)
{
    int code, n, nb_bits, index;
    INT16 *table_codes;
    INT8 *table_bits;
    int bit_cnt;
580
#ifndef ALT_BITSTREAM_READER
581 582 583 584 585 586 587 588
    UINT32 bit_buf;
    UINT8 *buf_ptr;
#endif

    SAVE_BITS(s);
    nb_bits = vlc->bits;
    table_codes = vlc->table_codes;
    table_bits = vlc->table_bits;
589 590

#ifdef FAST_GET_FIRST_VLC
591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606
    SHOW_BITS(s, index, nb_bits);
    code = table_codes[index];
    n = table_bits[index];
    if (n > 0) {
        /* most common case (90%)*/
        FLUSH_BITS(n);
        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;
    }
607
#endif
608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635
    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;
        }
    }
    RESTORE_BITS(s);
    return code;
}


F
Fabrice Bellard 已提交
636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661
/* 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 */

662
static inline int av_log2(unsigned int v)
F
Fabrice Bellard 已提交
663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692
{
    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;
}

/* memory */
void *av_mallocz(int size);

#endif