xref: /freebsd/contrib/xz/src/liblzma/lzma/lzma_encoder_private.h (revision 3b35e7ee8de9b0260149a2b77e87a2b9c7a36244)
1*3b35e7eeSXin LI // SPDX-License-Identifier: 0BSD
2*3b35e7eeSXin LI 
381ad8388SMartin Matuska ///////////////////////////////////////////////////////////////////////////////
481ad8388SMartin Matuska //
581ad8388SMartin Matuska /// \file       lzma_encoder_private.h
681ad8388SMartin Matuska /// \brief      Private definitions for LZMA encoder
781ad8388SMartin Matuska ///
881ad8388SMartin Matuska //  Authors:    Igor Pavlov
981ad8388SMartin Matuska //              Lasse Collin
1081ad8388SMartin Matuska //
1181ad8388SMartin Matuska ///////////////////////////////////////////////////////////////////////////////
1281ad8388SMartin Matuska 
1381ad8388SMartin Matuska #ifndef LZMA_LZMA_ENCODER_PRIVATE_H
1481ad8388SMartin Matuska #define LZMA_LZMA_ENCODER_PRIVATE_H
1581ad8388SMartin Matuska 
1681ad8388SMartin Matuska #include "lz_encoder.h"
1781ad8388SMartin Matuska #include "range_encoder.h"
1881ad8388SMartin Matuska #include "lzma_common.h"
1981ad8388SMartin Matuska #include "lzma_encoder.h"
2081ad8388SMartin Matuska 
2181ad8388SMartin Matuska 
2281ad8388SMartin Matuska // Macro to compare if the first two bytes in two buffers differ. This is
2381ad8388SMartin Matuska // needed in lzma_lzma_optimum_*() to test if the match is at least
2481ad8388SMartin Matuska // MATCH_LEN_MIN bytes. Unaligned access gives tiny gain so there's no
2581ad8388SMartin Matuska // reason to not use it when it is supported.
2681ad8388SMartin Matuska #ifdef TUKLIB_FAST_UNALIGNED_ACCESS
27a8675d92SXin LI #	define not_equal_16(a, b) (read16ne(a) != read16ne(b))
2881ad8388SMartin Matuska #else
2981ad8388SMartin Matuska #	define not_equal_16(a, b) \
3081ad8388SMartin Matuska 		((a)[0] != (b)[0] || (a)[1] != (b)[1])
3181ad8388SMartin Matuska #endif
3281ad8388SMartin Matuska 
3381ad8388SMartin Matuska 
3481ad8388SMartin Matuska // Optimal - Number of entries in the optimum array.
3581ad8388SMartin Matuska #define OPTS (1 << 12)
3681ad8388SMartin Matuska 
3781ad8388SMartin Matuska 
3881ad8388SMartin Matuska typedef struct {
3981ad8388SMartin Matuska 	probability choice;
4081ad8388SMartin Matuska 	probability choice2;
4181ad8388SMartin Matuska 	probability low[POS_STATES_MAX][LEN_LOW_SYMBOLS];
4281ad8388SMartin Matuska 	probability mid[POS_STATES_MAX][LEN_MID_SYMBOLS];
4381ad8388SMartin Matuska 	probability high[LEN_HIGH_SYMBOLS];
4481ad8388SMartin Matuska 
4581ad8388SMartin Matuska 	uint32_t prices[POS_STATES_MAX][LEN_SYMBOLS];
4681ad8388SMartin Matuska 	uint32_t table_size;
4781ad8388SMartin Matuska 	uint32_t counters[POS_STATES_MAX];
4881ad8388SMartin Matuska 
4981ad8388SMartin Matuska } lzma_length_encoder;
5081ad8388SMartin Matuska 
5181ad8388SMartin Matuska 
5281ad8388SMartin Matuska typedef struct {
5381ad8388SMartin Matuska 	lzma_lzma_state state;
5481ad8388SMartin Matuska 
5581ad8388SMartin Matuska 	bool prev_1_is_literal;
5681ad8388SMartin Matuska 	bool prev_2;
5781ad8388SMartin Matuska 
5881ad8388SMartin Matuska 	uint32_t pos_prev_2;
5981ad8388SMartin Matuska 	uint32_t back_prev_2;
6081ad8388SMartin Matuska 
6181ad8388SMartin Matuska 	uint32_t price;
6281ad8388SMartin Matuska 	uint32_t pos_prev;  // pos_next;
6381ad8388SMartin Matuska 	uint32_t back_prev;
6481ad8388SMartin Matuska 
6553200025SRui Paulo 	uint32_t backs[REPS];
6681ad8388SMartin Matuska 
6781ad8388SMartin Matuska } lzma_optimal;
6881ad8388SMartin Matuska 
6981ad8388SMartin Matuska 
701456f0f9SXin LI struct lzma_lzma1_encoder_s {
7181ad8388SMartin Matuska 	/// Range encoder
7281ad8388SMartin Matuska 	lzma_range_encoder rc;
7381ad8388SMartin Matuska 
7473ed8e77SXin LI 	/// Uncompressed size (doesn't include possible preset dictionary)
7573ed8e77SXin LI 	uint64_t uncomp_size;
7673ed8e77SXin LI 
7773ed8e77SXin LI 	/// If non-zero, produce at most this much output.
7873ed8e77SXin LI 	/// Some input may then be missing from the output.
7973ed8e77SXin LI 	uint64_t out_limit;
8073ed8e77SXin LI 
8173ed8e77SXin LI 	/// If the above out_limit is non-zero, *uncomp_size_ptr is set to
8273ed8e77SXin LI 	/// the amount of uncompressed data that we were able to fit
8373ed8e77SXin LI 	/// in the output buffer.
8473ed8e77SXin LI 	uint64_t *uncomp_size_ptr;
8573ed8e77SXin LI 
8681ad8388SMartin Matuska 	/// State
8781ad8388SMartin Matuska 	lzma_lzma_state state;
8881ad8388SMartin Matuska 
8981ad8388SMartin Matuska 	/// The four most recent match distances
9053200025SRui Paulo 	uint32_t reps[REPS];
9181ad8388SMartin Matuska 
9281ad8388SMartin Matuska 	/// Array of match candidates
9381ad8388SMartin Matuska 	lzma_match matches[MATCH_LEN_MAX + 1];
9481ad8388SMartin Matuska 
9581ad8388SMartin Matuska 	/// Number of match candidates in matches[]
9681ad8388SMartin Matuska 	uint32_t matches_count;
9781ad8388SMartin Matuska 
9881ad8388SMartin Matuska 	/// Variable to hold the length of the longest match between calls
9981ad8388SMartin Matuska 	/// to lzma_lzma_optimum_*().
10081ad8388SMartin Matuska 	uint32_t longest_match_length;
10181ad8388SMartin Matuska 
10281ad8388SMartin Matuska 	/// True if using getoptimumfast
10381ad8388SMartin Matuska 	bool fast_mode;
10481ad8388SMartin Matuska 
10581ad8388SMartin Matuska 	/// True if the encoder has been initialized by encoding the first
10681ad8388SMartin Matuska 	/// byte as a literal.
10781ad8388SMartin Matuska 	bool is_initialized;
10881ad8388SMartin Matuska 
10981ad8388SMartin Matuska 	/// True if the range encoder has been flushed, but not all bytes
11081ad8388SMartin Matuska 	/// have been written to the output buffer yet.
11181ad8388SMartin Matuska 	bool is_flushed;
11281ad8388SMartin Matuska 
11373ed8e77SXin LI 	/// True if end of payload marker will be written.
11473ed8e77SXin LI 	bool use_eopm;
11573ed8e77SXin LI 
11681ad8388SMartin Matuska 	uint32_t pos_mask;         ///< (1 << pos_bits) - 1
11781ad8388SMartin Matuska 	uint32_t literal_context_bits;
118*3b35e7eeSXin LI 	uint32_t literal_mask;
11981ad8388SMartin Matuska 
12081ad8388SMartin Matuska 	// These are the same as in lzma_decoder.c. See comments there.
121*3b35e7eeSXin LI 	probability literal[LITERAL_CODERS_MAX * LITERAL_CODER_SIZE];
12281ad8388SMartin Matuska 	probability is_match[STATES][POS_STATES_MAX];
12381ad8388SMartin Matuska 	probability is_rep[STATES];
12481ad8388SMartin Matuska 	probability is_rep0[STATES];
12581ad8388SMartin Matuska 	probability is_rep1[STATES];
12681ad8388SMartin Matuska 	probability is_rep2[STATES];
12781ad8388SMartin Matuska 	probability is_rep0_long[STATES][POS_STATES_MAX];
12853200025SRui Paulo 	probability dist_slot[DIST_STATES][DIST_SLOTS];
12953200025SRui Paulo 	probability dist_special[FULL_DISTANCES - DIST_MODEL_END];
13053200025SRui Paulo 	probability dist_align[ALIGN_SIZE];
13181ad8388SMartin Matuska 
13281ad8388SMartin Matuska 	// These are the same as in lzma_decoder.c except that the encoders
13381ad8388SMartin Matuska 	// include also price tables.
13481ad8388SMartin Matuska 	lzma_length_encoder match_len_encoder;
13581ad8388SMartin Matuska 	lzma_length_encoder rep_len_encoder;
13681ad8388SMartin Matuska 
13781ad8388SMartin Matuska 	// Price tables
13853200025SRui Paulo 	uint32_t dist_slot_prices[DIST_STATES][DIST_SLOTS];
13953200025SRui Paulo 	uint32_t dist_prices[DIST_STATES][FULL_DISTANCES];
14081ad8388SMartin Matuska 	uint32_t dist_table_size;
14181ad8388SMartin Matuska 	uint32_t match_price_count;
14281ad8388SMartin Matuska 
14353200025SRui Paulo 	uint32_t align_prices[ALIGN_SIZE];
14481ad8388SMartin Matuska 	uint32_t align_price_count;
14581ad8388SMartin Matuska 
14681ad8388SMartin Matuska 	// Optimal
14781ad8388SMartin Matuska 	uint32_t opts_end_index;
14881ad8388SMartin Matuska 	uint32_t opts_current_index;
14981ad8388SMartin Matuska 	lzma_optimal opts[OPTS];
15081ad8388SMartin Matuska };
15181ad8388SMartin Matuska 
15281ad8388SMartin Matuska 
15381ad8388SMartin Matuska extern void lzma_lzma_optimum_fast(
1541456f0f9SXin LI 		lzma_lzma1_encoder *restrict coder, lzma_mf *restrict mf,
15581ad8388SMartin Matuska 		uint32_t *restrict back_res, uint32_t *restrict len_res);
15681ad8388SMartin Matuska 
1571456f0f9SXin LI extern void lzma_lzma_optimum_normal(lzma_lzma1_encoder *restrict coder,
15881ad8388SMartin Matuska 		lzma_mf *restrict mf, uint32_t *restrict back_res,
15981ad8388SMartin Matuska 		uint32_t *restrict len_res, uint32_t position);
16081ad8388SMartin Matuska 
16181ad8388SMartin Matuska #endif
162