649664368b1a8b177e9c50bc2978dee1bdc8cbbf
[libav.git] / libavcodec / golomb.h
1 /*
2 * exp golomb vlc stuff
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
4 * Copyright (c) 2004 Alex Beregszaszi
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 *
20 */
21
22 /**
23 * @file golomb.h
24 * @brief
25 * exp golomb vlc stuff
26 * @author Michael Niedermayer <michaelni@gmx.at> and Alex Beregszaszi
27 */
28
29 #define INVALID_VLC 0x80000000
30
31 extern const uint8_t ff_golomb_vlc_len[512];
32 extern const uint8_t ff_ue_golomb_vlc_code[512];
33 extern const int8_t ff_se_golomb_vlc_code[512];
34 extern const uint8_t ff_ue_golomb_len[256];
35
36 extern const uint8_t ff_interleaved_golomb_vlc_len[256];
37 extern const uint8_t ff_interleaved_ue_golomb_vlc_code[256];
38 extern const int8_t ff_interleaved_se_golomb_vlc_code[256];
39
40
41 /**
42 * read unsigned exp golomb code.
43 */
44 static inline int get_ue_golomb(GetBitContext *gb){
45 unsigned int buf;
46 int log;
47
48 OPEN_READER(re, gb);
49 UPDATE_CACHE(re, gb);
50 buf=GET_CACHE(re, gb);
51
52 if(buf >= (1<<27)){
53 buf >>= 32 - 9;
54 LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
55 CLOSE_READER(re, gb);
56
57 return ff_ue_golomb_vlc_code[buf];
58 }else{
59 log= 2*av_log2(buf) - 31;
60 buf>>= log;
61 buf--;
62 LAST_SKIP_BITS(re, gb, 32 - log);
63 CLOSE_READER(re, gb);
64
65 return buf;
66 }
67 }
68
69 static inline int svq3_get_ue_golomb(GetBitContext *gb){
70 uint32_t buf;
71 int log;
72
73 OPEN_READER(re, gb);
74 UPDATE_CACHE(re, gb);
75 buf=GET_CACHE(re, gb);
76
77 if(buf&0xAA800000){
78 buf >>= 32 - 8;
79 LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
80 CLOSE_READER(re, gb);
81
82 return ff_interleaved_ue_golomb_vlc_code[buf];
83 }else{
84 LAST_SKIP_BITS(re, gb, 8);
85 UPDATE_CACHE(re, gb);
86 buf |= 1 | (GET_CACHE(re, gb) >> 8);
87
88 if((buf & 0xAAAAAAAA) == 0)
89 return INVALID_VLC;
90
91 for(log=31; (buf & 0x80000000) == 0; log--){
92 buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
93 }
94
95 LAST_SKIP_BITS(re, gb, 63 - 2*log - 8);
96 CLOSE_READER(re, gb);
97
98 return ((buf << log) >> log) - 1;
99 }
100 }
101
102 /**
103 * read unsigned truncated exp golomb code.
104 */
105 static inline int get_te0_golomb(GetBitContext *gb, int range){
106 assert(range >= 1);
107
108 if(range==1) return 0;
109 else if(range==2) return get_bits1(gb)^1;
110 else return get_ue_golomb(gb);
111 }
112
113 /**
114 * read unsigned truncated exp golomb code.
115 */
116 static inline int get_te_golomb(GetBitContext *gb, int range){
117 assert(range >= 1);
118
119 if(range==2) return get_bits1(gb)^1;
120 else return get_ue_golomb(gb);
121 }
122
123
124 /**
125 * read signed exp golomb code.
126 */
127 static inline int get_se_golomb(GetBitContext *gb){
128 unsigned int buf;
129 int log;
130
131 OPEN_READER(re, gb);
132 UPDATE_CACHE(re, gb);
133 buf=GET_CACHE(re, gb);
134
135 if(buf >= (1<<27)){
136 buf >>= 32 - 9;
137 LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
138 CLOSE_READER(re, gb);
139
140 return ff_se_golomb_vlc_code[buf];
141 }else{
142 log= 2*av_log2(buf) - 31;
143 buf>>= log;
144
145 LAST_SKIP_BITS(re, gb, 32 - log);
146 CLOSE_READER(re, gb);
147
148 if(buf&1) buf= -(buf>>1);
149 else buf= (buf>>1);
150
151 return buf;
152 }
153 }
154
155 static inline int svq3_get_se_golomb(GetBitContext *gb){
156 unsigned int buf;
157 int log;
158
159 OPEN_READER(re, gb);
160 UPDATE_CACHE(re, gb);
161 buf=GET_CACHE(re, gb);
162
163 if(buf&0xAA800000){
164 buf >>= 32 - 8;
165 LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
166 CLOSE_READER(re, gb);
167
168 return ff_interleaved_se_golomb_vlc_code[buf];
169 }else{
170 buf |=1;
171 if((buf & 0xAAAAAAAA) == 0)
172 return INVALID_VLC;
173
174 for(log=31; (buf & 0x80000000) == 0; log--){
175 buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
176 }
177
178 LAST_SKIP_BITS(re, gb, 63 - 2*log);
179 CLOSE_READER(re, gb);
180
181 return (signed) (((((buf << log) >> log) - 1) ^ -(buf & 0x1)) + 1) >> 1;
182 }
183 }
184
185 /**
186 * read unsigned golomb rice code (ffv1).
187 */
188 static inline int get_ur_golomb(GetBitContext *gb, int k, int limit, int esc_len){
189 unsigned int buf;
190 int log;
191
192 OPEN_READER(re, gb);
193 UPDATE_CACHE(re, gb);
194 buf=GET_CACHE(re, gb);
195
196 log= av_log2(buf);
197
198 if(log > 31-limit){
199 buf >>= log - k;
200 buf += (30-log)<<k;
201 LAST_SKIP_BITS(re, gb, 32 + k - log);
202 CLOSE_READER(re, gb);
203
204 return buf;
205 }else{
206 buf >>= 32 - limit - esc_len;
207 LAST_SKIP_BITS(re, gb, esc_len + limit);
208 CLOSE_READER(re, gb);
209
210 return buf + limit - 1;
211 }
212 }
213
214 /**
215 * read unsigned golomb rice code (jpegls).
216 */
217 static inline int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit, int esc_len){
218 unsigned int buf;
219 int log;
220
221 OPEN_READER(re, gb);
222 UPDATE_CACHE(re, gb);
223 buf=GET_CACHE(re, gb);
224
225 log= av_log2(buf);
226
227 if(log > 31-11){
228 buf >>= log - k;
229 buf += (30-log)<<k;
230 LAST_SKIP_BITS(re, gb, 32 + k - log);
231 CLOSE_READER(re, gb);
232
233 return buf;
234 }else{
235 int i;
236 for(i=0; SHOW_UBITS(re, gb, 1) == 0; i++){
237 LAST_SKIP_BITS(re, gb, 1);
238 UPDATE_CACHE(re, gb);
239 }
240 SKIP_BITS(re, gb, 1);
241
242 if(i < limit - 1){
243 if(k){
244 buf = SHOW_UBITS(re, gb, k);
245 LAST_SKIP_BITS(re, gb, k);
246 }else{
247 buf=0;
248 }
249
250 CLOSE_READER(re, gb);
251 return buf + (i<<k);
252 }else if(i == limit - 1){
253 buf = SHOW_UBITS(re, gb, esc_len);
254 LAST_SKIP_BITS(re, gb, esc_len);
255 CLOSE_READER(re, gb);
256
257 return buf + 1;
258 }else
259 return -1;
260 }
261 }
262
263 /**
264 * read signed golomb rice code (ffv1).
265 */
266 static inline int get_sr_golomb_ffv1(GetBitContext *gb, int k, int limit, int esc_len){
267 int v= get_ur_golomb(gb, k, limit, esc_len);
268
269 v++;
270 if (v&1) return v>>1;
271 else return -(v>>1);
272
273 // return (v>>1) ^ -(v&1);
274 }
275 /**
276
277 * read signed golomb rice code (flac).
278 */
279 static inline int get_sr_golomb_flac(GetBitContext *gb, int k, int limit, int esc_len){
280 int v= get_ur_golomb_jpegls(gb, k, limit, esc_len);
281 return (v>>1) ^ -(v&1);
282 }
283
284 /**
285 * read signed golomb rice code (sonic).
286 */
287 static inline int get_sr_golomb_sonic(GetBitContext *gb, int k, int limit, int esc_len){
288 int v= get_ur_golomb(gb, k, limit, esc_len);
289
290 v++;
291 if (v&1) return -(v>>1);
292 else return v>>1;
293 }
294
295 #ifdef TRACE
296
297 static inline int get_ue(GetBitContext *s, char *file, char *func, int line){
298 int show= show_bits(s, 24);
299 int pos= get_bits_count(s);
300 int i= get_ue_golomb(s);
301 int len= get_bits_count(s) - pos;
302 int bits= show>>(24-len);
303
304 print_bin(bits, len);
305
306 av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d ue @%5d in %s %s:%d\n", bits, len, i, pos, file, func, line);
307
308 return i;
309 }
310
311 static inline int get_se(GetBitContext *s, char *file, char *func, int line){
312 int show= show_bits(s, 24);
313 int pos= get_bits_count(s);
314 int i= get_se_golomb(s);
315 int len= get_bits_count(s) - pos;
316 int bits= show>>(24-len);
317
318 print_bin(bits, len);
319
320 av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d se @%5d in %s %s:%d\n", bits, len, i, pos, file, func, line);
321
322 return i;
323 }
324
325 static inline int get_te(GetBitContext *s, int r, char *file, char *func, int line){
326 int show= show_bits(s, 24);
327 int pos= get_bits_count(s);
328 int i= get_te0_golomb(s, r);
329 int len= get_bits_count(s) - pos;
330 int bits= show>>(24-len);
331
332 print_bin(bits, len);
333
334 av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d te @%5d in %s %s:%d\n", bits, len, i, pos, file, func, line);
335
336 return i;
337 }
338
339 #define get_ue_golomb(a) get_ue(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
340 #define get_se_golomb(a) get_se(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
341 #define get_te_golomb(a, r) get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
342 #define get_te0_golomb(a, r) get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
343
344 #endif
345
346 /**
347 * write unsigned exp golomb code.
348 */
349 static inline void set_ue_golomb(PutBitContext *pb, int i){
350 int e;
351
352 assert(i>=0);
353
354 #if 0
355 if(i=0){
356 put_bits(pb, 1, 1);
357 return;
358 }
359 #endif
360 if(i<256)
361 put_bits(pb, ff_ue_golomb_len[i], i+1);
362 else{
363 e= av_log2(i+1);
364
365 put_bits(pb, 2*e+1, i+1);
366 }
367 }
368
369 /**
370 * write truncated unsigned exp golomb code.
371 */
372 static inline void set_te_golomb(PutBitContext *pb, int i, int range){
373 assert(range >= 1);
374 assert(i<=range);
375
376 if(range==2) put_bits(pb, 1, i^1);
377 else set_ue_golomb(pb, i);
378 }
379
380 /**
381 * write signed exp golomb code.
382 */
383 static inline void set_se_golomb(PutBitContext *pb, int i){
384 #if 0
385 if(i<=0) i= -2*i;
386 else i= 2*i-1;
387 #elif 1
388 i= 2*i-1;
389 if(i<0) i^= -1; //FIXME check if gcc does the right thing
390 #else
391 i= 2*i-1;
392 i^= (i>>31);
393 #endif
394 set_ue_golomb(pb, i);
395 }
396
397 /**
398 * write unsigned golomb rice code (ffv1).
399 */
400 static inline void set_ur_golomb(PutBitContext *pb, int i, int k, int limit, int esc_len){
401 int e;
402
403 assert(i>=0);
404
405 e= i>>k;
406 if(e<limit){
407 put_bits(pb, e + k + 1, (1<<k) + (i&((1<<k)-1)));
408 }else{
409 put_bits(pb, limit + esc_len, i - limit + 1);
410 }
411 }
412
413 /**
414 * write unsigned golomb rice code (jpegls).
415 */
416 static inline void set_ur_golomb_jpegls(PutBitContext *pb, int i, int k, int limit, int esc_len){
417 int e;
418
419 assert(i>=0);
420
421 e= (i>>k) + 1;
422 if(e<limit){
423 put_bits(pb, e, 1);
424 if(k)
425 put_bits(pb, k, i&((1<<k)-1));
426 }else{
427 put_bits(pb, limit , 1);
428 put_bits(pb, esc_len, i - 1);
429 }
430 }
431
432 /**
433 * write signed golomb rice code (ffv1).
434 */
435 static inline void set_sr_golomb_ffv1(PutBitContext *pb, int i, int k, int limit, int esc_len){
436 int v;
437
438 v = -2*i-1;
439 v ^= (v>>31);
440
441 set_ur_golomb(pb, v, k, limit, esc_len);
442 }
443
444 /**
445 * write signed golomb rice code (flac).
446 */
447 static inline void set_sr_golomb_flac(PutBitContext *pb, int i, int k, int limit, int esc_len){
448 int v;
449
450 v = -2*i-1;
451 v ^= (v>>31);
452
453 set_ur_golomb_jpegls(pb, v, k, limit, esc_len);
454 }
455
456 /**
457 * write signed golomb rice code (sonic).
458 */
459 static inline void set_sr_golomb_sonic(PutBitContext *pb, int i, int k, int limit, int esc_len){
460 int v;
461
462 v = 2*i-1;
463 if (v<0) v ^= -1;
464
465 set_ur_golomb(pb, v, k, limit, esc_len);
466 }