| 62 | DecompressionStream::~DecompressionStream() { ZSTD_freeDStream(m_dStream); } |
| 63 | |
| 64 | void DecompressionStream::decompress(const char* in, size_t inLen, ByteArray& out) { |
| 65 | size_t const dOutSize = ZSTD_DStreamOutSize(); |
| 66 | ZSTD_inBuffer inBuffer = {in, inLen, 0}; |
| 67 | size_t written = out.size(); |
| 68 | out.resize(out.size() + dOutSize); |
| 69 | bool finished = false; |
| 70 | do { |
| 71 | ZSTD_outBuffer outBuffer = {out.ptr() + written, min(dOutSize, out.size() - written), 0}; |
| 72 | size_t ret = ZSTD_decompressStream(m_dStream, &outBuffer, &inBuffer); |
| 73 | if (ZSTD_isError(ret)) { |
| 74 | throw IOException(strf("ZSTD decompression error {}", ZSTD_getErrorName(ret))); |
| 75 | break; |
| 76 | } |
| 77 | |
| 78 | written += outBuffer.pos; |
| 79 | if (outBuffer.pos == outBuffer.size) { |
| 80 | if (written >= out.size()) |
| 81 | out.resize(out.size() * 2); |
| 82 | continue; |
| 83 | } |
| 84 | finished = inBuffer.pos == inBuffer.size; |
| 85 | } while (!finished); |
| 86 | out.resize(written); |
| 87 | } |
| 88 | |
| 89 | void DecompressionStream::decompress(ByteArray const& in, ByteArray& out) { |
| 90 | return decompress(in.ptr(), in.size(), out); |