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 /// Uncompressed size (doesn't include possible preset dictionary) 76 uint64_t uncomp_size; 77 78 /// If non-zero, produce at most this much output. 79 /// Some input may then be missing from the output. 80 uint64_t out_limit; 81 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; 86 87 /// State 88 lzma_lzma_state state; 89 90 /// The four most recent match distances 91 uint32_t reps[REPS]; 92 93 /// Array of match candidates 94 lzma_match matches[MATCH_LEN_MAX + 1]; 95 96 /// Number of match candidates in matches[] 97 uint32_t matches_count; 98 99 /// Variable to hold the length of the longest match between calls 100 /// to lzma_lzma_optimum_*(). 101 uint32_t longest_match_length; 102 103 /// True if using getoptimumfast 104 bool fast_mode; 105 106 /// True if the encoder has been initialized by encoding the first 107 /// byte as a literal. 108 bool is_initialized; 109 110 /// True if the range encoder has been flushed, but not all bytes 111 /// have been written to the output buffer yet. 112 bool is_flushed; 113 114 /// True if end of payload marker will be written. 115 bool use_eopm; 116 117 uint32_t pos_mask; ///< (1 << pos_bits) - 1 118 uint32_t literal_context_bits; 119 uint32_t literal_pos_mask; 120 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]; 132 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; 137 138 // Price tables 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; 143 144 uint32_t align_prices[ALIGN_SIZE]; 145 uint32_t align_price_count; 146 147 // Optimal 148 uint32_t opts_end_index; 149 uint32_t opts_current_index; 150 lzma_optimal opts[OPTS]; 151 }; 152 153 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); 157 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); 161 162 #endif 163