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 }