std::unique_ptr compress_memory()

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);
}