1*4d1abfb2Sjoerg ///////////////////////////////////////////////////////////////////////////////
2*4d1abfb2Sjoerg //
3*4d1abfb2Sjoerg /// \file range_encoder.h
4*4d1abfb2Sjoerg /// \brief Range Encoder
5*4d1abfb2Sjoerg ///
6*4d1abfb2Sjoerg // Authors: Igor Pavlov
7*4d1abfb2Sjoerg // Lasse Collin
8*4d1abfb2Sjoerg //
9*4d1abfb2Sjoerg // This file has been put into the public domain.
10*4d1abfb2Sjoerg // You can do whatever you want with this file.
11*4d1abfb2Sjoerg //
12*4d1abfb2Sjoerg ///////////////////////////////////////////////////////////////////////////////
13*4d1abfb2Sjoerg
14*4d1abfb2Sjoerg #ifndef LZMA_RANGE_ENCODER_H
15*4d1abfb2Sjoerg #define LZMA_RANGE_ENCODER_H
16*4d1abfb2Sjoerg
17*4d1abfb2Sjoerg #include "range_common.h"
18*4d1abfb2Sjoerg #include "price.h"
19*4d1abfb2Sjoerg
20*4d1abfb2Sjoerg
21*4d1abfb2Sjoerg /// Maximum number of symbols that can be put pending into lzma_range_encoder
22*4d1abfb2Sjoerg /// structure between calls to lzma_rc_encode(). For LZMA, 52+5 is enough
23*4d1abfb2Sjoerg /// (match with big distance and length followed by range encoder flush).
24*4d1abfb2Sjoerg #define RC_SYMBOLS_MAX 58
25*4d1abfb2Sjoerg
26*4d1abfb2Sjoerg
27*4d1abfb2Sjoerg typedef struct {
28*4d1abfb2Sjoerg uint64_t low;
29*4d1abfb2Sjoerg uint64_t cache_size;
30*4d1abfb2Sjoerg uint32_t range;
31*4d1abfb2Sjoerg uint8_t cache;
32*4d1abfb2Sjoerg
33*4d1abfb2Sjoerg /// Number of symbols in the tables
34*4d1abfb2Sjoerg size_t count;
35*4d1abfb2Sjoerg
36*4d1abfb2Sjoerg /// rc_encode()'s position in the tables
37*4d1abfb2Sjoerg size_t pos;
38*4d1abfb2Sjoerg
39*4d1abfb2Sjoerg /// Symbols to encode
40*4d1abfb2Sjoerg enum {
41*4d1abfb2Sjoerg RC_BIT_0,
42*4d1abfb2Sjoerg RC_BIT_1,
43*4d1abfb2Sjoerg RC_DIRECT_0,
44*4d1abfb2Sjoerg RC_DIRECT_1,
45*4d1abfb2Sjoerg RC_FLUSH,
46*4d1abfb2Sjoerg } symbols[RC_SYMBOLS_MAX];
47*4d1abfb2Sjoerg
48*4d1abfb2Sjoerg /// Probabilities associated with RC_BIT_0 or RC_BIT_1
49*4d1abfb2Sjoerg probability *probs[RC_SYMBOLS_MAX];
50*4d1abfb2Sjoerg
51*4d1abfb2Sjoerg } lzma_range_encoder;
52*4d1abfb2Sjoerg
53*4d1abfb2Sjoerg
54*4d1abfb2Sjoerg static inline void
rc_reset(lzma_range_encoder * rc)55*4d1abfb2Sjoerg rc_reset(lzma_range_encoder *rc)
56*4d1abfb2Sjoerg {
57*4d1abfb2Sjoerg rc->low = 0;
58*4d1abfb2Sjoerg rc->cache_size = 1;
59*4d1abfb2Sjoerg rc->range = UINT32_MAX;
60*4d1abfb2Sjoerg rc->cache = 0;
61*4d1abfb2Sjoerg rc->count = 0;
62*4d1abfb2Sjoerg rc->pos = 0;
63*4d1abfb2Sjoerg }
64*4d1abfb2Sjoerg
65*4d1abfb2Sjoerg
66*4d1abfb2Sjoerg static inline void
rc_bit(lzma_range_encoder * rc,probability * prob,uint32_t bit)67*4d1abfb2Sjoerg rc_bit(lzma_range_encoder *rc, probability *prob, uint32_t bit)
68*4d1abfb2Sjoerg {
69*4d1abfb2Sjoerg rc->symbols[rc->count] = bit;
70*4d1abfb2Sjoerg rc->probs[rc->count] = prob;
71*4d1abfb2Sjoerg ++rc->count;
72*4d1abfb2Sjoerg }
73*4d1abfb2Sjoerg
74*4d1abfb2Sjoerg
75*4d1abfb2Sjoerg static inline void
rc_bittree(lzma_range_encoder * rc,probability * probs,uint32_t bit_count,uint32_t symbol)76*4d1abfb2Sjoerg rc_bittree(lzma_range_encoder *rc, probability *probs,
77*4d1abfb2Sjoerg uint32_t bit_count, uint32_t symbol)
78*4d1abfb2Sjoerg {
79*4d1abfb2Sjoerg uint32_t model_index = 1;
80*4d1abfb2Sjoerg
81*4d1abfb2Sjoerg do {
82*4d1abfb2Sjoerg const uint32_t bit = (symbol >> --bit_count) & 1;
83*4d1abfb2Sjoerg rc_bit(rc, &probs[model_index], bit);
84*4d1abfb2Sjoerg model_index = (model_index << 1) + bit;
85*4d1abfb2Sjoerg } while (bit_count != 0);
86*4d1abfb2Sjoerg }
87*4d1abfb2Sjoerg
88*4d1abfb2Sjoerg
89*4d1abfb2Sjoerg static inline void
rc_bittree_reverse(lzma_range_encoder * rc,probability * probs,uint32_t bit_count,uint32_t symbol)90*4d1abfb2Sjoerg rc_bittree_reverse(lzma_range_encoder *rc, probability *probs,
91*4d1abfb2Sjoerg uint32_t bit_count, uint32_t symbol)
92*4d1abfb2Sjoerg {
93*4d1abfb2Sjoerg uint32_t model_index = 1;
94*4d1abfb2Sjoerg
95*4d1abfb2Sjoerg do {
96*4d1abfb2Sjoerg const uint32_t bit = symbol & 1;
97*4d1abfb2Sjoerg symbol >>= 1;
98*4d1abfb2Sjoerg rc_bit(rc, &probs[model_index], bit);
99*4d1abfb2Sjoerg model_index = (model_index << 1) + bit;
100*4d1abfb2Sjoerg } while (--bit_count != 0);
101*4d1abfb2Sjoerg }
102*4d1abfb2Sjoerg
103*4d1abfb2Sjoerg
104*4d1abfb2Sjoerg static inline void
rc_direct(lzma_range_encoder * rc,uint32_t value,uint32_t bit_count)105*4d1abfb2Sjoerg rc_direct(lzma_range_encoder *rc,
106*4d1abfb2Sjoerg uint32_t value, uint32_t bit_count)
107*4d1abfb2Sjoerg {
108*4d1abfb2Sjoerg do {
109*4d1abfb2Sjoerg rc->symbols[rc->count++]
110*4d1abfb2Sjoerg = RC_DIRECT_0 + ((value >> --bit_count) & 1);
111*4d1abfb2Sjoerg } while (bit_count != 0);
112*4d1abfb2Sjoerg }
113*4d1abfb2Sjoerg
114*4d1abfb2Sjoerg
115*4d1abfb2Sjoerg static inline void
rc_flush(lzma_range_encoder * rc)116*4d1abfb2Sjoerg rc_flush(lzma_range_encoder *rc)
117*4d1abfb2Sjoerg {
118*4d1abfb2Sjoerg for (size_t i = 0; i < 5; ++i)
119*4d1abfb2Sjoerg rc->symbols[rc->count++] = RC_FLUSH;
120*4d1abfb2Sjoerg }
121*4d1abfb2Sjoerg
122*4d1abfb2Sjoerg
123*4d1abfb2Sjoerg static inline bool
rc_shift_low(lzma_range_encoder * rc,uint8_t * out,size_t * out_pos,size_t out_size)124*4d1abfb2Sjoerg rc_shift_low(lzma_range_encoder *rc,
125*4d1abfb2Sjoerg uint8_t *out, size_t *out_pos, size_t out_size)
126*4d1abfb2Sjoerg {
127*4d1abfb2Sjoerg if ((uint32_t)(rc->low) < (uint32_t)(0xFF000000)
128*4d1abfb2Sjoerg || (uint32_t)(rc->low >> 32) != 0) {
129*4d1abfb2Sjoerg do {
130*4d1abfb2Sjoerg if (*out_pos == out_size)
131*4d1abfb2Sjoerg return true;
132*4d1abfb2Sjoerg
133*4d1abfb2Sjoerg out[*out_pos] = rc->cache + (uint8_t)(rc->low >> 32);
134*4d1abfb2Sjoerg ++*out_pos;
135*4d1abfb2Sjoerg rc->cache = 0xFF;
136*4d1abfb2Sjoerg
137*4d1abfb2Sjoerg } while (--rc->cache_size != 0);
138*4d1abfb2Sjoerg
139*4d1abfb2Sjoerg rc->cache = (rc->low >> 24) & 0xFF;
140*4d1abfb2Sjoerg }
141*4d1abfb2Sjoerg
142*4d1abfb2Sjoerg ++rc->cache_size;
143*4d1abfb2Sjoerg rc->low = (rc->low & 0x00FFFFFF) << RC_SHIFT_BITS;
144*4d1abfb2Sjoerg
145*4d1abfb2Sjoerg return false;
146*4d1abfb2Sjoerg }
147*4d1abfb2Sjoerg
148*4d1abfb2Sjoerg
149*4d1abfb2Sjoerg static inline bool
rc_encode(lzma_range_encoder * rc,uint8_t * out,size_t * out_pos,size_t out_size)150*4d1abfb2Sjoerg rc_encode(lzma_range_encoder *rc,
151*4d1abfb2Sjoerg uint8_t *out, size_t *out_pos, size_t out_size)
152*4d1abfb2Sjoerg {
153*4d1abfb2Sjoerg assert(rc->count <= RC_SYMBOLS_MAX);
154*4d1abfb2Sjoerg
155*4d1abfb2Sjoerg while (rc->pos < rc->count) {
156*4d1abfb2Sjoerg // Normalize
157*4d1abfb2Sjoerg if (rc->range < RC_TOP_VALUE) {
158*4d1abfb2Sjoerg if (rc_shift_low(rc, out, out_pos, out_size))
159*4d1abfb2Sjoerg return true;
160*4d1abfb2Sjoerg
161*4d1abfb2Sjoerg rc->range <<= RC_SHIFT_BITS;
162*4d1abfb2Sjoerg }
163*4d1abfb2Sjoerg
164*4d1abfb2Sjoerg // Encode a bit
165*4d1abfb2Sjoerg switch (rc->symbols[rc->pos]) {
166*4d1abfb2Sjoerg case RC_BIT_0: {
167*4d1abfb2Sjoerg probability prob = *rc->probs[rc->pos];
168*4d1abfb2Sjoerg rc->range = (rc->range >> RC_BIT_MODEL_TOTAL_BITS)
169*4d1abfb2Sjoerg * prob;
170*4d1abfb2Sjoerg prob += (RC_BIT_MODEL_TOTAL - prob) >> RC_MOVE_BITS;
171*4d1abfb2Sjoerg *rc->probs[rc->pos] = prob;
172*4d1abfb2Sjoerg break;
173*4d1abfb2Sjoerg }
174*4d1abfb2Sjoerg
175*4d1abfb2Sjoerg case RC_BIT_1: {
176*4d1abfb2Sjoerg probability prob = *rc->probs[rc->pos];
177*4d1abfb2Sjoerg const uint32_t bound = prob * (rc->range
178*4d1abfb2Sjoerg >> RC_BIT_MODEL_TOTAL_BITS);
179*4d1abfb2Sjoerg rc->low += bound;
180*4d1abfb2Sjoerg rc->range -= bound;
181*4d1abfb2Sjoerg prob -= prob >> RC_MOVE_BITS;
182*4d1abfb2Sjoerg *rc->probs[rc->pos] = prob;
183*4d1abfb2Sjoerg break;
184*4d1abfb2Sjoerg }
185*4d1abfb2Sjoerg
186*4d1abfb2Sjoerg case RC_DIRECT_0:
187*4d1abfb2Sjoerg rc->range >>= 1;
188*4d1abfb2Sjoerg break;
189*4d1abfb2Sjoerg
190*4d1abfb2Sjoerg case RC_DIRECT_1:
191*4d1abfb2Sjoerg rc->range >>= 1;
192*4d1abfb2Sjoerg rc->low += rc->range;
193*4d1abfb2Sjoerg break;
194*4d1abfb2Sjoerg
195*4d1abfb2Sjoerg case RC_FLUSH:
196*4d1abfb2Sjoerg // Prevent further normalizations.
197*4d1abfb2Sjoerg rc->range = UINT32_MAX;
198*4d1abfb2Sjoerg
199*4d1abfb2Sjoerg // Flush the last five bytes (see rc_flush()).
200*4d1abfb2Sjoerg do {
201*4d1abfb2Sjoerg if (rc_shift_low(rc, out, out_pos, out_size))
202*4d1abfb2Sjoerg return true;
203*4d1abfb2Sjoerg } while (++rc->pos < rc->count);
204*4d1abfb2Sjoerg
205*4d1abfb2Sjoerg // Reset the range encoder so we are ready to continue
206*4d1abfb2Sjoerg // encoding if we weren't finishing the stream.
207*4d1abfb2Sjoerg rc_reset(rc);
208*4d1abfb2Sjoerg return false;
209*4d1abfb2Sjoerg
210*4d1abfb2Sjoerg default:
211*4d1abfb2Sjoerg assert(0);
212*4d1abfb2Sjoerg break;
213*4d1abfb2Sjoerg }
214*4d1abfb2Sjoerg
215*4d1abfb2Sjoerg ++rc->pos;
216*4d1abfb2Sjoerg }
217*4d1abfb2Sjoerg
218*4d1abfb2Sjoerg rc->count = 0;
219*4d1abfb2Sjoerg rc->pos = 0;
220*4d1abfb2Sjoerg
221*4d1abfb2Sjoerg return false;
222*4d1abfb2Sjoerg }
223*4d1abfb2Sjoerg
224*4d1abfb2Sjoerg
225*4d1abfb2Sjoerg static inline uint64_t
rc_pending(const lzma_range_encoder * rc)226*4d1abfb2Sjoerg rc_pending(const lzma_range_encoder *rc)
227*4d1abfb2Sjoerg {
228*4d1abfb2Sjoerg return rc->cache_size + 5 - 1;
229*4d1abfb2Sjoerg }
230*4d1abfb2Sjoerg
231*4d1abfb2Sjoerg #endif
232