Home | History | Annotate | Line # | Download | only in zopfli
deflate.c revision 1.1
      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