1 ///////////////////////////////////////////////////////////////////////////////
2 //
3 /// \file       lzma_encoder_private.h
4 /// \brief      Private definitions for LZMA encoder
5 ///
6 //  Authors:    Igor Pavlov
7 //              Lasse Collin
8 //
9 //  This file has been put into the public domain.
10 //  You can do whatever you want with this file.
11 //
12 ///////////////////////////////////////////////////////////////////////////////
13 
14 #ifndef LZMA_LZMA_ENCODER_PRIVATE_H
15 #define LZMA_LZMA_ENCODER_PRIVATE_H
16 
17 #include "lz_encoder.h"
18 #include "range_encoder.h"
19 #include "lzma_common.h"
20 #include "lzma_encoder.h"
21 
22 
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))
29 #else
30 #	define not_equal_16(a, b) \
31 		((a)[0] != (b)[0] || (a)[1] != (b)[1])
32 #endif
33 
34 
35 // Optimal - Number of entries in the optimum array.
36 #define OPTS (1 << 12)
37 
38 
39 typedef struct {
40 	probability choice;
41 	probability choice2;
42 	probability low[POS_STATES_MAX][LEN_LOW_SYMBOLS];
43 	probability mid[POS_STATES_MAX][LEN_MID_SYMBOLS];
44 	probability high[LEN_HIGH_SYMBOLS];
45 
46 	uint32_t prices[POS_STATES_MAX][LEN_SYMBOLS];
47 	uint32_t table_size;
48 	uint32_t counters[POS_STATES_MAX];
49 
50 } lzma_length_encoder;
51 
52 
53 typedef struct {
54 	lzma_lzma_state state;
55 
56 	bool prev_1_is_literal;
57 	bool prev_2;
58 
59 	uint32_t pos_prev_2;
60 	uint32_t back_prev_2;
61 
62 	uint32_t price;
63 	uint32_t pos_prev;  // pos_next;
64 	uint32_t back_prev;
65 
66 	uint32_t backs[REPS];
67 
68 } lzma_optimal;
69 
70 
71 struct lzma_lzma1_encoder_s {
72 	/// Range encoder
73 	lzma_range_encoder rc;
74 
75 	/// State
76 	lzma_lzma_state state;
77 
78 	/// The four most recent match distances
79 	uint32_t reps[REPS];
80 
81 	/// Array of match candidates
82 	lzma_match matches[MATCH_LEN_MAX + 1];
83 
84 	/// Number of match candidates in matches[]
85 	uint32_t matches_count;
86 
87 	/// Variable to hold the length of the longest match between calls
88 	/// to lzma_lzma_optimum_*().
89 	uint32_t longest_match_length;
90 
91 	/// True if using getoptimumfast
92 	bool fast_mode;
93 
94 	/// True if the encoder has been initialized by encoding the first
95 	/// byte as a literal.
96 	bool is_initialized;
97 
98 	/// True if the range encoder has been flushed, but not all bytes
99 	/// have been written to the output buffer yet.
100 	bool is_flushed;
101 
102 	uint32_t pos_mask;         ///< (1 << pos_bits) - 1
103 	uint32_t literal_context_bits;
104 	uint32_t literal_pos_mask;
105 
106 	// These are the same as in lzma_decoder.c. See comments there.
107 	probability literal[LITERAL_CODERS_MAX][LITERAL_CODER_SIZE];
108 	probability is_match[STATES][POS_STATES_MAX];
109 	probability is_rep[STATES];
110 	probability is_rep0[STATES];
111 	probability is_rep1[STATES];
112 	probability is_rep2[STATES];
113 	probability is_rep0_long[STATES][POS_STATES_MAX];
114 	probability dist_slot[DIST_STATES][DIST_SLOTS];
115 	probability dist_special[FULL_DISTANCES - DIST_MODEL_END];
116 	probability dist_align[ALIGN_SIZE];
117 
118 	// These are the same as in lzma_decoder.c except that the encoders
119 	// include also price tables.
120 	lzma_length_encoder match_len_encoder;
121 	lzma_length_encoder rep_len_encoder;
122 
123 	// Price tables
124 	uint32_t dist_slot_prices[DIST_STATES][DIST_SLOTS];
125 	uint32_t dist_prices[DIST_STATES][FULL_DISTANCES];
126 	uint32_t dist_table_size;
127 	uint32_t match_price_count;
128 
129 	uint32_t align_prices[ALIGN_SIZE];
130 	uint32_t align_price_count;
131 
132 	// Optimal
133 	uint32_t opts_end_index;
134 	uint32_t opts_current_index;
135 	lzma_optimal opts[OPTS];
136 };
137 
138 
139 extern void lzma_lzma_optimum_fast(
140 		lzma_lzma1_encoder *restrict coder, lzma_mf *restrict mf,
141 		uint32_t *restrict back_res, uint32_t *restrict len_res);
142 
143 extern void lzma_lzma_optimum_normal(lzma_lzma1_encoder *restrict coder,
144 		lzma_mf *restrict mf, uint32_t *restrict back_res,
145 		uint32_t *restrict len_res, uint32_t position);
146 
147 #endif
148