00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00026 #ifndef AVCODEC_BITSTREAM_H
00027 #define AVCODEC_BITSTREAM_H
00028 
00029 #include <stdint.h>
00030 #include <stdlib.h>
00031 #include <assert.h>
00032 #include "libavutil/bswap.h"
00033 #include "libavutil/common.h"
00034 #include "libavutil/intreadwrite.h"
00035 #include "libavutil/log.h"
00036 
00037 #if defined(ALT_BITSTREAM_READER_LE) && !defined(ALT_BITSTREAM_READER)
00038 #   define ALT_BITSTREAM_READER
00039 #endif
00040 
00041 
00042 
00043 #if !defined(LIBMPEG2_BITSTREAM_READER) && !defined(A32_BITSTREAM_READER) && !defined(ALT_BITSTREAM_READER)
00044 #   if ARCH_ARM
00045 #       define A32_BITSTREAM_READER
00046 #   else
00047 #       define ALT_BITSTREAM_READER
00048 
00049 
00050 #   endif
00051 #endif
00052 
00053 extern const uint8_t ff_reverse[256];
00054 
00055 #if ARCH_X86
00056 
00057 static inline  int32_t NEG_SSR32( int32_t a, int8_t s){
00058     __asm__ ("sarl %1, %0\n\t"
00059          : "+r" (a)
00060          : "ic" ((uint8_t)(-s))
00061     );
00062     return a;
00063 }
00064 static inline uint32_t NEG_USR32(uint32_t a, int8_t s){
00065     __asm__ ("shrl %1, %0\n\t"
00066          : "+r" (a)
00067          : "ic" ((uint8_t)(-s))
00068     );
00069     return a;
00070 }
00071 #else
00072 #    define NEG_SSR32(a,s) ((( int32_t)(a))>>(32-(s)))
00073 #    define NEG_USR32(a,s) (((uint32_t)(a))>>(32-(s)))
00074 #endif
00075 
00076 
00077 
00078 
00079 typedef struct PutBitContext {
00080 #ifdef ALT_BITSTREAM_WRITER
00081     uint8_t *buf, *buf_end;
00082     int index;
00083 #else
00084     uint32_t bit_buf;
00085     int bit_left;
00086     uint8_t *buf, *buf_ptr, *buf_end;
00087 #endif
00088     int size_in_bits;
00089 } PutBitContext;
00090 
00091 static inline void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
00092 {
00093     if(buffer_size < 0) {
00094         buffer_size = 0;
00095         buffer = NULL;
00096     }
00097 
00098     s->size_in_bits= 8*buffer_size;
00099     s->buf = buffer;
00100     s->buf_end = s->buf + buffer_size;
00101 #ifdef ALT_BITSTREAM_WRITER
00102     s->index=0;
00103     ((uint32_t*)(s->buf))[0]=0;
00104 
00105 #else
00106     s->buf_ptr = s->buf;
00107     s->bit_left=32;
00108     s->bit_buf=0;
00109 #endif
00110 }
00111 
00112 
00113 static inline int put_bits_count(PutBitContext *s)
00114 {
00115 #ifdef ALT_BITSTREAM_WRITER
00116     return s->index;
00117 #else
00118     return (s->buf_ptr - s->buf) * 8 + 32 - s->bit_left;
00119 #endif
00120 }
00121 
00122 
00123 static inline void flush_put_bits(PutBitContext *s)
00124 {
00125 #ifdef ALT_BITSTREAM_WRITER
00126     align_put_bits(s);
00127 #else
00128 #ifndef BITSTREAM_WRITER_LE
00129     s->bit_buf<<= s->bit_left;
00130 #endif
00131     while (s->bit_left < 32) {
00132         
00133 #ifdef BITSTREAM_WRITER_LE
00134         *s->buf_ptr++=s->bit_buf;
00135         s->bit_buf>>=8;
00136 #else
00137         *s->buf_ptr++=s->bit_buf >> 24;
00138         s->bit_buf<<=8;
00139 #endif
00140         s->bit_left+=8;
00141     }
00142     s->bit_left=32;
00143     s->bit_buf=0;
00144 #endif
00145 }
00146 
00147 void align_put_bits(PutBitContext *s);
00148 void ff_put_string(PutBitContext * pbc, const char *s, int put_zero);
00149 void ff_copy_bits(PutBitContext *pb, const uint8_t *src, int length);
00150 
00151 
00152 
00153 typedef struct GetBitContext {
00154     const uint8_t *buffer, *buffer_end;
00155 #ifdef ALT_BITSTREAM_READER
00156     int index;
00157 #elif defined LIBMPEG2_BITSTREAM_READER
00158     uint8_t *buffer_ptr;
00159     uint32_t cache;
00160     int bit_count;
00161 #elif defined A32_BITSTREAM_READER
00162     uint32_t *buffer_ptr;
00163     uint32_t cache0;
00164     uint32_t cache1;
00165     int bit_count;
00166 #endif
00167     int size_in_bits;
00168 } GetBitContext;
00169 
00170 #define VLC_TYPE int16_t
00171 
00172 typedef struct VLC {
00173     int bits;
00174     VLC_TYPE (*table)[2]; 
00175     int table_size, table_allocated;
00176 } VLC;
00177 
00178 typedef struct RL_VLC_ELEM {
00179     int16_t level;
00180     int8_t len;
00181     uint8_t run;
00182 } RL_VLC_ELEM;
00183 
00184 #ifndef ALT_BITSTREAM_WRITER
00185 static inline void put_bits(PutBitContext *s, int n, unsigned int value)
00186 {
00187     unsigned int bit_buf;
00188     int bit_left;
00189 
00190     
00191     assert(n == 32 || value < (1U << n));
00192 
00193     bit_buf = s->bit_buf;
00194     bit_left = s->bit_left;
00195 
00196     
00197     
00198 #ifdef BITSTREAM_WRITER_LE
00199     bit_buf |= value << (32 - bit_left);
00200     if (n >= bit_left) {
00201 #if !HAVE_FAST_UNALIGNED
00202         if (3 & (intptr_t) s->buf_ptr) {
00203             AV_WL32(s->buf_ptr, bit_buf);
00204         } else
00205 #endif
00206         *(uint32_t *)s->buf_ptr = le2me_32(bit_buf);
00207         s->buf_ptr+=4;
00208         bit_buf = (bit_left==32)?0:value >> bit_left;
00209         bit_left+=32;
00210     }
00211     bit_left-=n;
00212 #else
00213     if (n < bit_left) {
00214         bit_buf = (bit_buf<<n) | value;
00215         bit_left-=n;
00216     } else {
00217         bit_buf<<=bit_left;
00218         bit_buf |= value >> (n - bit_left);
00219 #if !HAVE_FAST_UNALIGNED
00220         if (3 & (intptr_t) s->buf_ptr) {
00221             AV_WB32(s->buf_ptr, bit_buf);
00222         } else
00223 #endif
00224         *(uint32_t *)s->buf_ptr = be2me_32(bit_buf);
00225         
00226         s->buf_ptr+=4;
00227         bit_left+=32 - n;
00228         bit_buf = value;
00229     }
00230 #endif
00231 
00232     s->bit_buf = bit_buf;
00233     s->bit_left = bit_left;
00234 }
00235 #endif
00236 
00237 
00238 #ifdef ALT_BITSTREAM_WRITER
00239 static inline void put_bits(PutBitContext *s, int n, unsigned int value)
00240 {
00241 #    ifdef ALIGNED_BITSTREAM_WRITER
00242 #        if ARCH_X86
00243     __asm__ volatile(
00244         "movl %0, %%ecx                 \n\t"
00245         "xorl %%eax, %%eax              \n\t"
00246         "shrdl %%cl, %1, %%eax          \n\t"
00247         "shrl %%cl, %1                  \n\t"
00248         "movl %0, %%ecx                 \n\t"
00249         "shrl $3, %%ecx                 \n\t"
00250         "andl $0xFFFFFFFC, %%ecx        \n\t"
00251         "bswapl %1                      \n\t"
00252         "orl %1, (%2, %%ecx)            \n\t"
00253         "bswapl %%eax                   \n\t"
00254         "addl %3, %0                    \n\t"
00255         "movl %%eax, 4(%2, %%ecx)       \n\t"
00256         : "=&r" (s->index), "=&r" (value)
00257         : "r" (s->buf), "r" (n), "0" (s->index), "1" (value<<(-n))
00258         : "%eax", "%ecx"
00259     );
00260 #        else
00261     int index= s->index;
00262     uint32_t *ptr= ((uint32_t *)s->buf)+(index>>5);
00263 
00264     value<<= 32-n;
00265 
00266     ptr[0] |= be2me_32(value>>(index&31));
00267     ptr[1]  = be2me_32(value<<(32-(index&31)));
00268 
00269     index+= n;
00270     s->index= index;
00271 #        endif
00272 #    else //ALIGNED_BITSTREAM_WRITER
00273 #        if ARCH_X86
00274     __asm__ volatile(
00275         "movl $7, %%ecx                 \n\t"
00276         "andl %0, %%ecx                 \n\t"
00277         "addl %3, %%ecx                 \n\t"
00278         "negl %%ecx                     \n\t"
00279         "shll %%cl, %1                  \n\t"
00280         "bswapl %1                      \n\t"
00281         "movl %0, %%ecx                 \n\t"
00282         "shrl $3, %%ecx                 \n\t"
00283         "orl %1, (%%ecx, %2)            \n\t"
00284         "addl %3, %0                    \n\t"
00285         "movl $0, 4(%%ecx, %2)          \n\t"
00286         : "=&r" (s->index), "=&r" (value)
00287         : "r" (s->buf), "r" (n), "0" (s->index), "1" (value)
00288         : "%ecx"
00289     );
00290 #        else
00291     int index= s->index;
00292     uint32_t *ptr= (uint32_t*)(((uint8_t *)s->buf)+(index>>3));
00293 
00294     ptr[0] |= be2me_32(value<<(32-n-(index&7) ));
00295     ptr[1] = 0;
00296 
00297     index+= n;
00298     s->index= index;
00299 #        endif
00300 #    endif 
00301 }
00302 #endif
00303 
00304 static inline void put_sbits(PutBitContext *pb, int bits, int32_t val)
00305 {
00306     assert(bits >= 0 && bits <= 31);
00307 
00308     put_bits(pb, bits, val & ((1<<bits)-1));
00309 }
00310 
00311 
00312 static inline uint8_t* pbBufPtr(PutBitContext *s)
00313 {
00314 #ifdef ALT_BITSTREAM_WRITER
00315         return s->buf + (s->index>>3);
00316 #else
00317         return s->buf_ptr;
00318 #endif
00319 }
00320 
00325 static inline void skip_put_bytes(PutBitContext *s, int n){
00326         assert((put_bits_count(s)&7)==0);
00327 #ifdef ALT_BITSTREAM_WRITER
00328         FIXME may need some cleaning of the buffer
00329         s->index += n<<3;
00330 #else
00331         assert(s->bit_left==32);
00332         s->buf_ptr += n;
00333 #endif
00334 }
00335 
00340 static inline void skip_put_bits(PutBitContext *s, int n){
00341 #ifdef ALT_BITSTREAM_WRITER
00342     s->index += n;
00343 #else
00344     s->bit_left -= n;
00345     s->buf_ptr-= s->bit_left>>5;
00346     s->bit_left &= 31;
00347 #endif
00348 }
00349 
00353 static inline void set_put_bits_buffer_size(PutBitContext *s, int size){
00354     s->buf_end= s->buf + size;
00355 }
00356 
00357 
00358 
00359 
00360 
00361 
00362 
00363 
00364 
00365 
00366 
00367 
00368 
00369 
00370 
00371 
00372 
00373 
00374 
00375 
00376 
00377 
00378 
00379 
00380 
00381 
00382 
00383 
00384 
00385 
00386 
00387 
00388 
00389 
00390 
00391 
00392 
00393 
00394 
00395 
00396 
00397 
00398 
00399 
00400 
00401 
00402 #ifdef ALT_BITSTREAM_READER
00403 #   define MIN_CACHE_BITS 25
00404 
00405 #   define OPEN_READER(name, gb)\
00406         int name##_index= (gb)->index;\
00407         int name##_cache= 0;\
00408 
00409 #   define CLOSE_READER(name, gb)\
00410         (gb)->index= name##_index;\
00411 
00412 # ifdef ALT_BITSTREAM_READER_LE
00413 #   define UPDATE_CACHE(name, gb)\
00414         name##_cache= AV_RL32( ((const uint8_t *)(gb)->buffer)+(name##_index>>3) ) >> (name##_index&0x07);\
00415 
00416 #   define SKIP_CACHE(name, gb, num)\
00417         name##_cache >>= (num);
00418 # else
00419 #   define UPDATE_CACHE(name, gb)\
00420         name##_cache= AV_RB32( ((const uint8_t *)(gb)->buffer)+(name##_index>>3) ) << (name##_index&0x07);\
00421 
00422 #   define SKIP_CACHE(name, gb, num)\
00423         name##_cache <<= (num);
00424 # endif
00425 
00426 
00427 #   define SKIP_COUNTER(name, gb, num)\
00428         name##_index += (num);\
00429 
00430 #   define SKIP_BITS(name, gb, num)\
00431         {\
00432             SKIP_CACHE(name, gb, num)\
00433             SKIP_COUNTER(name, gb, num)\
00434         }\
00435 
00436 #   define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num)
00437 #   define LAST_SKIP_CACHE(name, gb, num) ;
00438 
00439 # ifdef ALT_BITSTREAM_READER_LE
00440 #   define SHOW_UBITS(name, gb, num)\
00441         ((name##_cache) & (NEG_USR32(0xffffffff,num)))
00442 
00443 #   define SHOW_SBITS(name, gb, num)\
00444         NEG_SSR32((name##_cache)<<(32-(num)), num)
00445 # else
00446 #   define SHOW_UBITS(name, gb, num)\
00447         NEG_USR32(name##_cache, num)
00448 
00449 #   define SHOW_SBITS(name, gb, num)\
00450         NEG_SSR32(name##_cache, num)
00451 # endif
00452 
00453 #   define GET_CACHE(name, gb)\
00454         ((uint32_t)name##_cache)
00455 
00456 static inline int get_bits_count(GetBitContext *s){
00457     return s->index;
00458 }
00459 
00460 static inline void skip_bits_long(GetBitContext *s, int n){
00461     s->index += n;
00462 }
00463 
00464 #elif defined LIBMPEG2_BITSTREAM_READER
00465 
00466 
00467 #   define MIN_CACHE_BITS 17
00468 
00469 #   define OPEN_READER(name, gb)\
00470         int name##_bit_count=(gb)->bit_count;\
00471         int name##_cache= (gb)->cache;\
00472         uint8_t * name##_buffer_ptr=(gb)->buffer_ptr;\
00473 
00474 #   define CLOSE_READER(name, gb)\
00475         (gb)->bit_count= name##_bit_count;\
00476         (gb)->cache= name##_cache;\
00477         (gb)->buffer_ptr= name##_buffer_ptr;\
00478 
00479 #   define UPDATE_CACHE(name, gb)\
00480     if(name##_bit_count >= 0){\
00481         name##_cache+= AV_RB16(name##_buffer_ptr) << name##_bit_count; \
00482         name##_buffer_ptr+=2;\
00483         name##_bit_count-= 16;\
00484     }\
00485 
00486 #   define SKIP_CACHE(name, gb, num)\
00487         name##_cache <<= (num);\
00488 
00489 #   define SKIP_COUNTER(name, gb, num)\
00490         name##_bit_count += (num);\
00491 
00492 #   define SKIP_BITS(name, gb, num)\
00493         {\
00494             SKIP_CACHE(name, gb, num)\
00495             SKIP_COUNTER(name, gb, num)\
00496         }\
00497 
00498 #   define LAST_SKIP_BITS(name, gb, num) SKIP_BITS(name, gb, num)
00499 #   define LAST_SKIP_CACHE(name, gb, num) SKIP_CACHE(name, gb, num)
00500 
00501 #   define SHOW_UBITS(name, gb, num)\
00502         NEG_USR32(name##_cache, num)
00503 
00504 #   define SHOW_SBITS(name, gb, num)\
00505         NEG_SSR32(name##_cache, num)
00506 
00507 #   define GET_CACHE(name, gb)\
00508         ((uint32_t)name##_cache)
00509 
00510 static inline int get_bits_count(GetBitContext *s){
00511     return (s->buffer_ptr - s->buffer)*8 - 16 + s->bit_count;
00512 }
00513 
00514 static inline void skip_bits_long(GetBitContext *s, int n){
00515     OPEN_READER(re, s)
00516     re_bit_count += n;
00517     re_buffer_ptr += 2*(re_bit_count>>4);
00518     re_bit_count &= 15;
00519     re_cache = ((re_buffer_ptr[-2]<<8) + re_buffer_ptr[-1]) << (16+re_bit_count);
00520     UPDATE_CACHE(re, s)
00521     CLOSE_READER(re, s)
00522 }
00523 
00524 #elif defined A32_BITSTREAM_READER
00525 
00526 #   define MIN_CACHE_BITS 32
00527 
00528 #   define OPEN_READER(name, gb)\
00529         int name##_bit_count=(gb)->bit_count;\
00530         uint32_t name##_cache0= (gb)->cache0;\
00531         uint32_t name##_cache1= (gb)->cache1;\
00532         uint32_t * name##_buffer_ptr=(gb)->buffer_ptr;\
00533 
00534 #   define CLOSE_READER(name, gb)\
00535         (gb)->bit_count= name##_bit_count;\
00536         (gb)->cache0= name##_cache0;\
00537         (gb)->cache1= name##_cache1;\
00538         (gb)->buffer_ptr= name##_buffer_ptr;\
00539 
00540 #   define UPDATE_CACHE(name, gb)\
00541     if(name##_bit_count > 0){\
00542         const uint32_t next= be2me_32( *name##_buffer_ptr );\
00543         name##_cache0 |= NEG_USR32(next,name##_bit_count);\
00544         name##_cache1 |= next<<name##_bit_count;\
00545         name##_buffer_ptr++;\
00546         name##_bit_count-= 32;\
00547     }\
00548 
00549 #if ARCH_X86
00550 #   define SKIP_CACHE(name, gb, num)\
00551         __asm__(\
00552             "shldl %2, %1, %0          \n\t"\
00553             "shll %2, %1               \n\t"\
00554             : "+r" (name##_cache0), "+r" (name##_cache1)\
00555             : "Ic" ((uint8_t)(num))\
00556            );
00557 #else
00558 #   define SKIP_CACHE(name, gb, num)\
00559         name##_cache0 <<= (num);\
00560         name##_cache0 |= NEG_USR32(name##_cache1,num);\
00561         name##_cache1 <<= (num);
00562 #endif
00563 
00564 #   define SKIP_COUNTER(name, gb, num)\
00565         name##_bit_count += (num);\
00566 
00567 #   define SKIP_BITS(name, gb, num)\
00568         {\
00569             SKIP_CACHE(name, gb, num)\
00570             SKIP_COUNTER(name, gb, num)\
00571         }\
00572 
00573 #   define LAST_SKIP_BITS(name, gb, num) SKIP_BITS(name, gb, num)
00574 #   define LAST_SKIP_CACHE(name, gb, num) SKIP_CACHE(name, gb, num)
00575 
00576 #   define SHOW_UBITS(name, gb, num)\
00577         NEG_USR32(name##_cache0, num)
00578 
00579 #   define SHOW_SBITS(name, gb, num)\
00580         NEG_SSR32(name##_cache0, num)
00581 
00582 #   define GET_CACHE(name, gb)\
00583         (name##_cache0)
00584 
00585 static inline int get_bits_count(GetBitContext *s){
00586     return ((uint8_t*)s->buffer_ptr - s->buffer)*8 - 32 + s->bit_count;
00587 }
00588 
00589 static inline void skip_bits_long(GetBitContext *s, int n){
00590     OPEN_READER(re, s)
00591     re_bit_count += n;
00592     re_buffer_ptr += re_bit_count>>5;
00593     re_bit_count &= 31;
00594     re_cache0 = be2me_32( re_buffer_ptr[-1] ) << re_bit_count;
00595     re_cache1 = 0;
00596     UPDATE_CACHE(re, s)
00597     CLOSE_READER(re, s)
00598 }
00599 
00600 #endif
00601 
00608 static inline int get_xbits(GetBitContext *s, int n){
00609     register int sign;
00610     register int32_t cache;
00611     OPEN_READER(re, s)
00612     UPDATE_CACHE(re, s)
00613     cache = GET_CACHE(re,s);
00614     sign=(~cache)>>31;
00615     LAST_SKIP_BITS(re, s, n)
00616     CLOSE_READER(re, s)
00617     return (NEG_USR32(sign ^ cache, n) ^ sign) - sign;
00618 }
00619 
00620 static inline int get_sbits(GetBitContext *s, int n){
00621     register int tmp;
00622     OPEN_READER(re, s)
00623     UPDATE_CACHE(re, s)
00624     tmp= SHOW_SBITS(re, s, n);
00625     LAST_SKIP_BITS(re, s, n)
00626     CLOSE_READER(re, s)
00627     return tmp;
00628 }
00629 
00634 static inline unsigned int get_bits(GetBitContext *s, int n){
00635     register int tmp;
00636     OPEN_READER(re, s)
00637     UPDATE_CACHE(re, s)
00638     tmp= SHOW_UBITS(re, s, n);
00639     LAST_SKIP_BITS(re, s, n)
00640     CLOSE_READER(re, s)
00641     return tmp;
00642 }
00643 
00648 static inline unsigned int show_bits(GetBitContext *s, int n){
00649     register int tmp;
00650     OPEN_READER(re, s)
00651     UPDATE_CACHE(re, s)
00652     tmp= SHOW_UBITS(re, s, n);
00653 
00654     return tmp;
00655 }
00656 
00657 static inline void skip_bits(GetBitContext *s, int n){
00658  
00659     OPEN_READER(re, s)
00660     UPDATE_CACHE(re, s)
00661     LAST_SKIP_BITS(re, s, n)
00662     CLOSE_READER(re, s)
00663 }
00664 
00665 static inline unsigned int get_bits1(GetBitContext *s){
00666 #ifdef ALT_BITSTREAM_READER
00667     int index= s->index;
00668     uint8_t result= s->buffer[ index>>3 ];
00669 #ifdef ALT_BITSTREAM_READER_LE
00670     result>>= (index&0x07);
00671     result&= 1;
00672 #else
00673     result<<= (index&0x07);
00674     result>>= 8 - 1;
00675 #endif
00676     index++;
00677     s->index= index;
00678 
00679     return result;
00680 #else
00681     return get_bits(s, 1);
00682 #endif
00683 }
00684 
00685 static inline unsigned int show_bits1(GetBitContext *s){
00686     return show_bits(s, 1);
00687 }
00688 
00689 static inline void skip_bits1(GetBitContext *s){
00690     skip_bits(s, 1);
00691 }
00692 
00696 static inline unsigned int get_bits_long(GetBitContext *s, int n){
00697     if(n<=17) return get_bits(s, n);
00698     else{
00699 #ifdef ALT_BITSTREAM_READER_LE
00700         int ret= get_bits(s, 16);
00701         return ret | (get_bits(s, n-16) << 16);
00702 #else
00703         int ret= get_bits(s, 16) << (n-16);
00704         return ret | get_bits(s, n-16);
00705 #endif
00706     }
00707 }
00708 
00712 static inline unsigned int show_bits_long(GetBitContext *s, int n){
00713     if(n<=17) return show_bits(s, n);
00714     else{
00715         GetBitContext gb= *s;
00716         int ret= get_bits_long(s, n);
00717         *s= gb;
00718         return ret;
00719     }
00720 }
00721 
00722 static inline int check_marker(GetBitContext *s, const char *msg)
00723 {
00724     int bit= get_bits1(s);
00725     if(!bit)
00726         av_log(NULL, AV_LOG_INFO, "Marker bit missing %s\n", msg);
00727 
00728     return bit;
00729 }
00730 
00737 static inline void init_get_bits(GetBitContext *s,
00738                    const uint8_t *buffer, int bit_size)
00739 {
00740     int buffer_size= (bit_size+7)>>3;
00741     if(buffer_size < 0 || bit_size < 0) {
00742         buffer_size = bit_size = 0;
00743         buffer = NULL;
00744     }
00745 
00746     s->buffer= buffer;
00747     s->size_in_bits= bit_size;
00748     s->buffer_end= buffer + buffer_size;
00749 #ifdef ALT_BITSTREAM_READER
00750     s->index=0;
00751 #elif defined LIBMPEG2_BITSTREAM_READER
00752     s->buffer_ptr = (uint8_t*)((intptr_t)buffer&(~1));
00753     s->bit_count = 16 + 8*((intptr_t)buffer&1);
00754     skip_bits_long(s, 0);
00755 #elif defined A32_BITSTREAM_READER
00756     s->buffer_ptr = (uint32_t*)((intptr_t)buffer&(~3));
00757     s->bit_count = 32 + 8*((intptr_t)buffer&3);
00758     skip_bits_long(s, 0);
00759 #endif
00760 }
00761 
00762 static inline void align_get_bits(GetBitContext *s)
00763 {
00764     int n= (-get_bits_count(s)) & 7;
00765     if(n) skip_bits(s, n);
00766 }
00767 
00768 #define init_vlc(vlc, nb_bits, nb_codes,\
00769                  bits, bits_wrap, bits_size,\
00770                  codes, codes_wrap, codes_size,\
00771                  flags)\
00772         init_vlc_sparse(vlc, nb_bits, nb_codes,\
00773                  bits, bits_wrap, bits_size,\
00774                  codes, codes_wrap, codes_size,\
00775                  NULL, 0, 0, flags)
00776 
00777 int init_vlc_sparse(VLC *vlc, int nb_bits, int nb_codes,
00778              const void *bits, int bits_wrap, int bits_size,
00779              const void *codes, int codes_wrap, int codes_size,
00780              const void *symbols, int symbols_wrap, int symbols_size,
00781              int flags);
00782 #define INIT_VLC_USE_STATIC 1 
00783 #define INIT_VLC_LE         2
00784 #define INIT_VLC_USE_NEW_STATIC 4
00785 void free_vlc(VLC *vlc);
00786 
00787 #define INIT_VLC_STATIC(vlc, bits, a,b,c,d,e,f,g, static_size)\
00788 {\
00789     static VLC_TYPE table[static_size][2];\
00790     (vlc)->table= table;\
00791     (vlc)->table_allocated= static_size;\
00792     init_vlc(vlc, bits, a,b,c,d,e,f,g, INIT_VLC_USE_NEW_STATIC);\
00793 }
00794 
00795 
00802 #define GET_VLC(code, name, gb, table, bits, max_depth)\
00803 {\
00804     int n, index, nb_bits;\
00805 \
00806     index= SHOW_UBITS(name, gb, bits);\
00807     code = table[index][0];\
00808     n    = table[index][1];\
00809 \
00810     if(max_depth > 1 && n < 0){\
00811         LAST_SKIP_BITS(name, gb, bits)\
00812         UPDATE_CACHE(name, gb)\
00813 \
00814         nb_bits = -n;\
00815 \
00816         index= SHOW_UBITS(name, gb, nb_bits) + code;\
00817         code = table[index][0];\
00818         n    = table[index][1];\
00819         if(max_depth > 2 && n < 0){\
00820             LAST_SKIP_BITS(name, gb, nb_bits)\
00821             UPDATE_CACHE(name, gb)\
00822 \
00823             nb_bits = -n;\
00824 \
00825             index= SHOW_UBITS(name, gb, nb_bits) + code;\
00826             code = table[index][0];\
00827             n    = table[index][1];\
00828         }\
00829     }\
00830     SKIP_BITS(name, gb, n)\
00831 }
00832 
00833 #define GET_RL_VLC(level, run, name, gb, table, bits, max_depth, need_update)\
00834 {\
00835     int n, index, nb_bits;\
00836 \
00837     index= SHOW_UBITS(name, gb, bits);\
00838     level = table[index].level;\
00839     n     = table[index].len;\
00840 \
00841     if(max_depth > 1 && n < 0){\
00842         SKIP_BITS(name, gb, bits)\
00843         if(need_update){\
00844             UPDATE_CACHE(name, gb)\
00845         }\
00846 \
00847         nb_bits = -n;\
00848 \
00849         index= SHOW_UBITS(name, gb, nb_bits) + level;\
00850         level = table[index].level;\
00851         n     = table[index].len;\
00852     }\
00853     run= table[index].run;\
00854     SKIP_BITS(name, gb, n)\
00855 }
00856 
00857 
00866 static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE (*table)[2],
00867                                   int bits, int max_depth)
00868 {
00869     int code;
00870 
00871     OPEN_READER(re, s)
00872     UPDATE_CACHE(re, s)
00873 
00874     GET_VLC(code, re, s, table, bits, max_depth)
00875 
00876     CLOSE_READER(re, s)
00877     return code;
00878 }
00879 
00880 
00881 
00882 #ifdef TRACE
00883 static inline void print_bin(int bits, int n){
00884     int i;
00885 
00886     for(i=n-1; i>=0; i--){
00887         av_log(NULL, AV_LOG_DEBUG, "%d", (bits>>i)&1);
00888     }
00889     for(i=n; i<24; i++)
00890         av_log(NULL, AV_LOG_DEBUG, " ");
00891 }
00892 
00893 static inline int get_bits_trace(GetBitContext *s, int n, char *file, const char *func, int line){
00894     int r= get_bits(s, n);
00895 
00896     print_bin(r, n);
00897     av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d bit @%5d in %s %s:%d\n", r, n, r, get_bits_count(s)-n, file, func, line);
00898     return r;
00899 }
00900 static inline int get_vlc_trace(GetBitContext *s, VLC_TYPE (*table)[2], int bits, int max_depth, char *file, const char *func, int line){
00901     int show= show_bits(s, 24);
00902     int pos= get_bits_count(s);
00903     int r= get_vlc2(s, table, bits, max_depth);
00904     int len= get_bits_count(s) - pos;
00905     int bits2= show>>(24-len);
00906 
00907     print_bin(bits2, len);
00908 
00909     av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d vlc @%5d in %s %s:%d\n", bits2, len, r, pos, file, func, line);
00910     return r;
00911 }
00912 static inline int get_xbits_trace(GetBitContext *s, int n, char *file, const char *func, int line){
00913     int show= show_bits(s, n);
00914     int r= get_xbits(s, n);
00915 
00916     print_bin(show, n);
00917     av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d xbt @%5d in %s %s:%d\n", show, n, r, get_bits_count(s)-n, file, func, line);
00918     return r;
00919 }
00920 
00921 #define get_bits(s, n)  get_bits_trace(s, n, __FILE__, __PRETTY_FUNCTION__, __LINE__)
00922 #define get_bits1(s)    get_bits_trace(s, 1, __FILE__, __PRETTY_FUNCTION__, __LINE__)
00923 #define get_xbits(s, n) get_xbits_trace(s, n, __FILE__, __PRETTY_FUNCTION__, __LINE__)
00924 #define get_vlc(s, vlc)            get_vlc_trace(s, (vlc)->table, (vlc)->bits, 3, __FILE__, __PRETTY_FUNCTION__, __LINE__)
00925 #define get_vlc2(s, tab, bits, max) get_vlc_trace(s, tab, bits, max, __FILE__, __PRETTY_FUNCTION__, __LINE__)
00926 
00927 #define tprintf(p, ...) av_log(p, AV_LOG_DEBUG, __VA_ARGS__)
00928 
00929 #else //TRACE
00930 #define tprintf(p, ...) {}
00931 #endif
00932 
00933 static inline int decode012(GetBitContext *gb){
00934     int n;
00935     n = get_bits1(gb);
00936     if (n == 0)
00937         return 0;
00938     else
00939         return get_bits1(gb) + 1;
00940 }
00941 
00942 static inline int decode210(GetBitContext *gb){
00943     if (get_bits1(gb))
00944         return 0;
00945     else
00946         return 2 - get_bits1(gb);
00947 }
00948 
00949 static inline int get_bits_left(GetBitContext *gb)
00950 {
00951     return gb->size_in_bits - get_bits_count(gb);
00952 }
00953 
00954 #endif