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