1 1.1 tls /* 2 1.1 tls Copyright 2011 Google Inc. All Rights Reserved. 3 1.1 tls 4 1.1 tls Licensed under the Apache License, Version 2.0 (the "License"); 5 1.1 tls you may not use this file except in compliance with the License. 6 1.1 tls You may obtain a copy of the License at 7 1.1 tls 8 1.1 tls http://www.apache.org/licenses/LICENSE-2.0 9 1.1 tls 10 1.1 tls Unless required by applicable law or agreed to in writing, software 11 1.1 tls distributed under the License is distributed on an "AS IS" BASIS, 12 1.1 tls WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 1.1 tls See the License for the specific language governing permissions and 14 1.1 tls limitations under the License. 15 1.1 tls 16 1.1 tls Author: lode.vandevenne (at) gmail.com (Lode Vandevenne) 17 1.1 tls Author: jyrki.alakuijala (at) gmail.com (Jyrki Alakuijala) 18 1.1 tls */ 19 1.1 tls 20 1.1 tls /* 21 1.1 tls Modified by madler (at) alumni.caltech.edu (Mark Adler) 22 1.1 tls Moved ZopfliInitOptions() from zopfli_lib.c. 23 1.1 tls */ 24 1.1 tls 25 1.1 tls #include "deflate.h" 26 1.1 tls 27 1.1 tls #include <assert.h> 28 1.1 tls #include <stdio.h> 29 1.1 tls #include <stdlib.h> 30 1.1 tls 31 1.1 tls #include "blocksplitter.h" 32 1.1 tls #include "lz77.h" 33 1.1 tls #include "squeeze.h" 34 1.1 tls #include "tree.h" 35 1.1 tls 36 1.1 tls void ZopfliInitOptions(ZopfliOptions* options) { 37 1.1 tls options->verbose = 0; 38 1.1 tls options->numiterations = 15; 39 1.1 tls options->blocksplitting = 1; 40 1.1 tls options->blocksplittinglast = 0; 41 1.1 tls options->blocksplittingmax = 15; 42 1.1 tls } 43 1.1 tls 44 1.1 tls static void AddBit(int bit, 45 1.1 tls unsigned char* bp, unsigned char** out, size_t* outsize) { 46 1.1 tls if (((*bp) & 7) == 0) ZOPFLI_APPEND_DATA(0, out, outsize); 47 1.1 tls (*out)[*outsize - 1] |= bit << ((*bp) & 7); 48 1.1 tls (*bp)++; 49 1.1 tls } 50 1.1 tls 51 1.1 tls static void AddBits(unsigned symbol, unsigned length, 52 1.1 tls unsigned char* bp, unsigned char** out, size_t* outsize) { 53 1.1 tls /* TODO(lode): make more efficient (add more bits at once). */ 54 1.1 tls unsigned i; 55 1.1 tls for (i = 0; i < length; i++) { 56 1.1 tls unsigned bit = (symbol >> i) & 1; 57 1.1 tls if (((*bp) & 7) == 0) ZOPFLI_APPEND_DATA(0, out, outsize); 58 1.1 tls (*out)[*outsize - 1] |= bit << ((*bp) & 7); 59 1.1 tls (*bp)++; 60 1.1 tls } 61 1.1 tls } 62 1.1 tls 63 1.1 tls /* 64 1.1 tls Adds bits, like AddBits, but the order is inverted. The deflate specification 65 1.1 tls uses both orders in one standard. 66 1.1 tls */ 67 1.1 tls static void AddHuffmanBits(unsigned symbol, unsigned length, 68 1.1 tls unsigned char* bp, unsigned char** out, 69 1.1 tls size_t* outsize) { 70 1.1 tls /* TODO(lode): make more efficient (add more bits at once). */ 71 1.1 tls unsigned i; 72 1.1 tls for (i = 0; i < length; i++) { 73 1.1 tls unsigned bit = (symbol >> (length - i - 1)) & 1; 74 1.1 tls if (((*bp) & 7) == 0) ZOPFLI_APPEND_DATA(0, out, outsize); 75 1.1 tls (*out)[*outsize - 1] |= bit << ((*bp) & 7); 76 1.1 tls (*bp)++; 77 1.1 tls } 78 1.1 tls } 79 1.1 tls 80 1.1 tls /* 81 1.1 tls Ensures there are at least 2 distance codes to support buggy decoders. 82 1.1 tls Zlib 1.2.1 and below have a bug where it fails if there isn't at least 1 83 1.1 tls distance code (with length > 0), even though it's valid according to the 84 1.1 tls deflate spec to have 0 distance codes. On top of that, some mobile phones 85 1.1 tls require at least two distance codes. To support these decoders too (but 86 1.1 tls potentially at the cost of a few bytes), add dummy code lengths of 1. 87 1.1 tls References to this bug can be found in the changelog of 88 1.1 tls Zlib 1.2.2 and here: http://www.jonof.id.au/forum/index.php?topic=515.0. 89 1.1 tls 90 1.1 tls d_lengths: the 32 lengths of the distance codes. 91 1.1 tls */ 92 1.1 tls static void PatchDistanceCodesForBuggyDecoders(unsigned* d_lengths) { 93 1.1 tls int num_dist_codes = 0; /* Amount of non-zero distance codes */ 94 1.1 tls int i; 95 1.1 tls for (i = 0; i < 30 /* Ignore the two unused codes from the spec */; i++) { 96 1.1 tls if (d_lengths[i]) num_dist_codes++; 97 1.1 tls if (num_dist_codes >= 2) return; /* Two or more codes is fine. */ 98 1.1 tls } 99 1.1 tls 100 1.1 tls if (num_dist_codes == 0) { 101 1.1 tls d_lengths[0] = d_lengths[1] = 1; 102 1.1 tls } else if (num_dist_codes == 1) { 103 1.1 tls d_lengths[d_lengths[0] ? 1 : 0] = 1; 104 1.1 tls } 105 1.1 tls } 106 1.1 tls 107 1.1 tls static void AddDynamicTree(const unsigned* ll_lengths, 108 1.1 tls const unsigned* d_lengths, 109 1.1 tls unsigned char* bp, 110 1.1 tls unsigned char** out, size_t* outsize) { 111 1.1 tls unsigned* lld_lengths = 0; /* All litlen and dist lengthts with ending zeros 112 1.1 tls trimmed together in one array. */ 113 1.1 tls unsigned lld_total; /* Size of lld_lengths. */ 114 1.1 tls unsigned* rle = 0; /* Runlength encoded version of lengths of litlen and dist 115 1.1 tls trees. */ 116 1.1 tls unsigned* rle_bits = 0; /* Extra bits for rle values 16, 17 and 18. */ 117 1.1 tls size_t rle_size = 0; /* Size of rle array. */ 118 1.1 tls size_t rle_bits_size = 0; /* Should have same value as rle_size. */ 119 1.1 tls unsigned hlit = 29; /* 286 - 257 */ 120 1.1 tls unsigned hdist = 29; /* 32 - 1, but gzip does not like hdist > 29.*/ 121 1.1 tls unsigned hclen; 122 1.1 tls size_t i, j; 123 1.1 tls size_t clcounts[19]; 124 1.1 tls unsigned clcl[19]; /* Code length code lengths. */ 125 1.1 tls unsigned clsymbols[19]; 126 1.1 tls /* The order in which code length code lengths are encoded as per deflate. */ 127 1.1 tls unsigned order[19] = { 128 1.1 tls 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 129 1.1 tls }; 130 1.1 tls 131 1.1 tls /* Trim zeros. */ 132 1.1 tls while (hlit > 0 && ll_lengths[257 + hlit - 1] == 0) hlit--; 133 1.1 tls while (hdist > 0 && d_lengths[1 + hdist - 1] == 0) hdist--; 134 1.1 tls 135 1.1 tls lld_total = hlit + 257 + hdist + 1; 136 1.1 tls lld_lengths = (unsigned*)malloc(sizeof(*lld_lengths) * lld_total); 137 1.1 tls if (!lld_lengths) exit(-1); /* Allocation failed. */ 138 1.1 tls 139 1.1 tls for (i = 0; i < lld_total; i++) { 140 1.1 tls lld_lengths[i] = i < 257 + hlit 141 1.1 tls ? ll_lengths[i] : d_lengths[i - 257 - hlit]; 142 1.1 tls assert(lld_lengths[i] < 16); 143 1.1 tls } 144 1.1 tls 145 1.1 tls for (i = 0; i < lld_total; i++) { 146 1.1 tls size_t count = 0; 147 1.1 tls for (j = i; j < lld_total && lld_lengths[i] == lld_lengths[j]; j++) { 148 1.1 tls count++; 149 1.1 tls } 150 1.1 tls if (count >= 4 || (count >= 3 && lld_lengths[i] == 0)) { 151 1.1 tls if (lld_lengths[i] == 0) { 152 1.1 tls if (count > 10) { 153 1.1 tls if (count > 138) count = 138; 154 1.1 tls ZOPFLI_APPEND_DATA(18, &rle, &rle_size); 155 1.1 tls ZOPFLI_APPEND_DATA(count - 11, &rle_bits, &rle_bits_size); 156 1.1 tls } else { 157 1.1 tls ZOPFLI_APPEND_DATA(17, &rle, &rle_size); 158 1.1 tls ZOPFLI_APPEND_DATA(count - 3, &rle_bits, &rle_bits_size); 159 1.1 tls } 160 1.1 tls } else { 161 1.1 tls unsigned repeat = count - 1; /* Since the first one is hardcoded. */ 162 1.1 tls ZOPFLI_APPEND_DATA(lld_lengths[i], &rle, &rle_size); 163 1.1 tls ZOPFLI_APPEND_DATA(0, &rle_bits, &rle_bits_size); 164 1.1 tls while (repeat >= 6) { 165 1.1 tls ZOPFLI_APPEND_DATA(16, &rle, &rle_size); 166 1.1 tls ZOPFLI_APPEND_DATA(6 - 3, &rle_bits, &rle_bits_size); 167 1.1 tls repeat -= 6; 168 1.1 tls } 169 1.1 tls if (repeat >= 3) { 170 1.1 tls ZOPFLI_APPEND_DATA(16, &rle, &rle_size); 171 1.1 tls ZOPFLI_APPEND_DATA(3 - 3, &rle_bits, &rle_bits_size); 172 1.1 tls repeat -= 3; 173 1.1 tls } 174 1.1 tls while (repeat != 0) { 175 1.1 tls ZOPFLI_APPEND_DATA(lld_lengths[i], &rle, &rle_size); 176 1.1 tls ZOPFLI_APPEND_DATA(0, &rle_bits, &rle_bits_size); 177 1.1 tls repeat--; 178 1.1 tls } 179 1.1 tls } 180 1.1 tls 181 1.1 tls i += count - 1; 182 1.1 tls } else { 183 1.1 tls ZOPFLI_APPEND_DATA(lld_lengths[i], &rle, &rle_size); 184 1.1 tls ZOPFLI_APPEND_DATA(0, &rle_bits, &rle_bits_size); 185 1.1 tls } 186 1.1 tls assert(rle[rle_size - 1] <= 18); 187 1.1 tls } 188 1.1 tls 189 1.1 tls for (i = 0; i < 19; i++) { 190 1.1 tls clcounts[i] = 0; 191 1.1 tls } 192 1.1 tls for (i = 0; i < rle_size; i++) { 193 1.1 tls clcounts[rle[i]]++; 194 1.1 tls } 195 1.1 tls 196 1.1 tls ZopfliCalculateBitLengths(clcounts, 19, 7, clcl); 197 1.1 tls ZopfliLengthsToSymbols(clcl, 19, 7, clsymbols); 198 1.1 tls 199 1.1 tls hclen = 15; 200 1.1 tls /* Trim zeros. */ 201 1.1 tls while (hclen > 0 && clcounts[order[hclen + 4 - 1]] == 0) hclen--; 202 1.1 tls 203 1.1 tls AddBits(hlit, 5, bp, out, outsize); 204 1.1 tls AddBits(hdist, 5, bp, out, outsize); 205 1.1 tls AddBits(hclen, 4, bp, out, outsize); 206 1.1 tls 207 1.1 tls for (i = 0; i < hclen + 4; i++) { 208 1.1 tls AddBits(clcl[order[i]], 3, bp, out, outsize); 209 1.1 tls } 210 1.1 tls 211 1.1 tls for (i = 0; i < rle_size; i++) { 212 1.1 tls unsigned symbol = clsymbols[rle[i]]; 213 1.1 tls AddHuffmanBits(symbol, clcl[rle[i]], bp, out, outsize); 214 1.1 tls /* Extra bits. */ 215 1.1 tls if (rle[i] == 16) AddBits(rle_bits[i], 2, bp, out, outsize); 216 1.1 tls else if (rle[i] == 17) AddBits(rle_bits[i], 3, bp, out, outsize); 217 1.1 tls else if (rle[i] == 18) AddBits(rle_bits[i], 7, bp, out, outsize); 218 1.1 tls } 219 1.1 tls 220 1.1 tls free(lld_lengths); 221 1.1 tls free(rle); 222 1.1 tls free(rle_bits); 223 1.1 tls } 224 1.1 tls 225 1.1 tls /* 226 1.1 tls Gives the exact size of the tree, in bits, as it will be encoded in DEFLATE. 227 1.1 tls */ 228 1.1 tls static size_t CalculateTreeSize(const unsigned* ll_lengths, 229 1.1 tls const unsigned* d_lengths, 230 1.1 tls size_t* ll_counts, size_t* d_counts) { 231 1.1 tls unsigned char* dummy = 0; 232 1.1 tls size_t dummysize = 0; 233 1.1 tls unsigned char bp = 0; 234 1.1 tls 235 1.1 tls (void)ll_counts; 236 1.1 tls (void)d_counts; 237 1.1 tls 238 1.1 tls AddDynamicTree(ll_lengths, d_lengths, &bp, &dummy, &dummysize); 239 1.1 tls free(dummy); 240 1.1 tls 241 1.1 tls return dummysize * 8 + (bp & 7); 242 1.1 tls } 243 1.1 tls 244 1.1 tls /* 245 1.1 tls Adds all lit/len and dist codes from the lists as huffman symbols. Does not add 246 1.1 tls end code 256. expected_data_size is the uncompressed block size, used for 247 1.1 tls assert, but you can set it to 0 to not do the assertion. 248 1.1 tls */ 249 1.1 tls static void AddLZ77Data(const unsigned short* litlens, 250 1.1 tls const unsigned short* dists, 251 1.1 tls size_t lstart, size_t lend, 252 1.1 tls size_t expected_data_size, 253 1.1 tls const unsigned* ll_symbols, const unsigned* ll_lengths, 254 1.1 tls const unsigned* d_symbols, const unsigned* d_lengths, 255 1.1 tls unsigned char* bp, 256 1.1 tls unsigned char** out, size_t* outsize) { 257 1.1 tls size_t testlength = 0; 258 1.1 tls size_t i; 259 1.1 tls 260 1.1 tls for (i = lstart; i < lend; i++) { 261 1.1 tls unsigned dist = dists[i]; 262 1.1 tls unsigned litlen = litlens[i]; 263 1.1 tls if (dist == 0) { 264 1.1 tls assert(litlen < 256); 265 1.1 tls assert(ll_lengths[litlen] > 0); 266 1.1 tls AddHuffmanBits(ll_symbols[litlen], ll_lengths[litlen], bp, out, outsize); 267 1.1 tls testlength++; 268 1.1 tls } else { 269 1.1 tls unsigned lls = ZopfliGetLengthSymbol(litlen); 270 1.1 tls unsigned ds = ZopfliGetDistSymbol(dist); 271 1.1 tls assert(litlen >= 3 && litlen <= 288); 272 1.1 tls assert(ll_lengths[lls] > 0); 273 1.1 tls assert(d_lengths[ds] > 0); 274 1.1 tls AddHuffmanBits(ll_symbols[lls], ll_lengths[lls], bp, out, outsize); 275 1.1 tls AddBits(ZopfliGetLengthExtraBitsValue(litlen), 276 1.1 tls ZopfliGetLengthExtraBits(litlen), 277 1.1 tls bp, out, outsize); 278 1.1 tls AddHuffmanBits(d_symbols[ds], d_lengths[ds], bp, out, outsize); 279 1.1 tls AddBits(ZopfliGetDistExtraBitsValue(dist), 280 1.1 tls ZopfliGetDistExtraBits(dist), 281 1.1 tls bp, out, outsize); 282 1.1 tls testlength += litlen; 283 1.1 tls } 284 1.1 tls } 285 1.1 tls assert(expected_data_size == 0 || testlength == expected_data_size); 286 1.1 tls } 287 1.1 tls 288 1.1 tls static void GetFixedTree(unsigned* ll_lengths, unsigned* d_lengths) { 289 1.1 tls size_t i; 290 1.1 tls for (i = 0; i < 144; i++) ll_lengths[i] = 8; 291 1.1 tls for (i = 144; i < 256; i++) ll_lengths[i] = 9; 292 1.1 tls for (i = 256; i < 280; i++) ll_lengths[i] = 7; 293 1.1 tls for (i = 280; i < 288; i++) ll_lengths[i] = 8; 294 1.1 tls for (i = 0; i < 32; i++) d_lengths[i] = 5; 295 1.1 tls } 296 1.1 tls 297 1.1 tls /* 298 1.1 tls Calculates size of the part after the header and tree of an LZ77 block, in bits. 299 1.1 tls */ 300 1.1 tls static size_t CalculateBlockSymbolSize(const unsigned* ll_lengths, 301 1.1 tls const unsigned* d_lengths, 302 1.1 tls const unsigned short* litlens, 303 1.1 tls const unsigned short* dists, 304 1.1 tls size_t lstart, size_t lend) { 305 1.1 tls size_t result = 0; 306 1.1 tls size_t i; 307 1.1 tls for (i = lstart; i < lend; i++) { 308 1.1 tls if (dists[i] == 0) { 309 1.1 tls result += ll_lengths[litlens[i]]; 310 1.1 tls } else { 311 1.1 tls result += ll_lengths[ZopfliGetLengthSymbol(litlens[i])]; 312 1.1 tls result += d_lengths[ZopfliGetDistSymbol(dists[i])]; 313 1.1 tls result += ZopfliGetLengthExtraBits(litlens[i]); 314 1.1 tls result += ZopfliGetDistExtraBits(dists[i]); 315 1.1 tls } 316 1.1 tls } 317 1.1 tls result += ll_lengths[256]; /*end symbol*/ 318 1.1 tls return result; 319 1.1 tls } 320 1.1 tls 321 1.1 tls double ZopfliCalculateBlockSize(const unsigned short* litlens, 322 1.1 tls const unsigned short* dists, 323 1.1 tls size_t lstart, size_t lend, int btype) { 324 1.1 tls size_t ll_counts[288]; 325 1.1 tls size_t d_counts[32]; 326 1.1 tls 327 1.1 tls unsigned ll_lengths[288]; 328 1.1 tls unsigned d_lengths[32]; 329 1.1 tls 330 1.1 tls double result = 3; /*bfinal and btype bits*/ 331 1.1 tls 332 1.1 tls assert(btype == 1 || btype == 2); /* This is not for uncompressed blocks. */ 333 1.1 tls 334 1.1 tls if(btype == 1) { 335 1.1 tls GetFixedTree(ll_lengths, d_lengths); 336 1.1 tls } else { 337 1.1 tls ZopfliLZ77Counts(litlens, dists, lstart, lend, ll_counts, d_counts); 338 1.1 tls ZopfliCalculateBitLengths(ll_counts, 288, 15, ll_lengths); 339 1.1 tls ZopfliCalculateBitLengths(d_counts, 32, 15, d_lengths); 340 1.1 tls PatchDistanceCodesForBuggyDecoders(d_lengths); 341 1.1 tls result += CalculateTreeSize(ll_lengths, d_lengths, ll_counts, d_counts); 342 1.1 tls } 343 1.1 tls 344 1.1 tls result += CalculateBlockSymbolSize( 345 1.1 tls ll_lengths, d_lengths, litlens, dists, lstart, lend); 346 1.1 tls 347 1.1 tls return result; 348 1.1 tls } 349 1.1 tls 350 1.1 tls /* 351 1.1 tls Adds a deflate block with the given LZ77 data to the output. 352 1.1 tls options: global program options 353 1.1 tls btype: the block type, must be 1 or 2 354 1.1 tls final: whether to set the "final" bit on this block, must be the last block 355 1.1 tls litlens: literal/length array of the LZ77 data, in the same format as in 356 1.1 tls ZopfliLZ77Store. 357 1.1 tls dists: distance array of the LZ77 data, in the same format as in 358 1.1 tls ZopfliLZ77Store. 359 1.1 tls lstart: where to start in the LZ77 data 360 1.1 tls lend: where to end in the LZ77 data (not inclusive) 361 1.1 tls expected_data_size: the uncompressed block size, used for assert, but you can 362 1.1 tls set it to 0 to not do the assertion. 363 1.1 tls bp: output bit pointer 364 1.1 tls out: dynamic output array to append to 365 1.1 tls outsize: dynamic output array size 366 1.1 tls */ 367 1.1 tls static void AddLZ77Block(const ZopfliOptions* options, int btype, int final, 368 1.1 tls const unsigned short* litlens, 369 1.1 tls const unsigned short* dists, 370 1.1 tls size_t lstart, size_t lend, 371 1.1 tls size_t expected_data_size, 372 1.1 tls unsigned char* bp, unsigned char** out, size_t* outsize) { 373 1.1 tls size_t ll_counts[288]; 374 1.1 tls size_t d_counts[32]; 375 1.1 tls unsigned ll_lengths[288]; 376 1.1 tls unsigned d_lengths[32]; 377 1.1 tls unsigned ll_symbols[288]; 378 1.1 tls unsigned d_symbols[32]; 379 1.1 tls size_t detect_block_size = *outsize; 380 1.1 tls size_t compressed_size; 381 1.1 tls size_t uncompressed_size = 0; 382 1.1 tls size_t i; 383 1.1 tls 384 1.1 tls AddBit(final, bp, out, outsize); 385 1.1 tls AddBit(btype & 1, bp, out, outsize); 386 1.1 tls AddBit((btype & 2) >> 1, bp, out, outsize); 387 1.1 tls 388 1.1 tls if (btype == 1) { 389 1.1 tls /* Fixed block. */ 390 1.1 tls GetFixedTree(ll_lengths, d_lengths); 391 1.1 tls } else { 392 1.1 tls /* Dynamic block. */ 393 1.1 tls unsigned detect_tree_size; 394 1.1 tls assert(btype == 2); 395 1.1 tls ZopfliLZ77Counts(litlens, dists, lstart, lend, ll_counts, d_counts); 396 1.1 tls ZopfliCalculateBitLengths(ll_counts, 288, 15, ll_lengths); 397 1.1 tls ZopfliCalculateBitLengths(d_counts, 32, 15, d_lengths); 398 1.1 tls PatchDistanceCodesForBuggyDecoders(d_lengths); 399 1.1 tls detect_tree_size = *outsize; 400 1.1 tls AddDynamicTree(ll_lengths, d_lengths, bp, out, outsize); 401 1.1 tls if (options->verbose) { 402 1.1 tls fprintf(stderr, "treesize: %d\n", (int)(*outsize - detect_tree_size)); 403 1.1 tls } 404 1.1 tls 405 1.1 tls /* Assert that for every present symbol, the code length is non-zero. */ 406 1.1 tls /* TODO(lode): remove this in release version. */ 407 1.1 tls for (i = 0; i < 288; i++) assert(ll_counts[i] == 0 || ll_lengths[i] > 0); 408 1.1 tls for (i = 0; i < 32; i++) assert(d_counts[i] == 0 || d_lengths[i] > 0); 409 1.1 tls } 410 1.1 tls 411 1.1 tls ZopfliLengthsToSymbols(ll_lengths, 288, 15, ll_symbols); 412 1.1 tls ZopfliLengthsToSymbols(d_lengths, 32, 15, d_symbols); 413 1.1 tls 414 1.1 tls detect_block_size = *outsize; 415 1.1 tls AddLZ77Data(litlens, dists, lstart, lend, expected_data_size, 416 1.1 tls ll_symbols, ll_lengths, d_symbols, d_lengths, 417 1.1 tls bp, out, outsize); 418 1.1 tls /* End symbol. */ 419 1.1 tls AddHuffmanBits(ll_symbols[256], ll_lengths[256], bp, out, outsize); 420 1.1 tls 421 1.1 tls for (i = lstart; i < lend; i++) { 422 1.1 tls uncompressed_size += dists[i] == 0 ? 1 : litlens[i]; 423 1.1 tls } 424 1.1 tls compressed_size = *outsize - detect_block_size; 425 1.1 tls if (options->verbose) { 426 1.1 tls fprintf(stderr, "compressed block size: %d (%dk) (unc: %d)\n", 427 1.1 tls (int)compressed_size, (int)(compressed_size / 1024), 428 1.1 tls (int)(uncompressed_size)); 429 1.1 tls } 430 1.1 tls } 431 1.1 tls 432 1.1 tls static void DeflateDynamicBlock(const ZopfliOptions* options, int final, 433 1.1 tls const unsigned char* in, 434 1.1 tls size_t instart, size_t inend, 435 1.1 tls unsigned char* bp, 436 1.1 tls unsigned char** out, size_t* outsize) { 437 1.1 tls ZopfliBlockState s; 438 1.1 tls size_t blocksize = inend - instart; 439 1.1 tls ZopfliLZ77Store store; 440 1.1 tls int btype = 2; 441 1.1 tls 442 1.1 tls ZopfliInitLZ77Store(&store); 443 1.1 tls 444 1.1 tls s.options = options; 445 1.1 tls s.blockstart = instart; 446 1.1 tls s.blockend = inend; 447 1.1 tls #ifdef ZOPFLI_LONGEST_MATCH_CACHE 448 1.1 tls s.lmc = (ZopfliLongestMatchCache*)malloc(sizeof(ZopfliLongestMatchCache)); 449 1.1 tls ZopfliInitCache(blocksize, s.lmc); 450 1.1 tls #endif 451 1.1 tls 452 1.1 tls ZopfliLZ77Optimal(&s, in, instart, inend, &store); 453 1.1 tls 454 1.1 tls /* For small block, encoding with fixed tree can be smaller. For large block, 455 1.1 tls don't bother doing this expensive test, dynamic tree will be better.*/ 456 1.1 tls if (store.size < 1000) { 457 1.1 tls double dyncost, fixedcost; 458 1.1 tls ZopfliLZ77Store fixedstore; 459 1.1 tls ZopfliInitLZ77Store(&fixedstore); 460 1.1 tls ZopfliLZ77OptimalFixed(&s, in, instart, inend, &fixedstore); 461 1.1 tls dyncost = ZopfliCalculateBlockSize(store.litlens, store.dists, 462 1.1 tls 0, store.size, 2); 463 1.1 tls fixedcost = ZopfliCalculateBlockSize(fixedstore.litlens, fixedstore.dists, 464 1.1 tls 0, fixedstore.size, 1); 465 1.1 tls if (fixedcost < dyncost) { 466 1.1 tls btype = 1; 467 1.1 tls ZopfliCleanLZ77Store(&store); 468 1.1 tls store = fixedstore; 469 1.1 tls } else { 470 1.1 tls ZopfliCleanLZ77Store(&fixedstore); 471 1.1 tls } 472 1.1 tls } 473 1.1 tls 474 1.1 tls AddLZ77Block(s.options, btype, final, 475 1.1 tls store.litlens, store.dists, 0, store.size, 476 1.1 tls blocksize, bp, out, outsize); 477 1.1 tls 478 1.1 tls #ifdef ZOPFLI_LONGEST_MATCH_CACHE 479 1.1 tls ZopfliCleanCache(s.lmc); 480 1.1 tls free(s.lmc); 481 1.1 tls #endif 482 1.1 tls ZopfliCleanLZ77Store(&store); 483 1.1 tls } 484 1.1 tls 485 1.1 tls static void DeflateFixedBlock(const ZopfliOptions* options, int final, 486 1.1 tls const unsigned char* in, 487 1.1 tls size_t instart, size_t inend, 488 1.1 tls unsigned char* bp, 489 1.1 tls unsigned char** out, size_t* outsize) { 490 1.1 tls ZopfliBlockState s; 491 1.1 tls size_t blocksize = inend - instart; 492 1.1 tls ZopfliLZ77Store store; 493 1.1 tls 494 1.1 tls ZopfliInitLZ77Store(&store); 495 1.1 tls 496 1.1 tls s.options = options; 497 1.1 tls s.blockstart = instart; 498 1.1 tls s.blockend = inend; 499 1.1 tls #ifdef ZOPFLI_LONGEST_MATCH_CACHE 500 1.1 tls s.lmc = (ZopfliLongestMatchCache*)malloc(sizeof(ZopfliLongestMatchCache)); 501 1.1 tls ZopfliInitCache(blocksize, s.lmc); 502 1.1 tls #endif 503 1.1 tls 504 1.1 tls ZopfliLZ77OptimalFixed(&s, in, instart, inend, &store); 505 1.1 tls 506 1.1 tls AddLZ77Block(s.options, 1, final, store.litlens, store.dists, 0, store.size, 507 1.1 tls blocksize, bp, out, outsize); 508 1.1 tls 509 1.1 tls #ifdef ZOPFLI_LONGEST_MATCH_CACHE 510 1.1 tls ZopfliCleanCache(s.lmc); 511 1.1 tls free(s.lmc); 512 1.1 tls #endif 513 1.1 tls ZopfliCleanLZ77Store(&store); 514 1.1 tls } 515 1.1 tls 516 1.1 tls static void DeflateNonCompressedBlock(const ZopfliOptions* options, int final, 517 1.1 tls const unsigned char* in, size_t instart, 518 1.1 tls size_t inend, 519 1.1 tls unsigned char* bp, 520 1.1 tls unsigned char** out, size_t* outsize) { 521 1.1 tls size_t i; 522 1.1 tls size_t blocksize = inend - instart; 523 1.1 tls unsigned short nlen = ~blocksize; 524 1.1 tls 525 1.1 tls (void)options; 526 1.1 tls assert(blocksize < 65536); /* Non compressed blocks are max this size. */ 527 1.1 tls 528 1.1 tls AddBit(final, bp, out, outsize); 529 1.1 tls /* BTYPE 00 */ 530 1.1 tls AddBit(0, bp, out, outsize); 531 1.1 tls AddBit(0, bp, out, outsize); 532 1.1 tls 533 1.1 tls /* Any bits of input up to the next byte boundary are ignored. */ 534 1.1 tls *bp = 0; 535 1.1 tls 536 1.1 tls ZOPFLI_APPEND_DATA(blocksize % 256, out, outsize); 537 1.1 tls ZOPFLI_APPEND_DATA((blocksize / 256) % 256, out, outsize); 538 1.1 tls ZOPFLI_APPEND_DATA(nlen % 256, out, outsize); 539 1.1 tls ZOPFLI_APPEND_DATA((nlen / 256) % 256, out, outsize); 540 1.1 tls 541 1.1 tls for (i = instart; i < inend; i++) { 542 1.1 tls ZOPFLI_APPEND_DATA(in[i], out, outsize); 543 1.1 tls } 544 1.1 tls } 545 1.1 tls 546 1.1 tls static void DeflateBlock(const ZopfliOptions* options, 547 1.1 tls int btype, int final, 548 1.1 tls const unsigned char* in, size_t instart, size_t inend, 549 1.1 tls unsigned char* bp, 550 1.1 tls unsigned char** out, size_t* outsize) { 551 1.1 tls if (btype == 0) { 552 1.1 tls DeflateNonCompressedBlock( 553 1.1 tls options, final, in, instart, inend, bp, out, outsize); 554 1.1 tls } else if (btype == 1) { 555 1.1 tls DeflateFixedBlock(options, final, in, instart, inend, bp, out, outsize); 556 1.1 tls } else { 557 1.1 tls assert (btype == 2); 558 1.1 tls DeflateDynamicBlock(options, final, in, instart, inend, bp, out, outsize); 559 1.1 tls } 560 1.1 tls } 561 1.1 tls 562 1.1 tls /* 563 1.1 tls Does squeeze strategy where first block splitting is done, then each block is 564 1.1 tls squeezed. 565 1.1 tls Parameters: see description of the ZopfliDeflate function. 566 1.1 tls */ 567 1.1 tls static void DeflateSplittingFirst(const ZopfliOptions* options, 568 1.1 tls int btype, int final, 569 1.1 tls const unsigned char* in, 570 1.1 tls size_t instart, size_t inend, 571 1.1 tls unsigned char* bp, 572 1.1 tls unsigned char** out, size_t* outsize) { 573 1.1 tls size_t i; 574 1.1 tls size_t* splitpoints = 0; 575 1.1 tls size_t npoints = 0; 576 1.1 tls if (btype == 0) { 577 1.1 tls ZopfliBlockSplitSimple(in, instart, inend, 65535, &splitpoints, &npoints); 578 1.1 tls } else if (btype == 1) { 579 1.1 tls /* If all blocks are fixed tree, splitting into separate blocks only 580 1.1 tls increases the total size. Leave npoints at 0, this represents 1 block. */ 581 1.1 tls } else { 582 1.1 tls ZopfliBlockSplit(options, in, instart, inend, 583 1.1 tls options->blocksplittingmax, &splitpoints, &npoints); 584 1.1 tls } 585 1.1 tls 586 1.1 tls for (i = 0; i <= npoints; i++) { 587 1.1 tls size_t start = i == 0 ? instart : splitpoints[i - 1]; 588 1.1 tls size_t end = i == npoints ? inend : splitpoints[i]; 589 1.1 tls DeflateBlock(options, btype, i == npoints && final, in, start, end, 590 1.1 tls bp, out, outsize); 591 1.1 tls } 592 1.1 tls 593 1.1 tls free(splitpoints); 594 1.1 tls } 595 1.1 tls 596 1.1 tls /* 597 1.1 tls Does squeeze strategy where first the best possible lz77 is done, and then based 598 1.1 tls on that data, block splitting is done. 599 1.1 tls Parameters: see description of the ZopfliDeflate function. 600 1.1 tls */ 601 1.1 tls static void DeflateSplittingLast(const ZopfliOptions* options, 602 1.1 tls int btype, int final, 603 1.1 tls const unsigned char* in, 604 1.1 tls size_t instart, size_t inend, 605 1.1 tls unsigned char* bp, 606 1.1 tls unsigned char** out, size_t* outsize) { 607 1.1 tls size_t i; 608 1.1 tls ZopfliBlockState s; 609 1.1 tls ZopfliLZ77Store store; 610 1.1 tls size_t* splitpoints = 0; 611 1.1 tls size_t npoints = 0; 612 1.1 tls 613 1.1 tls if (btype == 0) { 614 1.1 tls /* This function only supports LZ77 compression. DeflateSplittingFirst 615 1.1 tls supports the special case of noncompressed data. Punt it to that one. */ 616 1.1 tls DeflateSplittingFirst(options, btype, final, 617 1.1 tls in, instart, inend, 618 1.1 tls bp, out, outsize); 619 1.1 tls } 620 1.1 tls assert(btype == 1 || btype == 2); 621 1.1 tls 622 1.1 tls ZopfliInitLZ77Store(&store); 623 1.1 tls 624 1.1 tls s.options = options; 625 1.1 tls s.blockstart = instart; 626 1.1 tls s.blockend = inend; 627 1.1 tls #ifdef ZOPFLI_LONGEST_MATCH_CACHE 628 1.1 tls s.lmc = (ZopfliLongestMatchCache*)malloc(sizeof(ZopfliLongestMatchCache)); 629 1.1 tls ZopfliInitCache(inend - instart, s.lmc); 630 1.1 tls #endif 631 1.1 tls 632 1.1 tls if (btype == 2) { 633 1.1 tls ZopfliLZ77Optimal(&s, in, instart, inend, &store); 634 1.1 tls } else { 635 1.1 tls assert (btype == 1); 636 1.1 tls ZopfliLZ77OptimalFixed(&s, in, instart, inend, &store); 637 1.1 tls } 638 1.1 tls 639 1.1 tls if (btype == 1) { 640 1.1 tls /* If all blocks are fixed tree, splitting into separate blocks only 641 1.1 tls increases the total size. Leave npoints at 0, this represents 1 block. */ 642 1.1 tls } else { 643 1.1 tls ZopfliBlockSplitLZ77(options, store.litlens, store.dists, store.size, 644 1.1 tls options->blocksplittingmax, &splitpoints, &npoints); 645 1.1 tls } 646 1.1 tls 647 1.1 tls for (i = 0; i <= npoints; i++) { 648 1.1 tls size_t start = i == 0 ? 0 : splitpoints[i - 1]; 649 1.1 tls size_t end = i == npoints ? store.size : splitpoints[i]; 650 1.1 tls AddLZ77Block(options, btype, i == npoints && final, 651 1.1 tls store.litlens, store.dists, start, end, 0, 652 1.1 tls bp, out, outsize); 653 1.1 tls } 654 1.1 tls 655 1.1 tls #ifdef ZOPFLI_LONGEST_MATCH_CACHE 656 1.1 tls ZopfliCleanCache(s.lmc); 657 1.1 tls free(s.lmc); 658 1.1 tls #endif 659 1.1 tls 660 1.1 tls ZopfliCleanLZ77Store(&store); 661 1.1 tls } 662 1.1 tls 663 1.1 tls /* 664 1.1 tls Deflate a part, to allow ZopfliDeflate() to use multiple master blocks if 665 1.1 tls needed. 666 1.1 tls It is possible to call this function multiple times in a row, shifting 667 1.1 tls instart and inend to next bytes of the data. If instart is larger than 0, then 668 1.1 tls previous bytes are used as the initial dictionary for LZ77. 669 1.1 tls This function will usually output multiple deflate blocks. If final is 1, then 670 1.1 tls the final bit will be set on the last block. 671 1.1 tls */ 672 1.1 tls void ZopfliDeflatePart(const ZopfliOptions* options, int btype, int final, 673 1.1 tls const unsigned char* in, size_t instart, size_t inend, 674 1.1 tls unsigned char* bp, unsigned char** out, 675 1.1 tls size_t* outsize) { 676 1.1 tls if (options->blocksplitting) { 677 1.1 tls if (options->blocksplittinglast) { 678 1.1 tls DeflateSplittingLast(options, btype, final, in, instart, inend, 679 1.1 tls bp, out, outsize); 680 1.1 tls } else { 681 1.1 tls DeflateSplittingFirst(options, btype, final, in, instart, inend, 682 1.1 tls bp, out, outsize); 683 1.1 tls } 684 1.1 tls } else { 685 1.1 tls DeflateBlock(options, btype, final, in, instart, inend, bp, out, outsize); 686 1.1 tls } 687 1.1 tls } 688 1.1 tls 689 1.1 tls void ZopfliDeflate(const ZopfliOptions* options, int btype, int final, 690 1.1 tls const unsigned char* in, size_t insize, 691 1.1 tls unsigned char* bp, unsigned char** out, size_t* outsize) { 692 1.1 tls #if ZOPFLI_MASTER_BLOCK_SIZE == 0 693 1.1 tls ZopfliDeflatePart(options, btype, final, in, 0, insize, bp, out, outsize); 694 1.1 tls #else 695 1.1 tls size_t i = 0; 696 1.1 tls while (i < insize) { 697 1.1 tls int masterfinal = (i + ZOPFLI_MASTER_BLOCK_SIZE >= insize); 698 1.1 tls int final2 = final && masterfinal; 699 1.1 tls size_t size = masterfinal ? insize - i : ZOPFLI_MASTER_BLOCK_SIZE; 700 1.1 tls ZopfliDeflatePart(options, btype, final2, 701 1.1 tls in, i, i + size, bp, out, outsize); 702 1.1 tls i += size; 703 1.1 tls } 704 1.1 tls #endif 705 1.1 tls } 706