Commit | Line | Data |
---|---|---|
de6d9b64 FB |
1 | #ifndef COMMON_H |
2 | #define COMMON_H | |
3 | ||
4 | #include "../config.h" | |
5 | ||
980fc7b8 FB |
6 | #ifndef __WINE_WINDEF16_H |
7 | /* workaround for typedef conflict in MPlayer (wine typedefs) */ | |
de6d9b64 FB |
8 | typedef unsigned short UINT16; |
9 | typedef signed short INT16; | |
10 | #endif | |
11 | ||
12 | typedef unsigned char UINT8; | |
13 | typedef unsigned int UINT32; | |
14 | typedef unsigned long long UINT64; | |
15 | typedef signed char INT8; | |
16 | typedef signed int INT32; | |
17 | typedef signed long long INT64; | |
18 | ||
19 | /* bit output */ | |
20 | ||
21 | struct PutBitContext; | |
22 | ||
23 | typedef void (*WriteDataFunc)(void *, UINT8 *, int); | |
24 | ||
25 | typedef struct PutBitContext { | |
26 | UINT8 *buf, *buf_ptr, *buf_end; | |
27 | int bit_cnt; | |
28 | UINT32 bit_buf; | |
29 | long long data_out_size; /* in bytes */ | |
30 | void *opaque; | |
31 | WriteDataFunc write_data; | |
32 | } PutBitContext; | |
33 | ||
34 | void init_put_bits(PutBitContext *s, | |
35 | UINT8 *buffer, int buffer_size, | |
36 | void *opaque, | |
37 | void (*write_data)(void *, UINT8 *, int)); | |
38 | void put_bits(PutBitContext *s, int n, unsigned int value); | |
39 | long long get_bit_count(PutBitContext *s); | |
40 | void align_put_bits(PutBitContext *s); | |
41 | void flush_put_bits(PutBitContext *s); | |
42 | ||
43 | /* jpeg specific put_bits */ | |
44 | void jput_bits(PutBitContext *s, int n, unsigned int value); | |
45 | void jflush_put_bits(PutBitContext *s); | |
46 | ||
47 | /* bit input */ | |
48 | ||
49 | typedef struct GetBitContext { | |
50 | UINT8 *buf, *buf_ptr, *buf_end; | |
51 | int bit_cnt; | |
52 | UINT32 bit_buf; | |
53 | } GetBitContext; | |
54 | ||
55 | typedef struct VLC { | |
56 | int bits; | |
57 | INT16 *table_codes; | |
58 | INT8 *table_bits; | |
59 | int table_size, table_allocated; | |
60 | } VLC; | |
61 | ||
62 | void init_get_bits(GetBitContext *s, | |
63 | UINT8 *buffer, int buffer_size); | |
64 | ||
65 | unsigned int get_bits(GetBitContext *s, int n); | |
66 | void align_get_bits(GetBitContext *s); | |
67 | int init_vlc(VLC *vlc, int nb_bits, int nb_codes, | |
68 | const void *bits, int bits_wrap, int bits_size, | |
69 | const void *codes, int codes_wrap, int codes_size); | |
70 | void free_vlc(VLC *vlc); | |
71 | int get_vlc(GetBitContext *s, VLC *vlc); | |
72 | ||
73 | /* macro to go faster */ | |
74 | /* n must be <= 24 */ | |
75 | /* XXX: optimize buffer end test */ | |
76 | #define SHOW_BITS(s, val, n)\ | |
77 | {\ | |
78 | if (bit_cnt < n && buf_ptr < (s)->buf_end) {\ | |
79 | bit_buf |= *buf_ptr++ << (24 - bit_cnt);\ | |
80 | bit_cnt += 8;\ | |
81 | if (bit_cnt < n && buf_ptr < (s)->buf_end) {\ | |
82 | bit_buf |= *buf_ptr++ << (24 - bit_cnt);\ | |
83 | bit_cnt += 8;\ | |
84 | if (bit_cnt < n && buf_ptr < (s)->buf_end) {\ | |
85 | bit_buf |= *buf_ptr++ << (24 - bit_cnt);\ | |
86 | bit_cnt += 8;\ | |
87 | }\ | |
88 | }\ | |
89 | }\ | |
90 | val = bit_buf >> (32 - n);\ | |
91 | } | |
92 | ||
93 | /* SHOW_BITS with n1 >= n must be been done before */ | |
94 | #define FLUSH_BITS(n)\ | |
95 | {\ | |
96 | bit_buf <<= n;\ | |
97 | bit_cnt -= n;\ | |
98 | } | |
99 | ||
100 | #define SAVE_BITS(s) \ | |
101 | {\ | |
102 | bit_cnt = (s)->bit_cnt;\ | |
103 | bit_buf = (s)->bit_buf;\ | |
104 | buf_ptr = (s)->buf_ptr;\ | |
105 | } | |
106 | ||
107 | #define RESTORE_BITS(s) \ | |
108 | {\ | |
109 | (s)->buf_ptr = buf_ptr;\ | |
110 | (s)->bit_buf = bit_buf;\ | |
111 | (s)->bit_cnt = bit_cnt;\ | |
112 | } | |
113 | ||
114 | /* define it to include statistics code (useful only for optimizing | |
115 | codec efficiency */ | |
116 | //#define STATS | |
117 | ||
118 | #ifdef STATS | |
119 | ||
120 | enum { | |
121 | ST_UNKNOWN, | |
122 | ST_DC, | |
123 | ST_INTRA_AC, | |
124 | ST_INTER_AC, | |
125 | ST_INTRA_MB, | |
126 | ST_INTER_MB, | |
127 | ST_MV, | |
128 | ST_NB, | |
129 | }; | |
130 | ||
131 | extern int st_current_index; | |
132 | extern unsigned int st_bit_counts[ST_NB]; | |
133 | extern unsigned int st_out_bit_counts[ST_NB]; | |
134 | ||
135 | void print_stats(void); | |
136 | #endif | |
137 | ||
138 | /* misc math functions */ | |
139 | ||
140 | extern inline int log2(unsigned int v) | |
141 | { | |
142 | int n; | |
143 | ||
144 | n = 0; | |
145 | if (v & 0xffff0000) { | |
146 | v >>= 16; | |
147 | n += 16; | |
148 | } | |
149 | if (v & 0xff00) { | |
150 | v >>= 8; | |
151 | n += 8; | |
152 | } | |
153 | if (v & 0xf0) { | |
154 | v >>= 4; | |
155 | n += 4; | |
156 | } | |
157 | if (v & 0xc) { | |
158 | v >>= 2; | |
159 | n += 2; | |
160 | } | |
161 | if (v & 0x2) { | |
162 | n++; | |
163 | } | |
164 | return n; | |
165 | } | |
166 | ||
167 | /* memory */ | |
168 | void *av_mallocz(int size); | |
169 | ||
170 | #endif |