]> wimlib.net Git - wimlib/blob - src/compress.h
Decompression optimizations
[wimlib] / src / compress.h
1 /*
2  * compress.h
3  *
4  * Functions useful for compression, mainly bitstreams.
5  */
6
7 #ifndef _WIMLIB_COMPRESS_H
8 #define _WIMLIB_COMPRESS_H
9
10 #include "util.h"
11 #include "endianness.h"
12
13 typedef u16 output_bitbuf_t;
14
15 /* Structure to keep track of the current position in the compressed output. */
16 struct output_bitstream {
17
18         /* A variable to buffer writing bits to the output and is flushed to the
19          * compressed output when full. */
20         output_bitbuf_t bitbuf;
21
22         /* Number of free bits in @bitbuf */
23         unsigned free_bits;
24
25         u8 *bit_output;
26         u8 *next_bit_output;
27
28         /* Pointer to the next byte in the compressed output. */
29         u8 *output;
30
31
32         /* Number of bytes left in the memory pointed to by @output. */
33         int num_bytes_remaining;
34 };
35
36 static inline int bitstream_put_byte(struct output_bitstream *ostream,
37                                      u8 n)
38 {
39         if (ostream->num_bytes_remaining < 1)
40                 return 1;
41         *ostream->output = n;
42         ostream->output++;
43         ostream->num_bytes_remaining--;
44         return 0;
45 }
46
47 static inline int bitstream_put_two_bytes(struct output_bitstream *ostream,
48                                           u16 n)
49 {
50         if (ostream->num_bytes_remaining < 2)
51                 return 1;
52         *(u16*)ostream->output = cpu_to_le16(n);
53         ostream->output += 2;
54         ostream->num_bytes_remaining -= 2;
55         return 0;
56 }
57
58 struct lz_params {
59         unsigned min_match;
60         unsigned max_match;
61         unsigned nice_match;
62         unsigned good_match;
63         unsigned max_chain_len;
64         unsigned max_lazy_match;
65         unsigned too_far;
66 };
67
68 typedef unsigned (*lz_record_match_t)(unsigned, unsigned, void *, void *);
69 typedef unsigned (*lz_record_literal_t)(u8, void *);
70
71 extern unsigned lz_analyze_block(const u8 uncompressed_data[],
72                                  unsigned uncompressed_len,
73                                  u32 match_tab[],
74                                  lz_record_match_t record_match,
75                                  lz_record_literal_t record_literal,
76                                  void *record_match_arg1,
77                                  void *record_match_arg2,
78                                  void *record_literal_arg,
79                                  const struct lz_params *params);
80
81 extern int bitstream_put_bits(struct output_bitstream *ostream,
82                               output_bitbuf_t bits, unsigned num_bits);
83
84 extern void init_output_bitstream(struct output_bitstream *ostream,
85                                   void *data, unsigned num_bytes);
86
87 extern int flush_output_bitstream(struct output_bitstream *ostream);
88
89 extern void make_canonical_huffman_code(unsigned num_syms,
90                                         unsigned max_codeword_len,
91                                         const u32 freq_tab[],
92                                         u8 lens[],
93                                         u16 codewords[]);
94
95 #endif /* _WIMLIB_COMPRESS_H */