| 65 | } |
| 66 | |
| 67 | int64_t StreamingCompress(Codec* codec, const std::vector<uint8_t>& data, |
| 68 | std::vector<uint8_t>* compressed_data = nullptr) { |
| 69 | if (compressed_data != nullptr) { |
| 70 | compressed_data->clear(); |
| 71 | compressed_data->shrink_to_fit(); |
| 72 | } |
| 73 | auto compressor = *codec->MakeCompressor(); |
| 74 | |
| 75 | const uint8_t* input = data.data(); |
| 76 | int64_t input_len = data.size(); |
| 77 | int64_t compressed_size = 0; |
| 78 | |
| 79 | std::vector<uint8_t> output_buffer(1 << 20); // 1 MB |
| 80 | |
| 81 | while (input_len > 0) { |
| 82 | auto result = *compressor->Compress(input_len, input, output_buffer.size(), |
| 83 | output_buffer.data()); |
| 84 | input += result.bytes_read; |
| 85 | input_len -= result.bytes_read; |
| 86 | compressed_size += result.bytes_written; |
| 87 | if (compressed_data != nullptr && result.bytes_written > 0) { |
| 88 | compressed_data->resize(compressed_data->size() + result.bytes_written); |
| 89 | memcpy(compressed_data->data() + compressed_data->size() - result.bytes_written, |
| 90 | output_buffer.data(), result.bytes_written); |
| 91 | } |
| 92 | if (result.bytes_read == 0) { |
| 93 | // Need to enlarge output buffer |
| 94 | output_buffer.resize(output_buffer.size() * 2); |
| 95 | } |
| 96 | } |
| 97 | while (true) { |
| 98 | auto result = *compressor->End(output_buffer.size(), output_buffer.data()); |
| 99 | compressed_size += result.bytes_written; |
| 100 | if (compressed_data != nullptr && result.bytes_written > 0) { |
| 101 | compressed_data->resize(compressed_data->size() + result.bytes_written); |
| 102 | memcpy(compressed_data->data() + compressed_data->size() - result.bytes_written, |
| 103 | output_buffer.data(), result.bytes_written); |
| 104 | } |
| 105 | if (result.should_retry) { |
| 106 | // Need to enlarge output buffer |
| 107 | output_buffer.resize(output_buffer.size() * 2); |
| 108 | } else { |
| 109 | break; |
| 110 | } |
| 111 | } |
| 112 | return compressed_size; |
| 113 | } |
| 114 | |
| 115 | static void StreamingCompression(Compression::type compression, |
| 116 | const std::vector<uint8_t>& data, |