552c01730e66cae910c8eec351be000b2741b04d
[libav.git] / libavcodec / golomb.h
1 /*
2 * exp golomb vlc stuff
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 *
19 */
20
21 /**
22 * @file golomb.h
23 * @brief
24 * exp golomb vlc stuff
25 * @author Michael Niedermayer <michaelni@gmx.at>
26 */
27
28 extern const uint8_t ff_golomb_vlc_len[512];
29 extern const uint8_t ff_ue_golomb_vlc_code[512];
30 extern const int8_t ff_se_golomb_vlc_code[512];
31 extern const uint8_t ff_ue_golomb_len[256];
32
33
34 /**
35 * read unsigned exp golomb code.
36 */
37 static inline int get_ue_golomb(GetBitContext *gb){
38 unsigned int buf;
39 int log;
40
41 OPEN_READER(re, gb);
42 UPDATE_CACHE(re, gb);
43 buf=GET_CACHE(re, gb);
44
45 if(buf >= (1<<27)){
46 buf >>= 32 - 9;
47 LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
48 CLOSE_READER(re, gb);
49
50 return ff_ue_golomb_vlc_code[buf];
51 }else{
52 log= 2*av_log2(buf) - 31;
53 buf>>= log;
54 buf--;
55 LAST_SKIP_BITS(re, gb, 32 - log);
56 CLOSE_READER(re, gb);
57
58 return buf;
59 }
60 }
61
62 /**
63 * read unsigned truncated exp golomb code.
64 */
65 static inline int get_te0_golomb(GetBitContext *gb, int range){
66 assert(range >= 1);
67
68 if(range==1) return 0;
69 else if(range==2) return get_bits1(gb);
70 else return get_ue_golomb(gb);
71 }
72
73 /**
74 * read unsigned truncated exp golomb code.
75 */
76 static inline int get_te_golomb(GetBitContext *gb, int range){
77 assert(range >= 1);
78
79 if(range==2) return get_bits1(gb);
80 else return get_ue_golomb(gb);
81 }
82
83
84 /**
85 * read signed exp golomb code.
86 */
87 static inline int get_se_golomb(GetBitContext *gb){
88 unsigned int buf;
89 int log;
90
91 OPEN_READER(re, gb);
92 UPDATE_CACHE(re, gb);
93 buf=GET_CACHE(re, gb);
94
95 if(buf >= (1<<27)){
96 buf >>= 32 - 9;
97 LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
98 CLOSE_READER(re, gb);
99
100 return ff_se_golomb_vlc_code[buf];
101 }else{
102 log= 2*av_log2(buf) - 31;
103 buf>>= log;
104
105 LAST_SKIP_BITS(re, gb, 32 - log);
106 CLOSE_READER(re, gb);
107
108 if(buf&1) buf= -(buf>>1);
109 else buf= (buf>>1);
110
111 return buf;
112 }
113 }
114
115 #ifdef TRACE
116
117 static inline int get_ue(GetBitContext *s, char *file, char *func, int line){
118 int show= show_bits(s, 24);
119 int pos= get_bits_count(s);
120 int i= get_ue_golomb(s);
121 int len= get_bits_count(s) - pos;
122 int bits= show>>(24-len);
123
124 print_bin(bits, len);
125
126 printf("%5d %2d %3d ue @%5d in %s %s:%d\n", bits, len, i, pos, file, func, line);
127
128 return i;
129 }
130
131 static inline int get_se(GetBitContext *s, char *file, char *func, int line){
132 int show= show_bits(s, 24);
133 int pos= get_bits_count(s);
134 int i= get_se_golomb(s);
135 int len= get_bits_count(s) - pos;
136 int bits= show>>(24-len);
137
138 print_bin(bits, len);
139
140 printf("%5d %2d %3d se @%5d in %s %s:%d\n", bits, len, i, pos, file, func, line);
141
142 return i;
143 }
144
145 static inline int get_te(GetBitContext *s, int r, char *file, char *func, int line){
146 int show= show_bits(s, 24);
147 int pos= get_bits_count(s);
148 int i= get_te0_golomb(s, r);
149 int len= get_bits_count(s) - pos;
150 int bits= show>>(24-len);
151
152 print_bin(bits, len);
153
154 printf("%5d %2d %3d te @%5d in %s %s:%d\n", bits, len, i, pos, file, func, line);
155
156 return i;
157 }
158
159 #define get_ue_golomb(a) get_ue(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
160 #define get_se_golomb(a) get_se(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
161 #define get_te_golomb(a, r) get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
162 #define get_te0_golomb(a, r) get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
163
164 #endif
165
166 /**
167 * write unsigned exp golomb code.
168 */
169 static inline void set_ue_golomb(PutBitContext *pb, int i){
170 int e;
171
172 assert(i>=0);
173
174 #if 0
175 if(i=0){
176 put_bits(pb, 1, 1);
177 return;
178 }
179 #endif
180 if(i<256)
181 put_bits(pb, ff_ue_golomb_len[i], i+1);
182 else{
183 e= av_log2(i+1);
184
185 put_bits(pb, 2*e+1, i+1);
186 }
187 }
188
189 /**
190 * write truncated unsigned exp golomb code.
191 */
192 static inline void set_te_golomb(PutBitContext *pb, int i, int range){
193 assert(range >= 1);
194 assert(i<=range);
195
196 if(range==2) put_bits(pb, 1, i);
197 else set_ue_golomb(pb, i);
198 }
199
200 /**
201 * write signed exp golomb code.
202 */
203 static inline void set_se_golomb(PutBitContext *pb, int i){
204 #if 0
205 if(i<=0) i= -2*i;
206 else i= 2*i-1;
207 #elif 1
208 i= 2*i-1;
209 if(i<0) i^= -1; //FIXME check if gcc does the right thing
210 #else
211 i= 2*i-1;
212 i^= (i>>31);
213 #endif
214 set_ue_golomb(pb, i);
215 }