4 /* Constants for the LZMS data compression format. See the comments in
5 * lzms-decompress.c for more information about this format. */
7 //#define ENABLE_LZMS_DEBUG
8 #ifdef ENABLE_LZMS_DEBUG
9 # define LZMS_DEBUG DEBUG
10 # define LZMS_ASSERT wimlib_assert
12 # define LZMS_DEBUG(format, ...)
13 # define LZMS_ASSERT(...)
16 #define LZMS_NUM_RECENT_OFFSETS 3
18 #define LZMS_PROBABILITY_BITS 6
19 #define LZMS_PROBABILITY_MAX (1U << LZMS_PROBABILITY_BITS)
20 #define LZMS_INITIAL_PROBABILITY 48
21 #define LZMS_INITIAL_RECENT_BITS 0x0000000055555555ULL
23 #define LZMS_NUM_MAIN_STATES 16
24 #define LZMS_NUM_MATCH_STATES 32
25 #define LZMS_NUM_LZ_MATCH_STATES 64
26 #define LZMS_NUM_LZ_REPEAT_MATCH_STATES 64
27 #define LZMS_NUM_DELTA_MATCH_STATES 64
28 #define LZMS_NUM_DELTA_REPEAT_MATCH_STATES 64
29 #define LZMS_MAX_NUM_STATES 64
31 #define LZMS_NUM_LITERAL_SYMS 256
32 #define LZMS_NUM_LEN_SYMS 54
33 #define LZMS_NUM_DELTA_POWER_SYMS 8
34 #define LZMS_MAX_NUM_OFFSET_SYMS 799
35 #define LZMS_MAX_NUM_SYMS 799
37 #define LZMS_MAX_CODEWORD_LEN 15
39 #define LZMS_LITERAL_CODE_REBUILD_FREQ 1024
40 #define LZMS_LZ_OFFSET_CODE_REBUILD_FREQ 1024
41 #define LZMS_LENGTH_CODE_REBUILD_FREQ 512
42 #define LZMS_DELTA_OFFSET_CODE_REBUILD_FREQ 1024
43 #define LZMS_DELTA_POWER_CODE_REBUILD_FREQ 512
45 #define LZMS_X86_MAX_GOOD_TARGET_OFFSET 65535
46 #define LZMS_X86_MAX_TRANSLATION_OFFSET 1023
48 /* Code shared between the LZMS decompressor and compressor. */
50 #include <wimlib/types.h>
53 lzms_x86_filter(u8 data[], s32 size, s32 last_target_usages[], bool undo);
55 /* Probability entry for use by the range coder when in a specific state. */
56 struct lzms_probability_entry {
58 /* Number of zeroes in the most recent LZMS_PROBABILITY_MAX bits that
59 * have been coded using this probability entry. This is a cached value
60 * because it can be computed as LZMS_PROBABILITY_MAX minus the Hamming
61 * weight of the low-order LZMS_PROBABILITY_MAX bits of @recent_bits.
63 u32 num_recent_zero_bits;
65 /* The most recent LZMS_PROBABILITY_MAX bits that have been coded using
66 * this probability entry. The size of this variable, in bits, must be
67 * at least LZMS_PROBABILITY_MAX. */
71 extern u32 lzms_position_slot_base[LZMS_MAX_NUM_OFFSET_SYMS + 1];
73 extern u32 lzms_length_slot_base[LZMS_NUM_LEN_SYMS + 1];
76 lzms_init_slot_bases(void);
79 lzms_get_slot(u32 value, const u32 slot_base_tab[], unsigned num_slots);
82 lzms_get_position_slot(u32 value)
84 return lzms_get_slot(value, lzms_position_slot_base,
85 LZMS_MAX_NUM_OFFSET_SYMS);
89 lzms_get_length_slot(u32 value)
91 return lzms_get_slot(value, lzms_length_slot_base,
95 #endif /* _WIMLIB_LZMS_H */