xref: /dflybsd-src/contrib/xz/src/liblzma/rangecoder/price.h (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
1*86d7f5d3SJohn Marino ///////////////////////////////////////////////////////////////////////////////
2*86d7f5d3SJohn Marino //
3*86d7f5d3SJohn Marino /// \file       price.h
4*86d7f5d3SJohn Marino /// \brief      Probability price calculation
5*86d7f5d3SJohn Marino //
6*86d7f5d3SJohn Marino //  Author:     Igor Pavlov
7*86d7f5d3SJohn Marino //
8*86d7f5d3SJohn Marino //  This file has been put into the public domain.
9*86d7f5d3SJohn Marino //  You can do whatever you want with this file.
10*86d7f5d3SJohn Marino //
11*86d7f5d3SJohn Marino ///////////////////////////////////////////////////////////////////////////////
12*86d7f5d3SJohn Marino 
13*86d7f5d3SJohn Marino #ifndef LZMA_PRICE_H
14*86d7f5d3SJohn Marino #define LZMA_PRICE_H
15*86d7f5d3SJohn Marino 
16*86d7f5d3SJohn Marino 
17*86d7f5d3SJohn Marino #define RC_MOVE_REDUCING_BITS 4
18*86d7f5d3SJohn Marino #define RC_BIT_PRICE_SHIFT_BITS 4
19*86d7f5d3SJohn Marino #define RC_PRICE_TABLE_SIZE (RC_BIT_MODEL_TOTAL >> RC_MOVE_REDUCING_BITS)
20*86d7f5d3SJohn Marino 
21*86d7f5d3SJohn Marino #define RC_INFINITY_PRICE (UINT32_C(1) << 30)
22*86d7f5d3SJohn Marino 
23*86d7f5d3SJohn Marino 
24*86d7f5d3SJohn Marino /// Lookup table for the inline functions defined in this file.
25*86d7f5d3SJohn Marino extern const uint8_t lzma_rc_prices[RC_PRICE_TABLE_SIZE];
26*86d7f5d3SJohn Marino 
27*86d7f5d3SJohn Marino 
28*86d7f5d3SJohn Marino static inline uint32_t
rc_bit_price(const probability prob,const uint32_t bit)29*86d7f5d3SJohn Marino rc_bit_price(const probability prob, const uint32_t bit)
30*86d7f5d3SJohn Marino {
31*86d7f5d3SJohn Marino 	return lzma_rc_prices[(prob ^ ((UINT32_C(0) - bit)
32*86d7f5d3SJohn Marino 			& (RC_BIT_MODEL_TOTAL - 1))) >> RC_MOVE_REDUCING_BITS];
33*86d7f5d3SJohn Marino }
34*86d7f5d3SJohn Marino 
35*86d7f5d3SJohn Marino 
36*86d7f5d3SJohn Marino static inline uint32_t
rc_bit_0_price(const probability prob)37*86d7f5d3SJohn Marino rc_bit_0_price(const probability prob)
38*86d7f5d3SJohn Marino {
39*86d7f5d3SJohn Marino 	return lzma_rc_prices[prob >> RC_MOVE_REDUCING_BITS];
40*86d7f5d3SJohn Marino }
41*86d7f5d3SJohn Marino 
42*86d7f5d3SJohn Marino 
43*86d7f5d3SJohn Marino static inline uint32_t
rc_bit_1_price(const probability prob)44*86d7f5d3SJohn Marino rc_bit_1_price(const probability prob)
45*86d7f5d3SJohn Marino {
46*86d7f5d3SJohn Marino 	return lzma_rc_prices[(prob ^ (RC_BIT_MODEL_TOTAL - 1))
47*86d7f5d3SJohn Marino 			>> RC_MOVE_REDUCING_BITS];
48*86d7f5d3SJohn Marino }
49*86d7f5d3SJohn Marino 
50*86d7f5d3SJohn Marino 
51*86d7f5d3SJohn Marino static inline uint32_t
rc_bittree_price(const probability * const probs,const uint32_t bit_levels,uint32_t symbol)52*86d7f5d3SJohn Marino rc_bittree_price(const probability *const probs,
53*86d7f5d3SJohn Marino 		const uint32_t bit_levels, uint32_t symbol)
54*86d7f5d3SJohn Marino {
55*86d7f5d3SJohn Marino 	uint32_t price = 0;
56*86d7f5d3SJohn Marino 	symbol += UINT32_C(1) << bit_levels;
57*86d7f5d3SJohn Marino 
58*86d7f5d3SJohn Marino 	do {
59*86d7f5d3SJohn Marino 		const uint32_t bit = symbol & 1;
60*86d7f5d3SJohn Marino 		symbol >>= 1;
61*86d7f5d3SJohn Marino 		price += rc_bit_price(probs[symbol], bit);
62*86d7f5d3SJohn Marino 	} while (symbol != 1);
63*86d7f5d3SJohn Marino 
64*86d7f5d3SJohn Marino 	return price;
65*86d7f5d3SJohn Marino }
66*86d7f5d3SJohn Marino 
67*86d7f5d3SJohn Marino 
68*86d7f5d3SJohn Marino static inline uint32_t
rc_bittree_reverse_price(const probability * const probs,uint32_t bit_levels,uint32_t symbol)69*86d7f5d3SJohn Marino rc_bittree_reverse_price(const probability *const probs,
70*86d7f5d3SJohn Marino 		uint32_t bit_levels, uint32_t symbol)
71*86d7f5d3SJohn Marino {
72*86d7f5d3SJohn Marino 	uint32_t price = 0;
73*86d7f5d3SJohn Marino 	uint32_t model_index = 1;
74*86d7f5d3SJohn Marino 
75*86d7f5d3SJohn Marino 	do {
76*86d7f5d3SJohn Marino 		const uint32_t bit = symbol & 1;
77*86d7f5d3SJohn Marino 		symbol >>= 1;
78*86d7f5d3SJohn Marino 		price += rc_bit_price(probs[model_index], bit);
79*86d7f5d3SJohn Marino 		model_index = (model_index << 1) + bit;
80*86d7f5d3SJohn Marino 	} while (--bit_levels != 0);
81*86d7f5d3SJohn Marino 
82*86d7f5d3SJohn Marino 	return price;
83*86d7f5d3SJohn Marino }
84*86d7f5d3SJohn Marino 
85*86d7f5d3SJohn Marino 
86*86d7f5d3SJohn Marino static inline uint32_t
rc_direct_price(const uint32_t bits)87*86d7f5d3SJohn Marino rc_direct_price(const uint32_t bits)
88*86d7f5d3SJohn Marino {
89*86d7f5d3SJohn Marino 	 return bits << RC_BIT_PRICE_SHIFT_BITS;
90*86d7f5d3SJohn Marino }
91*86d7f5d3SJohn Marino 
92*86d7f5d3SJohn Marino #endif
93