]> git.sesse.net Git - ffmpeg/blob - libavcodec/golomb.h
golomb: reduce scope of a few variables
[ffmpeg] / 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 file is part of Libav.
7  *
8  * Libav is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * Libav is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with Libav; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22
23 /**
24  * @file
25  * @brief
26  *     exp golomb vlc stuff
27  * @author Michael Niedermayer <michaelni@gmx.at> and Alex Beregszaszi
28  */
29
30 #ifndef AVCODEC_GOLOMB_H
31 #define AVCODEC_GOLOMB_H
32
33 #include <stdint.h>
34
35 #include "get_bits.h"
36 #include "put_bits.h"
37
38 #define INVALID_VLC           0x80000000
39
40 extern const uint8_t ff_golomb_vlc_len[512];
41 extern const uint8_t ff_ue_golomb_vlc_code[512];
42 extern const  int8_t ff_se_golomb_vlc_code[512];
43 extern const uint8_t ff_ue_golomb_len[256];
44
45 extern const uint8_t ff_interleaved_golomb_vlc_len[256];
46 extern const uint8_t ff_interleaved_ue_golomb_vlc_code[256];
47 extern const  int8_t ff_interleaved_se_golomb_vlc_code[256];
48 extern const uint8_t ff_interleaved_dirac_golomb_vlc_code[256];
49
50 /**
51  * read unsigned exp golomb code.
52  */
53 static inline int get_ue_golomb(GetBitContext *gb)
54 {
55     unsigned int buf;
56
57     OPEN_READER(re, gb);
58     UPDATE_CACHE(re, gb);
59     buf = GET_CACHE(re, gb);
60
61     if (buf >= (1 << 27)) {
62         buf >>= 32 - 9;
63         LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
64         CLOSE_READER(re, gb);
65
66         return ff_ue_golomb_vlc_code[buf];
67     } else {
68         int log = 2 * av_log2(buf) - 31;
69         buf >>= log;
70         buf--;
71         LAST_SKIP_BITS(re, gb, 32 - log);
72         CLOSE_READER(re, gb);
73
74         return buf;
75     }
76 }
77
78 /**
79  * Read an unsigned Exp-Golomb code in the range 0 to UINT32_MAX-1.
80  */
81 static inline unsigned get_ue_golomb_long(GetBitContext *gb)
82 {
83     unsigned buf, log;
84
85     buf = show_bits_long(gb, 32);
86     log = 31 - av_log2(buf);
87     skip_bits_long(gb, log);
88
89     return get_bits_long(gb, log + 1) - 1;
90 }
91
92 /**
93  * read unsigned exp golomb code, constraint to a max of 31.
94  * the return value is undefined if the stored value exceeds 31.
95  */
96 static inline int get_ue_golomb_31(GetBitContext *gb)
97 {
98     unsigned int buf;
99
100     OPEN_READER(re, gb);
101     UPDATE_CACHE(re, gb);
102     buf = GET_CACHE(re, gb);
103
104     buf >>= 32 - 9;
105     LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
106     CLOSE_READER(re, gb);
107
108     return ff_ue_golomb_vlc_code[buf];
109 }
110
111 static inline unsigned svq3_get_ue_golomb(GetBitContext *gb)
112 {
113     uint32_t buf;
114
115     OPEN_READER(re, gb);
116     UPDATE_CACHE(re, gb);
117     buf = GET_CACHE(re, gb);
118
119     if (buf & 0xAA800000) {
120         buf >>= 32 - 8;
121         LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
122         CLOSE_READER(re, gb);
123
124         return ff_interleaved_ue_golomb_vlc_code[buf];
125     } else {
126         unsigned ret = 1;
127
128         do {
129             buf >>= 32 - 8;
130             LAST_SKIP_BITS(re, gb,
131                            FFMIN(ff_interleaved_golomb_vlc_len[buf], 8));
132
133             if (ff_interleaved_golomb_vlc_len[buf] != 9) {
134                 ret <<= (ff_interleaved_golomb_vlc_len[buf] - 1) >> 1;
135                 ret  |= ff_interleaved_dirac_golomb_vlc_code[buf];
136                 break;
137             }
138             ret = (ret << 4) | ff_interleaved_dirac_golomb_vlc_code[buf];
139             UPDATE_CACHE(re, gb);
140             buf = GET_CACHE(re, gb);
141         } while (HAVE_BITS_REMAINING(re, gb));
142
143         CLOSE_READER(re, gb);
144         return ret - 1;
145     }
146 }
147
148 /**
149  * read unsigned truncated exp golomb code.
150  */
151 static inline int get_te0_golomb(GetBitContext *gb, int range)
152 {
153     assert(range >= 1);
154
155     if (range == 1)
156         return 0;
157     else if (range == 2)
158         return get_bits1(gb) ^ 1;
159     else
160         return get_ue_golomb(gb);
161 }
162
163 /**
164  * read unsigned truncated exp golomb code.
165  */
166 static inline int get_te_golomb(GetBitContext *gb, int range)
167 {
168     assert(range >= 1);
169
170     if (range == 2)
171         return get_bits1(gb) ^ 1;
172     else
173         return get_ue_golomb(gb);
174 }
175
176 /**
177  * read signed exp golomb code.
178  */
179 static inline int get_se_golomb(GetBitContext *gb)
180 {
181     unsigned int buf;
182
183     OPEN_READER(re, gb);
184     UPDATE_CACHE(re, gb);
185     buf = GET_CACHE(re, gb);
186
187     if (buf >= (1 << 27)) {
188         buf >>= 32 - 9;
189         LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
190         CLOSE_READER(re, gb);
191
192         return ff_se_golomb_vlc_code[buf];
193     } else {
194         int log = 2 * av_log2(buf) - 31;
195         buf >>= log;
196
197         LAST_SKIP_BITS(re, gb, 32 - log);
198         CLOSE_READER(re, gb);
199
200         if (buf & 1)
201             buf = -(buf >> 1);
202         else
203             buf = (buf >> 1);
204
205         return buf;
206     }
207 }
208
209 static inline int svq3_get_se_golomb(GetBitContext *gb)
210 {
211     unsigned int buf;
212
213     OPEN_READER(re, gb);
214     UPDATE_CACHE(re, gb);
215     buf = GET_CACHE(re, gb);
216
217     if (buf & 0xAA800000) {
218         buf >>= 32 - 8;
219         LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
220         CLOSE_READER(re, gb);
221
222         return ff_interleaved_se_golomb_vlc_code[buf];
223     } else {
224         int log;
225         LAST_SKIP_BITS(re, gb, 8);
226         UPDATE_CACHE(re, gb);
227         buf |= 1 | (GET_CACHE(re, gb) >> 8);
228
229         if ((buf & 0xAAAAAAAA) == 0)
230             return INVALID_VLC;
231
232         for (log = 31; (buf & 0x80000000) == 0; log--)
233             buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
234
235         LAST_SKIP_BITS(re, gb, 63 - 2 * log - 8);
236         CLOSE_READER(re, gb);
237
238         return (signed) (((((buf << log) >> log) - 1) ^ -(buf & 0x1)) + 1) >> 1;
239     }
240 }
241
242 static inline int dirac_get_se_golomb(GetBitContext *gb)
243 {
244     uint32_t ret = svq3_get_ue_golomb(gb);
245
246     if (ret) {
247         uint32_t buf;
248         OPEN_READER(re, gb);
249         UPDATE_CACHE(re, gb);
250         buf = SHOW_SBITS(re, gb, 1);
251         LAST_SKIP_BITS(re, gb, 1);
252         ret = (ret ^ buf) - buf;
253         CLOSE_READER(re, gb);
254     }
255
256     return ret;
257 }
258
259 /**
260  * read unsigned golomb rice code (ffv1).
261  */
262 static inline int get_ur_golomb(GetBitContext *gb, int k, int limit,
263                                 int esc_len)
264 {
265     unsigned int buf;
266     int log;
267
268     OPEN_READER(re, gb);
269     UPDATE_CACHE(re, gb);
270     buf = GET_CACHE(re, gb);
271
272     log = av_log2(buf);
273
274     if (log > 31 - limit) {
275         buf >>= log - k;
276         buf  += (30 - log) << k;
277         LAST_SKIP_BITS(re, gb, 32 + k - log);
278         CLOSE_READER(re, gb);
279
280         return buf;
281     } else {
282         LAST_SKIP_BITS(re, gb, limit);
283         UPDATE_CACHE(re, gb);
284
285         buf = SHOW_UBITS(re, gb, esc_len);
286
287         LAST_SKIP_BITS(re, gb, esc_len);
288         CLOSE_READER(re, gb);
289
290         return buf + limit - 1;
291     }
292 }
293
294 /**
295  * read unsigned golomb rice code (jpegls).
296  */
297 static inline int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit,
298                                        int esc_len)
299 {
300     unsigned int buf;
301     int log;
302
303     OPEN_READER(re, gb);
304     UPDATE_CACHE(re, gb);
305     buf = GET_CACHE(re, gb);
306
307     log = av_log2(buf);
308
309     if (log - k >= 32 - MIN_CACHE_BITS + (MIN_CACHE_BITS == 32) &&
310         32 - log < limit) {
311         buf >>= log - k;
312         buf  += (30 - log) << k;
313         LAST_SKIP_BITS(re, gb, 32 + k - log);
314         CLOSE_READER(re, gb);
315
316         return buf;
317     } else {
318         int i;
319         for (i = 0; i < limit && SHOW_UBITS(re, gb, 1) == 0 && HAVE_BITS_REMAINING(re, gb); i++) {
320             LAST_SKIP_BITS(re, gb, 1);
321             UPDATE_CACHE(re, gb);
322         }
323         SKIP_BITS(re, gb, 1);
324
325         if (i < limit - 1) {
326             if (k) {
327                 buf = SHOW_UBITS(re, gb, k);
328                 LAST_SKIP_BITS(re, gb, k);
329             } else {
330                 buf = 0;
331             }
332
333             CLOSE_READER(re, gb);
334             return buf + (i << k);
335         } else if (i == limit - 1) {
336             buf = SHOW_UBITS(re, gb, esc_len);
337             LAST_SKIP_BITS(re, gb, esc_len);
338             CLOSE_READER(re, gb);
339
340             return buf + 1;
341         } else
342             return -1;
343     }
344 }
345
346 /**
347  * read signed golomb rice code (ffv1).
348  */
349 static inline int get_sr_golomb(GetBitContext *gb, int k, int limit,
350                                 int esc_len)
351 {
352     int v = get_ur_golomb(gb, k, limit, esc_len);
353
354     v++;
355     if (v & 1)
356         return v >> 1;
357     else
358         return -(v >> 1);
359
360 //    return (v>>1) ^ -(v&1);
361 }
362
363 /**
364  * read signed golomb rice code (flac).
365  */
366 static inline int get_sr_golomb_flac(GetBitContext *gb, int k, int limit,
367                                      int esc_len)
368 {
369     int v = get_ur_golomb_jpegls(gb, k, limit, esc_len);
370     return (v >> 1) ^ -(v & 1);
371 }
372
373 /**
374  * read unsigned golomb rice code (shorten).
375  */
376 static inline unsigned int get_ur_golomb_shorten(GetBitContext *gb, int k)
377 {
378     return get_ur_golomb_jpegls(gb, k, INT_MAX, 0);
379 }
380
381 /**
382  * read signed golomb rice code (shorten).
383  */
384 static inline int get_sr_golomb_shorten(GetBitContext *gb, int k)
385 {
386     int uvar = get_ur_golomb_jpegls(gb, k + 1, INT_MAX, 0);
387     if (uvar & 1)
388         return ~(uvar >> 1);
389     else
390         return uvar >> 1;
391 }
392
393 #ifdef TRACE
394
395 static inline int get_ue(GetBitContext *s, const char *file, const char *func,
396                          int line)
397 {
398     int show = show_bits(s, 24);
399     int pos  = get_bits_count(s);
400     int i    = get_ue_golomb(s);
401     int len  = get_bits_count(s) - pos;
402     int bits = show >> (24 - len);
403
404     print_bin(bits, len);
405
406     av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d ue  @%5d in %s %s:%d\n",
407            bits, len, i, pos, file, func, line);
408
409     return i;
410 }
411
412 static inline int get_se(GetBitContext *s, const char *file, const char *func,
413                          int line)
414 {
415     int show = show_bits(s, 24);
416     int pos  = get_bits_count(s);
417     int i    = get_se_golomb(s);
418     int len  = get_bits_count(s) - pos;
419     int bits = show >> (24 - len);
420
421     print_bin(bits, len);
422
423     av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d se  @%5d in %s %s:%d\n",
424            bits, len, i, pos, file, func, line);
425
426     return i;
427 }
428
429 static inline int get_te(GetBitContext *s, int r, char *file, const char *func,
430                          int line)
431 {
432     int show = show_bits(s, 24);
433     int pos  = get_bits_count(s);
434     int i    = get_te0_golomb(s, r);
435     int len  = get_bits_count(s) - pos;
436     int bits = show >> (24 - len);
437
438     print_bin(bits, len);
439
440     av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d te  @%5d in %s %s:%d\n",
441            bits, len, i, pos, file, func, line);
442
443     return i;
444 }
445
446 #define get_ue_golomb(a) get_ue(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
447 #define get_se_golomb(a) get_se(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
448 #define get_te_golomb(a, r)  get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
449 #define get_te0_golomb(a, r) get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
450
451 #endif /* TRACE */
452
453 /**
454  * write unsigned exp golomb code.
455  */
456 static inline void set_ue_golomb(PutBitContext *pb, int i)
457 {
458     assert(i >= 0);
459
460 #if 0
461     if (i = 0) {
462         put_bits(pb, 1, 1);
463         return;
464     }
465 #endif
466     if (i < 256)
467         put_bits(pb, ff_ue_golomb_len[i], i + 1);
468     else {
469         int e = av_log2(i + 1);
470         put_bits(pb, 2 * e + 1, i + 1);
471     }
472 }
473
474 /**
475  * write truncated unsigned exp golomb code.
476  */
477 static inline void set_te_golomb(PutBitContext *pb, int i, int range)
478 {
479     assert(range >= 1);
480     assert(i <= range);
481
482     if (range == 2)
483         put_bits(pb, 1, i ^ 1);
484     else
485         set_ue_golomb(pb, i);
486 }
487
488 /**
489  * write signed exp golomb code. 16 bits at most.
490  */
491 static inline void set_se_golomb(PutBitContext *pb, int i)
492 {
493 #if 0
494     if (i <= 0)
495         i = -2 * i;
496     else
497         i = 2 * i - 1;
498 #elif 1
499     i = 2 * i - 1;
500     if (i < 0)
501         i ^= -1;    //FIXME check if gcc does the right thing
502 #else
503     i  = 2 * i - 1;
504     i ^= (i >> 31);
505 #endif
506     set_ue_golomb(pb, i);
507 }
508
509 /**
510  * write unsigned golomb rice code (ffv1).
511  */
512 static inline void set_ur_golomb(PutBitContext *pb, int i, int k, int limit,
513                                  int esc_len)
514 {
515     int e;
516
517     assert(i >= 0);
518
519     e = i >> k;
520     if (e < limit)
521         put_bits(pb, e + k + 1, (1 << k) + (i & ((1 << k) - 1)));
522     else
523         put_bits(pb, limit + esc_len, i - limit + 1);
524 }
525
526 /**
527  * write unsigned golomb rice code (jpegls).
528  */
529 static inline void set_ur_golomb_jpegls(PutBitContext *pb, int i, int k,
530                                         int limit, int esc_len)
531 {
532     int e;
533
534     assert(i >= 0);
535
536     e = (i >> k) + 1;
537     if (e < limit) {
538         while (e > 31) {
539             put_bits(pb, 31, 0);
540             e -= 31;
541         }
542         put_bits(pb, e, 1);
543         if (k)
544             put_sbits(pb, k, i);
545     } else {
546         while (limit > 31) {
547             put_bits(pb, 31, 0);
548             limit -= 31;
549         }
550         put_bits(pb, limit, 1);
551         put_bits(pb, esc_len, i - 1);
552     }
553 }
554
555 /**
556  * write signed golomb rice code (ffv1).
557  */
558 static inline void set_sr_golomb(PutBitContext *pb, int i, int k, int limit,
559                                  int esc_len)
560 {
561     int v;
562
563     v  = -2 * i - 1;
564     v ^= (v >> 31);
565
566     set_ur_golomb(pb, v, k, limit, esc_len);
567 }
568
569 /**
570  * write signed golomb rice code (flac).
571  */
572 static inline void set_sr_golomb_flac(PutBitContext *pb, int i, int k,
573                                       int limit, int esc_len)
574 {
575     int v;
576
577     v  = -2 * i - 1;
578     v ^= (v >> 31);
579
580     set_ur_golomb_jpegls(pb, v, k, limit, esc_len);
581 }
582
583 #endif /* AVCODEC_GOLOMB_H */