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