Reuse allocations for decompression

This commit is contained in:
sfan5
2025-03-05 22:02:16 +01:00
parent 3c08380d18
commit 0a56b18cfb
6 changed files with 23 additions and 33 deletions

View File

@ -21,18 +21,13 @@ void ZstdDecompressor::setData(const u8 *data, size_t size, size_t seekPos)
m_size = size;
}
std::size_t ZstdDecompressor::seekPos() const
{
return m_seekPos;
}
ustring ZstdDecompressor::decompress()
void ZstdDecompressor::decompress(ustring &buffer)
{
ZSTD_DStream *stream = reinterpret_cast<ZSTD_DStream*>(m_stream);
ZSTD_inBuffer inbuf = { m_data, m_size, m_seekPos };
ustring buffer;
constexpr size_t BUFSIZE = 32 * 1024;
// output space is extended in chunks of this size
constexpr size_t BUFSIZE = 8 * 1024;
buffer.resize(BUFSIZE);
ZSTD_outBuffer outbuf = { &buffer[0], buffer.size(), 0 };
@ -42,17 +37,15 @@ ustring ZstdDecompressor::decompress()
size_t ret;
do {
ret = ZSTD_decompressStream(stream, &outbuf, &inbuf);
if (ret && ZSTD_isError(ret))
throw DecompressError();
if (outbuf.size == outbuf.pos) {
outbuf.size += BUFSIZE;
buffer.resize(outbuf.size);
outbuf.dst = &buffer[0];
}
if (ret && ZSTD_isError(ret))
throw DecompressError();
} while (ret != 0);
m_seekPos = inbuf.pos;
buffer.resize(outbuf.pos);
return buffer;
}