123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- /*++
- Copyright (c) Alex Ionescu. All rights reserved.
- Module Name:
- lzmadec.h
- Abstract:
- This header file contains C-style definitions, constants, and enumerations
- that map back to the LZMA Standard, specifically the probability model that
- is used for encoding probabilities.
- Author:
- Alex Ionescu (@aionescu) 15-Apr-2020 - Initial version
- Environment:
- Windows & Linux, user mode and kernel mode.
- --*/
- #pragma once
- //
- // Literals can be 0-255 and are encoded in 3 different types of slots based on
- // the previous literal decoded and the "match byte" used.
- //
- #define LZMA_LITERALS 256
- #define LZMA_LC_TYPES 3
- #define LZMA_LC_MODEL_SIZE (LZMA_LC_TYPES * LZMA_LITERALS)
- //
- // These are the hardcoded LZMA properties we support for position and coders
- //
- #define LZMA_LC 3
- #define LZMA_PB 2
- #define LZMA_LP 0
- #define LZMA_LITERAL_CODERS (1 << LZMA_LC)
- #define LZMA_POSITION_COUNT (1 << LZMA_PB)
- //
- // Lengths are described in three different ways using "low", "mid", and "high"
- // bit trees. The first two trees encode 3 bits, the last encodes 8. We never
- // encode a length less than 2 bytes, since that's wasteful.
- //
- #define LZMA_MAX_LOW_LENGTH (1 << 3)
- #define LZMA_MAX_MID_LENGTH (1 << 3)
- #define LZMA_MAX_HIGH_LENGTH (1 << 8)
- #define LZMA_MIN_LENGTH 2
- //
- // Distances can be encoded in different ways, based on the distance slot.
- // Lengths of 2, 3, 4 bytes are directly encoded with their own slot. Lengths
- // over 5 share a slot, which is then further subdivded into 3 different ways
- // of encoding them, which are described in the source.
- //
- #define LZMA_DISTANCE_SLOTS 64
- #define LZMA_FIRST_CONTEXT_DISTANCE_SLOT 4
- #define LZMA_FIRST_FIXED_DISTANCE_SLOT 14
- #define LZMA_DISTANCE_ALIGN_BITS 4
- #define LZMA_DISTANCE_ALIGN_SLOTS (1 << LZMA_DISTANCE_ALIGN_BITS)
- //
- // Total number of probabilities that we need to store
- //
- #define LZMA_BIT_MODEL_SLOTS (1174 + \
- (LZMA_LITERAL_CODERS * \
- LZMA_LC_MODEL_SIZE))
- //
- // The LZMA probability bit model is typically based on the last LZMA sequences
- // that were decoded. There are 11 such possibilities that are tracked.
- //
- typedef enum _LZMA_SEQUENCE_STATE
- {
- //
- // State where we last saw three literals
- //
- LzmaLitLitLitState,
- //
- // States where we last saw two literals preceeded by a non-literal
- //
- LzmaMatchLitLitState,
- LzmaRepLitLitState,
- LzmaLitShortrepLitLitState,
- //
- // States where we last saw one literal preceeded by a non-literal
- //
- LzmaMatchLitState,
- LzmaRepLitState,
- LzmaLitShortrepLitState,
- //
- // Separator between states where we last saw at least one literal
- //
- LzmaMaxLitState,
- //
- // States where we last saw a non-literal preceeded by a literal
- //
- LzmaLitMatchState = 7,
- LzmaLitRepState,
- LzmaLitShortrepState,
- //
- // States where we last saw two non-literals
- //
- LzmaNonlitMatchState,
- LzmaNonlitRepState,
- //
- // Separator for number of total states
- //
- LzmaMaxState
- } LZMA_SEQUENCE_STATE, * PLZMA_SEQUENCE_STATE;
|