1 ///////////////////////////////////////////////////////////////////////////////
4 /// \brief LZ in window and match finder API
6 // Copyright (C) 1999-2006 Igor Pavlov
7 // Copyright (C) 2007 Lasse Collin
9 // This library is free software; you can redistribute it and/or
10 // modify it under the terms of the GNU Lesser General Public
11 // License as published by the Free Software Foundation; either
12 // version 2.1 of the License, or (at your option) any later version.
14 // This library is distributed in the hope that it will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 // Lesser General Public License for more details.
19 ///////////////////////////////////////////////////////////////////////////////
21 #ifndef LZMA_LZ_ENCODER_H
22 #define LZMA_LZ_ENCODER_H
27 #define LZMA_LZ_TEMP_SIZE 64
30 typedef struct lzma_lz_encoder_s lzma_lz_encoder;
31 struct lzma_lz_encoder_s {
41 bool (*process)(lzma_coder *coder, uint8_t *restrict out,
42 size_t *restrict out_pos, size_t out_size);
44 /// Uncompressed Size or LZMA_VLI_VALUE_UNKNOWN if using EOPM. We need
45 /// to track Uncompressed Size to prevent writing flush marker to the
46 /// very end of stream that doesn't use EOPM.
47 lzma_vli uncompressed_size;
49 /// Temporary buffer for range encoder.
50 uint8_t temp[LZMA_LZ_TEMP_SIZE];
57 /// Pointer to buffer with data to be compressed
60 /// Total size of the allocated buffer (that is, including all
64 /// Match finders store locations of matches using 32-bit integers.
65 /// To avoid adjusting several megabytes of integers every time the
66 /// input window is moved with move_window(), we only adjust the
67 /// offset of the buffer. Thus, buffer[match_finder_pos - offset]
68 /// is the byte pointed by match_finder_pos.
71 /// buffer[read_pos] is the current byte.
74 /// As long as read_pos is less than read_limit, there is enough
75 /// input available in buffer for at least one encoding loop.
77 /// Because of the stateful API, read_limit may and will get greater
78 /// than read_pos quite often. This is taken into account when
79 /// calculating the value for keep_size_after.
82 /// buffer[write_pos] is the first byte that doesn't contain valid
83 /// uncompressed data; that is, the next input byte will be copied
84 /// to buffer[write_pos].
87 /// Number of bytes that must be kept available in our input history.
88 /// That is, once keep_size_before bytes have been processed,
89 /// buffer[read_pos - keep_size_before] is the oldest byte that
90 /// must be available for reading.
91 size_t keep_size_before;
93 /// Number of bytes that must be kept in buffer after read_pos.
94 /// That is, read_pos <= write_pos - keep_size_after as long as
95 /// stream_end_was_reached is false (once it is true, read_pos
96 /// is allowed to reach write_pos).
97 size_t keep_size_after;
103 // Pointers to match finder functions
104 void (*get_matches)(lzma_lz_encoder *restrict lz,
105 uint32_t *restrict distances);
106 void (*skip)(lzma_lz_encoder *restrict lz, uint32_t num);
109 uint32_t *hash; // TODO: Check if hash aliases son
110 uint32_t *son; // and add 'restrict' if possible.
111 uint32_t cyclic_buffer_pos;
112 uint32_t cyclic_buffer_size; // Must be dictionary_size + 1.
115 uint32_t hash_size_sum;
117 uint32_t match_max_len;
121 #define LZMA_LZ_ENCODER_INIT \
131 extern uint32_t lzma_lz_encoder_hash_properties(lzma_match_finder match_finder,
132 uint32_t history_size, uint32_t *restrict hash_mask,
133 uint32_t *restrict hash_size_sum,
134 uint32_t *restrict num_items);
136 // NOTE: liblzma doesn't use callback API like LZMA SDK does. The caller
137 // must make sure that keep_size_after is big enough for single encoding pass
138 // i.e. keep_size_after >= maximum number of bytes possibly needed after
139 // the current position between calls to lzma_lz_read().
140 extern lzma_ret lzma_lz_encoder_reset(lzma_lz_encoder *lz,
141 lzma_allocator *allocator,
142 bool (*process)(lzma_coder *coder, uint8_t *restrict out,
143 size_t *restrict out_pos, size_t out_size),
144 lzma_vli uncompressed_size,
145 size_t history_size, size_t additional_buffer_before,
146 size_t match_max_len, size_t additional_buffer_after,
147 lzma_match_finder match_finder, uint32_t match_finder_cycles,
148 const uint8_t *preset_dictionary,
149 size_t preset_dictionary_size);
151 /// Frees memory allocated for in window and match finder buffers.
152 extern void lzma_lz_encoder_end(
153 lzma_lz_encoder *lz, lzma_allocator *allocator);
155 extern lzma_ret lzma_lz_encode(lzma_coder *coder,
156 lzma_allocator *allocator lzma_attribute((unused)),
157 const uint8_t *restrict in, size_t *restrict in_pos,
158 size_t in_size, uint8_t *restrict out,
159 size_t *restrict out_pos, size_t out_size,
162 /// This should not be called directly, but only via move_pos() macro.
163 extern void lzma_lz_encoder_normalize(lzma_lz_encoder *lz);