123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409 |
- /* Copyright 2013 Google Inc. All Rights Reserved.
- Distributed under MIT license.
- See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
- */
- /**
- * @file
- * API for Brotli decompression.
- */
- #ifndef BROTLI_DEC_DECODE_H_
- #define BROTLI_DEC_DECODE_H_
- #include <brotli/port.h>
- #include <brotli/shared_dictionary.h>
- #include <brotli/types.h>
- #if defined(__cplusplus) || defined(c_plusplus)
- extern "C" {
- #endif
- /**
- * Opaque structure that holds decoder state.
- *
- * Allocated and initialized with ::BrotliDecoderCreateInstance.
- * Cleaned up and deallocated with ::BrotliDecoderDestroyInstance.
- */
- typedef struct BrotliDecoderStateStruct BrotliDecoderState;
- /**
- * Result type for ::BrotliDecoderDecompress and
- * ::BrotliDecoderDecompressStream functions.
- */
- typedef enum {
- /** Decoding error, e.g. corrupted input or memory allocation problem. */
- BROTLI_DECODER_RESULT_ERROR = 0,
- /** Decoding successfully completed. */
- BROTLI_DECODER_RESULT_SUCCESS = 1,
- /** Partially done; should be called again with more input. */
- BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT = 2,
- /** Partially done; should be called again with more output. */
- BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT = 3
- } BrotliDecoderResult;
- /**
- * Template that evaluates items of ::BrotliDecoderErrorCode.
- *
- * Example: @code {.cpp}
- * // Log Brotli error code.
- * switch (brotliDecoderErrorCode) {
- * #define CASE_(PREFIX, NAME, CODE) \
- * case BROTLI_DECODER ## PREFIX ## NAME: \
- * LOG(INFO) << "error code:" << #NAME; \
- * break;
- * #define NEWLINE_
- * BROTLI_DECODER_ERROR_CODES_LIST(CASE_, NEWLINE_)
- * #undef CASE_
- * #undef NEWLINE_
- * default: LOG(FATAL) << "unknown brotli error code";
- * }
- * @endcode
- */
- #define BROTLI_DECODER_ERROR_CODES_LIST(BROTLI_ERROR_CODE, SEPARATOR) \
- BROTLI_ERROR_CODE(_, NO_ERROR, 0) SEPARATOR \
- /* Same as BrotliDecoderResult values */ \
- BROTLI_ERROR_CODE(_, SUCCESS, 1) SEPARATOR \
- BROTLI_ERROR_CODE(_, NEEDS_MORE_INPUT, 2) SEPARATOR \
- BROTLI_ERROR_CODE(_, NEEDS_MORE_OUTPUT, 3) SEPARATOR \
- \
- /* Errors caused by invalid input */ \
- BROTLI_ERROR_CODE(_ERROR_FORMAT_, EXUBERANT_NIBBLE, -1) SEPARATOR \
- BROTLI_ERROR_CODE(_ERROR_FORMAT_, RESERVED, -2) SEPARATOR \
- BROTLI_ERROR_CODE(_ERROR_FORMAT_, EXUBERANT_META_NIBBLE, -3) SEPARATOR \
- BROTLI_ERROR_CODE(_ERROR_FORMAT_, SIMPLE_HUFFMAN_ALPHABET, -4) SEPARATOR \
- BROTLI_ERROR_CODE(_ERROR_FORMAT_, SIMPLE_HUFFMAN_SAME, -5) SEPARATOR \
- BROTLI_ERROR_CODE(_ERROR_FORMAT_, CL_SPACE, -6) SEPARATOR \
- BROTLI_ERROR_CODE(_ERROR_FORMAT_, HUFFMAN_SPACE, -7) SEPARATOR \
- BROTLI_ERROR_CODE(_ERROR_FORMAT_, CONTEXT_MAP_REPEAT, -8) SEPARATOR \
- BROTLI_ERROR_CODE(_ERROR_FORMAT_, BLOCK_LENGTH_1, -9) SEPARATOR \
- BROTLI_ERROR_CODE(_ERROR_FORMAT_, BLOCK_LENGTH_2, -10) SEPARATOR \
- BROTLI_ERROR_CODE(_ERROR_FORMAT_, TRANSFORM, -11) SEPARATOR \
- BROTLI_ERROR_CODE(_ERROR_FORMAT_, DICTIONARY, -12) SEPARATOR \
- BROTLI_ERROR_CODE(_ERROR_FORMAT_, WINDOW_BITS, -13) SEPARATOR \
- BROTLI_ERROR_CODE(_ERROR_FORMAT_, PADDING_1, -14) SEPARATOR \
- BROTLI_ERROR_CODE(_ERROR_FORMAT_, PADDING_2, -15) SEPARATOR \
- BROTLI_ERROR_CODE(_ERROR_FORMAT_, DISTANCE, -16) SEPARATOR \
- \
- /* -17 code is reserved */ \
- \
- BROTLI_ERROR_CODE(_ERROR_, COMPOUND_DICTIONARY, -18) SEPARATOR \
- BROTLI_ERROR_CODE(_ERROR_, DICTIONARY_NOT_SET, -19) SEPARATOR \
- BROTLI_ERROR_CODE(_ERROR_, INVALID_ARGUMENTS, -20) SEPARATOR \
- \
- /* Memory allocation problems */ \
- BROTLI_ERROR_CODE(_ERROR_ALLOC_, CONTEXT_MODES, -21) SEPARATOR \
- /* Literal, insert and distance trees together */ \
- BROTLI_ERROR_CODE(_ERROR_ALLOC_, TREE_GROUPS, -22) SEPARATOR \
- /* -23..-24 codes are reserved for distinct tree groups */ \
- BROTLI_ERROR_CODE(_ERROR_ALLOC_, CONTEXT_MAP, -25) SEPARATOR \
- BROTLI_ERROR_CODE(_ERROR_ALLOC_, RING_BUFFER_1, -26) SEPARATOR \
- BROTLI_ERROR_CODE(_ERROR_ALLOC_, RING_BUFFER_2, -27) SEPARATOR \
- /* -28..-29 codes are reserved for dynamic ring-buffer allocation */ \
- BROTLI_ERROR_CODE(_ERROR_ALLOC_, BLOCK_TYPE_TREES, -30) SEPARATOR \
- \
- /* "Impossible" states */ \
- BROTLI_ERROR_CODE(_ERROR_, UNREACHABLE, -31)
- /**
- * Error code for detailed logging / production debugging.
- *
- * See ::BrotliDecoderGetErrorCode and ::BROTLI_LAST_ERROR_CODE.
- */
- typedef enum {
- #define BROTLI_COMMA_ ,
- #define BROTLI_ERROR_CODE_ENUM_ITEM_(PREFIX, NAME, CODE) \
- BROTLI_DECODER ## PREFIX ## NAME = CODE
- BROTLI_DECODER_ERROR_CODES_LIST(BROTLI_ERROR_CODE_ENUM_ITEM_, BROTLI_COMMA_)
- } BrotliDecoderErrorCode;
- #undef BROTLI_ERROR_CODE_ENUM_ITEM_
- #undef BROTLI_COMMA_
- /**
- * The value of the last error code, negative integer.
- *
- * All other error code values are in the range from ::BROTLI_LAST_ERROR_CODE
- * to @c -1. There are also 4 other possible non-error codes @c 0 .. @c 3 in
- * ::BrotliDecoderErrorCode enumeration.
- */
- #define BROTLI_LAST_ERROR_CODE BROTLI_DECODER_ERROR_UNREACHABLE
- /** Options to be used with ::BrotliDecoderSetParameter. */
- typedef enum BrotliDecoderParameter {
- /**
- * Disable "canny" ring buffer allocation strategy.
- *
- * Ring buffer is allocated according to window size, despite the real size of
- * the content.
- */
- BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION = 0,
- /**
- * Flag that determines if "Large Window Brotli" is used.
- */
- BROTLI_DECODER_PARAM_LARGE_WINDOW = 1
- } BrotliDecoderParameter;
- /**
- * Sets the specified parameter to the given decoder instance.
- *
- * @param state decoder instance
- * @param param parameter to set
- * @param value new parameter value
- * @returns ::BROTLI_FALSE if parameter is unrecognized, or value is invalid
- * @returns ::BROTLI_TRUE if value is accepted
- */
- BROTLI_DEC_API BROTLI_BOOL BrotliDecoderSetParameter(
- BrotliDecoderState* state, BrotliDecoderParameter param, uint32_t value);
- /**
- * Adds LZ77 prefix dictionary, adds or replaces built-in static dictionary and
- * transforms.
- *
- * Attached dictionary ownership is not transferred.
- * Data provided to this method should be kept accessible until
- * decoding is finished and decoder instance is destroyed.
- *
- * @note Dictionaries can NOT be attached after actual decoding is started.
- *
- * @param state decoder instance
- * @param type dictionary data format
- * @param data_size length of memory region pointed by @p data
- * @param data dictionary data in format corresponding to @p type
- * @returns ::BROTLI_FALSE if dictionary is corrupted,
- * or dictionary count limit is reached
- * @returns ::BROTLI_TRUE if dictionary is accepted / attached
- */
- BROTLI_DEC_API BROTLI_BOOL BrotliDecoderAttachDictionary(
- BrotliDecoderState* state, BrotliSharedDictionaryType type,
- size_t data_size, const uint8_t data[BROTLI_ARRAY_PARAM(data_size)]);
- /**
- * Creates an instance of ::BrotliDecoderState and initializes it.
- *
- * The instance can be used once for decoding and should then be destroyed with
- * ::BrotliDecoderDestroyInstance, it cannot be reused for a new decoding
- * session.
- *
- * @p alloc_func and @p free_func @b MUST be both zero or both non-zero. In the
- * case they are both zero, default memory allocators are used. @p opaque is
- * passed to @p alloc_func and @p free_func when they are called. @p free_func
- * has to return without doing anything when asked to free a NULL pointer.
- *
- * @param alloc_func custom memory allocation function
- * @param free_func custom memory free function
- * @param opaque custom memory manager handle
- * @returns @c 0 if instance can not be allocated or initialized
- * @returns pointer to initialized ::BrotliDecoderState otherwise
- */
- BROTLI_DEC_API BrotliDecoderState* BrotliDecoderCreateInstance(
- brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque);
- /**
- * Deinitializes and frees ::BrotliDecoderState instance.
- *
- * @param state decoder instance to be cleaned up and deallocated
- */
- BROTLI_DEC_API void BrotliDecoderDestroyInstance(BrotliDecoderState* state);
- /**
- * Performs one-shot memory-to-memory decompression.
- *
- * Decompresses the data in @p encoded_buffer into @p decoded_buffer, and sets
- * @p *decoded_size to the decompressed length.
- *
- * @param encoded_size size of @p encoded_buffer
- * @param encoded_buffer compressed data buffer with at least @p encoded_size
- * addressable bytes
- * @param[in, out] decoded_size @b in: size of @p decoded_buffer; \n
- * @b out: length of decompressed data written to
- * @p decoded_buffer
- * @param decoded_buffer decompressed data destination buffer
- * @returns ::BROTLI_DECODER_RESULT_ERROR if input is corrupted, memory
- * allocation failed, or @p decoded_buffer is not large enough;
- * @returns ::BROTLI_DECODER_RESULT_SUCCESS otherwise
- */
- BROTLI_DEC_API BrotliDecoderResult BrotliDecoderDecompress(
- size_t encoded_size,
- const uint8_t encoded_buffer[BROTLI_ARRAY_PARAM(encoded_size)],
- size_t* decoded_size,
- uint8_t decoded_buffer[BROTLI_ARRAY_PARAM(*decoded_size)]);
- /**
- * Decompresses the input stream to the output stream.
- *
- * The values @p *available_in and @p *available_out must specify the number of
- * bytes addressable at @p *next_in and @p *next_out respectively.
- * When @p *available_out is @c 0, @p next_out is allowed to be @c NULL.
- *
- * After each call, @p *available_in will be decremented by the amount of input
- * bytes consumed, and the @p *next_in pointer will be incremented by that
- * amount. Similarly, @p *available_out will be decremented by the amount of
- * output bytes written, and the @p *next_out pointer will be incremented by
- * that amount.
- *
- * @p total_out, if it is not a null-pointer, will be set to the number
- * of bytes decompressed since the last @p state initialization.
- *
- * @note Input is never overconsumed, so @p next_in and @p available_in could be
- * passed to the next consumer after decoding is complete.
- *
- * @param state decoder instance
- * @param[in, out] available_in @b in: amount of available input; \n
- * @b out: amount of unused input
- * @param[in, out] next_in pointer to the next compressed byte
- * @param[in, out] available_out @b in: length of output buffer; \n
- * @b out: remaining size of output buffer
- * @param[in, out] next_out output buffer cursor;
- * can be @c NULL if @p available_out is @c 0
- * @param[out] total_out number of bytes decompressed so far; can be @c NULL
- * @returns ::BROTLI_DECODER_RESULT_ERROR if input is corrupted, memory
- * allocation failed, arguments were invalid, etc.;
- * use ::BrotliDecoderGetErrorCode to get detailed error code
- * @returns ::BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT decoding is blocked until
- * more input data is provided
- * @returns ::BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT decoding is blocked until
- * more output space is provided
- * @returns ::BROTLI_DECODER_RESULT_SUCCESS decoding is finished, no more
- * input might be consumed and no more output will be produced
- */
- BROTLI_DEC_API BrotliDecoderResult BrotliDecoderDecompressStream(
- BrotliDecoderState* state, size_t* available_in, const uint8_t** next_in,
- size_t* available_out, uint8_t** next_out, size_t* total_out);
- /**
- * Checks if decoder has more output.
- *
- * @param state decoder instance
- * @returns ::BROTLI_TRUE, if decoder has some unconsumed output
- * @returns ::BROTLI_FALSE otherwise
- */
- BROTLI_DEC_API BROTLI_BOOL BrotliDecoderHasMoreOutput(
- const BrotliDecoderState* state);
- /**
- * Acquires pointer to internal output buffer.
- *
- * This method is used to make language bindings easier and more efficient:
- * -# push data to ::BrotliDecoderDecompressStream,
- * until ::BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT is reported
- * -# use ::BrotliDecoderTakeOutput to peek bytes and copy to language-specific
- * entity
- *
- * Also this could be useful if there is an output stream that is able to
- * consume all the provided data (e.g. when data is saved to file system).
- *
- * @attention After every call to ::BrotliDecoderTakeOutput @p *size bytes of
- * output are considered consumed for all consecutive calls to the
- * instance methods; returned pointer becomes invalidated as well.
- *
- * @note Decoder output is not guaranteed to be contiguous. This means that
- * after the size-unrestricted call to ::BrotliDecoderTakeOutput,
- * immediate next call to ::BrotliDecoderTakeOutput may return more data.
- *
- * @param state decoder instance
- * @param[in, out] size @b in: number of bytes caller is ready to take, @c 0 if
- * any amount could be handled; \n
- * @b out: amount of data pointed by returned pointer and
- * considered consumed; \n
- * out value is never greater than in value, unless it is @c 0
- * @returns pointer to output data
- */
- BROTLI_DEC_API const uint8_t* BrotliDecoderTakeOutput(
- BrotliDecoderState* state, size_t* size);
- /**
- * Checks if instance has already consumed input.
- *
- * Instance that returns ::BROTLI_FALSE is considered "fresh" and could be
- * reused.
- *
- * @param state decoder instance
- * @returns ::BROTLI_TRUE if decoder has already used some input bytes
- * @returns ::BROTLI_FALSE otherwise
- */
- BROTLI_DEC_API BROTLI_BOOL BrotliDecoderIsUsed(const BrotliDecoderState* state);
- /**
- * Checks if decoder instance reached the final state.
- *
- * @param state decoder instance
- * @returns ::BROTLI_TRUE if decoder is in a state where it reached the end of
- * the input and produced all of the output
- * @returns ::BROTLI_FALSE otherwise
- */
- BROTLI_DEC_API BROTLI_BOOL BrotliDecoderIsFinished(
- const BrotliDecoderState* state);
- /**
- * Acquires a detailed error code.
- *
- * Should be used only after ::BrotliDecoderDecompressStream returns
- * ::BROTLI_DECODER_RESULT_ERROR.
- *
- * See also ::BrotliDecoderErrorString
- *
- * @param state decoder instance
- * @returns last saved error code
- */
- BROTLI_DEC_API BrotliDecoderErrorCode BrotliDecoderGetErrorCode(
- const BrotliDecoderState* state);
- /**
- * Converts error code to a c-string.
- */
- BROTLI_DEC_API const char* BrotliDecoderErrorString(BrotliDecoderErrorCode c);
- /**
- * Gets a decoder library version.
- *
- * Look at BROTLI_MAKE_HEX_VERSION for more information.
- */
- BROTLI_DEC_API uint32_t BrotliDecoderVersion(void);
- /**
- * Callback to fire on metadata block start.
- *
- * After this callback is fired, if @p size is not @c 0, it is followed by
- * ::brotli_decoder_metadata_chunk_func as more metadata block contents become
- * accessible.
- *
- * @param opaque callback handle
- * @param size size of metadata block
- */
- typedef void (*brotli_decoder_metadata_start_func)(void* opaque, size_t size);
- /**
- * Callback to fire on metadata block chunk becomes available.
- *
- * This function can be invoked multiple times per metadata block; block should
- * be considered finished when sum of @p size matches the announced metadata
- * block size. Chunks contents pointed by @p data are transient and shouln not
- * be accessed after leaving the callback.
- *
- * @param opaque callback handle
- * @param data pointer to metadata contents
- * @param size size of metadata block chunk, at least @c 1
- */
- typedef void (*brotli_decoder_metadata_chunk_func)(void* opaque,
- const uint8_t* data,
- size_t size);
- /**
- * Sets callback for receiving metadata blocks.
- *
- * @param state decoder instance
- * @param start_func callback on metadata block start
- * @param chunk_func callback on metadata block chunk
- * @param opaque callback handle
- */
- BROTLI_DEC_API void BrotliDecoderSetMetadataCallbacks(
- BrotliDecoderState* state,
- brotli_decoder_metadata_start_func start_func,
- brotli_decoder_metadata_chunk_func chunk_func, void* opaque);
- #if defined(__cplusplus) || defined(c_plusplus)
- } /* extern "C" */
- #endif
- #endif /* BROTLI_DEC_DECODE_H_ */
|