1 /*
2 Copyright 2011 Google Inc. All Rights Reserved.
3
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
15
16 Author: lode.vandevenne@gmail.com (Lode Vandevenne)
17 Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
18 */
19
20 #include "deflate.h"
21
22 #include <assert.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25
26 #include "blocksplitter.h"
27 #include "lz77.h"
28 #include "squeeze.h"
29 #include "tree.h"
30
31 /*
32 bp = bitpointer, always in range [0, 7].
33 The outsize is number of necessary bytes to encode the bits.
34 Given the value of bp and the amount of bytes, the amount of bits represented
35 is not simply bytesize * 8 + bp because even representing one bit requires a
36 whole byte. It is: (bp == 0) ? (bytesize * 8) : ((bytesize - 1) * 8 + bp)
37 */
AddBit(int bit,unsigned char * bp,unsigned char ** out,size_t * outsize)38 static void AddBit(int bit,
39 unsigned char* bp, unsigned char** out, size_t* outsize) {
40 if (*bp == 0) ZOPFLI_APPEND_DATA(0, out, outsize);
41 (*out)[*outsize - 1] |= bit << *bp;
42 *bp = (*bp + 1) & 7;
43 }
44
AddBits(unsigned symbol,unsigned length,unsigned char * bp,unsigned char ** out,size_t * outsize)45 static void AddBits(unsigned symbol, unsigned length,
46 unsigned char* bp, unsigned char** out, size_t* outsize) {
47 /* TODO(lode): make more efficient (add more bits at once). */
48 unsigned i;
49 for (i = 0; i < length; i++) {
50 unsigned bit = (symbol >> i) & 1;
51 if (*bp == 0) ZOPFLI_APPEND_DATA(0, out, outsize);
52 (*out)[*outsize - 1] |= bit << *bp;
53 *bp = (*bp + 1) & 7;
54 }
55 }
56
57 /*
58 Adds bits, like AddBits, but the order is inverted. The deflate specification
59 uses both orders in one standard.
60 */
AddHuffmanBits(unsigned symbol,unsigned length,unsigned char * bp,unsigned char ** out,size_t * outsize)61 static void AddHuffmanBits(unsigned symbol, unsigned length,
62 unsigned char* bp, unsigned char** out,
63 size_t* outsize) {
64 /* TODO(lode): make more efficient (add more bits at once). */
65 unsigned i;
66 for (i = 0; i < length; i++) {
67 unsigned bit = (symbol >> (length - i - 1)) & 1;
68 if (*bp == 0) ZOPFLI_APPEND_DATA(0, out, outsize);
69 (*out)[*outsize - 1] |= bit << *bp;
70 *bp = (*bp + 1) & 7;
71 }
72 }
73
74 /*
75 Ensures there are at least 2 distance codes to support buggy decoders.
76 Zlib 1.2.1 and below have a bug where it fails if there isn't at least 1
77 distance code (with length > 0), even though it's valid according to the
78 deflate spec to have 0 distance codes. On top of that, some mobile phones
79 require at least two distance codes. To support these decoders too (but
80 potentially at the cost of a few bytes), add dummy code lengths of 1.
81 References to this bug can be found in the changelog of
82 Zlib 1.2.2 and here: http://www.jonof.id.au/forum/index.php?topic=515.0.
83
84 d_lengths: the 32 lengths of the distance codes.
85 */
PatchDistanceCodesForBuggyDecoders(unsigned * d_lengths)86 static void PatchDistanceCodesForBuggyDecoders(unsigned* d_lengths) {
87 int num_dist_codes = 0; /* Amount of non-zero distance codes */
88 int i;
89 for (i = 0; i < 30 /* Ignore the two unused codes from the spec */; i++) {
90 if (d_lengths[i]) num_dist_codes++;
91 if (num_dist_codes >= 2) return; /* Two or more codes is fine. */
92 }
93
94 if (num_dist_codes == 0) {
95 d_lengths[0] = d_lengths[1] = 1;
96 } else if (num_dist_codes == 1) {
97 d_lengths[d_lengths[0] ? 1 : 0] = 1;
98 }
99 }
100
101 /*
102 Encodes the Huffman tree and returns how many bits its encoding takes. If out
103 is a null pointer, only returns the size and runs faster.
104 */
EncodeTree(const unsigned * ll_lengths,const unsigned * d_lengths,int use_16,int use_17,int use_18,unsigned char * bp,unsigned char ** out,size_t * outsize)105 static size_t EncodeTree(const unsigned* ll_lengths,
106 const unsigned* d_lengths,
107 int use_16, int use_17, int use_18,
108 unsigned char* bp,
109 unsigned char** out, size_t* outsize) {
110 unsigned lld_total; /* Total amount of literal, length, distance codes. */
111 /* Runlength encoded version of lengths of litlen and dist trees. */
112 unsigned* rle = 0;
113 unsigned* rle_bits = 0; /* Extra bits for rle values 16, 17 and 18. */
114 size_t rle_size = 0; /* Size of rle array. */
115 size_t rle_bits_size = 0; /* Should have same value as rle_size. */
116 unsigned hlit = 29; /* 286 - 257 */
117 unsigned hdist = 29; /* 32 - 1, but gzip does not like hdist > 29.*/
118 unsigned hclen;
119 unsigned hlit2;
120 size_t i, j;
121 size_t clcounts[19];
122 unsigned clcl[19]; /* Code length code lengths. */
123 unsigned clsymbols[19];
124 /* The order in which code length code lengths are encoded as per deflate. */
125 static const unsigned order[19] = {
126 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
127 };
128 int size_only = !out;
129 size_t result_size = 0;
130
131 for(i = 0; i < 19; i++) clcounts[i] = 0;
132
133 /* Trim zeros. */
134 while (hlit > 0 && ll_lengths[257 + hlit - 1] == 0) hlit--;
135 while (hdist > 0 && d_lengths[1 + hdist - 1] == 0) hdist--;
136 hlit2 = hlit + 257;
137
138 lld_total = hlit2 + hdist + 1;
139
140 for (i = 0; i < lld_total; i++) {
141 /* This is an encoding of a huffman tree, so now the length is a symbol */
142 unsigned char symbol = i < hlit2 ? ll_lengths[i] : d_lengths[i - hlit2];
143 unsigned count = 1;
144 if(use_16 || (symbol == 0 && (use_17 || use_18))) {
145 for (j = i + 1; j < lld_total && symbol ==
146 (j < hlit2 ? ll_lengths[j] : d_lengths[j - hlit2]); j++) {
147 count++;
148 }
149 }
150 i += count - 1;
151
152 /* Repetitions of zeroes */
153 if (symbol == 0 && count >= 3) {
154 if (use_18) {
155 while (count >= 11) {
156 unsigned count2 = count > 138 ? 138 : count;
157 if (!size_only) {
158 ZOPFLI_APPEND_DATA(18, &rle, &rle_size);
159 ZOPFLI_APPEND_DATA(count2 - 11, &rle_bits, &rle_bits_size);
160 }
161 clcounts[18]++;
162 count -= count2;
163 }
164 }
165 if (use_17) {
166 while (count >= 3) {
167 unsigned count2 = count > 10 ? 10 : count;
168 if (!size_only) {
169 ZOPFLI_APPEND_DATA(17, &rle, &rle_size);
170 ZOPFLI_APPEND_DATA(count2 - 3, &rle_bits, &rle_bits_size);
171 }
172 clcounts[17]++;
173 count -= count2;
174 }
175 }
176 }
177
178 /* Repetitions of any symbol */
179 if (use_16 && count >= 4) {
180 count--; /* Since the first one is hardcoded. */
181 clcounts[symbol]++;
182 if (!size_only) {
183 ZOPFLI_APPEND_DATA(symbol, &rle, &rle_size);
184 ZOPFLI_APPEND_DATA(0, &rle_bits, &rle_bits_size);
185 }
186 while (count >= 3) {
187 unsigned count2 = count > 6 ? 6 : count;
188 if (!size_only) {
189 ZOPFLI_APPEND_DATA(16, &rle, &rle_size);
190 ZOPFLI_APPEND_DATA(count2 - 3, &rle_bits, &rle_bits_size);
191 }
192 clcounts[16]++;
193 count -= count2;
194 }
195 }
196
197 /* No or insufficient repetition */
198 clcounts[symbol] += count;
199 while (count > 0) {
200 if (!size_only) {
201 ZOPFLI_APPEND_DATA(symbol, &rle, &rle_size);
202 ZOPFLI_APPEND_DATA(0, &rle_bits, &rle_bits_size);
203 }
204 count--;
205 }
206 }
207
208 ZopfliCalculateBitLengths(clcounts, 19, 7, clcl);
209 if (!size_only) ZopfliLengthsToSymbols(clcl, 19, 7, clsymbols);
210
211 hclen = 15;
212 /* Trim zeros. */
213 while (hclen > 0 && clcounts[order[hclen + 4 - 1]] == 0) hclen--;
214
215 if (!size_only) {
216 AddBits(hlit, 5, bp, out, outsize);
217 AddBits(hdist, 5, bp, out, outsize);
218 AddBits(hclen, 4, bp, out, outsize);
219
220 for (i = 0; i < hclen + 4; i++) {
221 AddBits(clcl[order[i]], 3, bp, out, outsize);
222 }
223
224 for (i = 0; i < rle_size; i++) {
225 unsigned symbol = clsymbols[rle[i]];
226 AddHuffmanBits(symbol, clcl[rle[i]], bp, out, outsize);
227 /* Extra bits. */
228 if (rle[i] == 16) AddBits(rle_bits[i], 2, bp, out, outsize);
229 else if (rle[i] == 17) AddBits(rle_bits[i], 3, bp, out, outsize);
230 else if (rle[i] == 18) AddBits(rle_bits[i], 7, bp, out, outsize);
231 }
232 }
233
234 result_size += 14; /* hlit, hdist, hclen bits */
235 result_size += (hclen + 4) * 3; /* clcl bits */
236 for(i = 0; i < 19; i++) {
237 result_size += clcl[i] * clcounts[i];
238 }
239 /* Extra bits. */
240 result_size += clcounts[16] * 2;
241 result_size += clcounts[17] * 3;
242 result_size += clcounts[18] * 7;
243
244 /* Note: in case of "size_only" these are null pointers so no effect. */
245 free(rle);
246 free(rle_bits);
247
248 return result_size;
249 }
250
AddDynamicTree(const unsigned * ll_lengths,const unsigned * d_lengths,unsigned char * bp,unsigned char ** out,size_t * outsize)251 static void AddDynamicTree(const unsigned* ll_lengths,
252 const unsigned* d_lengths,
253 unsigned char* bp,
254 unsigned char** out, size_t* outsize) {
255 int i;
256 int best = 0;
257 size_t bestsize = 0;
258
259 for(i = 0; i < 8; i++) {
260 size_t size = EncodeTree(ll_lengths, d_lengths,
261 i & 1, i & 2, i & 4,
262 0, 0, 0);
263 if (bestsize == 0 || size < bestsize) {
264 bestsize = size;
265 best = i;
266 }
267 }
268
269 EncodeTree(ll_lengths, d_lengths,
270 best & 1, best & 2, best & 4,
271 bp, out, outsize);
272 }
273
274 /*
275 Gives the exact size of the tree, in bits, as it will be encoded in DEFLATE.
276 */
CalculateTreeSize(const unsigned * ll_lengths,const unsigned * d_lengths)277 static size_t CalculateTreeSize(const unsigned* ll_lengths,
278 const unsigned* d_lengths) {
279 size_t result = 0;
280 int i;
281
282 for(i = 0; i < 8; i++) {
283 size_t size = EncodeTree(ll_lengths, d_lengths,
284 i & 1, i & 2, i & 4,
285 0, 0, 0);
286 if (result == 0 || size < result) result = size;
287 }
288
289 return result;
290 }
291
292 /*
293 Adds all lit/len and dist codes from the lists as huffman symbols. Does not add
294 end code 256. expected_data_size is the uncompressed block size, used for
295 assert, but you can set it to 0 to not do the assertion.
296 */
AddLZ77Data(const unsigned short * litlens,const unsigned short * dists,size_t lstart,size_t lend,size_t expected_data_size,const unsigned * ll_symbols,const unsigned * ll_lengths,const unsigned * d_symbols,const unsigned * d_lengths,unsigned char * bp,unsigned char ** out,size_t * outsize)297 static void AddLZ77Data(const unsigned short* litlens,
298 const unsigned short* dists,
299 size_t lstart, size_t lend,
300 size_t expected_data_size,
301 const unsigned* ll_symbols, const unsigned* ll_lengths,
302 const unsigned* d_symbols, const unsigned* d_lengths,
303 unsigned char* bp,
304 unsigned char** out, size_t* outsize) {
305 size_t testlength = 0;
306 size_t i;
307
308 for (i = lstart; i < lend; i++) {
309 unsigned dist = dists[i];
310 unsigned litlen = litlens[i];
311 if (dist == 0) {
312 assert(litlen < 256);
313 assert(ll_lengths[litlen] > 0);
314 AddHuffmanBits(ll_symbols[litlen], ll_lengths[litlen], bp, out, outsize);
315 testlength++;
316 } else {
317 unsigned lls = ZopfliGetLengthSymbol(litlen);
318 unsigned ds = ZopfliGetDistSymbol(dist);
319 assert(litlen >= 3 && litlen <= 288);
320 assert(ll_lengths[lls] > 0);
321 assert(d_lengths[ds] > 0);
322 AddHuffmanBits(ll_symbols[lls], ll_lengths[lls], bp, out, outsize);
323 AddBits(ZopfliGetLengthExtraBitsValue(litlen),
324 ZopfliGetLengthExtraBits(litlen),
325 bp, out, outsize);
326 AddHuffmanBits(d_symbols[ds], d_lengths[ds], bp, out, outsize);
327 AddBits(ZopfliGetDistExtraBitsValue(dist),
328 ZopfliGetDistExtraBits(dist),
329 bp, out, outsize);
330 testlength += litlen;
331 }
332 }
333 assert(expected_data_size == 0 || testlength == expected_data_size);
334 }
335
GetFixedTree(unsigned * ll_lengths,unsigned * d_lengths)336 static void GetFixedTree(unsigned* ll_lengths, unsigned* d_lengths) {
337 size_t i;
338 for (i = 0; i < 144; i++) ll_lengths[i] = 8;
339 for (i = 144; i < 256; i++) ll_lengths[i] = 9;
340 for (i = 256; i < 280; i++) ll_lengths[i] = 7;
341 for (i = 280; i < 288; i++) ll_lengths[i] = 8;
342 for (i = 0; i < 32; i++) d_lengths[i] = 5;
343 }
344
345 /*
346 Calculates size of the part after the header and tree of an LZ77 block, in bits.
347 */
CalculateBlockSymbolSize(const unsigned * ll_lengths,const unsigned * d_lengths,const unsigned short * litlens,const unsigned short * dists,size_t lstart,size_t lend)348 static size_t CalculateBlockSymbolSize(const unsigned* ll_lengths,
349 const unsigned* d_lengths,
350 const unsigned short* litlens,
351 const unsigned short* dists,
352 size_t lstart, size_t lend) {
353 size_t result = 0;
354 size_t i;
355 for (i = lstart; i < lend; i++) {
356 if (dists[i] == 0) {
357 result += ll_lengths[litlens[i]];
358 } else {
359 result += ll_lengths[ZopfliGetLengthSymbol(litlens[i])];
360 result += d_lengths[ZopfliGetDistSymbol(dists[i])];
361 result += ZopfliGetLengthExtraBits(litlens[i]);
362 result += ZopfliGetDistExtraBits(dists[i]);
363 }
364 }
365 result += ll_lengths[256]; /*end symbol*/
366 return result;
367 }
368
AbsDiff(size_t x,size_t y)369 static size_t AbsDiff(size_t x, size_t y) {
370 if (x > y)
371 return x - y;
372 else
373 return y - x;
374 }
375
376 /*
377 Change the population counts in a way that the consequent Hufmann tree
378 compression, especially its rle-part will be more likely to compress this data
379 more efficiently. length containts the size of the histogram.
380 */
OptimizeHuffmanForRle(int length,size_t * counts)381 void OptimizeHuffmanForRle(int length, size_t* counts) {
382 int i, k, stride;
383 size_t symbol, sum, limit;
384 int* good_for_rle;
385
386 /* 1) We don't want to touch the trailing zeros. We may break the
387 rules of the format by adding more data in the distance codes. */
388 for (; length >= 0; --length) {
389 if (length == 0) {
390 return;
391 }
392 if (counts[length - 1] != 0) {
393 /* Now counts[0..length - 1] does not have trailing zeros. */
394 break;
395 }
396 }
397 /* 2) Let's mark all population counts that already can be encoded
398 with an rle code.*/
399 good_for_rle = (int*)malloc(length * sizeof(int));
400 for (i = 0; i < length; ++i) good_for_rle[i] = 0;
401
402 /* Let's not spoil any of the existing good rle codes.
403 Mark any seq of 0's that is longer than 5 as a good_for_rle.
404 Mark any seq of non-0's that is longer than 7 as a good_for_rle.*/
405 symbol = counts[0];
406 stride = 0;
407 for (i = 0; i < length + 1; ++i) {
408 if (i == length || counts[i] != symbol) {
409 if ((symbol == 0 && stride >= 5) || (symbol != 0 && stride >= 7)) {
410 for (k = 0; k < stride; ++k) {
411 good_for_rle[i - k - 1] = 1;
412 }
413 }
414 stride = 1;
415 if (i != length) {
416 symbol = counts[i];
417 }
418 } else {
419 ++stride;
420 }
421 }
422
423 /* 3) Let's replace those population counts that lead to more rle codes. */
424 stride = 0;
425 limit = counts[0];
426 sum = 0;
427 for (i = 0; i < length + 1; ++i) {
428 if (i == length || good_for_rle[i]
429 /* Heuristic for selecting the stride ranges to collapse. */
430 || AbsDiff(counts[i], limit) >= 4) {
431 if (stride >= 4 || (stride >= 3 && sum == 0)) {
432 /* The stride must end, collapse what we have, if we have enough (4). */
433 int count = (sum + stride / 2) / stride;
434 if (count < 1) count = 1;
435 if (sum == 0) {
436 /* Don't make an all zeros stride to be upgraded to ones. */
437 count = 0;
438 }
439 for (k = 0; k < stride; ++k) {
440 /* We don't want to change value at counts[i],
441 that is already belonging to the next stride. Thus - 1. */
442 counts[i - k - 1] = count;
443 }
444 }
445 stride = 0;
446 sum = 0;
447 if (i < length - 3) {
448 /* All interesting strides have a count of at least 4,
449 at least when non-zeros. */
450 limit = (counts[i] + counts[i + 1] +
451 counts[i + 2] + counts[i + 3] + 2) / 4;
452 } else if (i < length) {
453 limit = counts[i];
454 } else {
455 limit = 0;
456 }
457 }
458 ++stride;
459 if (i != length) {
460 sum += counts[i];
461 }
462 }
463
464 free(good_for_rle);
465 }
466
467 /*
468 Calculates the bit lengths for the symbols for dynamic blocks. Chooses bit
469 lengths that give the smallest size of tree encoding + encoding of all the
470 symbols to have smallest output size. This are not necessarily the ideal Huffman
471 bit lengths.
472 */
GetDynamicLengths(const unsigned short * litlens,const unsigned short * dists,size_t lstart,size_t lend,unsigned * ll_lengths,unsigned * d_lengths)473 static void GetDynamicLengths(const unsigned short* litlens,
474 const unsigned short* dists,
475 size_t lstart, size_t lend,
476 unsigned* ll_lengths, unsigned* d_lengths) {
477 size_t ll_counts[288];
478 size_t d_counts[32];
479
480 ZopfliLZ77Counts(litlens, dists, lstart, lend, ll_counts, d_counts);
481 OptimizeHuffmanForRle(288, ll_counts);
482 OptimizeHuffmanForRle(32, d_counts);
483 ZopfliCalculateBitLengths(ll_counts, 288, 15, ll_lengths);
484 ZopfliCalculateBitLengths(d_counts, 32, 15, d_lengths);
485 PatchDistanceCodesForBuggyDecoders(d_lengths);
486 }
487
ZopfliCalculateBlockSize(const unsigned short * litlens,const unsigned short * dists,size_t lstart,size_t lend,int btype)488 double ZopfliCalculateBlockSize(const unsigned short* litlens,
489 const unsigned short* dists,
490 size_t lstart, size_t lend, int btype) {
491 unsigned ll_lengths[288];
492 unsigned d_lengths[32];
493
494 double result = 3; /* bfinal and btype bits */
495
496 assert(btype == 1 || btype == 2); /* This is not for uncompressed blocks. */
497
498 if(btype == 1) {
499 GetFixedTree(ll_lengths, d_lengths);
500 } else {
501 GetDynamicLengths(litlens, dists, lstart, lend, ll_lengths, d_lengths);
502 result += CalculateTreeSize(ll_lengths, d_lengths);
503 }
504
505 result += CalculateBlockSymbolSize(
506 ll_lengths, d_lengths, litlens, dists, lstart, lend);
507
508 return result;
509 }
510
511 /*
512 Adds a deflate block with the given LZ77 data to the output.
513 options: global program options
514 btype: the block type, must be 1 or 2
515 final: whether to set the "final" bit on this block, must be the last block
516 litlens: literal/length array of the LZ77 data, in the same format as in
517 ZopfliLZ77Store.
518 dists: distance array of the LZ77 data, in the same format as in
519 ZopfliLZ77Store.
520 lstart: where to start in the LZ77 data
521 lend: where to end in the LZ77 data (not inclusive)
522 expected_data_size: the uncompressed block size, used for assert, but you can
523 set it to 0 to not do the assertion.
524 bp: output bit pointer
525 out: dynamic output array to append to
526 outsize: dynamic output array size
527 */
AddLZ77Block(const ZopfliOptions * options,int btype,int final,const unsigned short * litlens,const unsigned short * dists,size_t lstart,size_t lend,size_t expected_data_size,unsigned char * bp,unsigned char ** out,size_t * outsize)528 static void AddLZ77Block(const ZopfliOptions* options, int btype, int final,
529 const unsigned short* litlens,
530 const unsigned short* dists,
531 size_t lstart, size_t lend,
532 size_t expected_data_size,
533 unsigned char* bp,
534 unsigned char** out, size_t* outsize) {
535 unsigned ll_lengths[288];
536 unsigned d_lengths[32];
537 unsigned ll_symbols[288];
538 unsigned d_symbols[32];
539 size_t detect_block_size = *outsize;
540 size_t compressed_size;
541 size_t uncompressed_size = 0;
542 size_t i;
543
544 AddBit(final, bp, out, outsize);
545 AddBit(btype & 1, bp, out, outsize);
546 AddBit((btype & 2) >> 1, bp, out, outsize);
547
548 if (btype == 1) {
549 /* Fixed block. */
550 GetFixedTree(ll_lengths, d_lengths);
551 } else {
552 /* Dynamic block. */
553 unsigned detect_tree_size;
554 assert(btype == 2);
555
556 GetDynamicLengths(litlens, dists, lstart, lend, ll_lengths, d_lengths);
557
558 detect_tree_size = *outsize;
559 AddDynamicTree(ll_lengths, d_lengths, bp, out, outsize);
560 if (options->verbose) {
561 fprintf(stderr, "treesize: %d\n", (int)(*outsize - detect_tree_size));
562 }
563 }
564
565 ZopfliLengthsToSymbols(ll_lengths, 288, 15, ll_symbols);
566 ZopfliLengthsToSymbols(d_lengths, 32, 15, d_symbols);
567
568 detect_block_size = *outsize;
569 AddLZ77Data(litlens, dists, lstart, lend, expected_data_size,
570 ll_symbols, ll_lengths, d_symbols, d_lengths,
571 bp, out, outsize);
572 /* End symbol. */
573 AddHuffmanBits(ll_symbols[256], ll_lengths[256], bp, out, outsize);
574
575 for (i = lstart; i < lend; i++) {
576 uncompressed_size += dists[i] == 0 ? 1 : litlens[i];
577 }
578 compressed_size = *outsize - detect_block_size;
579 if (options->verbose) {
580 fprintf(stderr, "compressed block size: %d (%dk) (unc: %d)\n",
581 (int)compressed_size, (int)(compressed_size / 1024),
582 (int)(uncompressed_size));
583 }
584 }
585
DeflateDynamicBlock(const ZopfliOptions * options,int final,const unsigned char * in,size_t instart,size_t inend,unsigned char * bp,unsigned char ** out,size_t * outsize)586 static void DeflateDynamicBlock(const ZopfliOptions* options, int final,
587 const unsigned char* in,
588 size_t instart, size_t inend,
589 unsigned char* bp,
590 unsigned char** out, size_t* outsize) {
591 ZopfliBlockState s;
592 size_t blocksize = inend - instart;
593 ZopfliLZ77Store store;
594 int btype = 2;
595
596 ZopfliInitLZ77Store(&store);
597
598 s.options = options;
599 s.blockstart = instart;
600 s.blockend = inend;
601 #ifdef ZOPFLI_LONGEST_MATCH_CACHE
602 s.lmc = (ZopfliLongestMatchCache*)malloc(sizeof(ZopfliLongestMatchCache));
603 ZopfliInitCache(blocksize, s.lmc);
604 #endif
605
606 ZopfliLZ77Optimal(&s, in, instart, inend, &store);
607
608 /* For small block, encoding with fixed tree can be smaller. For large block,
609 don't bother doing this expensive test, dynamic tree will be better.*/
610 if (store.size < 1000) {
611 double dyncost, fixedcost;
612 ZopfliLZ77Store fixedstore;
613 ZopfliInitLZ77Store(&fixedstore);
614 ZopfliLZ77OptimalFixed(&s, in, instart, inend, &fixedstore);
615 dyncost = ZopfliCalculateBlockSize(store.litlens, store.dists,
616 0, store.size, 2);
617 fixedcost = ZopfliCalculateBlockSize(fixedstore.litlens, fixedstore.dists,
618 0, fixedstore.size, 1);
619 if (fixedcost < dyncost) {
620 btype = 1;
621 ZopfliCleanLZ77Store(&store);
622 store = fixedstore;
623 } else {
624 ZopfliCleanLZ77Store(&fixedstore);
625 }
626 }
627
628 AddLZ77Block(s.options, btype, final,
629 store.litlens, store.dists, 0, store.size,
630 blocksize, bp, out, outsize);
631
632 #ifdef ZOPFLI_LONGEST_MATCH_CACHE
633 ZopfliCleanCache(s.lmc);
634 free(s.lmc);
635 #endif
636 ZopfliCleanLZ77Store(&store);
637 }
638
DeflateFixedBlock(const ZopfliOptions * options,int final,const unsigned char * in,size_t instart,size_t inend,unsigned char * bp,unsigned char ** out,size_t * outsize)639 static void DeflateFixedBlock(const ZopfliOptions* options, int final,
640 const unsigned char* in,
641 size_t instart, size_t inend,
642 unsigned char* bp,
643 unsigned char** out, size_t* outsize) {
644 ZopfliBlockState s;
645 size_t blocksize = inend - instart;
646 ZopfliLZ77Store store;
647
648 ZopfliInitLZ77Store(&store);
649
650 s.options = options;
651 s.blockstart = instart;
652 s.blockend = inend;
653 #ifdef ZOPFLI_LONGEST_MATCH_CACHE
654 s.lmc = (ZopfliLongestMatchCache*)malloc(sizeof(ZopfliLongestMatchCache));
655 ZopfliInitCache(blocksize, s.lmc);
656 #endif
657
658 ZopfliLZ77OptimalFixed(&s, in, instart, inend, &store);
659
660 AddLZ77Block(s.options, 1, final, store.litlens, store.dists, 0, store.size,
661 blocksize, bp, out, outsize);
662
663 #ifdef ZOPFLI_LONGEST_MATCH_CACHE
664 ZopfliCleanCache(s.lmc);
665 free(s.lmc);
666 #endif
667 ZopfliCleanLZ77Store(&store);
668 }
669
DeflateNonCompressedBlock(const ZopfliOptions * options,int final,const unsigned char * in,size_t instart,size_t inend,unsigned char * bp,unsigned char ** out,size_t * outsize)670 static void DeflateNonCompressedBlock(const ZopfliOptions* options, int final,
671 const unsigned char* in, size_t instart,
672 size_t inend,
673 unsigned char* bp,
674 unsigned char** out, size_t* outsize) {
675 size_t i;
676 size_t blocksize = inend - instart;
677 unsigned short nlen = ~blocksize;
678
679 (void)options;
680 assert(blocksize < 65536); /* Non compressed blocks are max this size. */
681
682 AddBit(final, bp, out, outsize);
683 /* BTYPE 00 */
684 AddBit(0, bp, out, outsize);
685 AddBit(0, bp, out, outsize);
686
687 /* Any bits of input up to the next byte boundary are ignored. */
688 *bp = 0;
689
690 ZOPFLI_APPEND_DATA(blocksize % 256, out, outsize);
691 ZOPFLI_APPEND_DATA((blocksize / 256) % 256, out, outsize);
692 ZOPFLI_APPEND_DATA(nlen % 256, out, outsize);
693 ZOPFLI_APPEND_DATA((nlen / 256) % 256, out, outsize);
694
695 for (i = instart; i < inend; i++) {
696 ZOPFLI_APPEND_DATA(in[i], out, outsize);
697 }
698 }
699
DeflateBlock(const ZopfliOptions * options,int btype,int final,const unsigned char * in,size_t instart,size_t inend,unsigned char * bp,unsigned char ** out,size_t * outsize)700 static void DeflateBlock(const ZopfliOptions* options,
701 int btype, int final,
702 const unsigned char* in, size_t instart, size_t inend,
703 unsigned char* bp,
704 unsigned char** out, size_t* outsize) {
705 if (btype == 0) {
706 DeflateNonCompressedBlock(
707 options, final, in, instart, inend, bp, out, outsize);
708 } else if (btype == 1) {
709 DeflateFixedBlock(options, final, in, instart, inend, bp, out, outsize);
710 } else {
711 assert (btype == 2);
712 DeflateDynamicBlock(options, final, in, instart, inend, bp, out, outsize);
713 }
714 }
715
716 /*
717 Does squeeze strategy where first block splitting is done, then each block is
718 squeezed.
719 Parameters: see description of the ZopfliDeflate function.
720 */
DeflateSplittingFirst(const ZopfliOptions * options,int btype,int final,const unsigned char * in,size_t instart,size_t inend,unsigned char * bp,unsigned char ** out,size_t * outsize)721 static void DeflateSplittingFirst(const ZopfliOptions* options,
722 int btype, int final,
723 const unsigned char* in,
724 size_t instart, size_t inend,
725 unsigned char* bp,
726 unsigned char** out, size_t* outsize) {
727 size_t i;
728 size_t* splitpoints = 0;
729 size_t npoints = 0;
730 if (btype == 0) {
731 ZopfliBlockSplitSimple(in, instart, inend, 65535, &splitpoints, &npoints);
732 } else if (btype == 1) {
733 /* If all blocks are fixed tree, splitting into separate blocks only
734 increases the total size. Leave npoints at 0, this represents 1 block. */
735 } else {
736 ZopfliBlockSplit(options, in, instart, inend,
737 options->blocksplittingmax, &splitpoints, &npoints);
738 }
739
740 for (i = 0; i <= npoints; i++) {
741 size_t start = i == 0 ? instart : splitpoints[i - 1];
742 size_t end = i == npoints ? inend : splitpoints[i];
743 DeflateBlock(options, btype, i == npoints && final, in, start, end,
744 bp, out, outsize);
745 }
746
747 free(splitpoints);
748 }
749
750 /*
751 Does squeeze strategy where first the best possible lz77 is done, and then based
752 on that data, block splitting is done.
753 Parameters: see description of the ZopfliDeflate function.
754 */
DeflateSplittingLast(const ZopfliOptions * options,int btype,int final,const unsigned char * in,size_t instart,size_t inend,unsigned char * bp,unsigned char ** out,size_t * outsize)755 static void DeflateSplittingLast(const ZopfliOptions* options,
756 int btype, int final,
757 const unsigned char* in,
758 size_t instart, size_t inend,
759 unsigned char* bp,
760 unsigned char** out, size_t* outsize) {
761 size_t i;
762 ZopfliBlockState s;
763 ZopfliLZ77Store store;
764 size_t* splitpoints = 0;
765 size_t npoints = 0;
766
767 if (btype == 0) {
768 /* This function only supports LZ77 compression. DeflateSplittingFirst
769 supports the special case of noncompressed data. Punt it to that one. */
770 DeflateSplittingFirst(options, btype, final,
771 in, instart, inend,
772 bp, out, outsize);
773 }
774 assert(btype == 1 || btype == 2);
775
776 ZopfliInitLZ77Store(&store);
777
778 s.options = options;
779 s.blockstart = instart;
780 s.blockend = inend;
781 #ifdef ZOPFLI_LONGEST_MATCH_CACHE
782 s.lmc = (ZopfliLongestMatchCache*)malloc(sizeof(ZopfliLongestMatchCache));
783 ZopfliInitCache(inend - instart, s.lmc);
784 #endif
785
786 if (btype == 2) {
787 ZopfliLZ77Optimal(&s, in, instart, inend, &store);
788 } else {
789 assert (btype == 1);
790 ZopfliLZ77OptimalFixed(&s, in, instart, inend, &store);
791 }
792
793 if (btype == 1) {
794 /* If all blocks are fixed tree, splitting into separate blocks only
795 increases the total size. Leave npoints at 0, this represents 1 block. */
796 } else {
797 ZopfliBlockSplitLZ77(options, store.litlens, store.dists, store.size,
798 options->blocksplittingmax, &splitpoints, &npoints);
799 }
800
801 for (i = 0; i <= npoints; i++) {
802 size_t start = i == 0 ? 0 : splitpoints[i - 1];
803 size_t end = i == npoints ? store.size : splitpoints[i];
804 AddLZ77Block(options, btype, i == npoints && final,
805 store.litlens, store.dists, start, end, 0,
806 bp, out, outsize);
807 }
808
809 #ifdef ZOPFLI_LONGEST_MATCH_CACHE
810 ZopfliCleanCache(s.lmc);
811 free(s.lmc);
812 #endif
813
814 ZopfliCleanLZ77Store(&store);
815 free(splitpoints);
816 }
817
818 /*
819 Deflate a part, to allow ZopfliDeflate() to use multiple master blocks if
820 needed.
821 It is possible to call this function multiple times in a row, shifting
822 instart and inend to next bytes of the data. If instart is larger than 0, then
823 previous bytes are used as the initial dictionary for LZ77.
824 This function will usually output multiple deflate blocks. If final is 1, then
825 the final bit will be set on the last block.
826 */
ZopfliDeflatePart(const ZopfliOptions * options,int btype,int final,const unsigned char * in,size_t instart,size_t inend,unsigned char * bp,unsigned char ** out,size_t * outsize)827 void ZopfliDeflatePart(const ZopfliOptions* options, int btype, int final,
828 const unsigned char* in, size_t instart, size_t inend,
829 unsigned char* bp, unsigned char** out,
830 size_t* outsize) {
831 if (options->blocksplitting) {
832 if (options->blocksplittinglast) {
833 DeflateSplittingLast(options, btype, final, in, instart, inend,
834 bp, out, outsize);
835 } else {
836 DeflateSplittingFirst(options, btype, final, in, instart, inend,
837 bp, out, outsize);
838 }
839 } else {
840 DeflateBlock(options, btype, final, in, instart, inend, bp, out, outsize);
841 }
842 }
843
ZopfliDeflate(const ZopfliOptions * options,int btype,int final,const unsigned char * in,size_t insize,unsigned char * bp,unsigned char ** out,size_t * outsize)844 void ZopfliDeflate(const ZopfliOptions* options, int btype, int final,
845 const unsigned char* in, size_t insize,
846 unsigned char* bp, unsigned char** out, size_t* outsize) {
847 #if ZOPFLI_MASTER_BLOCK_SIZE == 0
848 ZopfliDeflatePart(options, btype, final, in, 0, insize, bp, out, outsize);
849 #else
850 size_t i = 0;
851 while (i < insize) {
852 int masterfinal = (i + ZOPFLI_MASTER_BLOCK_SIZE >= insize);
853 int final2 = final && masterfinal;
854 size_t size = masterfinal ? insize - i : ZOPFLI_MASTER_BLOCK_SIZE;
855 ZopfliDeflatePart(options, btype, final2,
856 in, i, i + size, bp, out, outsize);
857 i += size;
858 }
859 #endif
860 if (options->verbose) {
861 fprintf(stderr,
862 "Original Size: %d, Deflate: %d, Compression: %f%% Removed\n",
863 (int)insize, (int)*outsize,
864 100.0 * (double)(insize - *outsize) / (double)insize);
865 }
866 }
867