• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 
12 #ifndef bool_coder_h
13 #define bool_coder_h 1
14 
15 /* Arithmetic bool coder with largish probability range.
16    Timothy S Murphy  6 August 2004 */
17 
18 /* So as not to force users to drag in too much of my idiosyncratic C++ world,
19    I avoid fancy storage management. */
20 
21 #include <assert.h>
22 
23 #include <stddef.h>
24 #include <stdio.h>
25 
26 typedef unsigned char vp8bc_index_t; // probability index
27 
28 /* There are a couple of slight variants in the details of finite-precision
29    arithmetic coding.  May be safely ignored by most users. */
30 
31 enum vp8bc_rounding
32 {
33     vp8bc_down = 0,     // just like VP8
34     vp8bc_down_full = 1, // handles minimum probability correctly
35     vp8bc_up = 2
36 };
37 
38 #if _MSC_VER
39 
40 /* Note that msvc by default does not inline _anything_ (regardless of the
41    setting of inline_depth) and that a command-line option (-Ob1 or -Ob2)
42    is required to inline even the smallest functions. */
43 
44 #   pragma inline_depth( 255)           // I mean it when I inline something
45 #   pragma warning( disable : 4099)     // No class vs. struct harassment
46 #   pragma warning( disable : 4250)     // dominance complaints
47 #   pragma warning( disable : 4284)     // operator-> in templates
48 #   pragma warning( disable : 4800)     // bool conversion
49 
50 // don't let prefix ++,-- stand in for postfix, disaster would ensue
51 
52 #   pragma warning( error : 4620 4621)
53 
54 #endif  // _MSC_VER
55 
56 
57 #if __cplusplus
58 
59 // Sometimes one wishes to be definite about integer lengths.
60 
61 struct int_types
62 {
63     typedef const bool cbool;
64     typedef const signed char cchar;
65     typedef const short cshort;
66     typedef const int cint;
67     typedef const int clong;
68 
69     typedef const double cdouble;
70     typedef const size_t csize_t;
71 
72     typedef unsigned char uchar;    // 8 bits
73     typedef const uchar cuchar;
74 
75     typedef short int16;
76     typedef unsigned short uint16;
77     typedef const int16 cint16;
78     typedef const uint16 cuint16;
79 
80     typedef int int32;
81     typedef unsigned int uint32;
82     typedef const int32 cint32;
83     typedef const uint32 cuint32;
84 
85     typedef unsigned int uint;
86     typedef unsigned int ulong;
87     typedef const uint cuint;
88     typedef const ulong culong;
89 
90 
91     // All structs consume space, may as well have a vptr.
92 
93     virtual ~int_types();
94 };
95 
96 
97 struct bool_coder_spec;
98 struct bool_coder;
99 struct bool_writer;
100 struct bool_reader;
101 
102 
103 struct bool_coder_namespace : int_types
104 {
105     typedef vp8bc_index_t Index;
106     typedef bool_coder_spec Spec;
107     typedef const Spec c_spec;
108 
109     enum Rounding
110     {
111         Down = vp8bc_down,
112         down_full = vp8bc_down_full,
113         Up = vp8bc_up
114     };
115 };
116 
117 
118 // Archivable specification of a bool coder includes rounding spec
119 // and probability mapping table.  The latter replaces a uchar j
120 // (0 <= j < 256) with an arbitrary uint16 tbl[j] = p.
121 // p/65536 is then the probability of a zero.
122 
123 struct bool_coder_spec : bool_coder_namespace
124 {
125     friend struct bool_coder;
126     friend struct bool_writer;
127     friend struct bool_reader;
128     friend struct bool_coder_spec_float;
129     friend struct bool_coder_spec_explicit_table;
130     friend struct bool_coder_spec_exponential_table;
131     friend struct BPsrc;
132 private:
133     uint w;                 // precision
134     Rounding r;
135 
136     uint ebits, mbits, ebias;
137     uint32 mmask;
138 
139     Index max_index, half_index;
140 
mantissabool_coder_spec141     uint32 mantissa(Index i) const
142     {
143         assert(i < half_index);
144         return (1 << mbits) + (i & mmask);
145     }
exponentbool_coder_spec146     uint exponent(Index i) const
147     {
148         assert(i < half_index);
149         return ebias - (i >> mbits);
150     }
151 
152     uint16 Ptbl[256];       // kinda clunky, but so is storage management.
153 
154     /* Cost in bits of encoding a zero at every probability, scaled by 2^20.
155        Assumes that index is at most 8 bits wide. */
156 
157     uint32 Ctbl[256];
158 
splitbool_coder_spec159     uint32 split(Index i, uint32 R) const    // 1 <= split <= max( 1, R-1)
160     {
161         if (!ebias)
162             return 1 + (((R - 1) * Ptbl[i]) >> 16);
163 
164         if (i >= half_index)
165             return R - split(max_index - i, R);
166 
167         return 1 + (((R - 1) * mantissa(i)) >> exponent(i));
168     }
169 
max_rangebool_coder_spec170     uint32 max_range() const
171     {
172         return (1 << w) - (r == down_full ? 0 : 1);
173     }
min_rangebool_coder_spec174     uint32 min_range() const
175     {
176         return (1 << (w - 1)) + (r == down_full ? 1 : 0);
177     }
Rincbool_coder_spec178     uint32 Rinc() const
179     {
180         return r == Up ? 1 : 0;
181     }
182 
183     void check_prec() const;
184 
185     bool float_init(uint Ebits, uint Mbits);
186 
187     void cost_init();
188 
189     bool_coder_spec(
190         uint prec, Rounding rr, uint Ebits = 0, uint Mbits = 0
191     )
wbool_coder_spec192         : w(prec), r(rr)
193     {
194         float_init(Ebits, Mbits);
195     }
196 public:
197     // Read complete spec from file.
198     bool_coder_spec(FILE *);
199 
200     // Write spec to file.
201     void dump(FILE *) const;
202 
203     // return probability index best approximating prob.
204     Index operator()(double prob) const;
205 
206     // probability corresponding to index
207     double operator()(Index i) const;
208 
complementbool_coder_spec209     Index complement(Index i) const
210     {
211         return max_index - i;
212     }
213 
max_indexbool_coder_spec214     Index max_index() const
215     {
216         return max_index;
217     }
half_indexbool_coder_spec218     Index half_index() const
219     {
220         return half_index;
221     }
222 
cost_zerobool_coder_spec223     uint32 cost_zero(Index i) const
224     {
225         return Ctbl[i];
226     }
cost_onebool_coder_spec227     uint32 cost_one(Index i) const
228     {
229         return Ctbl[ max_index - i];
230     }
cost_bitbool_coder_spec231     uint32 cost_bit(Index i, bool b) const
232     {
233         return Ctbl[b? max_index-i:i];
234     }
235 };
236 
237 
238 /* Pseudo floating-point probability specification.
239 
240    At least one of Ebits and Mbits must be nonzero.
241 
242    Since all arithmetic is done at 32 bits, Ebits is at most 5.
243 
244    Total significant bits in index is Ebits + Mbits + 1.
245 
246    Below the halfway point (i.e. when the top significant bit is 0),
247    the index is (e << Mbits) + m.
248 
249    The exponent e is between 0 and (2**Ebits) - 1,
250    the mantissa m is between 0 and (2**Mbits) - 1.
251 
252    Prepending an implicit 1 to the mantissa, the probability is then
253 
254         (2**Mbits + m) >> (e - 2**Ebits - 1 - Mbits),
255 
256    which has (1/2)**(2**Ebits + 1) as a minimum
257    and (1/2) * [1 - 2**(Mbits + 1)] as a maximum.
258 
259    When the index is above the halfway point, the probability is the
260    complement of the probability associated to the complement of the index.
261 
262    Note that the probability increases with the index and that, because of
263    the symmetry, we cannot encode probability exactly 1/2; though we
264    can get as close to 1/2 as we like, provided we have enough Mbits.
265 
266    The latter is of course not a problem in practice, one never has
267    exact probabilities and entropy errors are second order, that is, the
268    "overcoding" of a zero will be largely compensated for by the
269    "undercoding" of a one (or vice-versa).
270 
271    Compared to arithmetic probability specs (a la VP8), this will do better
272    at very high and low probabilities and worse at probabilities near 1/2,
273    as well as facilitating the usage of wider or narrower probability indices.
274 */
275 
276 struct bool_coder_spec_float : bool_coder_spec
277 {
278     bool_coder_spec_float(
279         uint Ebits = 3, uint Mbits = 4, Rounding rr = down_full, uint prec = 12
280     )
bool_coder_specbool_coder_spec_float281         : bool_coder_spec(prec, rr, Ebits, Mbits)
282     {
283         cost_init();
284     }
285 };
286 
287 
288 struct bool_coder_spec_explicit_table : bool_coder_spec
289 {
290     bool_coder_spec_explicit_table(
291         cuint16 probability_table[256] = 0,  // default is tbl[i] = i << 8.
292         Rounding = down_full,
293         uint precision = 16
294     );
295 };
296 
297 // Contruct table via multiplicative interpolation between
298 // p[128] = 1/2  and p[0] = (1/2)^x.
299 // Since we are working with 16-bit precision, x is at most 16.
300 // For probabilities to increase with i, we must have x > 1.
301 // For 0 <= i <= 128, p[i] = (1/2)^{ 1 + [1 - (i/128)]*[x-1] }.
302 // Finally, p[128+i] = 1 - p[128 - i].
303 
304 struct bool_coder_spec_exponential_table : bool_coder_spec
305 {
306     bool_coder_spec_exponential_table(uint x, Rounding = down_full, uint prec = 16);
307 };
308 
309 
310 // Commonalities between writer and reader.
311 
312 struct bool_coder : bool_coder_namespace
313 {
314     friend struct bool_writer;
315     friend struct bool_reader;
316     friend struct BPsrc;
317 private:
318     uint32 Low, Range;
319     cuint32 min_range;
320     cuint32 rinc;
321     c_spec spec;
322 
_resetbool_coder323     void _reset()
324     {
325         Low = 0;
326         Range = spec.max_range();
327     }
328 
bool_coderbool_coder329     bool_coder(c_spec &s)
330         :  min_range(s.min_range()),
331            rinc(s.Rinc()),
332            spec(s)
333     {
334         _reset();
335     }
336 
halfbool_coder337     uint32 half() const
338     {
339         return 1 + ((Range - 1) >> 1);
340     }
341 public:
Specbool_coder342     c_spec &Spec() const
343     {
344         return spec;
345     }
346 };
347 
348 
349 struct bool_writer : bool_coder
350 {
351     friend struct BPsrc;
352 private:
353     uchar *Bstart, *Bend, *B;
354     int bit_lag;
355     bool is_toast;
356     void carry();
resetbool_writer357     void reset()
358     {
359         _reset();
360         bit_lag = 32 - spec.w;
361         is_toast = 0;
362     }
363     void raw(bool value, uint32 split);
364 public:
365     bool_writer(c_spec &, uchar *Dest, size_t Len);
366     virtual ~bool_writer();
367 
operatorbool_writer368     void operator()(Index p, bool v)
369     {
370         raw(v, spec.split(p, Range));
371     }
372 
bufbool_writer373     uchar *buf() const
374     {
375         return Bstart;
376     }
bytes_writtenbool_writer377     size_t bytes_written() const
378     {
379         return B - Bstart;
380     }
381 
382     // Call when done with input, flushes internal state.
383     // DO NOT write any more data after calling this.
384 
385     bool_writer &flush();
386 
write_bitsbool_writer387     void write_bits(int n, uint val)
388     {
389         if (n)
390         {
391             uint m = 1 << (n - 1);
392 
393             do
394             {
395                 raw((bool)(val & m), half());
396             }
397             while (m >>= 1);
398         }
399     }
400 
401 #   if 0
402     // We are agnostic about storage management.
403     // By default, overflows throw an assert but user can
404     // override to provide an expanding buffer using ...
405 
406     virtual void overflow(uint Len) const;
407 
408     // ... this function copies already-written data into new buffer
409     // and retains new buffer location.
410 
411     void new_buffer(uchar *dest, uint Len);
412 
413     // Note that storage management is the user's responsibility.
414 #   endif
415 };
416 
417 
418 // This could be adjusted to use a little less lookahead.
419 
420 struct bool_reader : bool_coder
421 {
422     friend struct BPsrc;
423 private:
424     cuchar *const Bstart;   // for debugging
425     cuchar *B;
426     cuchar *const Bend;
427     cuint shf;
428     uint bct;
429     bool raw(uint32 split);
430 public:
431     bool_reader(c_spec &s, cuchar *src, size_t Len);
432 
operatorbool_reader433     bool operator()(Index p)
434     {
435         return raw(spec.split(p, Range));
436     }
437 
read_bitsbool_reader438     uint read_bits(int num_bits)
439     {
440         uint v = 0;
441 
442         while (--num_bits >= 0)
443             v += v + (raw(half()) ? 1 : 0);
444 
445         return v;
446     }
447 };
448 
449 extern "C" {
450 
451 #endif /*  __cplusplus */
452 
453 
454     /* C interface */
455 
456     typedef struct bool_coder_spec bool_coder_spec;
457     typedef struct bool_writer bool_writer;
458     typedef struct bool_reader bool_reader;
459 
460     typedef const bool_coder_spec c_bool_coder_spec;
461     typedef const bool_writer c_bool_writer;
462     typedef const bool_reader c_bool_reader;
463 
464 
465     /* Optionally override default precision when constructing coder_specs.
466        Just pass a zero pointer if you don't care.
467        Precision is at most 16 bits for table specs, at most 23 otherwise. */
468 
469     struct vp8bc_prec
470     {
471         enum vp8bc_rounding r;      /* see top header file for def */
472         unsigned int prec;          /* range precision in bits */
473     };
474 
475     typedef const struct vp8bc_prec vp8bc_c_prec;
476 
477     /* bool_coder_spec contains mapping of uchars to actual probabilities
478        (16 bit uints) as well as (usually immaterial) selection of
479        exact finite-precision algorithm used (for now, the latter can only
480        be overridden using the C++ interface).
481        See comments above the corresponding C++ constructors for discussion,
482        especially of exponential probability table generation. */
483 
484     bool_coder_spec *vp8bc_vp8spec(); // just like vp8
485 
486     bool_coder_spec *vp8bc_literal_spec(
487         const unsigned short prob_map[256],  // 0 is like vp8 w/more precision
488         vp8bc_c_prec*
489     );
490 
491     bool_coder_spec *vp8bc_float_spec(
492         unsigned int exponent_bits, unsigned int mantissa_bits, vp8bc_c_prec*
493     );
494 
495     bool_coder_spec *vp8bc_exponential_spec(unsigned int min_exp, vp8bc_c_prec *);
496 
497     bool_coder_spec *vp8bc_spec_from_file(FILE *);
498 
499 
500     void vp8bc_destroy_spec(c_bool_coder_spec *);
501 
502     void vp8bc_spec_to_file(c_bool_coder_spec *, FILE *);
503 
504 
505     /* Nearest index to supplied probability of zero, 0 <= prob <= 1. */
506 
507     vp8bc_index_t vp8bc_index(c_bool_coder_spec *, double prob);
508 
509     vp8bc_index_t vp8bc_index_from_counts(
510         c_bool_coder_spec *p, unsigned int zero_ct, unsigned int one_ct
511     );
512 
513     /* In case you want to look */
514 
515     double vp8bc_probability(c_bool_coder_spec *, vp8bc_index_t);
516 
517     /* Opposite index */
518 
519     vp8bc_index_t vp8bc_complement(c_bool_coder_spec *, vp8bc_index_t);
520 
521     /* Cost in bits of encoding a zero at given probability, scaled by 2^20.
522        (assumes that an int holds at least 32 bits). */
523 
524     unsigned int vp8bc_cost_zero(c_bool_coder_spec *, vp8bc_index_t);
525 
526     unsigned int vp8bc_cost_one(c_bool_coder_spec *, vp8bc_index_t);
527     unsigned int vp8bc_cost_bit(c_bool_coder_spec *, vp8bc_index_t, int);
528 
529 
530     /* bool_writer interface */
531 
532     /* Length = 0 disables checking for writes beyond buffer end. */
533 
534     bool_writer *vp8bc_create_writer(
535         c_bool_coder_spec *, unsigned char *Destination, size_t Length
536     );
537 
538     /* Flushes out any buffered data and returns total # of bytes written. */
539 
540     size_t vp8bc_destroy_writer(bool_writer *);
541 
542     void vp8bc_write_bool(bool_writer *, int boolean_val, vp8bc_index_t false_prob);
543 
544     void vp8bc_write_bits(
545         bool_writer *, unsigned int integer_value, int number_of_bits
546     );
547 
548     c_bool_coder_spec *vp8bc_writer_spec(c_bool_writer *);
549 
550 
551     /* bool_reader interface */
552 
553     /* Length = 0 disables checking for reads beyond buffer end. */
554 
555     bool_reader *vp8bc_create_reader(
556         c_bool_coder_spec *, const unsigned char *Source, size_t Length
557     );
558     void vp8bc_destroy_reader(bool_reader *);
559 
560     int vp8bc_read_bool(bool_reader *, vp8bc_index_t false_prob);
561 
562     unsigned int vp8bc_read_bits(bool_reader *, int number_of_bits);
563 
564     c_bool_coder_spec *vp8bc_reader_spec(c_bool_reader *);
565 
566 #if __cplusplus
567 }
568 #endif
569 
570 #endif  /* bool_coder_h */
571