1// Copyright 2013 Google Inc. All Rights Reserved. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14// 15// API for Brotli compression 16 17#ifndef BROTLI_ENC_ENCODE_H_ 18#define BROTLI_ENC_ENCODE_H_ 19 20#include <stddef.h> 21#include <stdint.h> 22#include <string> 23#include <vector> 24#include "./hash.h" 25#include "./ringbuffer.h" 26#include "./static_dict.h" 27 28namespace brotli { 29 30struct BrotliParams { 31 enum Mode { 32 MODE_TEXT = 0, 33 MODE_FONT = 1, 34 }; 35 Mode mode; 36 37 BrotliParams() : mode(MODE_TEXT) {} 38}; 39 40class BrotliCompressor { 41 public: 42 explicit BrotliCompressor(BrotliParams params); 43 ~BrotliCompressor(); 44 45 // Writes the stream header into the internal output buffer. 46 void WriteStreamHeader(); 47 48 // Encodes the data in input_buffer as a meta-block and writes it to 49 // encoded_buffer and sets *encoded_size to the number of bytes that was 50 // written. 51 void WriteMetaBlock(const size_t input_size, 52 const uint8_t* input_buffer, 53 const bool is_last, 54 size_t* encoded_size, 55 uint8_t* encoded_buffer); 56 57 // Writes a zero-length meta-block with end-of-input bit set to the 58 // internal output buffer and copies the output buffer to encoded_buffer and 59 // sets *encoded_size to the number of bytes written. 60 void FinishStream(size_t* encoded_size, uint8_t* encoded_buffer); 61 62 63 private: 64 // Initializes the hasher with the hashes of dictionary words. 65 void StoreDictionaryWordHashes(); 66 67 BrotliParams params_; 68 int window_bits_; 69 std::unique_ptr<Hashers> hashers_; 70 Hashers::Type hash_type_; 71 int dist_ringbuffer_[4]; 72 size_t dist_ringbuffer_idx_; 73 size_t input_pos_; 74 RingBuffer ringbuffer_; 75 std::vector<float> literal_cost_; 76 int storage_ix_; 77 uint8_t* storage_; 78 static StaticDictionary *static_dictionary_; 79}; 80 81// Compresses the data in input_buffer into encoded_buffer, and sets 82// *encoded_size to the compressed length. 83// Returns 0 if there was an error and 1 otherwise. 84int BrotliCompressBuffer(BrotliParams params, 85 size_t input_size, 86 const uint8_t* input_buffer, 87 size_t* encoded_size, 88 uint8_t* encoded_buffer); 89 90 91} // namespace brotli 92 93#endif // BROTLI_ENC_ENCODE_H_ 94