38379a4cfc0001031f587a67d576217b20ce7b69
[ffmpeg.git] / libavcodec / common.h
1 #ifndef COMMON_H
2 #define COMMON_H
3
4 #define FFMPEG_VERSION_INT 0x000406
5 #define FFMPEG_VERSION     "0.4.6"
6
7 #if defined(WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)
8 #define CONFIG_WIN32
9 #endif
10
11 //#define ALT_BITSTREAM_WRITER
12 //#define ALIGNED_BITSTREAM_WRITER
13 //#define ALT_BITSTREAM_READER
14 //#define ALIGNED_BITSTREAM
15 #define FAST_GET_FIRST_VLC
16 //#define DUMP_STREAM // only works with the ALT_BITSTREAM_READER
17
18 #ifdef HAVE_AV_CONFIG_H
19 /* only include the following when compiling package */
20 #include "../config.h"
21
22 #include <stdlib.h>
23 #include <stdio.h>
24 #include <string.h>
25 #include <errno.h>
26
27 #ifndef ENODATA
28 #define ENODATA  61
29 #endif
30
31 #endif
32
33 #ifdef CONFIG_WIN32
34
35 /* windows */
36
37 typedef unsigned short UINT16;
38 typedef signed short INT16;
39 typedef unsigned char UINT8;
40 typedef unsigned int UINT32;
41 typedef unsigned __int64 UINT64;
42 typedef signed char INT8;
43 typedef signed int INT32;
44 typedef signed __int64 INT64;
45
46 typedef UINT8 uint8_t;
47 typedef INT8 int8_t;
48 typedef UINT16 uint16_t;
49 typedef INT16 int16_t;
50 typedef UINT32 uint32_t;
51 typedef INT32 int32_t;
52
53 #ifndef __MINGW32__
54 #define INT64_C(c)     (c ## i64)
55 #define UINT64_C(c)    (c ## i64)
56
57 #define inline __inline
58
59 /*
60   Disable warning messages:
61     warning C4244: '=' : conversion from 'double' to 'float', possible loss of data
62     warning C4305: 'argument' : truncation from 'const double' to 'float'
63 */
64 #pragma warning( disable : 4244 )
65 #pragma warning( disable : 4305 )
66
67 #else
68 #define INT64_C(c)     (c ## LL)
69 #define UINT64_C(c)    (c ## ULL)
70 #endif /* __MINGW32__ */
71
72 #define M_PI    3.14159265358979323846
73 #define M_SQRT2 1.41421356237309504880  /* sqrt(2) */
74
75 #ifdef _DEBUG
76 #define DEBUG
77 #endif
78
79 // code from bits/byteswap.h (C) 1997, 1998 Free Software Foundation, Inc.
80 #define bswap_32(x) \
81      ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) | \
82       (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))
83 #define be2me_32(x) bswap_32(x)
84
85 #define snprintf _snprintf
86
87 #ifndef __MINGW32__
88 /* no config.h with VC */
89 #define CONFIG_ENCODERS 1
90 #define CONFIG_DECODERS 1
91 #define CONFIG_AC3      1
92 #endif
93
94 #else
95
96 /* unix */
97
98 #include <inttypes.h>
99
100 #ifndef __WINE_WINDEF16_H
101 /* workaround for typedef conflict in MPlayer (wine typedefs) */
102 typedef unsigned short UINT16;
103 typedef signed short INT16;
104 #endif
105
106 typedef unsigned char UINT8;
107 typedef unsigned int UINT32;
108 typedef unsigned long long UINT64;
109 typedef signed char INT8;
110 typedef signed int INT32;
111 typedef signed long long INT64;
112
113 #ifdef HAVE_AV_CONFIG_H
114
115 #ifdef __FreeBSD__
116 #include <sys/param.h>
117 #endif
118
119 #ifndef INT64_C
120 #define INT64_C(c)     (c ## LL)
121 #define UINT64_C(c)    (c ## ULL)
122 #endif
123
124 #include "../bswap.h"
125
126 #ifdef USE_FASTMEMCPY
127 #include "fastmemcpy.h"
128 #endif
129
130 #endif /* HAVE_AV_CONFIG_H */
131
132 #endif /* !CONFIG_WIN32 */
133
134
135 /* debug stuff */
136 #ifdef HAVE_AV_CONFIG_H
137
138 #ifndef DEBUG
139 #define NDEBUG
140 #endif
141 #include <assert.h>
142
143 /* dprintf macros */
144 #if defined(CONFIG_WIN32) && !defined(__MINGW32__)
145
146 inline void dprintf(const char* fmt,...) {}
147
148 #else
149
150 #ifdef DEBUG
151 #define dprintf(fmt,args...) printf(fmt, ## args)
152 #else
153 #define dprintf(fmt,args...)
154 #endif
155
156 #endif /* !CONFIG_WIN32 */
157
158 #endif /* HAVE_AV_CONFIG_H */
159
160 /* assume b>0 */
161 #define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b))
162 #define ABS(a) ((a) >= 0 ? (a) : (-(a)))
163
164 /* bit output */
165
166 struct PutBitContext;
167
168 typedef void (*WriteDataFunc)(void *, UINT8 *, int);
169
170 typedef struct PutBitContext {
171 #ifdef ALT_BITSTREAM_WRITER
172     UINT8 *buf, *buf_end;
173     int index;
174 #else
175     UINT32 bit_buf;
176     int bit_left;
177     UINT8 *buf, *buf_ptr, *buf_end;
178 #endif
179     INT64 data_out_size; /* in bytes */
180 } PutBitContext;
181
182 void init_put_bits(PutBitContext *s, 
183                    UINT8 *buffer, int buffer_size,
184                    void *opaque,
185                    void (*write_data)(void *, UINT8 *, int));
186
187 INT64 get_bit_count(PutBitContext *s); /* XXX: change function name */
188 void align_put_bits(PutBitContext *s);
189 void flush_put_bits(PutBitContext *s);
190 void put_string(PutBitContext * pbc, char *s);
191
192 /* jpeg specific put_bits */
193 void jflush_put_bits(PutBitContext *s);
194
195 /* bit input */
196
197 typedef struct GetBitContext {
198 #ifdef ALT_BITSTREAM_READER
199     int index;
200     UINT8 *buffer;
201 #else
202     UINT32 bit_buf;
203     int bit_cnt;
204     UINT8 *buf, *buf_ptr, *buf_end;
205 #endif
206     int size;
207 } GetBitContext;
208
209 static inline int get_bits_count(GetBitContext *s);
210
211 typedef struct VLC {
212     int bits;
213     INT16 *table_codes;
214     INT8 *table_bits;
215     int table_size, table_allocated;
216 } VLC;
217
218 /* used to avoid missaligned exceptions on some archs (alpha, ...) */
219 #ifdef ARCH_X86
220 #define unaligned32(a) (*(UINT32*)(a))
221 #else
222 #ifdef __GNUC__
223 static inline uint32_t unaligned32(const void *v) {
224     struct Unaligned {
225         uint32_t i;
226     } __attribute__((packed));
227
228     return ((const struct Unaligned *) v)->i;
229 }
230 #elif defined(__DECC)
231 static inline uint32_t unaligned32(const void *v) {
232     return *(const __unaligned uint32_t *) v;
233 }
234 #else
235 static inline uint32_t unaligned32(const void *v) {
236     return *(const uint32_t *) v;
237 }
238 #endif
239 #endif //!ARCH_X86
240
241 #ifndef ALT_BITSTREAM_WRITER
242 static inline void put_bits(PutBitContext *s, int n, unsigned int value)
243 {
244     unsigned int bit_buf;
245     int bit_left;
246
247 #ifdef STATS
248     st_out_bit_counts[st_current_index] += n;
249 #endif
250     //    printf("put_bits=%d %x\n", n, value);
251     assert(n == 32 || value < (1U << n));
252     
253     bit_buf = s->bit_buf;
254     bit_left = s->bit_left;
255
256     //    printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf);
257     /* XXX: optimize */
258     if (n < bit_left) {
259         bit_buf = (bit_buf<<n) | value;
260         bit_left-=n;
261     } else {
262         bit_buf<<=bit_left;
263         bit_buf |= value >> (n - bit_left);
264         *(UINT32 *)s->buf_ptr = be2me_32(bit_buf);
265         //printf("bitbuf = %08x\n", bit_buf);
266         s->buf_ptr+=4;
267         bit_left+=32 - n;
268         bit_buf = value;
269     }
270
271     s->bit_buf = bit_buf;
272     s->bit_left = bit_left;
273 }
274 #endif
275
276
277 #ifdef ALT_BITSTREAM_WRITER
278 static inline void put_bits(PutBitContext *s, int n, unsigned int value)
279 {
280 #ifdef ALIGNED_BITSTREAM_WRITER
281 #ifdef ARCH_X86
282     asm volatile(
283         "movl %0, %%ecx                 \n\t"
284         "xorl %%eax, %%eax              \n\t"
285         "shrdl %%cl, %1, %%eax          \n\t"
286         "shrl %%cl, %1                  \n\t"
287         "movl %0, %%ecx                 \n\t"
288         "shrl $3, %%ecx                 \n\t"
289         "andl $0xFFFFFFFC, %%ecx        \n\t"
290         "bswapl %1                      \n\t"
291         "orl %1, (%2, %%ecx)            \n\t"
292         "bswapl %%eax                   \n\t"
293         "addl %3, %0                    \n\t"
294         "movl %%eax, 4(%2, %%ecx)       \n\t"
295         : "=&r" (s->index), "=&r" (value)
296         : "r" (s->buf), "r" (n), "0" (s->index), "1" (value<<(-n))
297         : "%eax", "%ecx"
298     );
299 #else
300     int index= s->index;
301     uint32_t *ptr= ((uint32_t *)s->buf)+(index>>5);
302     
303     value<<= 32-n; 
304     
305     ptr[0] |= be2me_32(value>>(index&31));
306     ptr[1]  = be2me_32(value<<(32-(index&31)));
307 //if(n>24) printf("%d %d\n", n, value);
308     index+= n;
309     s->index= index;
310 #endif
311 #else //ALIGNED_BITSTREAM_WRITER
312 #ifdef ARCH_X86
313     asm volatile(
314         "movl $7, %%ecx                 \n\t"
315         "andl %0, %%ecx                 \n\t"
316         "addl %3, %%ecx                 \n\t"
317         "negl %%ecx                     \n\t"
318         "shll %%cl, %1                  \n\t"
319         "bswapl %1                      \n\t"
320         "movl %0, %%ecx                 \n\t"
321         "shrl $3, %%ecx                 \n\t"
322         "orl %1, (%%ecx, %2)            \n\t"
323         "addl %3, %0                    \n\t"
324         "movl $0, 4(%%ecx, %2)          \n\t"
325         : "=&r" (s->index), "=&r" (value)
326         : "r" (s->buf), "r" (n), "0" (s->index), "1" (value)
327         : "%ecx"
328     );
329 #else
330     int index= s->index;
331     uint32_t *ptr= (uint32_t*)(((uint8_t *)s->buf)+(index>>3));
332     
333     ptr[0] |= be2me_32(value<<(32-n-(index&7) ));
334     ptr[1] = 0;
335 //if(n>24) printf("%d %d\n", n, value);
336     index+= n;
337     s->index= index;
338 #endif
339 #endif //!ALIGNED_BITSTREAM_WRITER
340 }
341 #endif
342
343 #ifndef ALT_BITSTREAM_WRITER
344 /* for jpeg : escape 0xff with 0x00 after it */
345 static inline void jput_bits(PutBitContext *s, int n, unsigned int value)
346 {
347     unsigned int bit_buf, b;
348     int bit_left, i;
349     
350     assert(n == 32 || value < (1U << n));
351
352     bit_buf = s->bit_buf;
353     bit_left = s->bit_left;
354
355     //printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf);
356     /* XXX: optimize */
357     if (n < bit_left) {
358         bit_buf = (bit_buf<<n) | value;
359         bit_left-=n;
360     } else {
361         bit_buf<<=bit_left;
362         bit_buf |= value >> (n - bit_left);
363         /* handle escape */
364         for(i=0;i<4;i++) {
365             b = (bit_buf >> 24);
366             *(s->buf_ptr++) = b;
367             if (b == 0xff)
368                 *(s->buf_ptr++) = 0;
369             bit_buf <<= 8;
370         }
371
372         bit_left+= 32 - n;
373         bit_buf = value;
374     }
375     
376     s->bit_buf = bit_buf;
377     s->bit_left = bit_left;
378 }
379 #endif
380
381
382 #ifdef ALT_BITSTREAM_WRITER
383 static inline void jput_bits(PutBitContext *s, int n, int value)
384 {
385     int index= s->index;
386     uint32_t *ptr= (uint32_t*)(((uint8_t *)s->buf)+(index>>3));
387     int v= ptr[0];
388 //if(n>24) printf("%d %d\n", n, value);
389     
390     v |= be2me_32(value<<(32-n-(index&7) ));
391     if(((v+0x01010101)^0xFFFFFFFF)&v&0x80808080)
392     {
393         /* handle idiotic (m)jpeg escapes */
394         uint8_t *bPtr= (uint8_t*)ptr;
395         int numChecked= ((index+n)>>3) - (index>>3);
396         
397         v= be2me_32(v);
398
399         *(bPtr++)= v>>24;
400         if((v&0xFF000000)==0xFF000000 && numChecked>0){
401                 *(bPtr++)= 0x00;
402                 index+=8;
403         }
404         *(bPtr++)= (v>>16)&0xFF;
405         if((v&0x00FF0000)==0x00FF0000 && numChecked>1){
406                 *(bPtr++)= 0x00;
407                 index+=8;
408         }
409         *(bPtr++)= (v>>8)&0xFF;
410         if((v&0x0000FF00)==0x0000FF00 && numChecked>2){
411                 *(bPtr++)= 0x00;
412                 index+=8;
413         }
414         *(bPtr++)= v&0xFF;
415         if((v&0x000000FF)==0x000000FF && numChecked>3){
416                 *(bPtr++)= 0x00;
417                 index+=8;
418         }
419         *((uint32_t*)bPtr)= 0;
420     }
421     else
422     {
423         ptr[0] = v;
424         ptr[1] = 0;
425     }
426
427     index+= n;
428     s->index= index;
429  }
430 #endif
431
432
433 static inline uint8_t* pbBufPtr(PutBitContext *s)
434 {
435 #ifdef ALT_BITSTREAM_WRITER
436         return s->buf + (s->index>>3);
437 #else
438         return s->buf_ptr;
439 #endif
440 }
441
442 void init_get_bits(GetBitContext *s, 
443                    UINT8 *buffer, int buffer_size);
444
445 #ifndef ALT_BITSTREAM_READER
446 unsigned int get_bits_long(GetBitContext *s, int n);
447 unsigned int show_bits_long(GetBitContext *s, int n);
448 #endif
449
450 static inline unsigned int get_bits(GetBitContext *s, int n){
451 #ifdef ALT_BITSTREAM_READER
452 #ifdef ALIGNED_BITSTREAM
453     int index= s->index;
454     uint32_t result1= be2me_32( ((uint32_t *)s->buffer)[index>>5] );
455     uint32_t result2= be2me_32( ((uint32_t *)s->buffer)[(index>>5) + 1] );
456 #ifdef ARCH_X86
457     asm ("shldl %%cl, %2, %0\n\t"
458          : "=r" (result1)
459          : "0" (result1), "r" (result2), "c" (index));
460 #else
461     result1<<= (index&0x1F);
462     result2= (result2>>1) >> (31-(index&0x1F));
463     result1|= result2;
464 #endif
465     result1>>= 32 - n;
466     index+= n;
467     s->index= index;
468     
469     return result1;
470 #else //ALIGNED_BITSTREAM
471     int index= s->index;
472     uint32_t result= be2me_32( unaligned32( ((uint8_t *)s->buffer)+(index>>3) ) );
473
474     result<<= (index&0x07);
475     result>>= 32 - n;
476     index+= n;
477     s->index= index;
478 #ifdef DUMP_STREAM
479     while(n){
480         printf("%d", (result>>(n-1))&1);
481         n--;
482     }
483     printf(" ");
484 #endif
485     return result;
486 #endif //!ALIGNED_BITSTREAM
487 #else //ALT_BITSTREAM_READER
488     if(s->bit_cnt>=n){
489         /* most common case here */
490         unsigned int val = s->bit_buf >> (32 - n);
491         s->bit_buf <<= n;
492         s->bit_cnt -= n;
493 #ifdef STATS
494         st_bit_counts[st_current_index] += n;
495 #endif
496         return val;
497     }
498     return get_bits_long(s,n);
499 #endif //!ALT_BITSTREAM_READER
500 }
501
502 static inline unsigned int get_bits1(GetBitContext *s){
503 #ifdef ALT_BITSTREAM_READER
504     int index= s->index;
505     uint8_t result= s->buffer[ index>>3 ];
506     result<<= (index&0x07);
507     result>>= 8 - 1;
508     index++;
509     s->index= index;
510     
511 #ifdef DUMP_STREAM
512     printf("%d ", result);
513 #endif
514     return result;
515 #else
516     if(s->bit_cnt>0){
517         /* most common case here */
518         unsigned int val = s->bit_buf >> 31;
519         s->bit_buf <<= 1;
520         s->bit_cnt--;
521 #ifdef STATS
522         st_bit_counts[st_current_index]++;
523 #endif
524         return val;
525     }
526     return get_bits_long(s,1);
527 #endif
528 }
529
530 /* This function is identical to get_bits(), the only */
531 /* diference is that it doesn't touch the buffer      */
532 /* it is usefull to see the buffer.                   */
533 static inline unsigned int show_bits(GetBitContext *s, int n)
534 {
535 #ifdef ALT_BITSTREAM_READER
536 #ifdef ALIGNED_BITSTREAM
537     int index= s->index;
538     uint32_t result1= be2me_32( ((uint32_t *)s->buffer)[index>>5] );
539     uint32_t result2= be2me_32( ((uint32_t *)s->buffer)[(index>>5) + 1] );
540 #ifdef ARCH_X86
541     asm ("shldl %%cl, %2, %0\n\t"
542          : "=r" (result1)
543          : "0" (result1), "r" (result2), "c" (index));
544 #else
545     result1<<= (index&0x1F);
546     result2= (result2>>1) >> (31-(index&0x1F));
547     result1|= result2;
548 #endif
549     result1>>= 32 - n;
550     
551     return result1;
552 #else //ALIGNED_BITSTREAM
553     int index= s->index;
554     uint32_t result= be2me_32( unaligned32( ((uint8_t *)s->buffer)+(index>>3) ) );
555
556     result<<= (index&0x07);
557     result>>= 32 - n;
558     
559     return result;
560 #endif //!ALIGNED_BITSTREAM
561 #else //ALT_BITSTREAM_READER
562     if(s->bit_cnt>=n) {
563         /* most common case here */
564         unsigned int val = s->bit_buf >> (32 - n);
565         return val;
566     }
567     return show_bits_long(s,n);
568 #endif //!ALT_BITSTREAM_READER
569 }
570
571 static inline int show_aligned_bits(GetBitContext *s, int offset, int n)
572 {
573 #ifdef ALT_BITSTREAM_READER
574 #ifdef ALIGNED_BITSTREAM
575     int index= (s->index + offset + 7)&(~7);
576     uint32_t result1= be2me_32( ((uint32_t *)s->buffer)[index>>5] );
577     uint32_t result2= be2me_32( ((uint32_t *)s->buffer)[(index>>5) + 1] );
578 #ifdef ARCH_X86
579     asm ("shldl %%cl, %2, %0\n\t"
580          : "=r" (result1)
581          : "0" (result1), "r" (result2), "c" (index));
582 #else
583     result1<<= (index&0x1F);
584     result2= (result2>>1) >> (31-(index&0x1F));
585     result1|= result2;
586 #endif
587     result1>>= 32 - n;
588     
589     return result1;
590 #else //ALIGNED_BITSTREAM
591     int index= (s->index + offset + 7)>>3;
592     uint32_t result= be2me_32( unaligned32( ((uint8_t *)s->buffer)+index ) );
593
594     result>>= 32 - n;
595     
596     return result;
597 #endif //!ALIGNED_BITSTREAM
598 #else //ALT_BITSTREAM_READER
599     int index= (get_bits_count(s) + offset + 7)>>3;
600     uint32_t result= be2me_32( unaligned32( ((uint8_t *)s->buf)+index ) );
601
602     result>>= 32 - n;
603 //printf(" %X %X %d \n", (int)(((uint8_t *)s->buf)+index ), (int)s->buf_ptr, s->bit_cnt);    
604     return result;
605 #endif //!ALT_BITSTREAM_READER
606 }
607
608 static inline void skip_bits(GetBitContext *s, int n){
609 #ifdef ALT_BITSTREAM_READER
610     s->index+= n;
611 #ifdef DUMP_STREAM
612     {
613         int result;
614         s->index-= n;
615         result= get_bits(s, n);
616     }
617 #endif
618
619 #else
620     if(s->bit_cnt>=n){
621         /* most common case here */
622         s->bit_buf <<= n;
623         s->bit_cnt -= n;
624 #ifdef STATS
625         st_bit_counts[st_current_index] += n;
626 #endif
627     } else {
628         get_bits_long(s,n);
629     }
630 #endif
631 }
632
633 static inline void skip_bits1(GetBitContext *s){
634 #ifdef ALT_BITSTREAM_READER
635     s->index++;
636 #ifdef DUMP_STREAM
637     s->index--;
638     printf("%d ", get_bits1(s));
639 #endif
640 #else
641     if(s->bit_cnt>0){
642         /* most common case here */
643         s->bit_buf <<= 1;
644         s->bit_cnt--;
645 #ifdef STATS
646         st_bit_counts[st_current_index]++;
647 #endif
648     } else {
649         get_bits_long(s,1);
650     }
651 #endif
652 }
653
654 static inline int get_bits_count(GetBitContext *s)
655 {
656 #ifdef ALT_BITSTREAM_READER
657     return s->index;
658 #else
659     return (s->buf_ptr - s->buf) * 8 - s->bit_cnt;
660 #endif
661 }
662
663 int check_marker(GetBitContext *s, char *msg);
664 void align_get_bits(GetBitContext *s);
665 int init_vlc(VLC *vlc, int nb_bits, int nb_codes,
666              const void *bits, int bits_wrap, int bits_size,
667              const void *codes, int codes_wrap, int codes_size);
668 void free_vlc(VLC *vlc);
669
670 #ifdef ALT_BITSTREAM_READER
671 #ifdef ALIGNED_BITSTREAM
672 #ifdef ARCH_X86
673 #define SHOW_BITS(s, val, n) \
674     val= be2me_32( ((uint32_t *)(s)->buffer)[bit_cnt>>5] );\
675     {uint32_t result2= be2me_32( ((uint32_t *)(s)->buffer)[(bit_cnt>>5) + 1] );\
676     asm ("shldl %%cl, %2, %0\n\t"\
677          : "=r" (val)\
678          : "0" (val), "r" (result2), "c" (bit_cnt));\
679     ((uint32_t)val)>>= 32 - n;}
680 #else //ARCH_X86
681 #define SHOW_BITS(s, val, n) \
682     val= be2me_32( ((uint32_t *)(s)->buffer)[bit_cnt>>5] );\
683     {uint32_t result2= be2me_32( ((uint32_t *)(s)->buffer)[(bit_cnt>>5) + 1] );\
684     val<<= (bit_cnt&0x1F);\
685     result2= (result2>>1) >> (31-(bit_cnt&0x1F));\
686     val|= result2;\
687     ((uint32_t)val)>>= 32 - n;}
688 #endif //!ARCH_X86
689 #else //ALIGNED_BITSTREAM
690 #define SHOW_BITS(s, val, n) \
691     val= be2me_32( unaligned32( ((uint8_t *)(s)->buffer)+(bit_cnt>>3) ) );\
692     val<<= (bit_cnt&0x07);\
693     ((uint32_t)val)>>= 32 - n;
694 #endif // !ALIGNED_BITSTREAM
695 #define FLUSH_BITS(n) bit_cnt+=n; 
696 #define SAVE_BITS(s) bit_cnt= (s)->index;
697 #define RESTORE_BITS(s) (s)->index= bit_cnt;
698 #else
699
700 /* macro to go faster */
701 /* n must be <= 24 */
702 /* XXX: optimize buffer end test */
703 #define SHOW_BITS(s, val, n)\
704 {\
705     if (bit_cnt < n && buf_ptr < (s)->buf_end) {\
706         bit_buf |= *buf_ptr++ << (24 - bit_cnt);\
707         bit_cnt += 8;\
708         if (bit_cnt < n && buf_ptr < (s)->buf_end) {\
709             bit_buf |= *buf_ptr++ << (24 - bit_cnt);\
710             bit_cnt += 8;\
711             if (bit_cnt < n && buf_ptr < (s)->buf_end) {\
712                 bit_buf |= *buf_ptr++ << (24 - bit_cnt);\
713                 bit_cnt += 8;\
714             }\
715         }\
716     }\
717     val = bit_buf >> (32 - n);\
718 }
719
720 /* SHOW_BITS with n1 >= n must be been done before */
721 #define FLUSH_BITS(n)\
722 {\
723     bit_buf <<= n;\
724     bit_cnt -= n;\
725 }
726
727 #define SAVE_BITS(s) \
728 {\
729     bit_cnt = (s)->bit_cnt;\
730     bit_buf = (s)->bit_buf;\
731     buf_ptr = (s)->buf_ptr;\
732 }
733
734 #define RESTORE_BITS(s) \
735 {\
736     (s)->buf_ptr = buf_ptr;\
737     (s)->bit_buf = bit_buf;\
738     (s)->bit_cnt = bit_cnt;\
739 }
740 #endif // !ALT_BITSTREAM_READER
741
742 static inline int get_vlc(GetBitContext *s, VLC *vlc)
743 {
744     int code, n, nb_bits, index;
745     INT16 *table_codes;
746     INT8 *table_bits;
747     int bit_cnt;
748 #ifndef ALT_BITSTREAM_READER
749     UINT32 bit_buf;
750     UINT8 *buf_ptr;
751 #endif
752
753     SAVE_BITS(s);
754     nb_bits = vlc->bits;
755     table_codes = vlc->table_codes;
756     table_bits = vlc->table_bits;
757
758 #ifdef FAST_GET_FIRST_VLC
759     SHOW_BITS(s, index, nb_bits);
760     code = table_codes[index];
761     n = table_bits[index];
762     if (n > 0) {
763         /* most common case (90%)*/
764         FLUSH_BITS(n);
765 #ifdef DUMP_STREAM
766         {
767             int n= bit_cnt - s->index;
768             skip_bits(s, n);
769             RESTORE_BITS(s);
770         }
771 #endif
772         RESTORE_BITS(s);
773         return code;
774     } else if (n == 0) {
775         return -1;
776     } else {
777         FLUSH_BITS(nb_bits);
778         nb_bits = -n;
779         table_codes = vlc->table_codes + code;
780         table_bits = vlc->table_bits + code;
781     }
782 #endif
783     for(;;) {
784         SHOW_BITS(s, index, nb_bits);
785         code = table_codes[index];
786         n = table_bits[index];
787         if (n > 0) {
788             /* most common case */
789             FLUSH_BITS(n);
790 #ifdef STATS
791             st_bit_counts[st_current_index] += n;
792 #endif
793             break;
794         } else if (n == 0) {
795             return -1;
796         } else {
797             FLUSH_BITS(nb_bits);
798 #ifdef STATS
799             st_bit_counts[st_current_index] += nb_bits;
800 #endif
801             nb_bits = -n;
802             table_codes = vlc->table_codes + code;
803             table_bits = vlc->table_bits + code;
804         }
805     }
806 #ifdef DUMP_STREAM
807     {
808         int n= bit_cnt - s->index;
809         skip_bits(s, n);
810         RESTORE_BITS(s);
811     }
812 #endif
813     RESTORE_BITS(s);
814     return code;
815 }
816
817
818 /* define it to include statistics code (useful only for optimizing
819    codec efficiency */
820 //#define STATS
821
822 #ifdef STATS
823
824 enum {
825     ST_UNKNOWN,
826     ST_DC,
827     ST_INTRA_AC,
828     ST_INTER_AC,
829     ST_INTRA_MB,
830     ST_INTER_MB,
831     ST_MV,
832     ST_NB,
833 };
834
835 extern int st_current_index;
836 extern unsigned int st_bit_counts[ST_NB];
837 extern unsigned int st_out_bit_counts[ST_NB];
838
839 void print_stats(void);
840 #endif
841
842 /* misc math functions */
843
844 static inline int av_log2(unsigned int v)
845 {
846     int n;
847
848     n = 0;
849     if (v & 0xffff0000) {
850         v >>= 16;
851         n += 16;
852     }
853     if (v & 0xff00) {
854         v >>= 8;
855         n += 8;
856     }
857     if (v & 0xf0) {
858         v >>= 4;
859         n += 4;
860     }
861     if (v & 0xc) {
862         v >>= 2;
863         n += 2;
864     }
865     if (v & 0x2) {
866         n++;
867     }
868     return n;
869 }
870
871 /* median of 3 */
872 static inline int mid_pred(int a, int b, int c)
873 {
874     int vmin, vmax;
875     vmax = vmin = a;
876     if (b < vmin)
877         vmin = b;
878     else
879         vmax = b;
880
881     if (c < vmin)
882         vmin = c;
883     else if (c > vmax)
884         vmax = c;
885
886     return a + b + c - vmin - vmax;
887 }
888
889 static inline int clip(int a, int amin, int amax)
890 {
891     if (a < amin)
892         return amin;
893     else if (a > amax)
894         return amax;
895     else
896         return a;
897 }
898
899 /* memory */
900 void *av_mallocz(int size);
901
902 /* math */
903 int ff_gcd(int a, int b);
904
905 #define CLAMP_TO_8BIT(d) ((d > 0xff) ? 0xff : (d < 0) ? 0 : d)
906
907 #endif