| /* Copyright 2022 Google Inc. All Rights Reserved. | |
| Distributed under MIT license. | |
| See file LICENSE for detail or copy at https://opensource.org/licenses/MIT | |
| */ | |
| /* Encoder state. */ | |
| #ifndef BROTLI_ENC_STATE_H_ | |
| #define BROTLI_ENC_STATE_H_ | |
| #include "../common/constants.h" | |
| #include "../common/platform.h" | |
| #include "command.h" | |
| #include "compress_fragment.h" | |
| #include "compress_fragment_two_pass.h" | |
| #include "hash.h" | |
| #include "memory.h" | |
| #include "params.h" | |
| #include "ringbuffer.h" | |
| typedef enum BrotliEncoderStreamState { | |
| /* Default state. */ | |
| BROTLI_STREAM_PROCESSING = 0, | |
| /* Intermediate state; after next block is emitted, byte-padding should be | |
| performed before getting back to default state. */ | |
| BROTLI_STREAM_FLUSH_REQUESTED = 1, | |
| /* Last metablock was produced; no more input is acceptable. */ | |
| BROTLI_STREAM_FINISHED = 2, | |
| /* Flushing compressed block and writing meta-data block header. */ | |
| BROTLI_STREAM_METADATA_HEAD = 3, | |
| /* Writing metadata block body. */ | |
| BROTLI_STREAM_METADATA_BODY = 4 | |
| } BrotliEncoderStreamState; | |
| typedef enum BrotliEncoderFlintState { | |
| BROTLI_FLINT_NEEDS_2_BYTES = 2, | |
| BROTLI_FLINT_NEEDS_1_BYTE = 1, | |
| BROTLI_FLINT_WAITING_FOR_PROCESSING = 0, | |
| BROTLI_FLINT_WAITING_FOR_FLUSHING = -1, | |
| BROTLI_FLINT_DONE = -2 | |
| } BrotliEncoderFlintState; | |
| typedef struct BrotliEncoderStateStruct { | |
| BrotliEncoderParams params; | |
| MemoryManager memory_manager_; | |
| uint64_t input_pos_; | |
| RingBuffer ringbuffer_; | |
| size_t cmd_alloc_size_; | |
| Command* commands_; | |
| size_t num_commands_; | |
| size_t num_literals_; | |
| size_t last_insert_len_; | |
| uint64_t last_flush_pos_; | |
| uint64_t last_processed_pos_; | |
| int dist_cache_[BROTLI_NUM_DISTANCE_SHORT_CODES]; | |
| int saved_dist_cache_[4]; | |
| uint16_t last_bytes_; | |
| uint8_t last_bytes_bits_; | |
| /* "Flint" is a tiny uncompressed block emitted before the continuation | |
| block to unwire literal context from previous data. Despite being int8_t, | |
| field is actually BrotliEncoderFlintState enum. */ | |
| int8_t flint_; | |
| uint8_t prev_byte_; | |
| uint8_t prev_byte2_; | |
| size_t storage_size_; | |
| uint8_t* storage_; | |
| Hasher hasher_; | |
| /* Hash table for FAST_ONE_PASS_COMPRESSION_QUALITY mode. */ | |
| int small_table_[1 << 10]; /* 4KiB */ | |
| int* large_table_; /* Allocated only when needed */ | |
| size_t large_table_size_; | |
| BrotliOnePassArena* one_pass_arena_; | |
| BrotliTwoPassArena* two_pass_arena_; | |
| /* Command and literal buffers for FAST_TWO_PASS_COMPRESSION_QUALITY. */ | |
| uint32_t* command_buf_; | |
| uint8_t* literal_buf_; | |
| uint64_t total_in_; | |
| uint8_t* next_out_; | |
| size_t available_out_; | |
| uint64_t total_out_; | |
| /* Temporary buffer for padding flush bits or metadata block header / body. */ | |
| union { | |
| uint64_t u64[2]; | |
| uint8_t u8[16]; | |
| } tiny_buf_; | |
| uint32_t remaining_metadata_bytes_; | |
| BrotliEncoderStreamState stream_state_; | |
| BROTLI_BOOL is_last_block_emitted_; | |
| BROTLI_BOOL is_initialized_; | |
| } BrotliEncoderStateStruct; | |
| typedef struct BrotliEncoderStateStruct BrotliEncoderStateInternal; | |
| #define BrotliEncoderState BrotliEncoderStateInternal | |
| #endif // BROTLI_ENC_STATE_H_ |