1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package org.waarp.compress.zstdunsafe;
35
36 import static org.waarp.compress.zstdunsafe.Constants.*;
37
38 class CompressionParameters {
39 private static final int MIN_HASH_LOG = 6;
40
41 public static final int DEFAULT_COMPRESSION_LEVEL = 3;
42 private static final int MAX_COMPRESSION_LEVEL = 22;
43
44 private final int windowLog;
45
46 private final int chainLog;
47
48 private final int hashLog;
49 private final int searchLog;
50
51 private final int searchLength;
52
53 private final int targetLength;
54
55 private final Strategy strategy;
56
57 private static final CompressionParameters[][]
58 DEFAULT_COMPRESSION_PARAMETERS = new CompressionParameters[][] {
59 {
60
61 new CompressionParameters(19, 12, 13, 1, 6, 1, Strategy.FAST),
62
63 new CompressionParameters(19, 13, 14, 1, 7, 0, Strategy.FAST),
64
65 new CompressionParameters(19, 15, 16, 1, 6, 0, Strategy.FAST),
66
67 new CompressionParameters(20, 16, 17, 1, 5, 1, Strategy.DFAST),
68
69 new CompressionParameters(20, 18, 18, 1, 5, 1, Strategy.DFAST),
70
71 new CompressionParameters(20, 18, 18, 2, 5, 2, Strategy.GREEDY),
72
73 new CompressionParameters(21, 18, 19, 2, 5, 4, Strategy.LAZY),
74
75 new CompressionParameters(21, 18, 19, 3, 5, 8, Strategy.LAZY2),
76
77 new CompressionParameters(21, 19, 19, 3, 5, 16, Strategy.LAZY2),
78
79 new CompressionParameters(21, 19, 20, 4, 5, 16, Strategy.LAZY2),
80
81 new CompressionParameters(21, 20, 21, 4, 5, 16, Strategy.LAZY2),
82
83 new CompressionParameters(21, 21, 22, 4, 5, 16, Strategy.LAZY2),
84
85 new CompressionParameters(22, 20, 22, 5, 5, 16, Strategy.LAZY2),
86
87 new CompressionParameters(22, 21, 22, 4, 5, 32, Strategy.BTLAZY2),
88
89 new CompressionParameters(22, 21, 22, 5, 5, 32, Strategy.BTLAZY2),
90
91 new CompressionParameters(22, 22, 22, 6, 5, 32, Strategy.BTLAZY2),
92
93 new CompressionParameters(22, 21, 22, 4, 5, 48, Strategy.BTOPT),
94
95 new CompressionParameters(23, 22, 22, 4, 4, 64, Strategy.BTOPT),
96
97 new CompressionParameters(23, 23, 22, 6, 3, 256, Strategy.BTOPT),
98
99 new CompressionParameters(23, 24, 22, 7, 3, 256, Strategy.BTULTRA),
100
101 new CompressionParameters(25, 25, 23, 7, 3, 256, Strategy.BTULTRA),
102
103 new CompressionParameters(26, 26, 24, 7, 3, 512, Strategy.BTULTRA),
104
105 new CompressionParameters(27, 27, 25, 9, 3, 999, Strategy.BTULTRA)
106
107 }, {
108
109 new CompressionParameters(18, 12, 13, 1, 5, 1, Strategy.FAST),
110
111 new CompressionParameters(18, 13, 14, 1, 6, 0, Strategy.FAST),
112
113 new CompressionParameters(18, 14, 14, 1, 5, 1, Strategy.DFAST),
114
115 new CompressionParameters(18, 16, 16, 1, 4, 1, Strategy.DFAST),
116
117 new CompressionParameters(18, 16, 17, 2, 5, 2, Strategy.GREEDY),
118
119 new CompressionParameters(18, 18, 18, 3, 5, 2, Strategy.GREEDY),
120
121 new CompressionParameters(18, 18, 19, 3, 5, 4, Strategy.LAZY),
122
123 new CompressionParameters(18, 18, 19, 4, 4, 4, Strategy.LAZY),
124
125 new CompressionParameters(18, 18, 19, 4, 4, 8, Strategy.LAZY2),
126
127 new CompressionParameters(18, 18, 19, 5, 4, 8, Strategy.LAZY2),
128
129 new CompressionParameters(18, 18, 19, 6, 4, 8, Strategy.LAZY2),
130
131 new CompressionParameters(18, 18, 19, 5, 4, 16, Strategy.BTLAZY2),
132
133 new CompressionParameters(18, 19, 19, 6, 4, 16, Strategy.BTLAZY2),
134
135 new CompressionParameters(18, 19, 19, 8, 4, 16, Strategy.BTLAZY2),
136
137 new CompressionParameters(18, 18, 19, 4, 4, 24, Strategy.BTOPT),
138
139 new CompressionParameters(18, 18, 19, 4, 3, 24, Strategy.BTOPT),
140
141 new CompressionParameters(18, 19, 19, 6, 3, 64, Strategy.BTOPT),
142
143 new CompressionParameters(18, 19, 19, 8, 3, 128, Strategy.BTOPT),
144
145 new CompressionParameters(18, 19, 19, 10, 3, 256, Strategy.BTOPT),
146
147 new CompressionParameters(18, 19, 19, 10, 3, 256, Strategy.BTULTRA),
148
149 new CompressionParameters(18, 19, 19, 11, 3, 512, Strategy.BTULTRA),
150
151 new CompressionParameters(18, 19, 19, 12, 3, 512, Strategy.BTULTRA),
152
153 new CompressionParameters(18, 19, 19, 13, 3, 999, Strategy.BTULTRA)
154
155 }, {
156
157 new CompressionParameters(17, 12, 12, 1, 5, 1, Strategy.FAST),
158
159 new CompressionParameters(17, 12, 13, 1, 6, 0, Strategy.FAST),
160
161 new CompressionParameters(17, 13, 15, 1, 5, 0, Strategy.FAST),
162
163 new CompressionParameters(17, 15, 16, 2, 5, 1, Strategy.DFAST),
164
165 new CompressionParameters(17, 17, 17, 2, 4, 1, Strategy.DFAST),
166
167 new CompressionParameters(17, 16, 17, 3, 4, 2, Strategy.GREEDY),
168
169 new CompressionParameters(17, 17, 17, 3, 4, 4, Strategy.LAZY),
170
171 new CompressionParameters(17, 17, 17, 3, 4, 8, Strategy.LAZY2),
172
173 new CompressionParameters(17, 17, 17, 4, 4, 8, Strategy.LAZY2),
174
175 new CompressionParameters(17, 17, 17, 5, 4, 8, Strategy.LAZY2),
176
177 new CompressionParameters(17, 17, 17, 6, 4, 8, Strategy.LAZY2),
178
179 new CompressionParameters(17, 17, 17, 7, 4, 8, Strategy.LAZY2),
180
181 new CompressionParameters(17, 18, 17, 6, 4, 16, Strategy.BTLAZY2),
182
183 new CompressionParameters(17, 18, 17, 8, 4, 16, Strategy.BTLAZY2),
184
185 new CompressionParameters(17, 18, 17, 4, 4, 32, Strategy.BTOPT),
186
187 new CompressionParameters(17, 18, 17, 6, 3, 64, Strategy.BTOPT),
188
189 new CompressionParameters(17, 18, 17, 7, 3, 128, Strategy.BTOPT),
190
191 new CompressionParameters(17, 18, 17, 7, 3, 256, Strategy.BTOPT),
192
193 new CompressionParameters(17, 18, 17, 8, 3, 256, Strategy.BTOPT),
194
195 new CompressionParameters(17, 18, 17, 8, 3, 256, Strategy.BTULTRA),
196
197 new CompressionParameters(17, 18, 17, 9, 3, 256, Strategy.BTULTRA),
198
199 new CompressionParameters(17, 18, 17, 10, 3, 256, Strategy.BTULTRA),
200
201 new CompressionParameters(17, 18, 17, 11, 3, 512, Strategy.BTULTRA)
202
203 }, {
204
205 new CompressionParameters(14, 12, 13, 1, 5, 1, Strategy.FAST),
206
207 new CompressionParameters(14, 14, 15, 1, 5, 0, Strategy.FAST),
208
209 new CompressionParameters(14, 14, 15, 1, 4, 0, Strategy.FAST),
210
211 new CompressionParameters(14, 14, 14, 2, 4, 1, Strategy.DFAST),
212
213 new CompressionParameters(14, 14, 14, 4, 4, 2, Strategy.GREEDY),
214
215 new CompressionParameters(14, 14, 14, 3, 4, 4, Strategy.LAZY),
216
217 new CompressionParameters(14, 14, 14, 4, 4, 8, Strategy.LAZY2),
218
219 new CompressionParameters(14, 14, 14, 6, 4, 8, Strategy.LAZY2),
220
221 new CompressionParameters(14, 14, 14, 8, 4, 8, Strategy.LAZY2),
222
223 new CompressionParameters(14, 15, 14, 5, 4, 8, Strategy.BTLAZY2),
224
225 new CompressionParameters(14, 15, 14, 9, 4, 8, Strategy.BTLAZY2),
226
227 new CompressionParameters(14, 15, 14, 3, 4, 12, Strategy.BTOPT),
228
229 new CompressionParameters(14, 15, 14, 6, 3, 16, Strategy.BTOPT),
230
231 new CompressionParameters(14, 15, 14, 6, 3, 24, Strategy.BTOPT),
232
233 new CompressionParameters(14, 15, 15, 6, 3, 48, Strategy.BTOPT),
234
235 new CompressionParameters(14, 15, 15, 6, 3, 64, Strategy.BTOPT),
236
237 new CompressionParameters(14, 15, 15, 6, 3, 96, Strategy.BTOPT),
238
239 new CompressionParameters(14, 15, 15, 6, 3, 128, Strategy.BTOPT),
240
241 new CompressionParameters(14, 15, 15, 8, 3, 256, Strategy.BTOPT),
242
243 new CompressionParameters(14, 15, 15, 6, 3, 256, Strategy.BTULTRA),
244
245 new CompressionParameters(14, 15, 15, 8, 3, 256, Strategy.BTULTRA),
246
247 new CompressionParameters(14, 15, 15, 9, 3, 256, Strategy.BTULTRA),
248
249 new CompressionParameters(14, 15, 15, 10, 3, 512, Strategy.BTULTRA)
250
251 }
252 };
253
254 public enum Strategy {
255
256
257
258 FAST(BlockCompressor.UNSUPPORTED),
259
260
261
262 DFAST(new DoubleFastBlockCompressor()),
263
264
265
266
267 GREEDY(BlockCompressor.UNSUPPORTED),
268
269
270
271
272 LAZY(BlockCompressor.UNSUPPORTED),
273
274
275 LAZY2(BlockCompressor.UNSUPPORTED),
276
277
278
279
280
281 BTLAZY2(BlockCompressor.UNSUPPORTED),
282
283
284
285
286 BTOPT(BlockCompressor.UNSUPPORTED),
287
288
289 BTULTRA(BlockCompressor.UNSUPPORTED);
290
291 private final BlockCompressor compressor;
292
293 Strategy(final BlockCompressor compressor) {
294 this.compressor = compressor;
295 }
296
297 public BlockCompressor getCompressor() {
298 return compressor;
299 }
300 }
301
302 public CompressionParameters(final int windowLog, final int chainLog,
303 final int hashLog, final int searchLog,
304 final int searchLength, final int targetLength,
305 final Strategy strategy) {
306 this.windowLog = windowLog;
307 this.chainLog = chainLog;
308 this.hashLog = hashLog;
309 this.searchLog = searchLog;
310 this.searchLength = searchLength;
311 this.targetLength = targetLength;
312 this.strategy = strategy;
313 }
314
315 public int getWindowLog() {
316 return windowLog;
317 }
318
319 public int getSearchLength() {
320 return searchLength;
321 }
322
323 public int getChainLog() {
324 return chainLog;
325 }
326
327 public int getHashLog() {
328 return hashLog;
329 }
330
331 public int getSearchLog() {
332 return searchLog;
333 }
334
335 public int getTargetLength() {
336 return targetLength;
337 }
338
339 public Strategy getStrategy() {
340 return strategy;
341 }
342
343 public static CompressionParameters compute(final int compressionLevel,
344 final int inputSize) {
345 final CompressionParameters defaultParameters =
346 getDefaultParameters(compressionLevel, inputSize);
347
348 int targetLength = defaultParameters.targetLength;
349 int windowLog = defaultParameters.windowLog;
350 int chainLog = defaultParameters.chainLog;
351 int hashLog = defaultParameters.hashLog;
352 final int searchLog = defaultParameters.searchLog;
353 final int searchLength = defaultParameters.searchLength;
354 final Strategy strategy = defaultParameters.strategy;
355
356 if (compressionLevel < 0) {
357 targetLength = -compressionLevel;
358 }
359
360
361 final long maxWindowResize = 1L << (MAX_WINDOW_LOG - 1);
362 if (inputSize < maxWindowResize) {
363 final int hashSizeMin = 1 << MIN_HASH_LOG;
364 final int inputSizeLog = (inputSize < hashSizeMin)? MIN_HASH_LOG :
365 Util.highestBit(inputSize - 1) + 1;
366 if (windowLog > inputSizeLog) {
367 windowLog = inputSizeLog;
368 }
369 }
370
371 if (hashLog > windowLog + 1) {
372 hashLog = windowLog + 1;
373 }
374
375 final int cycleLog = Util.cycleLog(chainLog, strategy);
376 if (cycleLog > windowLog) {
377 chainLog -= (cycleLog - windowLog);
378 }
379
380 if (windowLog < MIN_WINDOW_LOG) {
381 windowLog = MIN_WINDOW_LOG;
382 }
383
384 return new CompressionParameters(windowLog, chainLog, hashLog, searchLog,
385 searchLength, targetLength, strategy);
386 }
387
388 private static CompressionParameters getDefaultParameters(
389 final int compressionLevel, final long estimatedInputSize) {
390 int table = 0;
391
392 if (estimatedInputSize != 0) {
393 if (estimatedInputSize <= 16 * 1024) {
394 table = 3;
395 } else if (estimatedInputSize <= 128 * 1024) {
396 table = 2;
397 } else if (estimatedInputSize <= 256 * 1024) {
398 table = 1;
399 }
400 }
401
402 int row = DEFAULT_COMPRESSION_LEVEL;
403
404 if (compressionLevel !=
405 0) {
406 row = Math.min(Math.max(0, compressionLevel), MAX_COMPRESSION_LEVEL);
407 }
408
409 return DEFAULT_COMPRESSION_PARAMETERS[table][row];
410 }
411 }