diff --git a/src/coders/compression.cpp b/src/coders/compression.cpp index 9f7b551e..a3af09ce 100644 --- a/src/coders/compression.cpp +++ b/src/coders/compression.cpp @@ -10,6 +10,8 @@ using namespace compression; +inline constexpr float BUFFER_NOCROP_THRESOLD = 0.9; + static util::BufferPool buffer_pools[] { {255}, {UINT16_MAX}, @@ -31,15 +33,21 @@ static auto compress_rle( size_t& len, size_t(*encodefunc)(const ubyte*, size_t, ubyte*) ) { - auto buffer = get_buffer(srclen * 2); + size_t bufferSize = srclen * 2; + auto buffer = get_buffer(bufferSize); auto bytes = buffer.get(); std::unique_ptr uptr; if (bytes == nullptr) { - uptr = std::make_unique(srclen * 2); + uptr = std::make_unique(bufferSize); bytes = uptr.get(); } len = encodefunc(src, srclen, bytes); if (uptr) { + if (len < bufferSize * BUFFER_NOCROP_THRESOLD) { + auto cropped = std::make_unique(len); + std::memcpy(cropped.get(), uptr.get(), len); + return cropped; + } return uptr; } auto data = std::make_unique(len);