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