OLD | NEW |
| (Empty) |
1 /* Copyright 2013 Google Inc. All Rights Reserved. | |
2 | |
3 Distributed under MIT license. | |
4 See file LICENSE for detail or copy at https://opensource.org/licenses/MIT | |
5 */ | |
6 | |
7 /* API for Brotli decompression */ | |
8 | |
9 #ifndef BROTLI_DEC_DECODE_H_ | |
10 #define BROTLI_DEC_DECODE_H_ | |
11 | |
12 #include "./types.h" | |
13 | |
14 #if defined(__cplusplus) || defined(c_plusplus) | |
15 extern "C" { | |
16 #endif | |
17 | |
18 typedef struct BrotliStateStruct BrotliState; | |
19 | |
20 typedef enum { | |
21 /* Decoding error, e.g. corrupt input or memory allocation problem */ | |
22 BROTLI_RESULT_ERROR = 0, | |
23 /* Decoding successfully completed */ | |
24 BROTLI_RESULT_SUCCESS = 1, | |
25 /* Partially done; should be called again with more input */ | |
26 BROTLI_RESULT_NEEDS_MORE_INPUT = 2, | |
27 /* Partially done; should be called again with more output */ | |
28 BROTLI_RESULT_NEEDS_MORE_OUTPUT = 3 | |
29 } BrotliResult; | |
30 | |
31 typedef enum { | |
32 BROTLI_NO_ERROR = 0, | |
33 /* Same as BrotliResult values */ | |
34 BROTLI_SUCCESS = 1, | |
35 BROTLI_NEEDS_MORE_INPUT = 2, | |
36 BROTLI_NEEDS_MORE_OUTPUT = 3, | |
37 | |
38 /* Errors caused by invalid input */ | |
39 BROTLI_ERROR_FORMAT_EXUBERANT_NIBBLE = -1, | |
40 BROTLI_ERROR_FORMAT_RESERVED = -2, | |
41 BROTLI_ERROR_FORMAT_EXUBERANT_META_NIBBLE = -3, | |
42 BROTLI_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET = -4, | |
43 BROTLI_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME = -5, | |
44 BROTLI_ERROR_FORMAT_CL_SPACE = -6, | |
45 BROTLI_ERROR_FORMAT_HUFFMAN_SPACE = -7, | |
46 BROTLI_ERROR_FORMAT_CONTEXT_MAP_REPEAT = -8, | |
47 BROTLI_ERROR_FORMAT_BLOCK_LENGTH_1 = -9, | |
48 BROTLI_ERROR_FORMAT_BLOCK_LENGTH_2 = -10, | |
49 BROTLI_ERROR_FORMAT_TRANSFORM = -11, | |
50 BROTLI_ERROR_FORMAT_DICTIONARY = -12, | |
51 BROTLI_ERROR_FORMAT_WINDOW_BITS = -13, | |
52 BROTLI_ERROR_FORMAT_PADDING_1 = -14, | |
53 BROTLI_ERROR_FORMAT_PADDING_2 = -15, | |
54 | |
55 /* -16..-20 codes are reserved */ | |
56 | |
57 /* Memory allocation problems */ | |
58 BROTLI_ERROR_ALLOC_CONTEXT_MODES = -21, | |
59 BROTLI_ERROR_ALLOC_TREE_GROUPS = -22, /* Literal, insert, distance */ | |
60 /* -23..-24 codes are reserved for distinct tree groups */ | |
61 BROTLI_ERROR_ALLOC_CONTEXT_MAP = -25, | |
62 BROTLI_ERROR_ALLOC_RING_BUFFER_1 = -26, | |
63 BROTLI_ERROR_ALLOC_RING_BUFFER_2 = -27, | |
64 /* -28..-29 codes are reserved for dynamic ringbuffer allocation */ | |
65 BROTLI_ERROR_ALLOC_BLOCK_TYPE_TREES = -30, | |
66 | |
67 /* "Impossible" states */ | |
68 BROTLI_ERROR_UNREACHABLE_1 = -31, | |
69 BROTLI_ERROR_UNREACHABLE_2 = -32, | |
70 BROTLI_ERROR_UNREACHABLE_3 = -33, | |
71 BROTLI_ERROR_UNREACHABLE_4 = -34, | |
72 BROTLI_ERROR_UNREACHABLE_5 = -35, | |
73 BROTLI_ERROR_UNREACHABLE_6 = -36 | |
74 } BrotliErrorCode; | |
75 | |
76 #define BROTLI_LAST_ERROR_CODE BROTLI_ERROR_UNREACHABLE_6 | |
77 | |
78 /* Creates the instance of BrotliState and initializes it. |alloc_func| and | |
79 |free_func| MUST be both zero or both non-zero. In the case they are both | |
80 zero, default memory allocators are used. |opaque| is passed to |alloc_func| | |
81 and |free_func| when they are called. */ | |
82 BrotliState* BrotliCreateState( | |
83 brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque); | |
84 | |
85 /* Deinitializes and frees BrotliState instance. */ | |
86 void BrotliDestroyState(BrotliState* state); | |
87 | |
88 /* Sets |*decoded_size| to the decompressed size of the given encoded stream. | |
89 This function only works if the encoded buffer has a single meta block, | |
90 or if it has two meta-blocks, where the first is uncompressed and the | |
91 second is empty. | |
92 Returns 1 on success, 0 on failure. */ | |
93 int BrotliDecompressedSize(size_t encoded_size, | |
94 const uint8_t* encoded_buffer, | |
95 size_t* decoded_size); | |
96 | |
97 /* Decompresses the data in |encoded_buffer| into |decoded_buffer|, and sets | |
98 |*decoded_size| to the decompressed length. */ | |
99 BrotliResult BrotliDecompressBuffer(size_t encoded_size, | |
100 const uint8_t* encoded_buffer, | |
101 size_t* decoded_size, | |
102 uint8_t* decoded_buffer); | |
103 | |
104 /* Decompresses the data. Supports partial input and output. | |
105 | |
106 Must be called with an allocated input buffer in |*next_in| and an allocated | |
107 output buffer in |*next_out|. The values |*available_in| and |*available_out| | |
108 must specify the allocated size in |*next_in| and |*next_out| respectively. | |
109 | |
110 After each call, |*available_in| will be decremented by the amount of input | |
111 bytes consumed, and the |*next_in| pointer will be incremented by that | |
112 amount. Similarly, |*available_out| will be decremented by the amount of | |
113 output bytes written, and the |*next_out| pointer will be incremented by that | |
114 amount. |total_out| will be set to the number of bytes decompressed since | |
115 last state initialization. | |
116 | |
117 Input is never overconsumed, so |next_in| and |available_in| could be passed | |
118 to the next consumer after decoding is complete. */ | |
119 BrotliResult BrotliDecompressStream(size_t* available_in, | |
120 const uint8_t** next_in, | |
121 size_t* available_out, | |
122 uint8_t** next_out, | |
123 size_t* total_out, | |
124 BrotliState* s); | |
125 | |
126 /* Fills the new state with a dictionary for LZ77, warming up the ringbuffer, | |
127 e.g. for custom static dictionaries for data formats. | |
128 Not to be confused with the built-in transformable dictionary of Brotli. | |
129 |size| should be less or equal to 2^24 (16MiB), otherwise the dictionary will | |
130 be ignored. The dictionary must exist in memory until decoding is done and | |
131 is owned by the caller. To use: | |
132 1) Allocate and initialize state with BrotliCreateState | |
133 2) Use BrotliSetCustomDictionary | |
134 3) Use BrotliDecompressStream | |
135 4) Clean up and free state with BrotliDestroyState | |
136 */ | |
137 void BrotliSetCustomDictionary( | |
138 size_t size, const uint8_t* dict, BrotliState* s); | |
139 | |
140 /* Returns 1, if s is in a state where we have not read any input bytes yet, | |
141 and 0 otherwise */ | |
142 int BrotliStateIsStreamStart(const BrotliState* s); | |
143 | |
144 /* Returns 1, if s is in a state where we reached the end of the input and | |
145 produced all of the output, and 0 otherwise. */ | |
146 int BrotliStateIsStreamEnd(const BrotliState* s); | |
147 | |
148 /* Returns detailed error code after BrotliDecompressStream returns | |
149 BROTLI_RESULT_ERROR. */ | |
150 BrotliErrorCode BrotliGetErrorCode(const BrotliState* s); | |
151 | |
152 #if defined(__cplusplus) || defined(c_plusplus) | |
153 } /* extern "C" */ | |
154 #endif | |
155 | |
156 #endif /* BROTLI_DEC_DECODE_H_ */ | |
OLD | NEW |