X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=include%2Fwimlib%2Flzms.h;h=ff3888eb67f1a99098dfb5548ece603f84c3cf82;hp=15128cb8ff4541b693f7683f4062bd1976600bb7;hb=637f86d129be63bb9dc431e8e2ead370330ca5ce;hpb=2e6b4c5e5343353b1edaa695fff0ee4143e65af6 diff --git a/include/wimlib/lzms.h b/include/wimlib/lzms.h index 15128cb8..ff3888eb 100644 --- a/include/wimlib/lzms.h +++ b/include/wimlib/lzms.h @@ -31,7 +31,7 @@ #define LZMS_NUM_LITERAL_SYMS 256 #define LZMS_NUM_LEN_SYMS 54 #define LZMS_NUM_DELTA_POWER_SYMS 8 -#define LZMS_MAX_NUM_OFFSET_SYMS 799 +#define LZMS_MAX_NUM_OFFSET_SYMS 799 #define LZMS_MAX_NUM_SYMS 799 #define LZMS_MAX_CODEWORD_LEN 15 @@ -45,4 +45,96 @@ #define LZMS_X86_MAX_GOOD_TARGET_OFFSET 65535 #define LZMS_X86_MAX_TRANSLATION_OFFSET 1023 +/* Code shared between the LZMS decompressor and compressor. */ + +#include + +extern void +lzms_x86_filter(u8 data[], s32 size, s32 last_target_usages[], bool undo); + +/* Probability entry for use by the range coder when in a specific state. */ +struct lzms_probability_entry { + + /* Number of zeroes in the most recent LZMS_PROBABILITY_MAX bits that + * have been coded using this probability entry. This is a cached value + * because it can be computed as LZMS_PROBABILITY_MAX minus the Hamming + * weight of the low-order LZMS_PROBABILITY_MAX bits of @recent_bits. + * */ + u32 num_recent_zero_bits; + + /* The most recent LZMS_PROBABILITY_MAX bits that have been coded using + * this probability entry. The size of this variable, in bits, must be + * at least LZMS_PROBABILITY_MAX. */ + u64 recent_bits; +}; + +/* LRU queues for LZ matches. */ +struct lzms_lz_lru_queues { + + /* Recent LZ match offsets */ + u32 recent_offsets[LZMS_NUM_RECENT_OFFSETS + 1]; + + /* These variables are used to delay updates to the LRU queues by one + * decoded item. */ + u32 prev_offset; + u32 upcoming_offset; +}; + +/* LRU queues for delta matches. */ +struct lzms_delta_lru_queues { + + /* Recent delta match powers and offsets */ + u32 recent_powers[LZMS_NUM_RECENT_OFFSETS + 1]; + u32 recent_offsets[LZMS_NUM_RECENT_OFFSETS + 1]; + + /* These variables are used to delay updates to the LRU queues by one + * decoded item. */ + u32 prev_power; + u32 prev_offset; + u32 upcoming_power; + u32 upcoming_offset; +}; + +/* LRU (least-recently-used) queues for match information. */ +struct lzms_lru_queues { + struct lzms_lz_lru_queues lz; + struct lzms_delta_lru_queues delta; +}; + +extern u32 lzms_position_slot_base[LZMS_MAX_NUM_OFFSET_SYMS + 1]; + +extern u32 lzms_length_slot_base[LZMS_NUM_LEN_SYMS + 1]; + +extern void +lzms_init_slot_bases(void); + +extern u32 +lzms_get_slot(u32 value, const u32 slot_base_tab[], unsigned num_slots); + +static inline u32 +lzms_get_position_slot(u32 value) +{ + return lzms_get_slot(value, lzms_position_slot_base, + LZMS_MAX_NUM_OFFSET_SYMS); +} + +static inline u32 +lzms_get_length_slot(u32 value) +{ + return lzms_get_slot(value, lzms_length_slot_base, + LZMS_NUM_LEN_SYMS); +} + +extern void +lzms_init_lru_queues(struct lzms_lru_queues *lru); + +extern void +lzms_update_lz_lru_queues(struct lzms_lz_lru_queues *lz); + +extern void +lzms_update_delta_lru_queues(struct lzms_delta_lru_queues *delta); + +extern void +lzms_update_lru_queues(struct lzms_lru_queues *lru); + #endif /* _WIMLIB_LZMS_H */