5 #include "wimlib/error.h"
6 #include "wimlib/compressor_ops.h"
7 #include "wimlib/util.h"
11 struct zstd_compressor {
12 unsigned compression_level;
17 zstd_get_needed_memory(size_t max_bufsize, unsigned compression_level,
20 return sizeof(struct zstd_compressor);
24 zstd_create_compressor(size_t max_bufsize, unsigned compression_level,
25 bool destructive, void **c_ret)
27 struct zstd_compressor *c;
29 c = MALLOC(sizeof(*c));
33 c->cctx = ZSTD_createCCtx();
37 c->compression_level = compression_level / 5;
38 c->compression_level = max(c->compression_level, 1);
39 c->compression_level = min(c->compression_level, ZSTD_maxCLevel());
46 return WIMLIB_ERR_NOMEM;
50 zstd_compress(const void *in, size_t in_nbytes,
51 void *out, size_t out_nbytes_avail, void *_c)
53 struct zstd_compressor *c = _c;
56 res = ZSTD_compressCCtx(c->cctx, out, out_nbytes_avail, in, in_nbytes,
57 c->compression_level);
59 if (ZSTD_isError(res))
65 zstd_free_compressor(void *_c)
67 struct zstd_compressor *c = _c;
73 const struct compressor_ops zstd_compressor_ops = {
74 .get_needed_memory = zstd_get_needed_memory,
75 .create_compressor = zstd_create_compressor,
76 .compress = zstd_compress,
77 .free_compressor = zstd_free_compressor,