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. 25extern const uint8_t lzma_rc_prices[RC_PRICE_TABLE_SIZE]; 26 27 28static inline uint32_t 29rc_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 36static inline uint32_t 37rc_bit_0_price(const probability prob) 38{ 39 return lzma_rc_prices[prob >> RC_MOVE_REDUCING_BITS]; 40} 41 42 43static inline uint32_t 44rc_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 51static inline uint32_t 52rc_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 68static inline uint32_t 69rc_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 86static inline uint32_t 87rc_direct_price(const uint32_t bits) 88{ 89 return bits << RC_BIT_PRICE_SHIFT_BITS; 90} 91 92#endif 93