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