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