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