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) (read16ne(a) != read16ne(b))
30 # define not_equal_16(a, b) \
31 ((a)[0] != (b)[0] || (a)[1] != (b)[1])
35 // Optimal - Number of entries in the optimum array.
36 #define OPTS (1 << 12)
42 probability low
[POS_STATES_MAX
][LEN_LOW_SYMBOLS
];
43 probability mid
[POS_STATES_MAX
][LEN_MID_SYMBOLS
];
44 probability high
[LEN_HIGH_SYMBOLS
];
46 uint32_t prices
[POS_STATES_MAX
][LEN_SYMBOLS
];
48 uint32_t counters
[POS_STATES_MAX
];
50 } lzma_length_encoder
;
54 lzma_lzma_state state
;
56 bool prev_1_is_literal
;
63 uint32_t pos_prev
; // pos_next;
71 struct lzma_lzma1_encoder_s
{
73 lzma_range_encoder rc
;
75 /// Uncompressed size (doesn't include possible preset dictionary)
78 /// If non-zero, produce at most this much output.
79 /// Some input may then be missing from the output.
82 /// If the above out_limit is non-zero, *uncomp_size_ptr is set to
83 /// the amount of uncompressed data that we were able to fit
84 /// in the output buffer.
85 uint64_t *uncomp_size_ptr
;
88 lzma_lzma_state state
;
90 /// The four most recent match distances
93 /// Array of match candidates
94 lzma_match matches
[MATCH_LEN_MAX
+ 1];
96 /// Number of match candidates in matches[]
97 uint32_t matches_count
;
99 /// Variable to hold the length of the longest match between calls
100 /// to lzma_lzma_optimum_*().
101 uint32_t longest_match_length
;
103 /// True if using getoptimumfast
106 /// True if the encoder has been initialized by encoding the first
107 /// byte as a literal.
110 /// True if the range encoder has been flushed, but not all bytes
111 /// have been written to the output buffer yet.
114 /// True if end of payload marker will be written.
117 uint32_t pos_mask
; ///< (1 << pos_bits) - 1
118 uint32_t literal_context_bits
;
119 uint32_t literal_pos_mask
;
121 // These are the same as in lzma_decoder.c. See comments there.
122 probability literal
[LITERAL_CODERS_MAX
][LITERAL_CODER_SIZE
];
123 probability is_match
[STATES
][POS_STATES_MAX
];
124 probability is_rep
[STATES
];
125 probability is_rep0
[STATES
];
126 probability is_rep1
[STATES
];
127 probability is_rep2
[STATES
];
128 probability is_rep0_long
[STATES
][POS_STATES_MAX
];
129 probability dist_slot
[DIST_STATES
][DIST_SLOTS
];
130 probability dist_special
[FULL_DISTANCES
- DIST_MODEL_END
];
131 probability dist_align
[ALIGN_SIZE
];
133 // These are the same as in lzma_decoder.c except that the encoders
134 // include also price tables.
135 lzma_length_encoder match_len_encoder
;
136 lzma_length_encoder rep_len_encoder
;
139 uint32_t dist_slot_prices
[DIST_STATES
][DIST_SLOTS
];
140 uint32_t dist_prices
[DIST_STATES
][FULL_DISTANCES
];
141 uint32_t dist_table_size
;
142 uint32_t match_price_count
;
144 uint32_t align_prices
[ALIGN_SIZE
];
145 uint32_t align_price_count
;
148 uint32_t opts_end_index
;
149 uint32_t opts_current_index
;
150 lzma_optimal opts
[OPTS
];
154 extern void lzma_lzma_optimum_fast(
155 lzma_lzma1_encoder
*restrict coder
, lzma_mf
*restrict mf
,
156 uint32_t *restrict back_res
, uint32_t *restrict len_res
);
158 extern void lzma_lzma_optimum_normal(lzma_lzma1_encoder
*restrict coder
,
159 lzma_mf
*restrict mf
, uint32_t *restrict back_res
,
160 uint32_t *restrict len_res
, uint32_t position
);