in src/zlibWrapper.cpp [36:86]
std::unique_ptr<uint8_t[]> compress_memory(uint8_t *raw_bytes,
const int64_t frame_mem_size_bytes, int64_t *raw_compressed_bytes_size) {
/* ZLib compresses memory and returns compressed bytes.
Args:
raw_bytes : *to memory to compress
frame_mem_size_bytes : memory size in bytes
raw_compressed_bytes_size : size in bytes of compressed bits.
Returns:
compressed memory.
*/
if (raw_bytes == NULL || frame_mem_size_bytes == 0) {
*raw_compressed_bytes_size = 0;
return NULL;
}
// Initalize ZLib
z_stream zs;
memset(&zs, 0, sizeof(zs));
deflateInit(&zs, Z_DEFAULT_COMPRESSION);
zs.next_in = reinterpret_cast<Bytef*>(raw_bytes);
zs.avail_in = frame_mem_size_bytes;
// Use fixed buffer to compress
unsigned char outbuffer[512 * 512 * 4 * 2];
zs.next_out = reinterpret_cast<Bytef*>(outbuffer);
zs.avail_out = sizeof(outbuffer);
int ret = deflate(&zs, Z_FINISH);
std::unique_ptr<uint8_t[]> raw_compressed_bytes;
// try to compress in one shot.
if (ret != Z_OK) {
raw_compressed_bytes = std::move(get_compressed_bytes(zs, outbuffer));
} else { // If larger buffer is required then build.
std::basic_string<unsigned char> mem;
mem.append(outbuffer, zs.total_out);
while (ret == Z_OK) {
zs.next_out = reinterpret_cast<Bytef*>(outbuffer);
zs.avail_out = sizeof(outbuffer);
ret = deflate(&zs, Z_FINISH);
if (zs.total_out != mem.size()) {
mem.append(outbuffer, zs.total_out - mem.size());
}
}
raw_compressed_bytes = std::move(get_compressed_bytes(zs, mem.c_str()));
}
// Set size of bits being returned
*raw_compressed_bytes_size = zs.total_out;
deflateEnd(&zs);
return std::move(raw_compressed_bytes);
}