Path: blob/master/Utilities/cmliblzma/liblzma/rangecoder/price.h
3156 views
// SPDX-License-Identifier: 0BSD12///////////////////////////////////////////////////////////////////////////////3//4/// \file price.h5/// \brief Probability price calculation6//7// Author: Igor Pavlov8//9///////////////////////////////////////////////////////////////////////////////1011#ifndef LZMA_PRICE_H12#define LZMA_PRICE_H131415#define RC_MOVE_REDUCING_BITS 416#define RC_BIT_PRICE_SHIFT_BITS 417#define RC_PRICE_TABLE_SIZE (RC_BIT_MODEL_TOTAL >> RC_MOVE_REDUCING_BITS)1819#define RC_INFINITY_PRICE (UINT32_C(1) << 30)202122/// Lookup table for the inline functions defined in this file.23lzma_attr_visibility_hidden24extern const uint8_t lzma_rc_prices[RC_PRICE_TABLE_SIZE];252627static inline uint32_t28rc_bit_price(const probability prob, const uint32_t bit)29{30return lzma_rc_prices[(prob ^ ((UINT32_C(0) - bit)31& (RC_BIT_MODEL_TOTAL - 1))) >> RC_MOVE_REDUCING_BITS];32}333435static inline uint32_t36rc_bit_0_price(const probability prob)37{38return lzma_rc_prices[prob >> RC_MOVE_REDUCING_BITS];39}404142static inline uint32_t43rc_bit_1_price(const probability prob)44{45return lzma_rc_prices[(prob ^ (RC_BIT_MODEL_TOTAL - 1))46>> RC_MOVE_REDUCING_BITS];47}484950static inline uint32_t51rc_bittree_price(const probability *const probs,52const uint32_t bit_levels, uint32_t symbol)53{54uint32_t price = 0;55symbol += UINT32_C(1) << bit_levels;5657do {58const uint32_t bit = symbol & 1;59symbol >>= 1;60price += rc_bit_price(probs[symbol], bit);61} while (symbol != 1);6263return price;64}656667static inline uint32_t68rc_bittree_reverse_price(const probability *const probs,69uint32_t bit_levels, uint32_t symbol)70{71uint32_t price = 0;72uint32_t model_index = 1;7374do {75const uint32_t bit = symbol & 1;76symbol >>= 1;77price += rc_bit_price(probs[model_index], bit);78model_index = (model_index << 1) + bit;79} while (--bit_levels != 0);8081return price;82}838485static inline uint32_t86rc_direct_price(const uint32_t bits)87{88return bits << RC_BIT_PRICE_SHIFT_BITS;89}9091#endif929394