|
16 | 16 |
|
17 | 17 | #include "common/zstd_deps.h"
|
18 | 18 | #include "common/zstd_internal.h"
|
| 19 | +#include "compress/zstd_compress_internal.h" |
19 | 20 |
|
20 | 21 | #define ZSTD_FORWARD_IF_ERR(ret) \
|
21 | 22 | do { \
|
@@ -85,6 +86,52 @@ size_t zstd_cctx_workspace_bound(const zstd_compression_parameters *cparams)
|
85 | 86 | }
|
86 | 87 | EXPORT_SYMBOL(zstd_cctx_workspace_bound);
|
87 | 88 |
|
| 89 | +// Used by zstd_cctx_workspace_bound_with_ext_seq_prod() |
| 90 | +static size_t dummy_external_sequence_producer( |
| 91 | + void *sequenceProducerState, |
| 92 | + ZSTD_Sequence *outSeqs, size_t outSeqsCapacity, |
| 93 | + const void *src, size_t srcSize, |
| 94 | + const void *dict, size_t dictSize, |
| 95 | + int compressionLevel, |
| 96 | + size_t windowSize) |
| 97 | +{ |
| 98 | + (void)sequenceProducerState; |
| 99 | + (void)outSeqs; (void)outSeqsCapacity; |
| 100 | + (void)src; (void)srcSize; |
| 101 | + (void)dict; (void)dictSize; |
| 102 | + (void)compressionLevel; |
| 103 | + (void)windowSize; |
| 104 | + return ZSTD_SEQUENCE_PRODUCER_ERROR; |
| 105 | +} |
| 106 | + |
| 107 | +static void init_cctx_params_from_compress_params( |
| 108 | + ZSTD_CCtx_params *cctx_params, |
| 109 | + const zstd_compression_parameters *compress_params) |
| 110 | +{ |
| 111 | + ZSTD_parameters zstd_params; |
| 112 | + memset(&zstd_params, 0, sizeof(zstd_params)); |
| 113 | + zstd_params.cParams = *compress_params; |
| 114 | + ZSTD_CCtxParams_init_advanced(&cctx_params, zstd_params); |
| 115 | +} |
| 116 | + |
| 117 | +size_t zstd_cctx_workspace_bound_with_ext_seq_prod(const zstd_compression_parameters *compress_params) |
| 118 | +{ |
| 119 | + ZSTD_CCtx_params cctx_params; |
| 120 | + init_cctx_params_from_compress_params(&cctx_params, compress_params); |
| 121 | + ZSTD_CCtxParams_registerSequenceProducer(&cctx_params, NULL, dummy_external_sequence_producer); |
| 122 | + return ZSTD_estimateCCtxSize_usingCCtxParams(&cctx_params); |
| 123 | +} |
| 124 | +EXPORT_SYMBOL(zstd_cctx_workspace_bound_with_ext_seq_prod); |
| 125 | + |
| 126 | +size_t zstd_cstream_workspace_bound_with_ext_seq_prod(const zstd_compression_parameters *compress_params) |
| 127 | +{ |
| 128 | + ZSTD_CCtx_params cctx_params; |
| 129 | + init_cctx_params_from_compress_params(&cctx_params, compress_params); |
| 130 | + ZSTD_CCtxParams_registerSequenceProducer(&cctx_params, NULL, dummy_external_sequence_producer); |
| 131 | + return ZSTD_estimateCStreamSize_usingCCtxParams(&cctx_params); |
| 132 | +} |
| 133 | +EXPORT_SYMBOL(zstd_cstream_workspace_bound_with_ext_seq_prod); |
| 134 | + |
88 | 135 | zstd_cctx *zstd_init_cctx(void *workspace, size_t workspace_size)
|
89 | 136 | {
|
90 | 137 | if (workspace == NULL)
|
@@ -160,5 +207,14 @@ size_t zstd_end_stream(zstd_cstream *cstream, zstd_out_buffer *output)
|
160 | 207 | }
|
161 | 208 | EXPORT_SYMBOL(zstd_end_stream);
|
162 | 209 |
|
| 210 | +void zstd_register_sequence_producer( |
| 211 | + zstd_cctx *cctx, |
| 212 | + void* sequence_producer_state, |
| 213 | + zstd_sequence_producer_f sequence_producer |
| 214 | +) { |
| 215 | + ZSTD_registerSequenceProducer(cctx, sequence_producer_state, sequence_producer); |
| 216 | +} |
| 217 | +EXPORT_SYMBOL(zstd_register_sequence_producer); |
| 218 | + |
163 | 219 | MODULE_LICENSE("Dual BSD/GPL");
|
164 | 220 | MODULE_DESCRIPTION("Zstd Compressor");
|
0 commit comments