xref: /freebsd/contrib/xz/src/liblzma/rangecoder/range_decoder.h (revision 81ad83880dcc267b198c781929dd9a009f98c5f7)
1*81ad8388SMartin Matuska ///////////////////////////////////////////////////////////////////////////////
2*81ad8388SMartin Matuska //
3*81ad8388SMartin Matuska /// \file       range_decoder.h
4*81ad8388SMartin Matuska /// \brief      Range Decoder
5*81ad8388SMartin Matuska ///
6*81ad8388SMartin Matuska //  Authors:    Igor Pavlov
7*81ad8388SMartin Matuska //              Lasse Collin
8*81ad8388SMartin Matuska //
9*81ad8388SMartin Matuska //  This file has been put into the public domain.
10*81ad8388SMartin Matuska //  You can do whatever you want with this file.
11*81ad8388SMartin Matuska //
12*81ad8388SMartin Matuska ///////////////////////////////////////////////////////////////////////////////
13*81ad8388SMartin Matuska 
14*81ad8388SMartin Matuska #ifndef LZMA_RANGE_DECODER_H
15*81ad8388SMartin Matuska #define LZMA_RANGE_DECODER_H
16*81ad8388SMartin Matuska 
17*81ad8388SMartin Matuska #include "range_common.h"
18*81ad8388SMartin Matuska 
19*81ad8388SMartin Matuska 
20*81ad8388SMartin Matuska typedef struct {
21*81ad8388SMartin Matuska 	uint32_t range;
22*81ad8388SMartin Matuska 	uint32_t code;
23*81ad8388SMartin Matuska 	uint32_t init_bytes_left;
24*81ad8388SMartin Matuska } lzma_range_decoder;
25*81ad8388SMartin Matuska 
26*81ad8388SMartin Matuska 
27*81ad8388SMartin Matuska /// Reads the first five bytes to initialize the range decoder.
28*81ad8388SMartin Matuska static inline bool
29*81ad8388SMartin Matuska rc_read_init(lzma_range_decoder *rc, const uint8_t *restrict in,
30*81ad8388SMartin Matuska 		size_t *restrict in_pos, size_t in_size)
31*81ad8388SMartin Matuska {
32*81ad8388SMartin Matuska 	while (rc->init_bytes_left > 0) {
33*81ad8388SMartin Matuska 		if (*in_pos == in_size)
34*81ad8388SMartin Matuska 			return false;
35*81ad8388SMartin Matuska 
36*81ad8388SMartin Matuska 		rc->code = (rc->code << 8) | in[*in_pos];
37*81ad8388SMartin Matuska 		++*in_pos;
38*81ad8388SMartin Matuska 		--rc->init_bytes_left;
39*81ad8388SMartin Matuska 	}
40*81ad8388SMartin Matuska 
41*81ad8388SMartin Matuska 	return true;
42*81ad8388SMartin Matuska }
43*81ad8388SMartin Matuska 
44*81ad8388SMartin Matuska 
45*81ad8388SMartin Matuska /// Makes local copies of range decoder and *in_pos variables. Doing this
46*81ad8388SMartin Matuska /// improves speed significantly. The range decoder macros expect also
47*81ad8388SMartin Matuska /// variables `in' and `in_size' to be defined.
48*81ad8388SMartin Matuska #define rc_to_local(range_decoder, in_pos) \
49*81ad8388SMartin Matuska 	lzma_range_decoder rc = range_decoder; \
50*81ad8388SMartin Matuska 	size_t rc_in_pos = (in_pos); \
51*81ad8388SMartin Matuska 	uint32_t rc_bound
52*81ad8388SMartin Matuska 
53*81ad8388SMartin Matuska 
54*81ad8388SMartin Matuska /// Stores the local copes back to the range decoder structure.
55*81ad8388SMartin Matuska #define rc_from_local(range_decoder, in_pos) \
56*81ad8388SMartin Matuska do { \
57*81ad8388SMartin Matuska 	range_decoder = rc; \
58*81ad8388SMartin Matuska 	in_pos = rc_in_pos; \
59*81ad8388SMartin Matuska } while (0)
60*81ad8388SMartin Matuska 
61*81ad8388SMartin Matuska 
62*81ad8388SMartin Matuska /// Resets the range decoder structure.
63*81ad8388SMartin Matuska #define rc_reset(range_decoder) \
64*81ad8388SMartin Matuska do { \
65*81ad8388SMartin Matuska 	(range_decoder).range = UINT32_MAX; \
66*81ad8388SMartin Matuska 	(range_decoder).code = 0; \
67*81ad8388SMartin Matuska 	(range_decoder).init_bytes_left = 5; \
68*81ad8388SMartin Matuska } while (0)
69*81ad8388SMartin Matuska 
70*81ad8388SMartin Matuska 
71*81ad8388SMartin Matuska /// When decoding has been properly finished, rc.code is always zero unless
72*81ad8388SMartin Matuska /// the input stream is corrupt. So checking this can catch some corrupt
73*81ad8388SMartin Matuska /// files especially if they don't have any other integrity check.
74*81ad8388SMartin Matuska #define rc_is_finished(range_decoder) \
75*81ad8388SMartin Matuska 	((range_decoder).code == 0)
76*81ad8388SMartin Matuska 
77*81ad8388SMartin Matuska 
78*81ad8388SMartin Matuska /// Read the next input byte if needed. If more input is needed but there is
79*81ad8388SMartin Matuska /// no more input available, "goto out" is used to jump out of the main
80*81ad8388SMartin Matuska /// decoder loop.
81*81ad8388SMartin Matuska #define rc_normalize(seq) \
82*81ad8388SMartin Matuska do { \
83*81ad8388SMartin Matuska 	if (rc.range < RC_TOP_VALUE) { \
84*81ad8388SMartin Matuska 		if (unlikely(rc_in_pos == in_size)) { \
85*81ad8388SMartin Matuska 			coder->sequence = seq; \
86*81ad8388SMartin Matuska 			goto out; \
87*81ad8388SMartin Matuska 		} \
88*81ad8388SMartin Matuska 		rc.range <<= RC_SHIFT_BITS; \
89*81ad8388SMartin Matuska 		rc.code = (rc.code << RC_SHIFT_BITS) | in[rc_in_pos++]; \
90*81ad8388SMartin Matuska 	} \
91*81ad8388SMartin Matuska } while (0)
92*81ad8388SMartin Matuska 
93*81ad8388SMartin Matuska 
94*81ad8388SMartin Matuska /// Start decoding a bit. This must be used together with rc_update_0()
95*81ad8388SMartin Matuska /// and rc_update_1():
96*81ad8388SMartin Matuska ///
97*81ad8388SMartin Matuska ///     rc_if_0(prob, seq) {
98*81ad8388SMartin Matuska ///         rc_update_0(prob);
99*81ad8388SMartin Matuska ///         // Do something
100*81ad8388SMartin Matuska ///     } else {
101*81ad8388SMartin Matuska ///         rc_update_1(prob);
102*81ad8388SMartin Matuska ///         // Do something else
103*81ad8388SMartin Matuska ///     }
104*81ad8388SMartin Matuska ///
105*81ad8388SMartin Matuska #define rc_if_0(prob, seq) \
106*81ad8388SMartin Matuska 	rc_normalize(seq); \
107*81ad8388SMartin Matuska 	rc_bound = (rc.range >> RC_BIT_MODEL_TOTAL_BITS) * (prob); \
108*81ad8388SMartin Matuska 	if (rc.code < rc_bound)
109*81ad8388SMartin Matuska 
110*81ad8388SMartin Matuska 
111*81ad8388SMartin Matuska /// Update the range decoder state and the used probability variable to
112*81ad8388SMartin Matuska /// match a decoded bit of 0.
113*81ad8388SMartin Matuska #define rc_update_0(prob) \
114*81ad8388SMartin Matuska do { \
115*81ad8388SMartin Matuska 	rc.range = rc_bound; \
116*81ad8388SMartin Matuska 	prob += (RC_BIT_MODEL_TOTAL - (prob)) >> RC_MOVE_BITS; \
117*81ad8388SMartin Matuska } while (0)
118*81ad8388SMartin Matuska 
119*81ad8388SMartin Matuska 
120*81ad8388SMartin Matuska /// Update the range decoder state and the used probability variable to
121*81ad8388SMartin Matuska /// match a decoded bit of 1.
122*81ad8388SMartin Matuska #define rc_update_1(prob) \
123*81ad8388SMartin Matuska do { \
124*81ad8388SMartin Matuska 	rc.range -= rc_bound; \
125*81ad8388SMartin Matuska 	rc.code -= rc_bound; \
126*81ad8388SMartin Matuska 	prob -= (prob) >> RC_MOVE_BITS; \
127*81ad8388SMartin Matuska } while (0)
128*81ad8388SMartin Matuska 
129*81ad8388SMartin Matuska 
130*81ad8388SMartin Matuska /// Decodes one bit and runs action0 or action1 depending on the decoded bit.
131*81ad8388SMartin Matuska /// This macro is used as the last step in bittree reverse decoders since
132*81ad8388SMartin Matuska /// those don't use "symbol" for anything else than indexing the probability
133*81ad8388SMartin Matuska /// arrays.
134*81ad8388SMartin Matuska #define rc_bit_last(prob, action0, action1, seq) \
135*81ad8388SMartin Matuska do { \
136*81ad8388SMartin Matuska 	rc_if_0(prob, seq) { \
137*81ad8388SMartin Matuska 		rc_update_0(prob); \
138*81ad8388SMartin Matuska 		action0; \
139*81ad8388SMartin Matuska 	} else { \
140*81ad8388SMartin Matuska 		rc_update_1(prob); \
141*81ad8388SMartin Matuska 		action1; \
142*81ad8388SMartin Matuska 	} \
143*81ad8388SMartin Matuska } while (0)
144*81ad8388SMartin Matuska 
145*81ad8388SMartin Matuska 
146*81ad8388SMartin Matuska /// Decodes one bit, updates "symbol", and runs action0 or action1 depending
147*81ad8388SMartin Matuska /// on the decoded bit.
148*81ad8388SMartin Matuska #define rc_bit(prob, action0, action1, seq) \
149*81ad8388SMartin Matuska 	rc_bit_last(prob, \
150*81ad8388SMartin Matuska 		symbol <<= 1; action0, \
151*81ad8388SMartin Matuska 		symbol = (symbol << 1) + 1; action1, \
152*81ad8388SMartin Matuska 		seq);
153*81ad8388SMartin Matuska 
154*81ad8388SMartin Matuska 
155*81ad8388SMartin Matuska /// Like rc_bit() but add "case seq:" as a prefix. This makes the unrolled
156*81ad8388SMartin Matuska /// loops more readable because the code isn't littered with "case"
157*81ad8388SMartin Matuska /// statements. On the other hand this also makes it less readable, since
158*81ad8388SMartin Matuska /// spotting the places where the decoder loop may be restarted is less
159*81ad8388SMartin Matuska /// obvious.
160*81ad8388SMartin Matuska #define rc_bit_case(prob, action0, action1, seq) \
161*81ad8388SMartin Matuska 	case seq: rc_bit(prob, action0, action1, seq)
162*81ad8388SMartin Matuska 
163*81ad8388SMartin Matuska 
164*81ad8388SMartin Matuska /// Decode a bit without using a probability.
165*81ad8388SMartin Matuska #define rc_direct(dest, seq) \
166*81ad8388SMartin Matuska do { \
167*81ad8388SMartin Matuska 	rc_normalize(seq); \
168*81ad8388SMartin Matuska 	rc.range >>= 1; \
169*81ad8388SMartin Matuska 	rc.code -= rc.range; \
170*81ad8388SMartin Matuska 	rc_bound = UINT32_C(0) - (rc.code >> 31); \
171*81ad8388SMartin Matuska 	rc.code += rc.range & rc_bound; \
172*81ad8388SMartin Matuska 	dest = (dest << 1) + (rc_bound + 1); \
173*81ad8388SMartin Matuska } while (0)
174*81ad8388SMartin Matuska 
175*81ad8388SMartin Matuska 
176*81ad8388SMartin Matuska // NOTE: No macros are provided for bittree decoding. It seems to be simpler
177*81ad8388SMartin Matuska // to just write them open in the code.
178*81ad8388SMartin Matuska 
179*81ad8388SMartin Matuska #endif
180