xref: /freebsd/contrib/xz/src/liblzma/lzma/lzma_encoder_private.h (revision 59c8e88e72633afbc47a4ace0d2170d00d51f7dc)
1 // SPDX-License-Identifier: 0BSD
2 
3 ///////////////////////////////////////////////////////////////////////////////
4 //
5 /// \file       lzma_encoder_private.h
6 /// \brief      Private definitions for LZMA encoder
7 ///
8 //  Authors:    Igor Pavlov
9 //              Lasse Collin
10 //
11 ///////////////////////////////////////////////////////////////////////////////
12 
13 #ifndef LZMA_LZMA_ENCODER_PRIVATE_H
14 #define LZMA_LZMA_ENCODER_PRIVATE_H
15 
16 #include "lz_encoder.h"
17 #include "range_encoder.h"
18 #include "lzma_common.h"
19 #include "lzma_encoder.h"
20 
21 
22 // Macro to compare if the first two bytes in two buffers differ. This is
23 // needed in lzma_lzma_optimum_*() to test if the match is at least
24 // MATCH_LEN_MIN bytes. Unaligned access gives tiny gain so there's no
25 // reason to not use it when it is supported.
26 #ifdef TUKLIB_FAST_UNALIGNED_ACCESS
27 #	define not_equal_16(a, b) (read16ne(a) != read16ne(b))
28 #else
29 #	define not_equal_16(a, b) \
30 		((a)[0] != (b)[0] || (a)[1] != (b)[1])
31 #endif
32 
33 
34 // Optimal - Number of entries in the optimum array.
35 #define OPTS (1 << 12)
36 
37 
38 typedef struct {
39 	probability choice;
40 	probability choice2;
41 	probability low[POS_STATES_MAX][LEN_LOW_SYMBOLS];
42 	probability mid[POS_STATES_MAX][LEN_MID_SYMBOLS];
43 	probability high[LEN_HIGH_SYMBOLS];
44 
45 	uint32_t prices[POS_STATES_MAX][LEN_SYMBOLS];
46 	uint32_t table_size;
47 	uint32_t counters[POS_STATES_MAX];
48 
49 } lzma_length_encoder;
50 
51 
52 typedef struct {
53 	lzma_lzma_state state;
54 
55 	bool prev_1_is_literal;
56 	bool prev_2;
57 
58 	uint32_t pos_prev_2;
59 	uint32_t back_prev_2;
60 
61 	uint32_t price;
62 	uint32_t pos_prev;  // pos_next;
63 	uint32_t back_prev;
64 
65 	uint32_t backs[REPS];
66 
67 } lzma_optimal;
68 
69 
70 struct lzma_lzma1_encoder_s {
71 	/// Range encoder
72 	lzma_range_encoder rc;
73 
74 	/// Uncompressed size (doesn't include possible preset dictionary)
75 	uint64_t uncomp_size;
76 
77 	/// If non-zero, produce at most this much output.
78 	/// Some input may then be missing from the output.
79 	uint64_t out_limit;
80 
81 	/// If the above out_limit is non-zero, *uncomp_size_ptr is set to
82 	/// the amount of uncompressed data that we were able to fit
83 	/// in the output buffer.
84 	uint64_t *uncomp_size_ptr;
85 
86 	/// State
87 	lzma_lzma_state state;
88 
89 	/// The four most recent match distances
90 	uint32_t reps[REPS];
91 
92 	/// Array of match candidates
93 	lzma_match matches[MATCH_LEN_MAX + 1];
94 
95 	/// Number of match candidates in matches[]
96 	uint32_t matches_count;
97 
98 	/// Variable to hold the length of the longest match between calls
99 	/// to lzma_lzma_optimum_*().
100 	uint32_t longest_match_length;
101 
102 	/// True if using getoptimumfast
103 	bool fast_mode;
104 
105 	/// True if the encoder has been initialized by encoding the first
106 	/// byte as a literal.
107 	bool is_initialized;
108 
109 	/// True if the range encoder has been flushed, but not all bytes
110 	/// have been written to the output buffer yet.
111 	bool is_flushed;
112 
113 	/// True if end of payload marker will be written.
114 	bool use_eopm;
115 
116 	uint32_t pos_mask;         ///< (1 << pos_bits) - 1
117 	uint32_t literal_context_bits;
118 	uint32_t literal_mask;
119 
120 	// These are the same as in lzma_decoder.c. See comments there.
121 	probability literal[LITERAL_CODERS_MAX * LITERAL_CODER_SIZE];
122 	probability is_match[STATES][POS_STATES_MAX];
123 	probability is_rep[STATES];
124 	probability is_rep0[STATES];
125 	probability is_rep1[STATES];
126 	probability is_rep2[STATES];
127 	probability is_rep0_long[STATES][POS_STATES_MAX];
128 	probability dist_slot[DIST_STATES][DIST_SLOTS];
129 	probability dist_special[FULL_DISTANCES - DIST_MODEL_END];
130 	probability dist_align[ALIGN_SIZE];
131 
132 	// These are the same as in lzma_decoder.c except that the encoders
133 	// include also price tables.
134 	lzma_length_encoder match_len_encoder;
135 	lzma_length_encoder rep_len_encoder;
136 
137 	// Price tables
138 	uint32_t dist_slot_prices[DIST_STATES][DIST_SLOTS];
139 	uint32_t dist_prices[DIST_STATES][FULL_DISTANCES];
140 	uint32_t dist_table_size;
141 	uint32_t match_price_count;
142 
143 	uint32_t align_prices[ALIGN_SIZE];
144 	uint32_t align_price_count;
145 
146 	// Optimal
147 	uint32_t opts_end_index;
148 	uint32_t opts_current_index;
149 	lzma_optimal opts[OPTS];
150 };
151 
152 
153 extern void lzma_lzma_optimum_fast(
154 		lzma_lzma1_encoder *restrict coder, lzma_mf *restrict mf,
155 		uint32_t *restrict back_res, uint32_t *restrict len_res);
156 
157 extern void lzma_lzma_optimum_normal(lzma_lzma1_encoder *restrict coder,
158 		lzma_mf *restrict mf, uint32_t *restrict back_res,
159 		uint32_t *restrict len_res, uint32_t position);
160 
161 #endif
162