1*81ad8388SMartin Matuska /////////////////////////////////////////////////////////////////////////////// 2*81ad8388SMartin Matuska // 3*81ad8388SMartin Matuska /// \file range_common.h 4*81ad8388SMartin Matuska /// \brief Common things for range encoder and decoder 5*81ad8388SMartin Matuska /// 6*81ad8388SMartin Matuska // Authors: Igor Pavlov 7*81ad8388SMartin Matuska // Lasse Collin 8*81ad8388SMartin Matuska // 9*81ad8388SMartin Matuska // This file has been put into the public domain. 10*81ad8388SMartin Matuska // You can do whatever you want with this file. 11*81ad8388SMartin Matuska // 12*81ad8388SMartin Matuska /////////////////////////////////////////////////////////////////////////////// 13*81ad8388SMartin Matuska 14*81ad8388SMartin Matuska #ifndef LZMA_RANGE_COMMON_H 15*81ad8388SMartin Matuska #define LZMA_RANGE_COMMON_H 16*81ad8388SMartin Matuska 17*81ad8388SMartin Matuska #ifdef HAVE_CONFIG_H 18*81ad8388SMartin Matuska # include "common.h" 19*81ad8388SMartin Matuska #endif 20*81ad8388SMartin Matuska 21*81ad8388SMartin Matuska 22*81ad8388SMartin Matuska /////////////// 23*81ad8388SMartin Matuska // Constants // 24*81ad8388SMartin Matuska /////////////// 25*81ad8388SMartin Matuska 26*81ad8388SMartin Matuska #define RC_SHIFT_BITS 8 27*81ad8388SMartin Matuska #define RC_TOP_BITS 24 28*81ad8388SMartin Matuska #define RC_TOP_VALUE (UINT32_C(1) << RC_TOP_BITS) 29*81ad8388SMartin Matuska #define RC_BIT_MODEL_TOTAL_BITS 11 30*81ad8388SMartin Matuska #define RC_BIT_MODEL_TOTAL (UINT32_C(1) << RC_BIT_MODEL_TOTAL_BITS) 31*81ad8388SMartin Matuska #define RC_MOVE_BITS 5 32*81ad8388SMartin Matuska 33*81ad8388SMartin Matuska 34*81ad8388SMartin Matuska //////////// 35*81ad8388SMartin Matuska // Macros // 36*81ad8388SMartin Matuska //////////// 37*81ad8388SMartin Matuska 38*81ad8388SMartin Matuska // Resets the probability so that both 0 and 1 have probability of 50 % 39*81ad8388SMartin Matuska #define bit_reset(prob) \ 40*81ad8388SMartin Matuska prob = RC_BIT_MODEL_TOTAL >> 1 41*81ad8388SMartin Matuska 42*81ad8388SMartin Matuska // This does the same for a complete bit tree. 43*81ad8388SMartin Matuska // (A tree represented as an array.) 44*81ad8388SMartin Matuska #define bittree_reset(probs, bit_levels) \ 45*81ad8388SMartin Matuska for (uint32_t bt_i = 0; bt_i < (1 << (bit_levels)); ++bt_i) \ 46*81ad8388SMartin Matuska bit_reset((probs)[bt_i]) 47*81ad8388SMartin Matuska 48*81ad8388SMartin Matuska 49*81ad8388SMartin Matuska ////////////////////// 50*81ad8388SMartin Matuska // Type definitions // 51*81ad8388SMartin Matuska ////////////////////// 52*81ad8388SMartin Matuska 53*81ad8388SMartin Matuska /// \brief Type of probabilities used with range coder 54*81ad8388SMartin Matuska /// 55*81ad8388SMartin Matuska /// This needs to be at least 12-bit integer, so uint16_t is a logical choice. 56*81ad8388SMartin Matuska /// However, on some architecture and compiler combinations, a bigger type 57*81ad8388SMartin Matuska /// may give better speed, because the probability variables are accessed 58*81ad8388SMartin Matuska /// a lot. On the other hand, bigger probability type increases cache 59*81ad8388SMartin Matuska /// footprint, since there are 2 to 14 thousand probability variables in 60*81ad8388SMartin Matuska /// LZMA (assuming the limit of lc + lp <= 4; with lc + lp <= 12 there 61*81ad8388SMartin Matuska /// would be about 1.5 million variables). 62*81ad8388SMartin Matuska /// 63*81ad8388SMartin Matuska /// With malicious files, the initialization speed of the LZMA decoder can 64*81ad8388SMartin Matuska /// become important. In that case, smaller probability variables mean that 65*81ad8388SMartin Matuska /// there is less bytes to write to RAM, which makes initialization faster. 66*81ad8388SMartin Matuska /// With big probability type, the initialization can become so slow that it 67*81ad8388SMartin Matuska /// can be a problem e.g. for email servers doing virus scanning. 68*81ad8388SMartin Matuska /// 69*81ad8388SMartin Matuska /// I will be sticking to uint16_t unless some specific architectures 70*81ad8388SMartin Matuska /// are *much* faster (20-50 %) with uint32_t. 71*81ad8388SMartin Matuska typedef uint16_t probability; 72*81ad8388SMartin Matuska 73*81ad8388SMartin Matuska #endif 74