1 ///////////////////////////////////////////////////////////////////////////////
3 /// \file lzma_encoder_private.h
4 /// \brief Private definitions for LZMA encoder
6 // Authors: Igor Pavlov
9 // This file has been put into the public domain.
10 // You can do whatever you want with this file.
12 ///////////////////////////////////////////////////////////////////////////////
14 #ifndef LZMA_LZMA_ENCODER_PRIVATE_H
15 #define LZMA_LZMA_ENCODER_PRIVATE_H
17 #include "lz_encoder.h"
18 #include "range_encoder.h"
19 #include "lzma_common.h"
20 #include "lzma_encoder.h"
23 // Macro to compare if the first two bytes in two buffers differ. This is
24 // needed in lzma_lzma_optimum_*() to test if the match is at least
25 // MATCH_LEN_MIN bytes. Unaligned access gives tiny gain so there's no
26 // reason to not use it when it is supported.
27 #ifdef TUKLIB_FAST_UNALIGNED_ACCESS
28 # define not_equal_16(a, b) \
29 (*(const uint16_t *)(a) != *(const uint16_t *)(b))
31 # define not_equal_16(a, b) \
32 ((a)[0] != (b)[0] || (a)[1] != (b)[1])
36 // Optimal - Number of entries in the optimum array.
37 #define OPTS (1 << 12)
43 probability low[POS_STATES_MAX][LEN_LOW_SYMBOLS];
44 probability mid[POS_STATES_MAX][LEN_MID_SYMBOLS];
45 probability high[LEN_HIGH_SYMBOLS];
47 uint32_t prices[POS_STATES_MAX][LEN_SYMBOLS];
49 uint32_t counters[POS_STATES_MAX];
51 } lzma_length_encoder;
55 lzma_lzma_state state;
57 bool prev_1_is_literal;
64 uint32_t pos_prev; // pos_next;
72 struct lzma_lzma1_encoder_s {
74 lzma_range_encoder rc;
77 lzma_lzma_state state;
79 /// The four most recent match distances
82 /// Array of match candidates
83 lzma_match matches[MATCH_LEN_MAX + 1];
85 /// Number of match candidates in matches[]
86 uint32_t matches_count;
88 /// Variable to hold the length of the longest match between calls
89 /// to lzma_lzma_optimum_*().
90 uint32_t longest_match_length;
92 /// True if using getoptimumfast
95 /// True if the encoder has been initialized by encoding the first
96 /// byte as a literal.
99 /// True if the range encoder has been flushed, but not all bytes
100 /// have been written to the output buffer yet.
103 uint32_t pos_mask; ///< (1 << pos_bits) - 1
104 uint32_t literal_context_bits;
105 uint32_t literal_pos_mask;
107 // These are the same as in lzma_decoder.c. See comments there.
108 probability literal[LITERAL_CODERS_MAX][LITERAL_CODER_SIZE];
109 probability is_match[STATES][POS_STATES_MAX];
110 probability is_rep[STATES];
111 probability is_rep0[STATES];
112 probability is_rep1[STATES];
113 probability is_rep2[STATES];
114 probability is_rep0_long[STATES][POS_STATES_MAX];
115 probability dist_slot[DIST_STATES][DIST_SLOTS];
116 probability dist_special[FULL_DISTANCES - DIST_MODEL_END];
117 probability dist_align[ALIGN_SIZE];
119 // These are the same as in lzma_decoder.c except that the encoders
120 // include also price tables.
121 lzma_length_encoder match_len_encoder;
122 lzma_length_encoder rep_len_encoder;
125 uint32_t dist_slot_prices[DIST_STATES][DIST_SLOTS];
126 uint32_t dist_prices[DIST_STATES][FULL_DISTANCES];
127 uint32_t dist_table_size;
128 uint32_t match_price_count;
130 uint32_t align_prices[ALIGN_SIZE];
131 uint32_t align_price_count;
134 uint32_t opts_end_index;
135 uint32_t opts_current_index;
136 lzma_optimal opts[OPTS];
140 extern void lzma_lzma_optimum_fast(
141 lzma_lzma1_encoder *restrict coder, lzma_mf *restrict mf,
142 uint32_t *restrict back_res, uint32_t *restrict len_res);
144 extern void lzma_lzma_optimum_normal(lzma_lzma1_encoder *restrict coder,
145 lzma_mf *restrict mf, uint32_t *restrict back_res,
146 uint32_t *restrict len_res, uint32_t position);