1a28cd43dSSascha Wildner /* 2a28cd43dSSascha Wildner * Copyright (c) 2016-2020, Yann Collet, Facebook, Inc. 3a28cd43dSSascha Wildner * All rights reserved. 4a28cd43dSSascha Wildner * 5a28cd43dSSascha Wildner * This source code is licensed under both the BSD-style license (found in the 6a28cd43dSSascha Wildner * LICENSE file in the root directory of this source tree) and the GPLv2 (found 7a28cd43dSSascha Wildner * in the COPYING file in the root directory of this source tree). 8a28cd43dSSascha Wildner * You may select, at your option, one of the above-listed licenses. 9a28cd43dSSascha Wildner */ 10a28cd43dSSascha Wildner #if defined (__cplusplus) 11a28cd43dSSascha Wildner extern "C" { 12a28cd43dSSascha Wildner #endif 13a28cd43dSSascha Wildner 14a28cd43dSSascha Wildner #ifndef ZSTD_H_235446 15a28cd43dSSascha Wildner #define ZSTD_H_235446 16a28cd43dSSascha Wildner 17a28cd43dSSascha Wildner /* ====== Dependency ======*/ 18a28cd43dSSascha Wildner #include <limits.h> /* INT_MAX */ 19a28cd43dSSascha Wildner #include <stddef.h> /* size_t */ 20a28cd43dSSascha Wildner 21a28cd43dSSascha Wildner 22a28cd43dSSascha Wildner /* ===== ZSTDLIB_API : control library symbols visibility ===== */ 23a28cd43dSSascha Wildner #ifndef ZSTDLIB_VISIBILITY 24a28cd43dSSascha Wildner # if defined(__GNUC__) && (__GNUC__ >= 4) 25a28cd43dSSascha Wildner # define ZSTDLIB_VISIBILITY __attribute__ ((visibility ("default"))) 26a28cd43dSSascha Wildner # else 27a28cd43dSSascha Wildner # define ZSTDLIB_VISIBILITY 28a28cd43dSSascha Wildner # endif 29a28cd43dSSascha Wildner #endif 30a28cd43dSSascha Wildner #if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1) 31a28cd43dSSascha Wildner # define ZSTDLIB_API __declspec(dllexport) ZSTDLIB_VISIBILITY 32a28cd43dSSascha Wildner #elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1) 33a28cd43dSSascha Wildner # define ZSTDLIB_API __declspec(dllimport) ZSTDLIB_VISIBILITY /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ 34a28cd43dSSascha Wildner #else 35a28cd43dSSascha Wildner # define ZSTDLIB_API ZSTDLIB_VISIBILITY 36a28cd43dSSascha Wildner #endif 37a28cd43dSSascha Wildner 38a28cd43dSSascha Wildner 39a28cd43dSSascha Wildner /******************************************************************************* 40a28cd43dSSascha Wildner Introduction 41a28cd43dSSascha Wildner 42a28cd43dSSascha Wildner zstd, short for Zstandard, is a fast lossless compression algorithm, targeting 43a28cd43dSSascha Wildner real-time compression scenarios at zlib-level and better compression ratios. 44a28cd43dSSascha Wildner The zstd compression library provides in-memory compression and decompression 45a28cd43dSSascha Wildner functions. 46a28cd43dSSascha Wildner 47a28cd43dSSascha Wildner The library supports regular compression levels from 1 up to ZSTD_maxCLevel(), 48a28cd43dSSascha Wildner which is currently 22. Levels >= 20, labeled `--ultra`, should be used with 49a28cd43dSSascha Wildner caution, as they require more memory. The library also offers negative 50a28cd43dSSascha Wildner compression levels, which extend the range of speed vs. ratio preferences. 51a28cd43dSSascha Wildner The lower the level, the faster the speed (at the cost of compression). 52a28cd43dSSascha Wildner 53a28cd43dSSascha Wildner Compression can be done in: 54a28cd43dSSascha Wildner - a single step (described as Simple API) 55a28cd43dSSascha Wildner - a single step, reusing a context (described as Explicit context) 56a28cd43dSSascha Wildner - unbounded multiple steps (described as Streaming compression) 57a28cd43dSSascha Wildner 58a28cd43dSSascha Wildner The compression ratio achievable on small data can be highly improved using 59a28cd43dSSascha Wildner a dictionary. Dictionary compression can be performed in: 60a28cd43dSSascha Wildner - a single step (described as Simple dictionary API) 61a28cd43dSSascha Wildner - a single step, reusing a dictionary (described as Bulk-processing 62a28cd43dSSascha Wildner dictionary API) 63a28cd43dSSascha Wildner 64a28cd43dSSascha Wildner Advanced experimental functions can be accessed using 65a28cd43dSSascha Wildner `#define ZSTD_STATIC_LINKING_ONLY` before including zstd.h. 66a28cd43dSSascha Wildner 67a28cd43dSSascha Wildner Advanced experimental APIs should never be used with a dynamically-linked 68a28cd43dSSascha Wildner library. They are not "stable"; their definitions or signatures may change in 69a28cd43dSSascha Wildner the future. Only static linking is allowed. 70a28cd43dSSascha Wildner *******************************************************************************/ 71a28cd43dSSascha Wildner 72a28cd43dSSascha Wildner /*------ Version ------*/ 73a28cd43dSSascha Wildner #define ZSTD_VERSION_MAJOR 1 74a28cd43dSSascha Wildner #define ZSTD_VERSION_MINOR 4 75a28cd43dSSascha Wildner #define ZSTD_VERSION_RELEASE 8 76a28cd43dSSascha Wildner #define ZSTD_VERSION_NUMBER (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE) 77a28cd43dSSascha Wildner 78a28cd43dSSascha Wildner /*! ZSTD_versionNumber() : 79a28cd43dSSascha Wildner * Return runtime library version, the value is (MAJOR*100*100 + MINOR*100 + RELEASE). */ 80a28cd43dSSascha Wildner ZSTDLIB_API unsigned ZSTD_versionNumber(void); 81a28cd43dSSascha Wildner 82a28cd43dSSascha Wildner #define ZSTD_LIB_VERSION ZSTD_VERSION_MAJOR.ZSTD_VERSION_MINOR.ZSTD_VERSION_RELEASE 83a28cd43dSSascha Wildner #define ZSTD_QUOTE(str) #str 84a28cd43dSSascha Wildner #define ZSTD_EXPAND_AND_QUOTE(str) ZSTD_QUOTE(str) 85a28cd43dSSascha Wildner #define ZSTD_VERSION_STRING ZSTD_EXPAND_AND_QUOTE(ZSTD_LIB_VERSION) 86a28cd43dSSascha Wildner 87a28cd43dSSascha Wildner /*! ZSTD_versionString() : 88a28cd43dSSascha Wildner * Return runtime library version, like "1.4.5". Requires v1.3.0+. */ 89a28cd43dSSascha Wildner ZSTDLIB_API const char* ZSTD_versionString(void); 90a28cd43dSSascha Wildner 91a28cd43dSSascha Wildner /* ************************************* 92a28cd43dSSascha Wildner * Default constant 93a28cd43dSSascha Wildner ***************************************/ 94a28cd43dSSascha Wildner #ifndef ZSTD_CLEVEL_DEFAULT 95a28cd43dSSascha Wildner # define ZSTD_CLEVEL_DEFAULT 3 96a28cd43dSSascha Wildner #endif 97a28cd43dSSascha Wildner 98a28cd43dSSascha Wildner /* ************************************* 99a28cd43dSSascha Wildner * Constants 100a28cd43dSSascha Wildner ***************************************/ 101a28cd43dSSascha Wildner 102a28cd43dSSascha Wildner /* All magic numbers are supposed read/written to/from files/memory using little-endian convention */ 103a28cd43dSSascha Wildner #define ZSTD_MAGICNUMBER 0xFD2FB528 /* valid since v0.8.0 */ 104a28cd43dSSascha Wildner #define ZSTD_MAGIC_DICTIONARY 0xEC30A437 /* valid since v0.7.0 */ 105a28cd43dSSascha Wildner #define ZSTD_MAGIC_SKIPPABLE_START 0x184D2A50 /* all 16 values, from 0x184D2A50 to 0x184D2A5F, signal the beginning of a skippable frame */ 106a28cd43dSSascha Wildner #define ZSTD_MAGIC_SKIPPABLE_MASK 0xFFFFFFF0 107a28cd43dSSascha Wildner 108a28cd43dSSascha Wildner #define ZSTD_BLOCKSIZELOG_MAX 17 109a28cd43dSSascha Wildner #define ZSTD_BLOCKSIZE_MAX (1<<ZSTD_BLOCKSIZELOG_MAX) 110a28cd43dSSascha Wildner 111a28cd43dSSascha Wildner 112a28cd43dSSascha Wildner 113a28cd43dSSascha Wildner /*************************************** 114a28cd43dSSascha Wildner * Simple API 115a28cd43dSSascha Wildner ***************************************/ 116a28cd43dSSascha Wildner /*! ZSTD_compress() : 117a28cd43dSSascha Wildner * Compresses `src` content as a single zstd compressed frame into already allocated `dst`. 118a28cd43dSSascha Wildner * Hint : compression runs faster if `dstCapacity` >= `ZSTD_compressBound(srcSize)`. 119a28cd43dSSascha Wildner * @return : compressed size written into `dst` (<= `dstCapacity), 120a28cd43dSSascha Wildner * or an error code if it fails (which can be tested using ZSTD_isError()). */ 121a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compress( void* dst, size_t dstCapacity, 122a28cd43dSSascha Wildner const void* src, size_t srcSize, 123a28cd43dSSascha Wildner int compressionLevel); 124a28cd43dSSascha Wildner 125a28cd43dSSascha Wildner /*! ZSTD_decompress() : 126a28cd43dSSascha Wildner * `compressedSize` : must be the _exact_ size of some number of compressed and/or skippable frames. 127a28cd43dSSascha Wildner * `dstCapacity` is an upper bound of originalSize to regenerate. 128a28cd43dSSascha Wildner * If user cannot imply a maximum upper bound, it's better to use streaming mode to decompress data. 129a28cd43dSSascha Wildner * @return : the number of bytes decompressed into `dst` (<= `dstCapacity`), 130a28cd43dSSascha Wildner * or an errorCode if it fails (which can be tested using ZSTD_isError()). */ 131a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decompress( void* dst, size_t dstCapacity, 132a28cd43dSSascha Wildner const void* src, size_t compressedSize); 133a28cd43dSSascha Wildner 134a28cd43dSSascha Wildner /*! ZSTD_getFrameContentSize() : requires v1.3.0+ 135a28cd43dSSascha Wildner * `src` should point to the start of a ZSTD encoded frame. 136a28cd43dSSascha Wildner * `srcSize` must be at least as large as the frame header. 137a28cd43dSSascha Wildner * hint : any size >= `ZSTD_frameHeaderSize_max` is large enough. 138a28cd43dSSascha Wildner * @return : - decompressed size of `src` frame content, if known 139a28cd43dSSascha Wildner * - ZSTD_CONTENTSIZE_UNKNOWN if the size cannot be determined 140a28cd43dSSascha Wildner * - ZSTD_CONTENTSIZE_ERROR if an error occurred (e.g. invalid magic number, srcSize too small) 141a28cd43dSSascha Wildner * note 1 : a 0 return value means the frame is valid but "empty". 142a28cd43dSSascha Wildner * note 2 : decompressed size is an optional field, it may not be present, typically in streaming mode. 143a28cd43dSSascha Wildner * When `return==ZSTD_CONTENTSIZE_UNKNOWN`, data to decompress could be any size. 144a28cd43dSSascha Wildner * In which case, it's necessary to use streaming mode to decompress data. 145a28cd43dSSascha Wildner * Optionally, application can rely on some implicit limit, 146a28cd43dSSascha Wildner * as ZSTD_decompress() only needs an upper bound of decompressed size. 147a28cd43dSSascha Wildner * (For example, data could be necessarily cut into blocks <= 16 KB). 148a28cd43dSSascha Wildner * note 3 : decompressed size is always present when compression is completed using single-pass functions, 149a28cd43dSSascha Wildner * such as ZSTD_compress(), ZSTD_compressCCtx() ZSTD_compress_usingDict() or ZSTD_compress_usingCDict(). 150a28cd43dSSascha Wildner * note 4 : decompressed size can be very large (64-bits value), 151a28cd43dSSascha Wildner * potentially larger than what local system can handle as a single memory segment. 152a28cd43dSSascha Wildner * In which case, it's necessary to use streaming mode to decompress data. 153a28cd43dSSascha Wildner * note 5 : If source is untrusted, decompressed size could be wrong or intentionally modified. 154a28cd43dSSascha Wildner * Always ensure return value fits within application's authorized limits. 155a28cd43dSSascha Wildner * Each application can set its own limits. 156a28cd43dSSascha Wildner * note 6 : This function replaces ZSTD_getDecompressedSize() */ 157a28cd43dSSascha Wildner #define ZSTD_CONTENTSIZE_UNKNOWN (0ULL - 1) 158a28cd43dSSascha Wildner #define ZSTD_CONTENTSIZE_ERROR (0ULL - 2) 159a28cd43dSSascha Wildner ZSTDLIB_API unsigned long long ZSTD_getFrameContentSize(const void *src, size_t srcSize); 160a28cd43dSSascha Wildner 161a28cd43dSSascha Wildner /*! ZSTD_getDecompressedSize() : 162a28cd43dSSascha Wildner * NOTE: This function is now obsolete, in favor of ZSTD_getFrameContentSize(). 163a28cd43dSSascha Wildner * Both functions work the same way, but ZSTD_getDecompressedSize() blends 164a28cd43dSSascha Wildner * "empty", "unknown" and "error" results to the same return value (0), 165a28cd43dSSascha Wildner * while ZSTD_getFrameContentSize() gives them separate return values. 166a28cd43dSSascha Wildner * @return : decompressed size of `src` frame content _if known and not empty_, 0 otherwise. */ 167a28cd43dSSascha Wildner ZSTDLIB_API unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize); 168a28cd43dSSascha Wildner 169a28cd43dSSascha Wildner /*! ZSTD_findFrameCompressedSize() : 170a28cd43dSSascha Wildner * `src` should point to the start of a ZSTD frame or skippable frame. 171a28cd43dSSascha Wildner * `srcSize` must be >= first frame size 172a28cd43dSSascha Wildner * @return : the compressed size of the first frame starting at `src`, 173a28cd43dSSascha Wildner * suitable to pass as `srcSize` to `ZSTD_decompress` or similar, 174a28cd43dSSascha Wildner * or an error code if input is invalid */ 175a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize); 176a28cd43dSSascha Wildner 177a28cd43dSSascha Wildner 178a28cd43dSSascha Wildner /*====== Helper functions ======*/ 179a28cd43dSSascha Wildner #define ZSTD_COMPRESSBOUND(srcSize) ((srcSize) + ((srcSize)>>8) + (((srcSize) < (128<<10)) ? (((128<<10) - (srcSize)) >> 11) /* margin, from 64 to 0 */ : 0)) /* this formula ensures that bound(A) + bound(B) <= bound(A+B) as long as A and B >= 128 KB */ 180a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case single-pass scenario */ 181a28cd43dSSascha Wildner ZSTDLIB_API unsigned ZSTD_isError(size_t code); /*!< tells if a `size_t` function result is an error code */ 182a28cd43dSSascha Wildner ZSTDLIB_API const char* ZSTD_getErrorName(size_t code); /*!< provides readable string from an error code */ 183a28cd43dSSascha Wildner ZSTDLIB_API int ZSTD_minCLevel(void); /*!< minimum negative compression level allowed */ 184a28cd43dSSascha Wildner ZSTDLIB_API int ZSTD_maxCLevel(void); /*!< maximum compression level available */ 185a28cd43dSSascha Wildner 186a28cd43dSSascha Wildner 187a28cd43dSSascha Wildner /*************************************** 188a28cd43dSSascha Wildner * Explicit context 189a28cd43dSSascha Wildner ***************************************/ 190a28cd43dSSascha Wildner /*= Compression context 191a28cd43dSSascha Wildner * When compressing many times, 192a28cd43dSSascha Wildner * it is recommended to allocate a context just once, 193a28cd43dSSascha Wildner * and re-use it for each successive compression operation. 194a28cd43dSSascha Wildner * This will make workload friendlier for system's memory. 195a28cd43dSSascha Wildner * Note : re-using context is just a speed / resource optimization. 196a28cd43dSSascha Wildner * It doesn't change the compression ratio, which remains identical. 197a28cd43dSSascha Wildner * Note 2 : In multi-threaded environments, 198a28cd43dSSascha Wildner * use one different context per thread for parallel execution. 199a28cd43dSSascha Wildner */ 200a28cd43dSSascha Wildner typedef struct ZSTD_CCtx_s ZSTD_CCtx; 201a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_CCtx* ZSTD_createCCtx(void); 202a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx); 203a28cd43dSSascha Wildner 204a28cd43dSSascha Wildner /*! ZSTD_compressCCtx() : 205a28cd43dSSascha Wildner * Same as ZSTD_compress(), using an explicit ZSTD_CCtx. 206a28cd43dSSascha Wildner * Important : in order to behave similarly to `ZSTD_compress()`, 207a28cd43dSSascha Wildner * this function compresses at requested compression level, 208a28cd43dSSascha Wildner * __ignoring any other parameter__ . 209a28cd43dSSascha Wildner * If any advanced parameter was set using the advanced API, 210a28cd43dSSascha Wildner * they will all be reset. Only `compressionLevel` remains. 211a28cd43dSSascha Wildner */ 212a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressCCtx(ZSTD_CCtx* cctx, 213a28cd43dSSascha Wildner void* dst, size_t dstCapacity, 214a28cd43dSSascha Wildner const void* src, size_t srcSize, 215a28cd43dSSascha Wildner int compressionLevel); 216a28cd43dSSascha Wildner 217a28cd43dSSascha Wildner /*= Decompression context 218a28cd43dSSascha Wildner * When decompressing many times, 219a28cd43dSSascha Wildner * it is recommended to allocate a context only once, 220a28cd43dSSascha Wildner * and re-use it for each successive compression operation. 221a28cd43dSSascha Wildner * This will make workload friendlier for system's memory. 222a28cd43dSSascha Wildner * Use one context per thread for parallel execution. */ 223a28cd43dSSascha Wildner typedef struct ZSTD_DCtx_s ZSTD_DCtx; 224a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_DCtx* ZSTD_createDCtx(void); 225a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx); 226a28cd43dSSascha Wildner 227a28cd43dSSascha Wildner /*! ZSTD_decompressDCtx() : 228a28cd43dSSascha Wildner * Same as ZSTD_decompress(), 229a28cd43dSSascha Wildner * requires an allocated ZSTD_DCtx. 230a28cd43dSSascha Wildner * Compatible with sticky parameters. 231a28cd43dSSascha Wildner */ 232a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decompressDCtx(ZSTD_DCtx* dctx, 233a28cd43dSSascha Wildner void* dst, size_t dstCapacity, 234a28cd43dSSascha Wildner const void* src, size_t srcSize); 235a28cd43dSSascha Wildner 236a28cd43dSSascha Wildner 237a28cd43dSSascha Wildner /*************************************** 238a28cd43dSSascha Wildner * Advanced compression API 239a28cd43dSSascha Wildner ***************************************/ 240a28cd43dSSascha Wildner 241a28cd43dSSascha Wildner /* API design : 242a28cd43dSSascha Wildner * Parameters are pushed one by one into an existing context, 243a28cd43dSSascha Wildner * using ZSTD_CCtx_set*() functions. 244a28cd43dSSascha Wildner * Pushed parameters are sticky : they are valid for next compressed frame, and any subsequent frame. 245a28cd43dSSascha Wildner * "sticky" parameters are applicable to `ZSTD_compress2()` and `ZSTD_compressStream*()` ! 246a28cd43dSSascha Wildner * __They do not apply to "simple" one-shot variants such as ZSTD_compressCCtx()__ . 247a28cd43dSSascha Wildner * 248a28cd43dSSascha Wildner * It's possible to reset all parameters to "default" using ZSTD_CCtx_reset(). 249a28cd43dSSascha Wildner * 250a28cd43dSSascha Wildner * This API supercedes all other "advanced" API entry points in the experimental section. 251a28cd43dSSascha Wildner * In the future, we expect to remove from experimental API entry points which are redundant with this API. 252a28cd43dSSascha Wildner */ 253a28cd43dSSascha Wildner 254a28cd43dSSascha Wildner 255a28cd43dSSascha Wildner /* Compression strategies, listed from fastest to strongest */ 256a28cd43dSSascha Wildner typedef enum { ZSTD_fast=1, 257a28cd43dSSascha Wildner ZSTD_dfast=2, 258a28cd43dSSascha Wildner ZSTD_greedy=3, 259a28cd43dSSascha Wildner ZSTD_lazy=4, 260a28cd43dSSascha Wildner ZSTD_lazy2=5, 261a28cd43dSSascha Wildner ZSTD_btlazy2=6, 262a28cd43dSSascha Wildner ZSTD_btopt=7, 263a28cd43dSSascha Wildner ZSTD_btultra=8, 264a28cd43dSSascha Wildner ZSTD_btultra2=9 265a28cd43dSSascha Wildner /* note : new strategies _might_ be added in the future. 266a28cd43dSSascha Wildner Only the order (from fast to strong) is guaranteed */ 267a28cd43dSSascha Wildner } ZSTD_strategy; 268a28cd43dSSascha Wildner 269a28cd43dSSascha Wildner 270a28cd43dSSascha Wildner typedef enum { 271a28cd43dSSascha Wildner 272a28cd43dSSascha Wildner /* compression parameters 273a28cd43dSSascha Wildner * Note: When compressing with a ZSTD_CDict these parameters are superseded 274a28cd43dSSascha Wildner * by the parameters used to construct the ZSTD_CDict. 275a28cd43dSSascha Wildner * See ZSTD_CCtx_refCDict() for more info (superseded-by-cdict). */ 276a28cd43dSSascha Wildner ZSTD_c_compressionLevel=100, /* Set compression parameters according to pre-defined cLevel table. 277a28cd43dSSascha Wildner * Note that exact compression parameters are dynamically determined, 278a28cd43dSSascha Wildner * depending on both compression level and srcSize (when known). 279a28cd43dSSascha Wildner * Default level is ZSTD_CLEVEL_DEFAULT==3. 280a28cd43dSSascha Wildner * Special: value 0 means default, which is controlled by ZSTD_CLEVEL_DEFAULT. 281a28cd43dSSascha Wildner * Note 1 : it's possible to pass a negative compression level. 282a28cd43dSSascha Wildner * Note 2 : setting a level does not automatically set all other compression parameters 283a28cd43dSSascha Wildner * to default. Setting this will however eventually dynamically impact the compression 284a28cd43dSSascha Wildner * parameters which have not been manually set. The manually set 285a28cd43dSSascha Wildner * ones will 'stick'. */ 286a28cd43dSSascha Wildner /* Advanced compression parameters : 287a28cd43dSSascha Wildner * It's possible to pin down compression parameters to some specific values. 288a28cd43dSSascha Wildner * In which case, these values are no longer dynamically selected by the compressor */ 289a28cd43dSSascha Wildner ZSTD_c_windowLog=101, /* Maximum allowed back-reference distance, expressed as power of 2. 290a28cd43dSSascha Wildner * This will set a memory budget for streaming decompression, 291a28cd43dSSascha Wildner * with larger values requiring more memory 292a28cd43dSSascha Wildner * and typically compressing more. 293a28cd43dSSascha Wildner * Must be clamped between ZSTD_WINDOWLOG_MIN and ZSTD_WINDOWLOG_MAX. 294a28cd43dSSascha Wildner * Special: value 0 means "use default windowLog". 295a28cd43dSSascha Wildner * Note: Using a windowLog greater than ZSTD_WINDOWLOG_LIMIT_DEFAULT 296a28cd43dSSascha Wildner * requires explicitly allowing such size at streaming decompression stage. */ 297a28cd43dSSascha Wildner ZSTD_c_hashLog=102, /* Size of the initial probe table, as a power of 2. 298a28cd43dSSascha Wildner * Resulting memory usage is (1 << (hashLog+2)). 299a28cd43dSSascha Wildner * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX. 300a28cd43dSSascha Wildner * Larger tables improve compression ratio of strategies <= dFast, 301a28cd43dSSascha Wildner * and improve speed of strategies > dFast. 302a28cd43dSSascha Wildner * Special: value 0 means "use default hashLog". */ 303a28cd43dSSascha Wildner ZSTD_c_chainLog=103, /* Size of the multi-probe search table, as a power of 2. 304a28cd43dSSascha Wildner * Resulting memory usage is (1 << (chainLog+2)). 305a28cd43dSSascha Wildner * Must be clamped between ZSTD_CHAINLOG_MIN and ZSTD_CHAINLOG_MAX. 306a28cd43dSSascha Wildner * Larger tables result in better and slower compression. 307a28cd43dSSascha Wildner * This parameter is useless for "fast" strategy. 308a28cd43dSSascha Wildner * It's still useful when using "dfast" strategy, 309a28cd43dSSascha Wildner * in which case it defines a secondary probe table. 310a28cd43dSSascha Wildner * Special: value 0 means "use default chainLog". */ 311a28cd43dSSascha Wildner ZSTD_c_searchLog=104, /* Number of search attempts, as a power of 2. 312a28cd43dSSascha Wildner * More attempts result in better and slower compression. 313a28cd43dSSascha Wildner * This parameter is useless for "fast" and "dFast" strategies. 314a28cd43dSSascha Wildner * Special: value 0 means "use default searchLog". */ 315a28cd43dSSascha Wildner ZSTD_c_minMatch=105, /* Minimum size of searched matches. 316a28cd43dSSascha Wildner * Note that Zstandard can still find matches of smaller size, 317a28cd43dSSascha Wildner * it just tweaks its search algorithm to look for this size and larger. 318a28cd43dSSascha Wildner * Larger values increase compression and decompression speed, but decrease ratio. 319a28cd43dSSascha Wildner * Must be clamped between ZSTD_MINMATCH_MIN and ZSTD_MINMATCH_MAX. 320a28cd43dSSascha Wildner * Note that currently, for all strategies < btopt, effective minimum is 4. 321a28cd43dSSascha Wildner * , for all strategies > fast, effective maximum is 6. 322a28cd43dSSascha Wildner * Special: value 0 means "use default minMatchLength". */ 323a28cd43dSSascha Wildner ZSTD_c_targetLength=106, /* Impact of this field depends on strategy. 324a28cd43dSSascha Wildner * For strategies btopt, btultra & btultra2: 325a28cd43dSSascha Wildner * Length of Match considered "good enough" to stop search. 326a28cd43dSSascha Wildner * Larger values make compression stronger, and slower. 327a28cd43dSSascha Wildner * For strategy fast: 328a28cd43dSSascha Wildner * Distance between match sampling. 329a28cd43dSSascha Wildner * Larger values make compression faster, and weaker. 330a28cd43dSSascha Wildner * Special: value 0 means "use default targetLength". */ 331a28cd43dSSascha Wildner ZSTD_c_strategy=107, /* See ZSTD_strategy enum definition. 332a28cd43dSSascha Wildner * The higher the value of selected strategy, the more complex it is, 333a28cd43dSSascha Wildner * resulting in stronger and slower compression. 334a28cd43dSSascha Wildner * Special: value 0 means "use default strategy". */ 335a28cd43dSSascha Wildner 336a28cd43dSSascha Wildner /* LDM mode parameters */ 337a28cd43dSSascha Wildner ZSTD_c_enableLongDistanceMatching=160, /* Enable long distance matching. 338a28cd43dSSascha Wildner * This parameter is designed to improve compression ratio 339a28cd43dSSascha Wildner * for large inputs, by finding large matches at long distance. 340a28cd43dSSascha Wildner * It increases memory usage and window size. 341a28cd43dSSascha Wildner * Note: enabling this parameter increases default ZSTD_c_windowLog to 128 MB 342a28cd43dSSascha Wildner * except when expressly set to a different value. 343a28cd43dSSascha Wildner * Note: will be enabled by default if ZSTD_c_windowLog >= 128 MB and 344a28cd43dSSascha Wildner * compression strategy >= ZSTD_btopt (== compression level 16+) */ 345a28cd43dSSascha Wildner ZSTD_c_ldmHashLog=161, /* Size of the table for long distance matching, as a power of 2. 346a28cd43dSSascha Wildner * Larger values increase memory usage and compression ratio, 347a28cd43dSSascha Wildner * but decrease compression speed. 348a28cd43dSSascha Wildner * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX 349a28cd43dSSascha Wildner * default: windowlog - 7. 350a28cd43dSSascha Wildner * Special: value 0 means "automatically determine hashlog". */ 351a28cd43dSSascha Wildner ZSTD_c_ldmMinMatch=162, /* Minimum match size for long distance matcher. 352a28cd43dSSascha Wildner * Larger/too small values usually decrease compression ratio. 353a28cd43dSSascha Wildner * Must be clamped between ZSTD_LDM_MINMATCH_MIN and ZSTD_LDM_MINMATCH_MAX. 354a28cd43dSSascha Wildner * Special: value 0 means "use default value" (default: 64). */ 355a28cd43dSSascha Wildner ZSTD_c_ldmBucketSizeLog=163, /* Log size of each bucket in the LDM hash table for collision resolution. 356a28cd43dSSascha Wildner * Larger values improve collision resolution but decrease compression speed. 357a28cd43dSSascha Wildner * The maximum value is ZSTD_LDM_BUCKETSIZELOG_MAX. 358a28cd43dSSascha Wildner * Special: value 0 means "use default value" (default: 3). */ 359a28cd43dSSascha Wildner ZSTD_c_ldmHashRateLog=164, /* Frequency of inserting/looking up entries into the LDM hash table. 360a28cd43dSSascha Wildner * Must be clamped between 0 and (ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN). 361a28cd43dSSascha Wildner * Default is MAX(0, (windowLog - ldmHashLog)), optimizing hash table usage. 362a28cd43dSSascha Wildner * Larger values improve compression speed. 363a28cd43dSSascha Wildner * Deviating far from default value will likely result in a compression ratio decrease. 364a28cd43dSSascha Wildner * Special: value 0 means "automatically determine hashRateLog". */ 365a28cd43dSSascha Wildner 366a28cd43dSSascha Wildner /* frame parameters */ 367a28cd43dSSascha Wildner ZSTD_c_contentSizeFlag=200, /* Content size will be written into frame header _whenever known_ (default:1) 368a28cd43dSSascha Wildner * Content size must be known at the beginning of compression. 369a28cd43dSSascha Wildner * This is automatically the case when using ZSTD_compress2(), 370a28cd43dSSascha Wildner * For streaming scenarios, content size must be provided with ZSTD_CCtx_setPledgedSrcSize() */ 371a28cd43dSSascha Wildner ZSTD_c_checksumFlag=201, /* A 32-bits checksum of content is written at end of frame (default:0) */ 372a28cd43dSSascha Wildner ZSTD_c_dictIDFlag=202, /* When applicable, dictionary's ID is written into frame header (default:1) */ 373a28cd43dSSascha Wildner 374a28cd43dSSascha Wildner /* multi-threading parameters */ 375a28cd43dSSascha Wildner /* These parameters are only active if multi-threading is enabled (compiled with build macro ZSTD_MULTITHREAD). 376a28cd43dSSascha Wildner * Otherwise, trying to set any other value than default (0) will be a no-op and return an error. 377a28cd43dSSascha Wildner * In a situation where it's unknown if the linked library supports multi-threading or not, 378a28cd43dSSascha Wildner * setting ZSTD_c_nbWorkers to any value >= 1 and consulting the return value provides a quick way to check this property. 379a28cd43dSSascha Wildner */ 380a28cd43dSSascha Wildner ZSTD_c_nbWorkers=400, /* Select how many threads will be spawned to compress in parallel. 381a28cd43dSSascha Wildner * When nbWorkers >= 1, triggers asynchronous mode when invoking ZSTD_compressStream*() : 382a28cd43dSSascha Wildner * ZSTD_compressStream*() consumes input and flush output if possible, but immediately gives back control to caller, 383a28cd43dSSascha Wildner * while compression is performed in parallel, within worker thread(s). 384a28cd43dSSascha Wildner * (note : a strong exception to this rule is when first invocation of ZSTD_compressStream2() sets ZSTD_e_end : 385a28cd43dSSascha Wildner * in which case, ZSTD_compressStream2() delegates to ZSTD_compress2(), which is always a blocking call). 386a28cd43dSSascha Wildner * More workers improve speed, but also increase memory usage. 387a28cd43dSSascha Wildner * Default value is `0`, aka "single-threaded mode" : no worker is spawned, 388a28cd43dSSascha Wildner * compression is performed inside Caller's thread, and all invocations are blocking */ 389a28cd43dSSascha Wildner ZSTD_c_jobSize=401, /* Size of a compression job. This value is enforced only when nbWorkers >= 1. 390a28cd43dSSascha Wildner * Each compression job is completed in parallel, so this value can indirectly impact the nb of active threads. 391a28cd43dSSascha Wildner * 0 means default, which is dynamically determined based on compression parameters. 392a28cd43dSSascha Wildner * Job size must be a minimum of overlap size, or 1 MB, whichever is largest. 393a28cd43dSSascha Wildner * The minimum size is automatically and transparently enforced. */ 394a28cd43dSSascha Wildner ZSTD_c_overlapLog=402, /* Control the overlap size, as a fraction of window size. 395a28cd43dSSascha Wildner * The overlap size is an amount of data reloaded from previous job at the beginning of a new job. 396a28cd43dSSascha Wildner * It helps preserve compression ratio, while each job is compressed in parallel. 397a28cd43dSSascha Wildner * This value is enforced only when nbWorkers >= 1. 398a28cd43dSSascha Wildner * Larger values increase compression ratio, but decrease speed. 399a28cd43dSSascha Wildner * Possible values range from 0 to 9 : 400a28cd43dSSascha Wildner * - 0 means "default" : value will be determined by the library, depending on strategy 401a28cd43dSSascha Wildner * - 1 means "no overlap" 402a28cd43dSSascha Wildner * - 9 means "full overlap", using a full window size. 403a28cd43dSSascha Wildner * Each intermediate rank increases/decreases load size by a factor 2 : 404a28cd43dSSascha Wildner * 9: full window; 8: w/2; 7: w/4; 6: w/8; 5:w/16; 4: w/32; 3:w/64; 2:w/128; 1:no overlap; 0:default 405a28cd43dSSascha Wildner * default value varies between 6 and 9, depending on strategy */ 406a28cd43dSSascha Wildner 407a28cd43dSSascha Wildner /* note : additional experimental parameters are also available 408a28cd43dSSascha Wildner * within the experimental section of the API. 409a28cd43dSSascha Wildner * At the time of this writing, they include : 410a28cd43dSSascha Wildner * ZSTD_c_rsyncable 411a28cd43dSSascha Wildner * ZSTD_c_format 412a28cd43dSSascha Wildner * ZSTD_c_forceMaxWindow 413a28cd43dSSascha Wildner * ZSTD_c_forceAttachDict 414a28cd43dSSascha Wildner * ZSTD_c_literalCompressionMode 415a28cd43dSSascha Wildner * ZSTD_c_targetCBlockSize 416a28cd43dSSascha Wildner * ZSTD_c_srcSizeHint 417a28cd43dSSascha Wildner * ZSTD_c_enableDedicatedDictSearch 418a28cd43dSSascha Wildner * ZSTD_c_stableInBuffer 419a28cd43dSSascha Wildner * ZSTD_c_stableOutBuffer 420a28cd43dSSascha Wildner * ZSTD_c_blockDelimiters 421a28cd43dSSascha Wildner * ZSTD_c_validateSequences 422a28cd43dSSascha Wildner * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. 423a28cd43dSSascha Wildner * note : never ever use experimentalParam? names directly; 424a28cd43dSSascha Wildner * also, the enums values themselves are unstable and can still change. 425a28cd43dSSascha Wildner */ 426a28cd43dSSascha Wildner ZSTD_c_experimentalParam1=500, 427a28cd43dSSascha Wildner ZSTD_c_experimentalParam2=10, 428a28cd43dSSascha Wildner ZSTD_c_experimentalParam3=1000, 429a28cd43dSSascha Wildner ZSTD_c_experimentalParam4=1001, 430a28cd43dSSascha Wildner ZSTD_c_experimentalParam5=1002, 431a28cd43dSSascha Wildner ZSTD_c_experimentalParam6=1003, 432a28cd43dSSascha Wildner ZSTD_c_experimentalParam7=1004, 433a28cd43dSSascha Wildner ZSTD_c_experimentalParam8=1005, 434a28cd43dSSascha Wildner ZSTD_c_experimentalParam9=1006, 435a28cd43dSSascha Wildner ZSTD_c_experimentalParam10=1007, 436a28cd43dSSascha Wildner ZSTD_c_experimentalParam11=1008, 437a28cd43dSSascha Wildner ZSTD_c_experimentalParam12=1009 438a28cd43dSSascha Wildner } ZSTD_cParameter; 439a28cd43dSSascha Wildner 440a28cd43dSSascha Wildner typedef struct { 441a28cd43dSSascha Wildner size_t error; 442a28cd43dSSascha Wildner int lowerBound; 443a28cd43dSSascha Wildner int upperBound; 444a28cd43dSSascha Wildner } ZSTD_bounds; 445a28cd43dSSascha Wildner 446a28cd43dSSascha Wildner /*! ZSTD_cParam_getBounds() : 447a28cd43dSSascha Wildner * All parameters must belong to an interval with lower and upper bounds, 448a28cd43dSSascha Wildner * otherwise they will either trigger an error or be automatically clamped. 449a28cd43dSSascha Wildner * @return : a structure, ZSTD_bounds, which contains 450a28cd43dSSascha Wildner * - an error status field, which must be tested using ZSTD_isError() 451a28cd43dSSascha Wildner * - lower and upper bounds, both inclusive 452a28cd43dSSascha Wildner */ 453a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter cParam); 454a28cd43dSSascha Wildner 455a28cd43dSSascha Wildner /*! ZSTD_CCtx_setParameter() : 456a28cd43dSSascha Wildner * Set one compression parameter, selected by enum ZSTD_cParameter. 457a28cd43dSSascha Wildner * All parameters have valid bounds. Bounds can be queried using ZSTD_cParam_getBounds(). 458a28cd43dSSascha Wildner * Providing a value beyond bound will either clamp it, or trigger an error (depending on parameter). 459a28cd43dSSascha Wildner * Setting a parameter is generally only possible during frame initialization (before starting compression). 460a28cd43dSSascha Wildner * Exception : when using multi-threading mode (nbWorkers >= 1), 461a28cd43dSSascha Wildner * the following parameters can be updated _during_ compression (within same frame): 462a28cd43dSSascha Wildner * => compressionLevel, hashLog, chainLog, searchLog, minMatch, targetLength and strategy. 463a28cd43dSSascha Wildner * new parameters will be active for next job only (after a flush()). 464a28cd43dSSascha Wildner * @return : an error code (which can be tested using ZSTD_isError()). 465a28cd43dSSascha Wildner */ 466a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value); 467a28cd43dSSascha Wildner 468a28cd43dSSascha Wildner /*! ZSTD_CCtx_setPledgedSrcSize() : 469a28cd43dSSascha Wildner * Total input data size to be compressed as a single frame. 470a28cd43dSSascha Wildner * Value will be written in frame header, unless if explicitly forbidden using ZSTD_c_contentSizeFlag. 471a28cd43dSSascha Wildner * This value will also be controlled at end of frame, and trigger an error if not respected. 472a28cd43dSSascha Wildner * @result : 0, or an error code (which can be tested with ZSTD_isError()). 473a28cd43dSSascha Wildner * Note 1 : pledgedSrcSize==0 actually means zero, aka an empty frame. 474a28cd43dSSascha Wildner * In order to mean "unknown content size", pass constant ZSTD_CONTENTSIZE_UNKNOWN. 475a28cd43dSSascha Wildner * ZSTD_CONTENTSIZE_UNKNOWN is default value for any new frame. 476a28cd43dSSascha Wildner * Note 2 : pledgedSrcSize is only valid once, for the next frame. 477a28cd43dSSascha Wildner * It's discarded at the end of the frame, and replaced by ZSTD_CONTENTSIZE_UNKNOWN. 478a28cd43dSSascha Wildner * Note 3 : Whenever all input data is provided and consumed in a single round, 479a28cd43dSSascha Wildner * for example with ZSTD_compress2(), 480a28cd43dSSascha Wildner * or invoking immediately ZSTD_compressStream2(,,,ZSTD_e_end), 481a28cd43dSSascha Wildner * this value is automatically overridden by srcSize instead. 482a28cd43dSSascha Wildner */ 483a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize); 484a28cd43dSSascha Wildner 485a28cd43dSSascha Wildner typedef enum { 486a28cd43dSSascha Wildner ZSTD_reset_session_only = 1, 487a28cd43dSSascha Wildner ZSTD_reset_parameters = 2, 488a28cd43dSSascha Wildner ZSTD_reset_session_and_parameters = 3 489a28cd43dSSascha Wildner } ZSTD_ResetDirective; 490a28cd43dSSascha Wildner 491a28cd43dSSascha Wildner /*! ZSTD_CCtx_reset() : 492a28cd43dSSascha Wildner * There are 2 different things that can be reset, independently or jointly : 493a28cd43dSSascha Wildner * - The session : will stop compressing current frame, and make CCtx ready to start a new one. 494a28cd43dSSascha Wildner * Useful after an error, or to interrupt any ongoing compression. 495a28cd43dSSascha Wildner * Any internal data not yet flushed is cancelled. 496a28cd43dSSascha Wildner * Compression parameters and dictionary remain unchanged. 497a28cd43dSSascha Wildner * They will be used to compress next frame. 498a28cd43dSSascha Wildner * Resetting session never fails. 499a28cd43dSSascha Wildner * - The parameters : changes all parameters back to "default". 500a28cd43dSSascha Wildner * This removes any reference to any dictionary too. 501a28cd43dSSascha Wildner * Parameters can only be changed between 2 sessions (i.e. no compression is currently ongoing) 502a28cd43dSSascha Wildner * otherwise the reset fails, and function returns an error value (which can be tested using ZSTD_isError()) 503a28cd43dSSascha Wildner * - Both : similar to resetting the session, followed by resetting parameters. 504a28cd43dSSascha Wildner */ 505a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_ResetDirective reset); 506a28cd43dSSascha Wildner 507a28cd43dSSascha Wildner /*! ZSTD_compress2() : 508a28cd43dSSascha Wildner * Behave the same as ZSTD_compressCCtx(), but compression parameters are set using the advanced API. 509a28cd43dSSascha Wildner * ZSTD_compress2() always starts a new frame. 510a28cd43dSSascha Wildner * Should cctx hold data from a previously unfinished frame, everything about it is forgotten. 511a28cd43dSSascha Wildner * - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*() 512a28cd43dSSascha Wildner * - The function is always blocking, returns when compression is completed. 513a28cd43dSSascha Wildner * Hint : compression runs faster if `dstCapacity` >= `ZSTD_compressBound(srcSize)`. 514a28cd43dSSascha Wildner * @return : compressed size written into `dst` (<= `dstCapacity), 515a28cd43dSSascha Wildner * or an error code if it fails (which can be tested using ZSTD_isError()). 516a28cd43dSSascha Wildner */ 517a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compress2( ZSTD_CCtx* cctx, 518a28cd43dSSascha Wildner void* dst, size_t dstCapacity, 519a28cd43dSSascha Wildner const void* src, size_t srcSize); 520a28cd43dSSascha Wildner 521a28cd43dSSascha Wildner 522a28cd43dSSascha Wildner /*************************************** 523a28cd43dSSascha Wildner * Advanced decompression API 524a28cd43dSSascha Wildner ***************************************/ 525a28cd43dSSascha Wildner 526a28cd43dSSascha Wildner /* The advanced API pushes parameters one by one into an existing DCtx context. 527a28cd43dSSascha Wildner * Parameters are sticky, and remain valid for all following frames 528a28cd43dSSascha Wildner * using the same DCtx context. 529a28cd43dSSascha Wildner * It's possible to reset parameters to default values using ZSTD_DCtx_reset(). 530a28cd43dSSascha Wildner * Note : This API is compatible with existing ZSTD_decompressDCtx() and ZSTD_decompressStream(). 531a28cd43dSSascha Wildner * Therefore, no new decompression function is necessary. 532a28cd43dSSascha Wildner */ 533a28cd43dSSascha Wildner 534a28cd43dSSascha Wildner typedef enum { 535a28cd43dSSascha Wildner 536a28cd43dSSascha Wildner ZSTD_d_windowLogMax=100, /* Select a size limit (in power of 2) beyond which 537a28cd43dSSascha Wildner * the streaming API will refuse to allocate memory buffer 538a28cd43dSSascha Wildner * in order to protect the host from unreasonable memory requirements. 539a28cd43dSSascha Wildner * This parameter is only useful in streaming mode, since no internal buffer is allocated in single-pass mode. 540a28cd43dSSascha Wildner * By default, a decompression context accepts window sizes <= (1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT). 541a28cd43dSSascha Wildner * Special: value 0 means "use default maximum windowLog". */ 542a28cd43dSSascha Wildner 543a28cd43dSSascha Wildner /* note : additional experimental parameters are also available 544a28cd43dSSascha Wildner * within the experimental section of the API. 545a28cd43dSSascha Wildner * At the time of this writing, they include : 546a28cd43dSSascha Wildner * ZSTD_d_format 547a28cd43dSSascha Wildner * ZSTD_d_stableOutBuffer 548a28cd43dSSascha Wildner * ZSTD_d_forceIgnoreChecksum 549a28cd43dSSascha Wildner * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. 550a28cd43dSSascha Wildner * note : never ever use experimentalParam? names directly 551a28cd43dSSascha Wildner */ 552a28cd43dSSascha Wildner ZSTD_d_experimentalParam1=1000, 553a28cd43dSSascha Wildner ZSTD_d_experimentalParam2=1001, 554a28cd43dSSascha Wildner ZSTD_d_experimentalParam3=1002 555a28cd43dSSascha Wildner 556a28cd43dSSascha Wildner } ZSTD_dParameter; 557a28cd43dSSascha Wildner 558a28cd43dSSascha Wildner /*! ZSTD_dParam_getBounds() : 559a28cd43dSSascha Wildner * All parameters must belong to an interval with lower and upper bounds, 560a28cd43dSSascha Wildner * otherwise they will either trigger an error or be automatically clamped. 561a28cd43dSSascha Wildner * @return : a structure, ZSTD_bounds, which contains 562a28cd43dSSascha Wildner * - an error status field, which must be tested using ZSTD_isError() 563a28cd43dSSascha Wildner * - both lower and upper bounds, inclusive 564a28cd43dSSascha Wildner */ 565a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_bounds ZSTD_dParam_getBounds(ZSTD_dParameter dParam); 566a28cd43dSSascha Wildner 567a28cd43dSSascha Wildner /*! ZSTD_DCtx_setParameter() : 568a28cd43dSSascha Wildner * Set one compression parameter, selected by enum ZSTD_dParameter. 569a28cd43dSSascha Wildner * All parameters have valid bounds. Bounds can be queried using ZSTD_dParam_getBounds(). 570a28cd43dSSascha Wildner * Providing a value beyond bound will either clamp it, or trigger an error (depending on parameter). 571a28cd43dSSascha Wildner * Setting a parameter is only possible during frame initialization (before starting decompression). 572a28cd43dSSascha Wildner * @return : 0, or an error code (which can be tested using ZSTD_isError()). 573a28cd43dSSascha Wildner */ 574a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DCtx_setParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int value); 575a28cd43dSSascha Wildner 576a28cd43dSSascha Wildner /*! ZSTD_DCtx_reset() : 577a28cd43dSSascha Wildner * Return a DCtx to clean state. 578a28cd43dSSascha Wildner * Session and parameters can be reset jointly or separately. 579a28cd43dSSascha Wildner * Parameters can only be reset when no active frame is being decompressed. 580a28cd43dSSascha Wildner * @return : 0, or an error code, which can be tested with ZSTD_isError() 581a28cd43dSSascha Wildner */ 582a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DCtx_reset(ZSTD_DCtx* dctx, ZSTD_ResetDirective reset); 583a28cd43dSSascha Wildner 584a28cd43dSSascha Wildner 585a28cd43dSSascha Wildner /**************************** 586a28cd43dSSascha Wildner * Streaming 587a28cd43dSSascha Wildner ****************************/ 588a28cd43dSSascha Wildner 589a28cd43dSSascha Wildner typedef struct ZSTD_inBuffer_s { 590a28cd43dSSascha Wildner const void* src; /**< start of input buffer */ 591a28cd43dSSascha Wildner size_t size; /**< size of input buffer */ 592a28cd43dSSascha Wildner size_t pos; /**< position where reading stopped. Will be updated. Necessarily 0 <= pos <= size */ 593a28cd43dSSascha Wildner } ZSTD_inBuffer; 594a28cd43dSSascha Wildner 595a28cd43dSSascha Wildner typedef struct ZSTD_outBuffer_s { 596a28cd43dSSascha Wildner void* dst; /**< start of output buffer */ 597a28cd43dSSascha Wildner size_t size; /**< size of output buffer */ 598a28cd43dSSascha Wildner size_t pos; /**< position where writing stopped. Will be updated. Necessarily 0 <= pos <= size */ 599a28cd43dSSascha Wildner } ZSTD_outBuffer; 600a28cd43dSSascha Wildner 601a28cd43dSSascha Wildner 602a28cd43dSSascha Wildner 603a28cd43dSSascha Wildner /*-*********************************************************************** 604a28cd43dSSascha Wildner * Streaming compression - HowTo 605a28cd43dSSascha Wildner * 606a28cd43dSSascha Wildner * A ZSTD_CStream object is required to track streaming operation. 607a28cd43dSSascha Wildner * Use ZSTD_createCStream() and ZSTD_freeCStream() to create/release resources. 608a28cd43dSSascha Wildner * ZSTD_CStream objects can be reused multiple times on consecutive compression operations. 609a28cd43dSSascha Wildner * It is recommended to re-use ZSTD_CStream since it will play nicer with system's memory, by re-using already allocated memory. 610a28cd43dSSascha Wildner * 611a28cd43dSSascha Wildner * For parallel execution, use one separate ZSTD_CStream per thread. 612a28cd43dSSascha Wildner * 613a28cd43dSSascha Wildner * note : since v1.3.0, ZSTD_CStream and ZSTD_CCtx are the same thing. 614a28cd43dSSascha Wildner * 615a28cd43dSSascha Wildner * Parameters are sticky : when starting a new compression on the same context, 616a28cd43dSSascha Wildner * it will re-use the same sticky parameters as previous compression session. 617a28cd43dSSascha Wildner * When in doubt, it's recommended to fully initialize the context before usage. 618a28cd43dSSascha Wildner * Use ZSTD_CCtx_reset() to reset the context and ZSTD_CCtx_setParameter(), 619a28cd43dSSascha Wildner * ZSTD_CCtx_setPledgedSrcSize(), or ZSTD_CCtx_loadDictionary() and friends to 620a28cd43dSSascha Wildner * set more specific parameters, the pledged source size, or load a dictionary. 621a28cd43dSSascha Wildner * 622a28cd43dSSascha Wildner * Use ZSTD_compressStream2() with ZSTD_e_continue as many times as necessary to 623a28cd43dSSascha Wildner * consume input stream. The function will automatically update both `pos` 624a28cd43dSSascha Wildner * fields within `input` and `output`. 625a28cd43dSSascha Wildner * Note that the function may not consume the entire input, for example, because 626a28cd43dSSascha Wildner * the output buffer is already full, in which case `input.pos < input.size`. 627a28cd43dSSascha Wildner * The caller must check if input has been entirely consumed. 628a28cd43dSSascha Wildner * If not, the caller must make some room to receive more compressed data, 629a28cd43dSSascha Wildner * and then present again remaining input data. 630a28cd43dSSascha Wildner * note: ZSTD_e_continue is guaranteed to make some forward progress when called, 631a28cd43dSSascha Wildner * but doesn't guarantee maximal forward progress. This is especially relevant 632a28cd43dSSascha Wildner * when compressing with multiple threads. The call won't block if it can 633a28cd43dSSascha Wildner * consume some input, but if it can't it will wait for some, but not all, 634a28cd43dSSascha Wildner * output to be flushed. 635a28cd43dSSascha Wildner * @return : provides a minimum amount of data remaining to be flushed from internal buffers 636a28cd43dSSascha Wildner * or an error code, which can be tested using ZSTD_isError(). 637a28cd43dSSascha Wildner * 638a28cd43dSSascha Wildner * At any moment, it's possible to flush whatever data might remain stuck within internal buffer, 639a28cd43dSSascha Wildner * using ZSTD_compressStream2() with ZSTD_e_flush. `output->pos` will be updated. 640a28cd43dSSascha Wildner * Note that, if `output->size` is too small, a single invocation with ZSTD_e_flush might not be enough (return code > 0). 641a28cd43dSSascha Wildner * In which case, make some room to receive more compressed data, and call again ZSTD_compressStream2() with ZSTD_e_flush. 642a28cd43dSSascha Wildner * You must continue calling ZSTD_compressStream2() with ZSTD_e_flush until it returns 0, at which point you can change the 643a28cd43dSSascha Wildner * operation. 644a28cd43dSSascha Wildner * note: ZSTD_e_flush will flush as much output as possible, meaning when compressing with multiple threads, it will 645a28cd43dSSascha Wildner * block until the flush is complete or the output buffer is full. 646a28cd43dSSascha Wildner * @return : 0 if internal buffers are entirely flushed, 647a28cd43dSSascha Wildner * >0 if some data still present within internal buffer (the value is minimal estimation of remaining size), 648a28cd43dSSascha Wildner * or an error code, which can be tested using ZSTD_isError(). 649a28cd43dSSascha Wildner * 650a28cd43dSSascha Wildner * Calling ZSTD_compressStream2() with ZSTD_e_end instructs to finish a frame. 651a28cd43dSSascha Wildner * It will perform a flush and write frame epilogue. 652a28cd43dSSascha Wildner * The epilogue is required for decoders to consider a frame completed. 653a28cd43dSSascha Wildner * flush operation is the same, and follows same rules as calling ZSTD_compressStream2() with ZSTD_e_flush. 654a28cd43dSSascha Wildner * You must continue calling ZSTD_compressStream2() with ZSTD_e_end until it returns 0, at which point you are free to 655a28cd43dSSascha Wildner * start a new frame. 656a28cd43dSSascha Wildner * note: ZSTD_e_end will flush as much output as possible, meaning when compressing with multiple threads, it will 657a28cd43dSSascha Wildner * block until the flush is complete or the output buffer is full. 658a28cd43dSSascha Wildner * @return : 0 if frame fully completed and fully flushed, 659a28cd43dSSascha Wildner * >0 if some data still present within internal buffer (the value is minimal estimation of remaining size), 660a28cd43dSSascha Wildner * or an error code, which can be tested using ZSTD_isError(). 661a28cd43dSSascha Wildner * 662a28cd43dSSascha Wildner * *******************************************************************/ 663a28cd43dSSascha Wildner 664a28cd43dSSascha Wildner typedef ZSTD_CCtx ZSTD_CStream; /**< CCtx and CStream are now effectively same object (>= v1.3.0) */ 665a28cd43dSSascha Wildner /* Continue to distinguish them for compatibility with older versions <= v1.2.0 */ 666a28cd43dSSascha Wildner /*===== ZSTD_CStream management functions =====*/ 667a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_CStream* ZSTD_createCStream(void); 668a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_freeCStream(ZSTD_CStream* zcs); 669a28cd43dSSascha Wildner 670a28cd43dSSascha Wildner /*===== Streaming compression functions =====*/ 671a28cd43dSSascha Wildner typedef enum { 672a28cd43dSSascha Wildner ZSTD_e_continue=0, /* collect more data, encoder decides when to output compressed result, for optimal compression ratio */ 673a28cd43dSSascha Wildner ZSTD_e_flush=1, /* flush any data provided so far, 674a28cd43dSSascha Wildner * it creates (at least) one new block, that can be decoded immediately on reception; 675a28cd43dSSascha Wildner * frame will continue: any future data can still reference previously compressed data, improving compression. 676a28cd43dSSascha Wildner * note : multithreaded compression will block to flush as much output as possible. */ 677a28cd43dSSascha Wildner ZSTD_e_end=2 /* flush any remaining data _and_ close current frame. 678a28cd43dSSascha Wildner * note that frame is only closed after compressed data is fully flushed (return value == 0). 679a28cd43dSSascha Wildner * After that point, any additional data starts a new frame. 680a28cd43dSSascha Wildner * note : each frame is independent (does not reference any content from previous frame). 681a28cd43dSSascha Wildner : note : multithreaded compression will block to flush as much output as possible. */ 682a28cd43dSSascha Wildner } ZSTD_EndDirective; 683a28cd43dSSascha Wildner 684a28cd43dSSascha Wildner /*! ZSTD_compressStream2() : 685a28cd43dSSascha Wildner * Behaves about the same as ZSTD_compressStream, with additional control on end directive. 686a28cd43dSSascha Wildner * - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*() 687a28cd43dSSascha Wildner * - Compression parameters cannot be changed once compression is started (save a list of exceptions in multi-threading mode) 688a28cd43dSSascha Wildner * - output->pos must be <= dstCapacity, input->pos must be <= srcSize 689a28cd43dSSascha Wildner * - output->pos and input->pos will be updated. They are guaranteed to remain below their respective limit. 690a28cd43dSSascha Wildner * - endOp must be a valid directive 691a28cd43dSSascha Wildner * - When nbWorkers==0 (default), function is blocking : it completes its job before returning to caller. 692a28cd43dSSascha Wildner * - When nbWorkers>=1, function is non-blocking : it copies a portion of input, distributes jobs to internal worker threads, flush to output whatever is available, 693a28cd43dSSascha Wildner * and then immediately returns, just indicating that there is some data remaining to be flushed. 694a28cd43dSSascha Wildner * The function nonetheless guarantees forward progress : it will return only after it reads or write at least 1+ byte. 695a28cd43dSSascha Wildner * - Exception : if the first call requests a ZSTD_e_end directive and provides enough dstCapacity, the function delegates to ZSTD_compress2() which is always blocking. 696a28cd43dSSascha Wildner * - @return provides a minimum amount of data remaining to be flushed from internal buffers 697a28cd43dSSascha Wildner * or an error code, which can be tested using ZSTD_isError(). 698a28cd43dSSascha Wildner * if @return != 0, flush is not fully completed, there is still some data left within internal buffers. 699a28cd43dSSascha Wildner * This is useful for ZSTD_e_flush, since in this case more flushes are necessary to empty all buffers. 700a28cd43dSSascha Wildner * For ZSTD_e_end, @return == 0 when internal buffers are fully flushed and frame is completed. 701a28cd43dSSascha Wildner * - after a ZSTD_e_end directive, if internal buffer is not fully flushed (@return != 0), 702a28cd43dSSascha Wildner * only ZSTD_e_end or ZSTD_e_flush operations are allowed. 703a28cd43dSSascha Wildner * Before starting a new compression job, or changing compression parameters, 704a28cd43dSSascha Wildner * it is required to fully flush internal buffers. 705a28cd43dSSascha Wildner */ 706a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, 707a28cd43dSSascha Wildner ZSTD_outBuffer* output, 708a28cd43dSSascha Wildner ZSTD_inBuffer* input, 709a28cd43dSSascha Wildner ZSTD_EndDirective endOp); 710a28cd43dSSascha Wildner 711a28cd43dSSascha Wildner 712a28cd43dSSascha Wildner /* These buffer sizes are softly recommended. 713a28cd43dSSascha Wildner * They are not required : ZSTD_compressStream*() happily accepts any buffer size, for both input and output. 714a28cd43dSSascha Wildner * Respecting the recommended size just makes it a bit easier for ZSTD_compressStream*(), 715a28cd43dSSascha Wildner * reducing the amount of memory shuffling and buffering, resulting in minor performance savings. 716a28cd43dSSascha Wildner * 717a28cd43dSSascha Wildner * However, note that these recommendations are from the perspective of a C caller program. 718a28cd43dSSascha Wildner * If the streaming interface is invoked from some other language, 719a28cd43dSSascha Wildner * especially managed ones such as Java or Go, through a foreign function interface such as jni or cgo, 720a28cd43dSSascha Wildner * a major performance rule is to reduce crossing such interface to an absolute minimum. 721a28cd43dSSascha Wildner * It's not rare that performance ends being spent more into the interface, rather than compression itself. 722a28cd43dSSascha Wildner * In which cases, prefer using large buffers, as large as practical, 723a28cd43dSSascha Wildner * for both input and output, to reduce the nb of roundtrips. 724a28cd43dSSascha Wildner */ 725a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CStreamInSize(void); /**< recommended size for input buffer */ 726a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CStreamOutSize(void); /**< recommended size for output buffer. Guarantee to successfully flush at least one complete compressed block. */ 727a28cd43dSSascha Wildner 728a28cd43dSSascha Wildner 729a28cd43dSSascha Wildner /* ***************************************************************************** 730a28cd43dSSascha Wildner * This following is a legacy streaming API. 731a28cd43dSSascha Wildner * It can be replaced by ZSTD_CCtx_reset() and ZSTD_compressStream2(). 732a28cd43dSSascha Wildner * It is redundant, but remains fully supported. 733a28cd43dSSascha Wildner * Advanced parameters and dictionary compression can only be used through the 734a28cd43dSSascha Wildner * new API. 735a28cd43dSSascha Wildner ******************************************************************************/ 736a28cd43dSSascha Wildner 737a28cd43dSSascha Wildner /*! 738a28cd43dSSascha Wildner * Equivalent to: 739a28cd43dSSascha Wildner * 740a28cd43dSSascha Wildner * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); 741a28cd43dSSascha Wildner * ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any) 742a28cd43dSSascha Wildner * ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel); 743a28cd43dSSascha Wildner */ 744a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_initCStream(ZSTD_CStream* zcs, int compressionLevel); 745a28cd43dSSascha Wildner /*! 746a28cd43dSSascha Wildner * Alternative for ZSTD_compressStream2(zcs, output, input, ZSTD_e_continue). 747a28cd43dSSascha Wildner * NOTE: The return value is different. ZSTD_compressStream() returns a hint for 748a28cd43dSSascha Wildner * the next read size (if non-zero and not an error). ZSTD_compressStream2() 749a28cd43dSSascha Wildner * returns the minimum nb of bytes left to flush (if non-zero and not an error). 750a28cd43dSSascha Wildner */ 751a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuffer* input); 752a28cd43dSSascha Wildner /*! Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_flush). */ 753a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output); 754a28cd43dSSascha Wildner /*! Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_end). */ 755a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output); 756a28cd43dSSascha Wildner 757a28cd43dSSascha Wildner 758a28cd43dSSascha Wildner /*-*************************************************************************** 759a28cd43dSSascha Wildner * Streaming decompression - HowTo 760a28cd43dSSascha Wildner * 761a28cd43dSSascha Wildner * A ZSTD_DStream object is required to track streaming operations. 762a28cd43dSSascha Wildner * Use ZSTD_createDStream() and ZSTD_freeDStream() to create/release resources. 763a28cd43dSSascha Wildner * ZSTD_DStream objects can be re-used multiple times. 764a28cd43dSSascha Wildner * 765a28cd43dSSascha Wildner * Use ZSTD_initDStream() to start a new decompression operation. 766a28cd43dSSascha Wildner * @return : recommended first input size 767a28cd43dSSascha Wildner * Alternatively, use advanced API to set specific properties. 768a28cd43dSSascha Wildner * 769a28cd43dSSascha Wildner * Use ZSTD_decompressStream() repetitively to consume your input. 770a28cd43dSSascha Wildner * The function will update both `pos` fields. 771a28cd43dSSascha Wildner * If `input.pos < input.size`, some input has not been consumed. 772a28cd43dSSascha Wildner * It's up to the caller to present again remaining data. 773a28cd43dSSascha Wildner * The function tries to flush all data decoded immediately, respecting output buffer size. 774a28cd43dSSascha Wildner * If `output.pos < output.size`, decoder has flushed everything it could. 775a28cd43dSSascha Wildner * But if `output.pos == output.size`, there might be some data left within internal buffers., 776a28cd43dSSascha Wildner * In which case, call ZSTD_decompressStream() again to flush whatever remains in the buffer. 777a28cd43dSSascha Wildner * Note : with no additional input provided, amount of data flushed is necessarily <= ZSTD_BLOCKSIZE_MAX. 778a28cd43dSSascha Wildner * @return : 0 when a frame is completely decoded and fully flushed, 779a28cd43dSSascha Wildner * or an error code, which can be tested using ZSTD_isError(), 780a28cd43dSSascha Wildner * or any other value > 0, which means there is still some decoding or flushing to do to complete current frame : 781a28cd43dSSascha Wildner * the return value is a suggested next input size (just a hint for better latency) 782a28cd43dSSascha Wildner * that will never request more than the remaining frame size. 783a28cd43dSSascha Wildner * *******************************************************************************/ 784a28cd43dSSascha Wildner 785a28cd43dSSascha Wildner typedef ZSTD_DCtx ZSTD_DStream; /**< DCtx and DStream are now effectively same object (>= v1.3.0) */ 786a28cd43dSSascha Wildner /* For compatibility with versions <= v1.2.0, prefer differentiating them. */ 787a28cd43dSSascha Wildner /*===== ZSTD_DStream management functions =====*/ 788a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_DStream* ZSTD_createDStream(void); 789a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_freeDStream(ZSTD_DStream* zds); 790a28cd43dSSascha Wildner 791a28cd43dSSascha Wildner /*===== Streaming decompression functions =====*/ 792a28cd43dSSascha Wildner 793a28cd43dSSascha Wildner /* This function is redundant with the advanced API and equivalent to: 794a28cd43dSSascha Wildner * 795a28cd43dSSascha Wildner * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); 796a28cd43dSSascha Wildner * ZSTD_DCtx_refDDict(zds, NULL); 797a28cd43dSSascha Wildner */ 798a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_initDStream(ZSTD_DStream* zds); 799a28cd43dSSascha Wildner 800a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input); 801a28cd43dSSascha Wildner 802a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DStreamInSize(void); /*!< recommended size for input buffer */ 803a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DStreamOutSize(void); /*!< recommended size for output buffer. Guarantee to successfully flush at least one complete block in all circumstances. */ 804a28cd43dSSascha Wildner 805a28cd43dSSascha Wildner 806a28cd43dSSascha Wildner /************************** 807a28cd43dSSascha Wildner * Simple dictionary API 808a28cd43dSSascha Wildner ***************************/ 809a28cd43dSSascha Wildner /*! ZSTD_compress_usingDict() : 810a28cd43dSSascha Wildner * Compression at an explicit compression level using a Dictionary. 811a28cd43dSSascha Wildner * A dictionary can be any arbitrary data segment (also called a prefix), 812a28cd43dSSascha Wildner * or a buffer with specified information (see dictBuilder/zdict.h). 813a28cd43dSSascha Wildner * Note : This function loads the dictionary, resulting in significant startup delay. 814a28cd43dSSascha Wildner * It's intended for a dictionary used only once. 815a28cd43dSSascha Wildner * Note 2 : When `dict == NULL || dictSize < 8` no dictionary is used. */ 816a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compress_usingDict(ZSTD_CCtx* ctx, 817a28cd43dSSascha Wildner void* dst, size_t dstCapacity, 818a28cd43dSSascha Wildner const void* src, size_t srcSize, 819a28cd43dSSascha Wildner const void* dict,size_t dictSize, 820a28cd43dSSascha Wildner int compressionLevel); 821a28cd43dSSascha Wildner 822a28cd43dSSascha Wildner /*! ZSTD_decompress_usingDict() : 823a28cd43dSSascha Wildner * Decompression using a known Dictionary. 824a28cd43dSSascha Wildner * Dictionary must be identical to the one used during compression. 825a28cd43dSSascha Wildner * Note : This function loads the dictionary, resulting in significant startup delay. 826a28cd43dSSascha Wildner * It's intended for a dictionary used only once. 827a28cd43dSSascha Wildner * Note : When `dict == NULL || dictSize < 8` no dictionary is used. */ 828a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decompress_usingDict(ZSTD_DCtx* dctx, 829a28cd43dSSascha Wildner void* dst, size_t dstCapacity, 830a28cd43dSSascha Wildner const void* src, size_t srcSize, 831a28cd43dSSascha Wildner const void* dict,size_t dictSize); 832a28cd43dSSascha Wildner 833a28cd43dSSascha Wildner 834a28cd43dSSascha Wildner /*********************************** 835a28cd43dSSascha Wildner * Bulk processing dictionary API 836a28cd43dSSascha Wildner **********************************/ 837a28cd43dSSascha Wildner typedef struct ZSTD_CDict_s ZSTD_CDict; 838a28cd43dSSascha Wildner 839a28cd43dSSascha Wildner /*! ZSTD_createCDict() : 840a28cd43dSSascha Wildner * When compressing multiple messages or blocks using the same dictionary, 841a28cd43dSSascha Wildner * it's recommended to digest the dictionary only once, since it's a costly operation. 842a28cd43dSSascha Wildner * ZSTD_createCDict() will create a state from digesting a dictionary. 843a28cd43dSSascha Wildner * The resulting state can be used for future compression operations with very limited startup cost. 844a28cd43dSSascha Wildner * ZSTD_CDict can be created once and shared by multiple threads concurrently, since its usage is read-only. 845a28cd43dSSascha Wildner * @dictBuffer can be released after ZSTD_CDict creation, because its content is copied within CDict. 846a28cd43dSSascha Wildner * Note 1 : Consider experimental function `ZSTD_createCDict_byReference()` if you prefer to not duplicate @dictBuffer content. 847a28cd43dSSascha Wildner * Note 2 : A ZSTD_CDict can be created from an empty @dictBuffer, 848a28cd43dSSascha Wildner * in which case the only thing that it transports is the @compressionLevel. 849a28cd43dSSascha Wildner * This can be useful in a pipeline featuring ZSTD_compress_usingCDict() exclusively, 850a28cd43dSSascha Wildner * expecting a ZSTD_CDict parameter with any data, including those without a known dictionary. */ 851a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict(const void* dictBuffer, size_t dictSize, 852a28cd43dSSascha Wildner int compressionLevel); 853a28cd43dSSascha Wildner 854a28cd43dSSascha Wildner /*! ZSTD_freeCDict() : 855a28cd43dSSascha Wildner * Function frees memory allocated by ZSTD_createCDict(). */ 856a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_freeCDict(ZSTD_CDict* CDict); 857a28cd43dSSascha Wildner 858a28cd43dSSascha Wildner /*! ZSTD_compress_usingCDict() : 859a28cd43dSSascha Wildner * Compression using a digested Dictionary. 860a28cd43dSSascha Wildner * Recommended when same dictionary is used multiple times. 861a28cd43dSSascha Wildner * Note : compression level is _decided at dictionary creation time_, 862a28cd43dSSascha Wildner * and frame parameters are hardcoded (dictID=yes, contentSize=yes, checksum=no) */ 863a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compress_usingCDict(ZSTD_CCtx* cctx, 864a28cd43dSSascha Wildner void* dst, size_t dstCapacity, 865a28cd43dSSascha Wildner const void* src, size_t srcSize, 866a28cd43dSSascha Wildner const ZSTD_CDict* cdict); 867a28cd43dSSascha Wildner 868a28cd43dSSascha Wildner 869a28cd43dSSascha Wildner typedef struct ZSTD_DDict_s ZSTD_DDict; 870a28cd43dSSascha Wildner 871a28cd43dSSascha Wildner /*! ZSTD_createDDict() : 872a28cd43dSSascha Wildner * Create a digested dictionary, ready to start decompression operation without startup delay. 873a28cd43dSSascha Wildner * dictBuffer can be released after DDict creation, as its content is copied inside DDict. */ 874a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict(const void* dictBuffer, size_t dictSize); 875a28cd43dSSascha Wildner 876a28cd43dSSascha Wildner /*! ZSTD_freeDDict() : 877a28cd43dSSascha Wildner * Function frees memory allocated with ZSTD_createDDict() */ 878a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_freeDDict(ZSTD_DDict* ddict); 879a28cd43dSSascha Wildner 880a28cd43dSSascha Wildner /*! ZSTD_decompress_usingDDict() : 881a28cd43dSSascha Wildner * Decompression using a digested Dictionary. 882a28cd43dSSascha Wildner * Recommended when same dictionary is used multiple times. */ 883a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx, 884a28cd43dSSascha Wildner void* dst, size_t dstCapacity, 885a28cd43dSSascha Wildner const void* src, size_t srcSize, 886a28cd43dSSascha Wildner const ZSTD_DDict* ddict); 887a28cd43dSSascha Wildner 888a28cd43dSSascha Wildner 889a28cd43dSSascha Wildner /******************************** 890a28cd43dSSascha Wildner * Dictionary helper functions 891a28cd43dSSascha Wildner *******************************/ 892a28cd43dSSascha Wildner 893a28cd43dSSascha Wildner /*! ZSTD_getDictID_fromDict() : 894a28cd43dSSascha Wildner * Provides the dictID stored within dictionary. 895a28cd43dSSascha Wildner * if @return == 0, the dictionary is not conformant with Zstandard specification. 896a28cd43dSSascha Wildner * It can still be loaded, but as a content-only dictionary. */ 897a28cd43dSSascha Wildner ZSTDLIB_API unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize); 898a28cd43dSSascha Wildner 899a28cd43dSSascha Wildner /*! ZSTD_getDictID_fromDDict() : 900a28cd43dSSascha Wildner * Provides the dictID of the dictionary loaded into `ddict`. 901a28cd43dSSascha Wildner * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty. 902a28cd43dSSascha Wildner * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */ 903a28cd43dSSascha Wildner ZSTDLIB_API unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict); 904a28cd43dSSascha Wildner 905a28cd43dSSascha Wildner /*! ZSTD_getDictID_fromFrame() : 906a28cd43dSSascha Wildner * Provides the dictID required to decompressed the frame stored within `src`. 907a28cd43dSSascha Wildner * If @return == 0, the dictID could not be decoded. 908a28cd43dSSascha Wildner * This could for one of the following reasons : 909a28cd43dSSascha Wildner * - The frame does not require a dictionary to be decoded (most common case). 910a28cd43dSSascha Wildner * - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden information. 911a28cd43dSSascha Wildner * Note : this use case also happens when using a non-conformant dictionary. 912a28cd43dSSascha Wildner * - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`). 913a28cd43dSSascha Wildner * - This is not a Zstandard frame. 914a28cd43dSSascha Wildner * When identifying the exact failure cause, it's possible to use ZSTD_getFrameHeader(), which will provide a more precise error code. */ 915a28cd43dSSascha Wildner ZSTDLIB_API unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize); 916a28cd43dSSascha Wildner 917a28cd43dSSascha Wildner 918a28cd43dSSascha Wildner /******************************************************************************* 919a28cd43dSSascha Wildner * Advanced dictionary and prefix API 920a28cd43dSSascha Wildner * 921a28cd43dSSascha Wildner * This API allows dictionaries to be used with ZSTD_compress2(), 922a28cd43dSSascha Wildner * ZSTD_compressStream2(), and ZSTD_decompress(). Dictionaries are sticky, and 923a28cd43dSSascha Wildner * only reset with the context is reset with ZSTD_reset_parameters or 924a28cd43dSSascha Wildner * ZSTD_reset_session_and_parameters. Prefixes are single-use. 925a28cd43dSSascha Wildner ******************************************************************************/ 926a28cd43dSSascha Wildner 927a28cd43dSSascha Wildner 928a28cd43dSSascha Wildner /*! ZSTD_CCtx_loadDictionary() : 929a28cd43dSSascha Wildner * Create an internal CDict from `dict` buffer. 930a28cd43dSSascha Wildner * Decompression will have to use same dictionary. 931a28cd43dSSascha Wildner * @result : 0, or an error code (which can be tested with ZSTD_isError()). 932a28cd43dSSascha Wildner * Special: Loading a NULL (or 0-size) dictionary invalidates previous dictionary, 933a28cd43dSSascha Wildner * meaning "return to no-dictionary mode". 934a28cd43dSSascha Wildner * Note 1 : Dictionary is sticky, it will be used for all future compressed frames. 935a28cd43dSSascha Wildner * To return to "no-dictionary" situation, load a NULL dictionary (or reset parameters). 936a28cd43dSSascha Wildner * Note 2 : Loading a dictionary involves building tables. 937a28cd43dSSascha Wildner * It's also a CPU consuming operation, with non-negligible impact on latency. 938a28cd43dSSascha Wildner * Tables are dependent on compression parameters, and for this reason, 939a28cd43dSSascha Wildner * compression parameters can no longer be changed after loading a dictionary. 940a28cd43dSSascha Wildner * Note 3 :`dict` content will be copied internally. 941a28cd43dSSascha Wildner * Use experimental ZSTD_CCtx_loadDictionary_byReference() to reference content instead. 942a28cd43dSSascha Wildner * In such a case, dictionary buffer must outlive its users. 943a28cd43dSSascha Wildner * Note 4 : Use ZSTD_CCtx_loadDictionary_advanced() 944a28cd43dSSascha Wildner * to precisely select how dictionary content must be interpreted. */ 945a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize); 946a28cd43dSSascha Wildner 947a28cd43dSSascha Wildner /*! ZSTD_CCtx_refCDict() : 948a28cd43dSSascha Wildner * Reference a prepared dictionary, to be used for all next compressed frames. 949a28cd43dSSascha Wildner * Note that compression parameters are enforced from within CDict, 950a28cd43dSSascha Wildner * and supersede any compression parameter previously set within CCtx. 951a28cd43dSSascha Wildner * The parameters ignored are labled as "superseded-by-cdict" in the ZSTD_cParameter enum docs. 952a28cd43dSSascha Wildner * The ignored parameters will be used again if the CCtx is returned to no-dictionary mode. 953a28cd43dSSascha Wildner * The dictionary will remain valid for future compressed frames using same CCtx. 954a28cd43dSSascha Wildner * @result : 0, or an error code (which can be tested with ZSTD_isError()). 955a28cd43dSSascha Wildner * Special : Referencing a NULL CDict means "return to no-dictionary mode". 956a28cd43dSSascha Wildner * Note 1 : Currently, only one dictionary can be managed. 957a28cd43dSSascha Wildner * Referencing a new dictionary effectively "discards" any previous one. 958a28cd43dSSascha Wildner * Note 2 : CDict is just referenced, its lifetime must outlive its usage within CCtx. */ 959a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_refCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); 960a28cd43dSSascha Wildner 961a28cd43dSSascha Wildner /*! ZSTD_CCtx_refPrefix() : 962a28cd43dSSascha Wildner * Reference a prefix (single-usage dictionary) for next compressed frame. 963a28cd43dSSascha Wildner * A prefix is **only used once**. Tables are discarded at end of frame (ZSTD_e_end). 964a28cd43dSSascha Wildner * Decompression will need same prefix to properly regenerate data. 965a28cd43dSSascha Wildner * Compressing with a prefix is similar in outcome as performing a diff and compressing it, 966a28cd43dSSascha Wildner * but performs much faster, especially during decompression (compression speed is tunable with compression level). 967a28cd43dSSascha Wildner * @result : 0, or an error code (which can be tested with ZSTD_isError()). 968a28cd43dSSascha Wildner * Special: Adding any prefix (including NULL) invalidates any previous prefix or dictionary 969a28cd43dSSascha Wildner * Note 1 : Prefix buffer is referenced. It **must** outlive compression. 970a28cd43dSSascha Wildner * Its content must remain unmodified during compression. 971a28cd43dSSascha Wildner * Note 2 : If the intention is to diff some large src data blob with some prior version of itself, 972a28cd43dSSascha Wildner * ensure that the window size is large enough to contain the entire source. 973a28cd43dSSascha Wildner * See ZSTD_c_windowLog. 974a28cd43dSSascha Wildner * Note 3 : Referencing a prefix involves building tables, which are dependent on compression parameters. 975a28cd43dSSascha Wildner * It's a CPU consuming operation, with non-negligible impact on latency. 976a28cd43dSSascha Wildner * If there is a need to use the same prefix multiple times, consider loadDictionary instead. 977a28cd43dSSascha Wildner * Note 4 : By default, the prefix is interpreted as raw content (ZSTD_dct_rawContent). 978a28cd43dSSascha Wildner * Use experimental ZSTD_CCtx_refPrefix_advanced() to alter dictionary interpretation. */ 979a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_refPrefix(ZSTD_CCtx* cctx, 980a28cd43dSSascha Wildner const void* prefix, size_t prefixSize); 981a28cd43dSSascha Wildner 982a28cd43dSSascha Wildner /*! ZSTD_DCtx_loadDictionary() : 983a28cd43dSSascha Wildner * Create an internal DDict from dict buffer, 984a28cd43dSSascha Wildner * to be used to decompress next frames. 985a28cd43dSSascha Wildner * The dictionary remains valid for all future frames, until explicitly invalidated. 986a28cd43dSSascha Wildner * @result : 0, or an error code (which can be tested with ZSTD_isError()). 987a28cd43dSSascha Wildner * Special : Adding a NULL (or 0-size) dictionary invalidates any previous dictionary, 988a28cd43dSSascha Wildner * meaning "return to no-dictionary mode". 989a28cd43dSSascha Wildner * Note 1 : Loading a dictionary involves building tables, 990a28cd43dSSascha Wildner * which has a non-negligible impact on CPU usage and latency. 991a28cd43dSSascha Wildner * It's recommended to "load once, use many times", to amortize the cost 992a28cd43dSSascha Wildner * Note 2 :`dict` content will be copied internally, so `dict` can be released after loading. 993a28cd43dSSascha Wildner * Use ZSTD_DCtx_loadDictionary_byReference() to reference dictionary content instead. 994a28cd43dSSascha Wildner * Note 3 : Use ZSTD_DCtx_loadDictionary_advanced() to take control of 995a28cd43dSSascha Wildner * how dictionary content is loaded and interpreted. 996a28cd43dSSascha Wildner */ 997a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); 998a28cd43dSSascha Wildner 999a28cd43dSSascha Wildner /*! ZSTD_DCtx_refDDict() : 1000a28cd43dSSascha Wildner * Reference a prepared dictionary, to be used to decompress next frames. 1001a28cd43dSSascha Wildner * The dictionary remains active for decompression of future frames using same DCtx. 1002a28cd43dSSascha Wildner * @result : 0, or an error code (which can be tested with ZSTD_isError()). 1003a28cd43dSSascha Wildner * Note 1 : Currently, only one dictionary can be managed. 1004a28cd43dSSascha Wildner * Referencing a new dictionary effectively "discards" any previous one. 1005a28cd43dSSascha Wildner * Special: referencing a NULL DDict means "return to no-dictionary mode". 1006a28cd43dSSascha Wildner * Note 2 : DDict is just referenced, its lifetime must outlive its usage from DCtx. 1007a28cd43dSSascha Wildner */ 1008a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DCtx_refDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict); 1009a28cd43dSSascha Wildner 1010a28cd43dSSascha Wildner /*! ZSTD_DCtx_refPrefix() : 1011a28cd43dSSascha Wildner * Reference a prefix (single-usage dictionary) to decompress next frame. 1012a28cd43dSSascha Wildner * This is the reverse operation of ZSTD_CCtx_refPrefix(), 1013a28cd43dSSascha Wildner * and must use the same prefix as the one used during compression. 1014a28cd43dSSascha Wildner * Prefix is **only used once**. Reference is discarded at end of frame. 1015a28cd43dSSascha Wildner * End of frame is reached when ZSTD_decompressStream() returns 0. 1016a28cd43dSSascha Wildner * @result : 0, or an error code (which can be tested with ZSTD_isError()). 1017a28cd43dSSascha Wildner * Note 1 : Adding any prefix (including NULL) invalidates any previously set prefix or dictionary 1018a28cd43dSSascha Wildner * Note 2 : Prefix buffer is referenced. It **must** outlive decompression. 1019a28cd43dSSascha Wildner * Prefix buffer must remain unmodified up to the end of frame, 1020a28cd43dSSascha Wildner * reached when ZSTD_decompressStream() returns 0. 1021a28cd43dSSascha Wildner * Note 3 : By default, the prefix is treated as raw content (ZSTD_dct_rawContent). 1022a28cd43dSSascha Wildner * Use ZSTD_CCtx_refPrefix_advanced() to alter dictMode (Experimental section) 1023a28cd43dSSascha Wildner * Note 4 : Referencing a raw content prefix has almost no cpu nor memory cost. 1024a28cd43dSSascha Wildner * A full dictionary is more costly, as it requires building tables. 1025a28cd43dSSascha Wildner */ 1026a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DCtx_refPrefix(ZSTD_DCtx* dctx, 1027a28cd43dSSascha Wildner const void* prefix, size_t prefixSize); 1028a28cd43dSSascha Wildner 1029a28cd43dSSascha Wildner /* === Memory management === */ 1030a28cd43dSSascha Wildner 1031a28cd43dSSascha Wildner /*! ZSTD_sizeof_*() : 1032a28cd43dSSascha Wildner * These functions give the _current_ memory usage of selected object. 1033a28cd43dSSascha Wildner * Note that object memory usage can evolve (increase or decrease) over time. */ 1034a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_sizeof_CCtx(const ZSTD_CCtx* cctx); 1035a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_sizeof_DCtx(const ZSTD_DCtx* dctx); 1036a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_sizeof_CStream(const ZSTD_CStream* zcs); 1037a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_sizeof_DStream(const ZSTD_DStream* zds); 1038a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_sizeof_CDict(const ZSTD_CDict* cdict); 1039a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); 1040a28cd43dSSascha Wildner 1041a28cd43dSSascha Wildner #endif /* ZSTD_H_235446 */ 1042a28cd43dSSascha Wildner 1043a28cd43dSSascha Wildner 1044a28cd43dSSascha Wildner /* ************************************************************************************** 1045a28cd43dSSascha Wildner * ADVANCED AND EXPERIMENTAL FUNCTIONS 1046a28cd43dSSascha Wildner **************************************************************************************** 1047a28cd43dSSascha Wildner * The definitions in the following section are considered experimental. 1048a28cd43dSSascha Wildner * They are provided for advanced scenarios. 1049a28cd43dSSascha Wildner * They should never be used with a dynamic library, as prototypes may change in the future. 1050a28cd43dSSascha Wildner * Use them only in association with static linking. 1051a28cd43dSSascha Wildner * ***************************************************************************************/ 1052a28cd43dSSascha Wildner 1053a28cd43dSSascha Wildner #if defined(ZSTD_STATIC_LINKING_ONLY) && !defined(ZSTD_H_ZSTD_STATIC_LINKING_ONLY) 1054a28cd43dSSascha Wildner #define ZSTD_H_ZSTD_STATIC_LINKING_ONLY 1055a28cd43dSSascha Wildner 1056a28cd43dSSascha Wildner /**************************************************************************************** 1057a28cd43dSSascha Wildner * experimental API (static linking only) 1058a28cd43dSSascha Wildner **************************************************************************************** 1059a28cd43dSSascha Wildner * The following symbols and constants 1060a28cd43dSSascha Wildner * are not planned to join "stable API" status in the near future. 1061a28cd43dSSascha Wildner * They can still change in future versions. 1062a28cd43dSSascha Wildner * Some of them are planned to remain in the static_only section indefinitely. 1063a28cd43dSSascha Wildner * Some of them might be removed in the future (especially when redundant with existing stable functions) 1064a28cd43dSSascha Wildner * ***************************************************************************************/ 1065a28cd43dSSascha Wildner 1066a28cd43dSSascha Wildner #define ZSTD_FRAMEHEADERSIZE_PREFIX(format) ((format) == ZSTD_f_zstd1 ? 5 : 1) /* minimum input size required to query frame header size */ 1067a28cd43dSSascha Wildner #define ZSTD_FRAMEHEADERSIZE_MIN(format) ((format) == ZSTD_f_zstd1 ? 6 : 2) 1068a28cd43dSSascha Wildner #define ZSTD_FRAMEHEADERSIZE_MAX 18 /* can be useful for static allocation */ 1069a28cd43dSSascha Wildner #define ZSTD_SKIPPABLEHEADERSIZE 8 1070a28cd43dSSascha Wildner 1071a28cd43dSSascha Wildner /* compression parameter bounds */ 1072a28cd43dSSascha Wildner #define ZSTD_WINDOWLOG_MAX_32 30 1073a28cd43dSSascha Wildner #define ZSTD_WINDOWLOG_MAX_64 31 1074a28cd43dSSascha Wildner #define ZSTD_WINDOWLOG_MAX ((int)(sizeof(size_t) == 4 ? ZSTD_WINDOWLOG_MAX_32 : ZSTD_WINDOWLOG_MAX_64)) 1075a28cd43dSSascha Wildner #define ZSTD_WINDOWLOG_MIN 10 1076a28cd43dSSascha Wildner #define ZSTD_HASHLOG_MAX ((ZSTD_WINDOWLOG_MAX < 30) ? ZSTD_WINDOWLOG_MAX : 30) 1077a28cd43dSSascha Wildner #define ZSTD_HASHLOG_MIN 6 1078a28cd43dSSascha Wildner #define ZSTD_CHAINLOG_MAX_32 29 1079a28cd43dSSascha Wildner #define ZSTD_CHAINLOG_MAX_64 30 1080a28cd43dSSascha Wildner #define ZSTD_CHAINLOG_MAX ((int)(sizeof(size_t) == 4 ? ZSTD_CHAINLOG_MAX_32 : ZSTD_CHAINLOG_MAX_64)) 1081a28cd43dSSascha Wildner #define ZSTD_CHAINLOG_MIN ZSTD_HASHLOG_MIN 1082a28cd43dSSascha Wildner #define ZSTD_SEARCHLOG_MAX (ZSTD_WINDOWLOG_MAX-1) 1083a28cd43dSSascha Wildner #define ZSTD_SEARCHLOG_MIN 1 1084a28cd43dSSascha Wildner #define ZSTD_MINMATCH_MAX 7 /* only for ZSTD_fast, other strategies are limited to 6 */ 1085a28cd43dSSascha Wildner #define ZSTD_MINMATCH_MIN 3 /* only for ZSTD_btopt+, faster strategies are limited to 4 */ 1086a28cd43dSSascha Wildner #define ZSTD_TARGETLENGTH_MAX ZSTD_BLOCKSIZE_MAX 1087a28cd43dSSascha Wildner #define ZSTD_TARGETLENGTH_MIN 0 /* note : comparing this constant to an unsigned results in a tautological test */ 1088a28cd43dSSascha Wildner #define ZSTD_STRATEGY_MIN ZSTD_fast 1089a28cd43dSSascha Wildner #define ZSTD_STRATEGY_MAX ZSTD_btultra2 1090a28cd43dSSascha Wildner 1091a28cd43dSSascha Wildner 1092a28cd43dSSascha Wildner #define ZSTD_OVERLAPLOG_MIN 0 1093a28cd43dSSascha Wildner #define ZSTD_OVERLAPLOG_MAX 9 1094a28cd43dSSascha Wildner 1095a28cd43dSSascha Wildner #define ZSTD_WINDOWLOG_LIMIT_DEFAULT 27 /* by default, the streaming decoder will refuse any frame 1096a28cd43dSSascha Wildner * requiring larger than (1<<ZSTD_WINDOWLOG_LIMIT_DEFAULT) window size, 1097a28cd43dSSascha Wildner * to preserve host's memory from unreasonable requirements. 1098a28cd43dSSascha Wildner * This limit can be overridden using ZSTD_DCtx_setParameter(,ZSTD_d_windowLogMax,). 1099a28cd43dSSascha Wildner * The limit does not apply for one-pass decoders (such as ZSTD_decompress()), since no additional memory is allocated */ 1100a28cd43dSSascha Wildner 1101a28cd43dSSascha Wildner 1102a28cd43dSSascha Wildner /* LDM parameter bounds */ 1103a28cd43dSSascha Wildner #define ZSTD_LDM_HASHLOG_MIN ZSTD_HASHLOG_MIN 1104a28cd43dSSascha Wildner #define ZSTD_LDM_HASHLOG_MAX ZSTD_HASHLOG_MAX 1105a28cd43dSSascha Wildner #define ZSTD_LDM_MINMATCH_MIN 4 1106a28cd43dSSascha Wildner #define ZSTD_LDM_MINMATCH_MAX 4096 1107a28cd43dSSascha Wildner #define ZSTD_LDM_BUCKETSIZELOG_MIN 1 1108a28cd43dSSascha Wildner #define ZSTD_LDM_BUCKETSIZELOG_MAX 8 1109a28cd43dSSascha Wildner #define ZSTD_LDM_HASHRATELOG_MIN 0 1110a28cd43dSSascha Wildner #define ZSTD_LDM_HASHRATELOG_MAX (ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN) 1111a28cd43dSSascha Wildner 1112a28cd43dSSascha Wildner /* Advanced parameter bounds */ 1113a28cd43dSSascha Wildner #define ZSTD_TARGETCBLOCKSIZE_MIN 64 1114a28cd43dSSascha Wildner #define ZSTD_TARGETCBLOCKSIZE_MAX ZSTD_BLOCKSIZE_MAX 1115a28cd43dSSascha Wildner #define ZSTD_SRCSIZEHINT_MIN 0 1116a28cd43dSSascha Wildner #define ZSTD_SRCSIZEHINT_MAX INT_MAX 1117a28cd43dSSascha Wildner 1118a28cd43dSSascha Wildner /* internal */ 1119a28cd43dSSascha Wildner #define ZSTD_HASHLOG3_MAX 17 1120a28cd43dSSascha Wildner 1121a28cd43dSSascha Wildner 1122a28cd43dSSascha Wildner /* --- Advanced types --- */ 1123a28cd43dSSascha Wildner 1124a28cd43dSSascha Wildner typedef struct ZSTD_CCtx_params_s ZSTD_CCtx_params; 1125a28cd43dSSascha Wildner 1126a28cd43dSSascha Wildner typedef struct { 1127a28cd43dSSascha Wildner unsigned int offset; /* The offset of the match. (NOT the same as the offset code) 1128a28cd43dSSascha Wildner * If offset == 0 and matchLength == 0, this sequence represents the last 1129a28cd43dSSascha Wildner * literals in the block of litLength size. 1130a28cd43dSSascha Wildner */ 1131a28cd43dSSascha Wildner 1132a28cd43dSSascha Wildner unsigned int litLength; /* Literal length of the sequence. */ 1133a28cd43dSSascha Wildner unsigned int matchLength; /* Match length of the sequence. */ 1134a28cd43dSSascha Wildner 1135a28cd43dSSascha Wildner /* Note: Users of this API may provide a sequence with matchLength == litLength == offset == 0. 1136a28cd43dSSascha Wildner * In this case, we will treat the sequence as a marker for a block boundary. 1137a28cd43dSSascha Wildner */ 1138a28cd43dSSascha Wildner 1139a28cd43dSSascha Wildner unsigned int rep; /* Represents which repeat offset is represented by the field 'offset'. 1140a28cd43dSSascha Wildner * Ranges from [0, 3]. 1141a28cd43dSSascha Wildner * 1142a28cd43dSSascha Wildner * Repeat offsets are essentially previous offsets from previous sequences sorted in 1143a28cd43dSSascha Wildner * recency order. For more detail, see doc/zstd_compression_format.md 1144a28cd43dSSascha Wildner * 1145a28cd43dSSascha Wildner * If rep == 0, then 'offset' does not contain a repeat offset. 1146a28cd43dSSascha Wildner * If rep > 0: 1147a28cd43dSSascha Wildner * If litLength != 0: 1148a28cd43dSSascha Wildner * rep == 1 --> offset == repeat_offset_1 1149a28cd43dSSascha Wildner * rep == 2 --> offset == repeat_offset_2 1150a28cd43dSSascha Wildner * rep == 3 --> offset == repeat_offset_3 1151a28cd43dSSascha Wildner * If litLength == 0: 1152a28cd43dSSascha Wildner * rep == 1 --> offset == repeat_offset_2 1153a28cd43dSSascha Wildner * rep == 2 --> offset == repeat_offset_3 1154a28cd43dSSascha Wildner * rep == 3 --> offset == repeat_offset_1 - 1 1155a28cd43dSSascha Wildner * 1156a28cd43dSSascha Wildner * Note: This field is optional. ZSTD_generateSequences() will calculate the value of 1157a28cd43dSSascha Wildner * 'rep', but repeat offsets do not necessarily need to be calculated from an external 1158a28cd43dSSascha Wildner * sequence provider's perspective. For example, ZSTD_compressSequences() does not 1159a28cd43dSSascha Wildner * use this 'rep' field at all (as of now). 1160a28cd43dSSascha Wildner */ 1161a28cd43dSSascha Wildner } ZSTD_Sequence; 1162a28cd43dSSascha Wildner 1163a28cd43dSSascha Wildner typedef struct { 1164a28cd43dSSascha Wildner unsigned windowLog; /**< largest match distance : larger == more compression, more memory needed during decompression */ 1165a28cd43dSSascha Wildner unsigned chainLog; /**< fully searched segment : larger == more compression, slower, more memory (useless for fast) */ 1166a28cd43dSSascha Wildner unsigned hashLog; /**< dispatch table : larger == faster, more memory */ 1167a28cd43dSSascha Wildner unsigned searchLog; /**< nb of searches : larger == more compression, slower */ 1168a28cd43dSSascha Wildner unsigned minMatch; /**< match length searched : larger == faster decompression, sometimes less compression */ 1169a28cd43dSSascha Wildner unsigned targetLength; /**< acceptable match size for optimal parser (only) : larger == more compression, slower */ 1170a28cd43dSSascha Wildner ZSTD_strategy strategy; /**< see ZSTD_strategy definition above */ 1171a28cd43dSSascha Wildner } ZSTD_compressionParameters; 1172a28cd43dSSascha Wildner 1173a28cd43dSSascha Wildner typedef struct { 1174a28cd43dSSascha Wildner int contentSizeFlag; /**< 1: content size will be in frame header (when known) */ 1175a28cd43dSSascha Wildner int checksumFlag; /**< 1: generate a 32-bits checksum using XXH64 algorithm at end of frame, for error detection */ 1176a28cd43dSSascha Wildner int noDictIDFlag; /**< 1: no dictID will be saved into frame header (dictID is only useful for dictionary compression) */ 1177a28cd43dSSascha Wildner } ZSTD_frameParameters; 1178a28cd43dSSascha Wildner 1179a28cd43dSSascha Wildner typedef struct { 1180a28cd43dSSascha Wildner ZSTD_compressionParameters cParams; 1181a28cd43dSSascha Wildner ZSTD_frameParameters fParams; 1182a28cd43dSSascha Wildner } ZSTD_parameters; 1183a28cd43dSSascha Wildner 1184a28cd43dSSascha Wildner typedef enum { 1185a28cd43dSSascha Wildner ZSTD_dct_auto = 0, /* dictionary is "full" when starting with ZSTD_MAGIC_DICTIONARY, otherwise it is "rawContent" */ 1186a28cd43dSSascha Wildner ZSTD_dct_rawContent = 1, /* ensures dictionary is always loaded as rawContent, even if it starts with ZSTD_MAGIC_DICTIONARY */ 1187a28cd43dSSascha Wildner ZSTD_dct_fullDict = 2 /* refuses to load a dictionary if it does not respect Zstandard's specification, starting with ZSTD_MAGIC_DICTIONARY */ 1188a28cd43dSSascha Wildner } ZSTD_dictContentType_e; 1189a28cd43dSSascha Wildner 1190a28cd43dSSascha Wildner typedef enum { 1191a28cd43dSSascha Wildner ZSTD_dlm_byCopy = 0, /**< Copy dictionary content internally */ 1192a28cd43dSSascha Wildner ZSTD_dlm_byRef = 1 /**< Reference dictionary content -- the dictionary buffer must outlive its users. */ 1193a28cd43dSSascha Wildner } ZSTD_dictLoadMethod_e; 1194a28cd43dSSascha Wildner 1195a28cd43dSSascha Wildner typedef enum { 1196a28cd43dSSascha Wildner ZSTD_f_zstd1 = 0, /* zstd frame format, specified in zstd_compression_format.md (default) */ 1197a28cd43dSSascha Wildner ZSTD_f_zstd1_magicless = 1 /* Variant of zstd frame format, without initial 4-bytes magic number. 1198a28cd43dSSascha Wildner * Useful to save 4 bytes per generated frame. 1199a28cd43dSSascha Wildner * Decoder cannot recognise automatically this format, requiring this instruction. */ 1200a28cd43dSSascha Wildner } ZSTD_format_e; 1201a28cd43dSSascha Wildner 1202a28cd43dSSascha Wildner typedef enum { 1203a28cd43dSSascha Wildner /* Note: this enum controls ZSTD_d_forceIgnoreChecksum */ 1204a28cd43dSSascha Wildner ZSTD_d_validateChecksum = 0, 1205a28cd43dSSascha Wildner ZSTD_d_ignoreChecksum = 1 1206a28cd43dSSascha Wildner } ZSTD_forceIgnoreChecksum_e; 1207a28cd43dSSascha Wildner 1208a28cd43dSSascha Wildner typedef enum { 1209a28cd43dSSascha Wildner /* Note: this enum and the behavior it controls are effectively internal 1210a28cd43dSSascha Wildner * implementation details of the compressor. They are expected to continue 1211a28cd43dSSascha Wildner * to evolve and should be considered only in the context of extremely 1212a28cd43dSSascha Wildner * advanced performance tuning. 1213a28cd43dSSascha Wildner * 1214a28cd43dSSascha Wildner * Zstd currently supports the use of a CDict in three ways: 1215a28cd43dSSascha Wildner * 1216a28cd43dSSascha Wildner * - The contents of the CDict can be copied into the working context. This 1217a28cd43dSSascha Wildner * means that the compression can search both the dictionary and input 1218a28cd43dSSascha Wildner * while operating on a single set of internal tables. This makes 1219a28cd43dSSascha Wildner * the compression faster per-byte of input. However, the initial copy of 1220a28cd43dSSascha Wildner * the CDict's tables incurs a fixed cost at the beginning of the 1221a28cd43dSSascha Wildner * compression. For small compressions (< 8 KB), that copy can dominate 1222a28cd43dSSascha Wildner * the cost of the compression. 1223a28cd43dSSascha Wildner * 1224a28cd43dSSascha Wildner * - The CDict's tables can be used in-place. In this model, compression is 1225a28cd43dSSascha Wildner * slower per input byte, because the compressor has to search two sets of 1226a28cd43dSSascha Wildner * tables. However, this model incurs no start-up cost (as long as the 1227a28cd43dSSascha Wildner * working context's tables can be reused). For small inputs, this can be 1228a28cd43dSSascha Wildner * faster than copying the CDict's tables. 1229a28cd43dSSascha Wildner * 1230a28cd43dSSascha Wildner * - The CDict's tables are not used at all, and instead we use the working 1231a28cd43dSSascha Wildner * context alone to reload the dictionary and use params based on the source 1232a28cd43dSSascha Wildner * size. See ZSTD_compress_insertDictionary() and ZSTD_compress_usingDict(). 1233a28cd43dSSascha Wildner * This method is effective when the dictionary sizes are very small relative 1234a28cd43dSSascha Wildner * to the input size, and the input size is fairly large to begin with. 1235a28cd43dSSascha Wildner * 1236a28cd43dSSascha Wildner * Zstd has a simple internal heuristic that selects which strategy to use 1237a28cd43dSSascha Wildner * at the beginning of a compression. However, if experimentation shows that 1238a28cd43dSSascha Wildner * Zstd is making poor choices, it is possible to override that choice with 1239a28cd43dSSascha Wildner * this enum. 1240a28cd43dSSascha Wildner */ 1241a28cd43dSSascha Wildner ZSTD_dictDefaultAttach = 0, /* Use the default heuristic. */ 1242a28cd43dSSascha Wildner ZSTD_dictForceAttach = 1, /* Never copy the dictionary. */ 1243a28cd43dSSascha Wildner ZSTD_dictForceCopy = 2, /* Always copy the dictionary. */ 1244a28cd43dSSascha Wildner ZSTD_dictForceLoad = 3 /* Always reload the dictionary */ 1245a28cd43dSSascha Wildner } ZSTD_dictAttachPref_e; 1246a28cd43dSSascha Wildner 1247a28cd43dSSascha Wildner typedef enum { 1248a28cd43dSSascha Wildner ZSTD_lcm_auto = 0, /**< Automatically determine the compression mode based on the compression level. 1249a28cd43dSSascha Wildner * Negative compression levels will be uncompressed, and positive compression 1250a28cd43dSSascha Wildner * levels will be compressed. */ 1251a28cd43dSSascha Wildner ZSTD_lcm_huffman = 1, /**< Always attempt Huffman compression. Uncompressed literals will still be 1252a28cd43dSSascha Wildner * emitted if Huffman compression is not profitable. */ 1253a28cd43dSSascha Wildner ZSTD_lcm_uncompressed = 2 /**< Always emit uncompressed literals. */ 1254a28cd43dSSascha Wildner } ZSTD_literalCompressionMode_e; 1255a28cd43dSSascha Wildner 1256a28cd43dSSascha Wildner 1257a28cd43dSSascha Wildner /*************************************** 1258a28cd43dSSascha Wildner * Frame size functions 1259a28cd43dSSascha Wildner ***************************************/ 1260a28cd43dSSascha Wildner 1261a28cd43dSSascha Wildner /*! ZSTD_findDecompressedSize() : 1262a28cd43dSSascha Wildner * `src` should point to the start of a series of ZSTD encoded and/or skippable frames 1263a28cd43dSSascha Wildner * `srcSize` must be the _exact_ size of this series 1264a28cd43dSSascha Wildner * (i.e. there should be a frame boundary at `src + srcSize`) 1265a28cd43dSSascha Wildner * @return : - decompressed size of all data in all successive frames 1266a28cd43dSSascha Wildner * - if the decompressed size cannot be determined: ZSTD_CONTENTSIZE_UNKNOWN 1267a28cd43dSSascha Wildner * - if an error occurred: ZSTD_CONTENTSIZE_ERROR 1268a28cd43dSSascha Wildner * 1269a28cd43dSSascha Wildner * note 1 : decompressed size is an optional field, that may not be present, especially in streaming mode. 1270a28cd43dSSascha Wildner * When `return==ZSTD_CONTENTSIZE_UNKNOWN`, data to decompress could be any size. 1271a28cd43dSSascha Wildner * In which case, it's necessary to use streaming mode to decompress data. 1272a28cd43dSSascha Wildner * note 2 : decompressed size is always present when compression is done with ZSTD_compress() 1273a28cd43dSSascha Wildner * note 3 : decompressed size can be very large (64-bits value), 1274a28cd43dSSascha Wildner * potentially larger than what local system can handle as a single memory segment. 1275a28cd43dSSascha Wildner * In which case, it's necessary to use streaming mode to decompress data. 1276a28cd43dSSascha Wildner * note 4 : If source is untrusted, decompressed size could be wrong or intentionally modified. 1277a28cd43dSSascha Wildner * Always ensure result fits within application's authorized limits. 1278a28cd43dSSascha Wildner * Each application can set its own limits. 1279a28cd43dSSascha Wildner * note 5 : ZSTD_findDecompressedSize handles multiple frames, and so it must traverse the input to 1280a28cd43dSSascha Wildner * read each contained frame header. This is fast as most of the data is skipped, 1281a28cd43dSSascha Wildner * however it does mean that all frame data must be present and valid. */ 1282a28cd43dSSascha Wildner ZSTDLIB_API unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize); 1283a28cd43dSSascha Wildner 1284a28cd43dSSascha Wildner /*! ZSTD_decompressBound() : 1285a28cd43dSSascha Wildner * `src` should point to the start of a series of ZSTD encoded and/or skippable frames 1286a28cd43dSSascha Wildner * `srcSize` must be the _exact_ size of this series 1287a28cd43dSSascha Wildner * (i.e. there should be a frame boundary at `src + srcSize`) 1288a28cd43dSSascha Wildner * @return : - upper-bound for the decompressed size of all data in all successive frames 1289a28cd43dSSascha Wildner * - if an error occured: ZSTD_CONTENTSIZE_ERROR 1290a28cd43dSSascha Wildner * 1291a28cd43dSSascha Wildner * note 1 : an error can occur if `src` contains an invalid or incorrectly formatted frame. 1292a28cd43dSSascha Wildner * note 2 : the upper-bound is exact when the decompressed size field is available in every ZSTD encoded frame of `src`. 1293a28cd43dSSascha Wildner * in this case, `ZSTD_findDecompressedSize` and `ZSTD_decompressBound` return the same value. 1294a28cd43dSSascha Wildner * note 3 : when the decompressed size field isn't available, the upper-bound for that frame is calculated by: 1295a28cd43dSSascha Wildner * upper-bound = # blocks * min(128 KB, Window_Size) 1296a28cd43dSSascha Wildner */ 1297a28cd43dSSascha Wildner ZSTDLIB_API unsigned long long ZSTD_decompressBound(const void* src, size_t srcSize); 1298a28cd43dSSascha Wildner 1299a28cd43dSSascha Wildner /*! ZSTD_frameHeaderSize() : 1300a28cd43dSSascha Wildner * srcSize must be >= ZSTD_FRAMEHEADERSIZE_PREFIX. 1301a28cd43dSSascha Wildner * @return : size of the Frame Header, 1302a28cd43dSSascha Wildner * or an error code (if srcSize is too small) */ 1303a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize); 1304a28cd43dSSascha Wildner 1305a28cd43dSSascha Wildner typedef enum { 1306a28cd43dSSascha Wildner ZSTD_sf_noBlockDelimiters = 0, /* Representation of ZSTD_Sequence has no block delimiters, sequences only */ 1307a28cd43dSSascha Wildner ZSTD_sf_explicitBlockDelimiters = 1 /* Representation of ZSTD_Sequence contains explicit block delimiters */ 1308a28cd43dSSascha Wildner } ZSTD_sequenceFormat_e; 1309a28cd43dSSascha Wildner 1310a28cd43dSSascha Wildner /*! ZSTD_generateSequences() : 1311a28cd43dSSascha Wildner * Generate sequences using ZSTD_compress2, given a source buffer. 1312a28cd43dSSascha Wildner * 1313a28cd43dSSascha Wildner * Each block will end with a dummy sequence 1314a28cd43dSSascha Wildner * with offset == 0, matchLength == 0, and litLength == length of last literals. 1315a28cd43dSSascha Wildner * litLength may be == 0, and if so, then the sequence of (of: 0 ml: 0 ll: 0) 1316a28cd43dSSascha Wildner * simply acts as a block delimiter. 1317a28cd43dSSascha Wildner * 1318a28cd43dSSascha Wildner * zc can be used to insert custom compression params. 1319a28cd43dSSascha Wildner * This function invokes ZSTD_compress2 1320a28cd43dSSascha Wildner * 1321a28cd43dSSascha Wildner * The output of this function can be fed into ZSTD_compressSequences() with CCtx 1322a28cd43dSSascha Wildner * setting of ZSTD_c_blockDelimiters as ZSTD_sf_explicitBlockDelimiters 1323a28cd43dSSascha Wildner * @return : number of sequences generated 1324a28cd43dSSascha Wildner */ 1325a28cd43dSSascha Wildner 1326a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_generateSequences(ZSTD_CCtx* zc, ZSTD_Sequence* outSeqs, 1327a28cd43dSSascha Wildner size_t outSeqsSize, const void* src, size_t srcSize); 1328a28cd43dSSascha Wildner 1329a28cd43dSSascha Wildner /*! ZSTD_mergeBlockDelimiters() : 1330a28cd43dSSascha Wildner * Given an array of ZSTD_Sequence, remove all sequences that represent block delimiters/last literals 1331a28cd43dSSascha Wildner * by merging them into into the literals of the next sequence. 1332a28cd43dSSascha Wildner * 1333a28cd43dSSascha Wildner * As such, the final generated result has no explicit representation of block boundaries, 1334a28cd43dSSascha Wildner * and the final last literals segment is not represented in the sequences. 1335a28cd43dSSascha Wildner * 1336a28cd43dSSascha Wildner * The output of this function can be fed into ZSTD_compressSequences() with CCtx 1337a28cd43dSSascha Wildner * setting of ZSTD_c_blockDelimiters as ZSTD_sf_noBlockDelimiters 1338a28cd43dSSascha Wildner * @return : number of sequences left after merging 1339a28cd43dSSascha Wildner */ 1340a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_mergeBlockDelimiters(ZSTD_Sequence* sequences, size_t seqsSize); 1341a28cd43dSSascha Wildner 1342a28cd43dSSascha Wildner /*! ZSTD_compressSequences() : 1343a28cd43dSSascha Wildner * Compress an array of ZSTD_Sequence, generated from the original source buffer, into dst. 1344a28cd43dSSascha Wildner * If a dictionary is included, then the cctx should reference the dict. (see: ZSTD_CCtx_refCDict(), ZSTD_CCtx_loadDictionary(), etc.) 1345a28cd43dSSascha Wildner * The entire source is compressed into a single frame. 1346a28cd43dSSascha Wildner * 1347a28cd43dSSascha Wildner * The compression behavior changes based on cctx params. In particular: 1348a28cd43dSSascha Wildner * If ZSTD_c_blockDelimiters == ZSTD_sf_noBlockDelimiters, the array of ZSTD_Sequence is expected to contain 1349a28cd43dSSascha Wildner * no block delimiters (defined in ZSTD_Sequence). Block boundaries are roughly determined based on 1350a28cd43dSSascha Wildner * the block size derived from the cctx, and sequences may be split. This is the default setting. 1351a28cd43dSSascha Wildner * 1352a28cd43dSSascha Wildner * If ZSTD_c_blockDelimiters == ZSTD_sf_explicitBlockDelimiters, the array of ZSTD_Sequence is expected to contain 1353a28cd43dSSascha Wildner * block delimiters (defined in ZSTD_Sequence). Behavior is undefined if no block delimiters are provided. 1354a28cd43dSSascha Wildner * 1355a28cd43dSSascha Wildner * If ZSTD_c_validateSequences == 0, this function will blindly accept the sequences provided. Invalid sequences cause undefined 1356a28cd43dSSascha Wildner * behavior. If ZSTD_c_validateSequences == 1, then if sequence is invalid (see doc/zstd_compression_format.md for 1357a28cd43dSSascha Wildner * specifics regarding offset/matchlength requirements) then the function will bail out and return an error. 1358a28cd43dSSascha Wildner * 1359a28cd43dSSascha Wildner * In addition to the two adjustable experimental params, there are other important cctx params. 1360a28cd43dSSascha Wildner * - ZSTD_c_minMatch MUST be set as less than or equal to the smallest match generated by the match finder. It has a minimum value of ZSTD_MINMATCH_MIN. 1361a28cd43dSSascha Wildner * - ZSTD_c_compressionLevel accordingly adjusts the strength of the entropy coder, as it would in typical compression. 1362a28cd43dSSascha Wildner * - ZSTD_c_windowLog affects offset validation: this function will return an error at higher debug levels if a provided offset 1363a28cd43dSSascha Wildner * is larger than what the spec allows for a given window log and dictionary (if present). See: doc/zstd_compression_format.md 1364a28cd43dSSascha Wildner * 1365a28cd43dSSascha Wildner * Note: Repcodes are, as of now, always re-calculated within this function, so ZSTD_Sequence::rep is unused. 1366a28cd43dSSascha Wildner * Note 2: Once we integrate ability to ingest repcodes, the explicit block delims mode must respect those repcodes exactly, 1367a28cd43dSSascha Wildner * and cannot emit an RLE block that disagrees with the repcode history 1368a28cd43dSSascha Wildner * @return : final compressed size or a ZSTD error. 1369a28cd43dSSascha Wildner */ 1370a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size_t dstSize, 1371a28cd43dSSascha Wildner const ZSTD_Sequence* inSeqs, size_t inSeqsSize, 1372a28cd43dSSascha Wildner const void* src, size_t srcSize); 1373a28cd43dSSascha Wildner 1374a28cd43dSSascha Wildner 1375a28cd43dSSascha Wildner /*************************************** 1376a28cd43dSSascha Wildner * Memory management 1377a28cd43dSSascha Wildner ***************************************/ 1378a28cd43dSSascha Wildner 1379a28cd43dSSascha Wildner /*! ZSTD_estimate*() : 1380a28cd43dSSascha Wildner * These functions make it possible to estimate memory usage 1381a28cd43dSSascha Wildner * of a future {D,C}Ctx, before its creation. 1382a28cd43dSSascha Wildner * 1383a28cd43dSSascha Wildner * ZSTD_estimateCCtxSize() will provide a memory budget large enough 1384a28cd43dSSascha Wildner * for any compression level up to selected one. 1385a28cd43dSSascha Wildner * Note : Unlike ZSTD_estimateCStreamSize*(), this estimate 1386a28cd43dSSascha Wildner * does not include space for a window buffer. 1387a28cd43dSSascha Wildner * Therefore, the estimation is only guaranteed for single-shot compressions, not streaming. 1388a28cd43dSSascha Wildner * The estimate will assume the input may be arbitrarily large, 1389a28cd43dSSascha Wildner * which is the worst case. 1390a28cd43dSSascha Wildner * 1391a28cd43dSSascha Wildner * When srcSize can be bound by a known and rather "small" value, 1392a28cd43dSSascha Wildner * this fact can be used to provide a tighter estimation 1393a28cd43dSSascha Wildner * because the CCtx compression context will need less memory. 1394a28cd43dSSascha Wildner * This tighter estimation can be provided by more advanced functions 1395a28cd43dSSascha Wildner * ZSTD_estimateCCtxSize_usingCParams(), which can be used in tandem with ZSTD_getCParams(), 1396a28cd43dSSascha Wildner * and ZSTD_estimateCCtxSize_usingCCtxParams(), which can be used in tandem with ZSTD_CCtxParams_setParameter(). 1397a28cd43dSSascha Wildner * Both can be used to estimate memory using custom compression parameters and arbitrary srcSize limits. 1398a28cd43dSSascha Wildner * 1399a28cd43dSSascha Wildner * Note 2 : only single-threaded compression is supported. 1400a28cd43dSSascha Wildner * ZSTD_estimateCCtxSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1. 1401a28cd43dSSascha Wildner */ 1402a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateCCtxSize(int compressionLevel); 1403a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams); 1404a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params); 1405a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateDCtxSize(void); 1406a28cd43dSSascha Wildner 1407a28cd43dSSascha Wildner /*! ZSTD_estimateCStreamSize() : 1408a28cd43dSSascha Wildner * ZSTD_estimateCStreamSize() will provide a budget large enough for any compression level up to selected one. 1409a28cd43dSSascha Wildner * It will also consider src size to be arbitrarily "large", which is worst case. 1410a28cd43dSSascha Wildner * If srcSize is known to always be small, ZSTD_estimateCStreamSize_usingCParams() can provide a tighter estimation. 1411a28cd43dSSascha Wildner * ZSTD_estimateCStreamSize_usingCParams() can be used in tandem with ZSTD_getCParams() to create cParams from compressionLevel. 1412a28cd43dSSascha Wildner * ZSTD_estimateCStreamSize_usingCCtxParams() can be used in tandem with ZSTD_CCtxParams_setParameter(). Only single-threaded compression is supported. This function will return an error code if ZSTD_c_nbWorkers is >= 1. 1413a28cd43dSSascha Wildner * Note : CStream size estimation is only correct for single-threaded compression. 1414a28cd43dSSascha Wildner * ZSTD_DStream memory budget depends on window Size. 1415a28cd43dSSascha Wildner * This information can be passed manually, using ZSTD_estimateDStreamSize, 1416a28cd43dSSascha Wildner * or deducted from a valid frame Header, using ZSTD_estimateDStreamSize_fromFrame(); 1417a28cd43dSSascha Wildner * Note : if streaming is init with function ZSTD_init?Stream_usingDict(), 1418a28cd43dSSascha Wildner * an internal ?Dict will be created, which additional size is not estimated here. 1419a28cd43dSSascha Wildner * In this case, get total size by adding ZSTD_estimate?DictSize */ 1420a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateCStreamSize(int compressionLevel); 1421a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams); 1422a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateCStreamSize_usingCCtxParams(const ZSTD_CCtx_params* params); 1423a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateDStreamSize(size_t windowSize); 1424a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize); 1425a28cd43dSSascha Wildner 1426a28cd43dSSascha Wildner /*! ZSTD_estimate?DictSize() : 1427a28cd43dSSascha Wildner * ZSTD_estimateCDictSize() will bet that src size is relatively "small", and content is copied, like ZSTD_createCDict(). 1428a28cd43dSSascha Wildner * ZSTD_estimateCDictSize_advanced() makes it possible to control compression parameters precisely, like ZSTD_createCDict_advanced(). 1429a28cd43dSSascha Wildner * Note : dictionaries created by reference (`ZSTD_dlm_byRef`) are logically smaller. 1430a28cd43dSSascha Wildner */ 1431a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateCDictSize(size_t dictSize, int compressionLevel); 1432a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateCDictSize_advanced(size_t dictSize, ZSTD_compressionParameters cParams, ZSTD_dictLoadMethod_e dictLoadMethod); 1433a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod); 1434a28cd43dSSascha Wildner 1435a28cd43dSSascha Wildner /*! ZSTD_initStatic*() : 1436a28cd43dSSascha Wildner * Initialize an object using a pre-allocated fixed-size buffer. 1437a28cd43dSSascha Wildner * workspace: The memory area to emplace the object into. 1438a28cd43dSSascha Wildner * Provided pointer *must be 8-bytes aligned*. 1439a28cd43dSSascha Wildner * Buffer must outlive object. 1440a28cd43dSSascha Wildner * workspaceSize: Use ZSTD_estimate*Size() to determine 1441a28cd43dSSascha Wildner * how large workspace must be to support target scenario. 1442a28cd43dSSascha Wildner * @return : pointer to object (same address as workspace, just different type), 1443a28cd43dSSascha Wildner * or NULL if error (size too small, incorrect alignment, etc.) 1444a28cd43dSSascha Wildner * Note : zstd will never resize nor malloc() when using a static buffer. 1445a28cd43dSSascha Wildner * If the object requires more memory than available, 1446a28cd43dSSascha Wildner * zstd will just error out (typically ZSTD_error_memory_allocation). 1447a28cd43dSSascha Wildner * Note 2 : there is no corresponding "free" function. 1448a28cd43dSSascha Wildner * Since workspace is allocated externally, it must be freed externally too. 1449a28cd43dSSascha Wildner * Note 3 : cParams : use ZSTD_getCParams() to convert a compression level 1450a28cd43dSSascha Wildner * into its associated cParams. 1451a28cd43dSSascha Wildner * Limitation 1 : currently not compatible with internal dictionary creation, triggered by 1452a28cd43dSSascha Wildner * ZSTD_CCtx_loadDictionary(), ZSTD_initCStream_usingDict() or ZSTD_initDStream_usingDict(). 1453a28cd43dSSascha Wildner * Limitation 2 : static cctx currently not compatible with multi-threading. 1454a28cd43dSSascha Wildner * Limitation 3 : static dctx is incompatible with legacy support. 1455a28cd43dSSascha Wildner */ 1456a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_CCtx* ZSTD_initStaticCCtx(void* workspace, size_t workspaceSize); 1457a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_CStream* ZSTD_initStaticCStream(void* workspace, size_t workspaceSize); /**< same as ZSTD_initStaticCCtx() */ 1458a28cd43dSSascha Wildner 1459a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_DCtx* ZSTD_initStaticDCtx(void* workspace, size_t workspaceSize); 1460a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_DStream* ZSTD_initStaticDStream(void* workspace, size_t workspaceSize); /**< same as ZSTD_initStaticDCtx() */ 1461a28cd43dSSascha Wildner 1462a28cd43dSSascha Wildner ZSTDLIB_API const ZSTD_CDict* ZSTD_initStaticCDict( 1463a28cd43dSSascha Wildner void* workspace, size_t workspaceSize, 1464a28cd43dSSascha Wildner const void* dict, size_t dictSize, 1465a28cd43dSSascha Wildner ZSTD_dictLoadMethod_e dictLoadMethod, 1466a28cd43dSSascha Wildner ZSTD_dictContentType_e dictContentType, 1467a28cd43dSSascha Wildner ZSTD_compressionParameters cParams); 1468a28cd43dSSascha Wildner 1469a28cd43dSSascha Wildner ZSTDLIB_API const ZSTD_DDict* ZSTD_initStaticDDict( 1470a28cd43dSSascha Wildner void* workspace, size_t workspaceSize, 1471a28cd43dSSascha Wildner const void* dict, size_t dictSize, 1472a28cd43dSSascha Wildner ZSTD_dictLoadMethod_e dictLoadMethod, 1473a28cd43dSSascha Wildner ZSTD_dictContentType_e dictContentType); 1474a28cd43dSSascha Wildner 1475a28cd43dSSascha Wildner 1476a28cd43dSSascha Wildner /*! Custom memory allocation : 1477a28cd43dSSascha Wildner * These prototypes make it possible to pass your own allocation/free functions. 1478a28cd43dSSascha Wildner * ZSTD_customMem is provided at creation time, using ZSTD_create*_advanced() variants listed below. 1479a28cd43dSSascha Wildner * All allocation/free operations will be completed using these custom variants instead of regular <stdlib.h> ones. 1480a28cd43dSSascha Wildner */ 1481a28cd43dSSascha Wildner typedef void* (*ZSTD_allocFunction) (void* opaque, size_t size); 1482a28cd43dSSascha Wildner typedef void (*ZSTD_freeFunction) (void* opaque, void* address); 1483a28cd43dSSascha Wildner typedef struct { ZSTD_allocFunction customAlloc; ZSTD_freeFunction customFree; void* opaque; } ZSTD_customMem; 1484a28cd43dSSascha Wildner static 1485a28cd43dSSascha Wildner #ifdef __GNUC__ 1486a28cd43dSSascha Wildner __attribute__((__unused__)) 1487a28cd43dSSascha Wildner #endif 1488a28cd43dSSascha Wildner ZSTD_customMem const ZSTD_defaultCMem = { NULL, NULL, NULL }; /**< this constant defers to stdlib's functions */ 1489a28cd43dSSascha Wildner 1490a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_CCtx* ZSTD_createCCtx_advanced(ZSTD_customMem customMem); 1491a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_CStream* ZSTD_createCStream_advanced(ZSTD_customMem customMem); 1492a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem); 1493a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_DStream* ZSTD_createDStream_advanced(ZSTD_customMem customMem); 1494a28cd43dSSascha Wildner 1495a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_advanced(const void* dict, size_t dictSize, 1496a28cd43dSSascha Wildner ZSTD_dictLoadMethod_e dictLoadMethod, 1497a28cd43dSSascha Wildner ZSTD_dictContentType_e dictContentType, 1498a28cd43dSSascha Wildner ZSTD_compressionParameters cParams, 1499a28cd43dSSascha Wildner ZSTD_customMem customMem); 1500a28cd43dSSascha Wildner 1501a28cd43dSSascha Wildner /* ! Thread pool : 1502a28cd43dSSascha Wildner * These prototypes make it possible to share a thread pool among multiple compression contexts. 1503a28cd43dSSascha Wildner * This can limit resources for applications with multiple threads where each one uses 1504a28cd43dSSascha Wildner * a threaded compression mode (via ZSTD_c_nbWorkers parameter). 1505a28cd43dSSascha Wildner * ZSTD_createThreadPool creates a new thread pool with a given number of threads. 1506a28cd43dSSascha Wildner * Note that the lifetime of such pool must exist while being used. 1507a28cd43dSSascha Wildner * ZSTD_CCtx_refThreadPool assigns a thread pool to a context (use NULL argument value 1508a28cd43dSSascha Wildner * to use an internal thread pool). 1509a28cd43dSSascha Wildner * ZSTD_freeThreadPool frees a thread pool. 1510a28cd43dSSascha Wildner */ 1511a28cd43dSSascha Wildner typedef struct POOL_ctx_s ZSTD_threadPool; 1512a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_threadPool* ZSTD_createThreadPool(size_t numThreads); 1513a28cd43dSSascha Wildner ZSTDLIB_API void ZSTD_freeThreadPool (ZSTD_threadPool* pool); 1514a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_refThreadPool(ZSTD_CCtx* cctx, ZSTD_threadPool* pool); 1515a28cd43dSSascha Wildner 1516a28cd43dSSascha Wildner /* 1517a28cd43dSSascha Wildner * This API is temporary and is expected to change or disappear in the future! 1518a28cd43dSSascha Wildner */ 1519a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_advanced2( 1520a28cd43dSSascha Wildner const void* dict, size_t dictSize, 1521a28cd43dSSascha Wildner ZSTD_dictLoadMethod_e dictLoadMethod, 1522a28cd43dSSascha Wildner ZSTD_dictContentType_e dictContentType, 1523a28cd43dSSascha Wildner const ZSTD_CCtx_params* cctxParams, 1524a28cd43dSSascha Wildner ZSTD_customMem customMem); 1525a28cd43dSSascha Wildner 1526a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict_advanced(const void* dict, size_t dictSize, 1527a28cd43dSSascha Wildner ZSTD_dictLoadMethod_e dictLoadMethod, 1528a28cd43dSSascha Wildner ZSTD_dictContentType_e dictContentType, 1529a28cd43dSSascha Wildner ZSTD_customMem customMem); 1530a28cd43dSSascha Wildner 1531a28cd43dSSascha Wildner /*************************************** 1532a28cd43dSSascha Wildner * Advanced compression functions 1533a28cd43dSSascha Wildner ***************************************/ 1534a28cd43dSSascha Wildner 1535a28cd43dSSascha Wildner /*! ZSTD_createCDict_byReference() : 1536a28cd43dSSascha Wildner * Create a digested dictionary for compression 1537a28cd43dSSascha Wildner * Dictionary content is just referenced, not duplicated. 1538a28cd43dSSascha Wildner * As a consequence, `dictBuffer` **must** outlive CDict, 1539a28cd43dSSascha Wildner * and its content must remain unmodified throughout the lifetime of CDict. 1540a28cd43dSSascha Wildner * note: equivalent to ZSTD_createCDict_advanced(), with dictLoadMethod==ZSTD_dlm_byRef */ 1541a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_byReference(const void* dictBuffer, size_t dictSize, int compressionLevel); 1542a28cd43dSSascha Wildner 1543a28cd43dSSascha Wildner /*! ZSTD_getDictID_fromCDict() : 1544a28cd43dSSascha Wildner * Provides the dictID of the dictionary loaded into `cdict`. 1545a28cd43dSSascha Wildner * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty. 1546a28cd43dSSascha Wildner * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */ 1547a28cd43dSSascha Wildner ZSTDLIB_API unsigned ZSTD_getDictID_fromCDict(const ZSTD_CDict* cdict); 1548a28cd43dSSascha Wildner 1549a28cd43dSSascha Wildner /*! ZSTD_getCParams() : 1550a28cd43dSSascha Wildner * @return ZSTD_compressionParameters structure for a selected compression level and estimated srcSize. 1551a28cd43dSSascha Wildner * `estimatedSrcSize` value is optional, select 0 if not known */ 1552a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize); 1553a28cd43dSSascha Wildner 1554a28cd43dSSascha Wildner /*! ZSTD_getParams() : 1555a28cd43dSSascha Wildner * same as ZSTD_getCParams(), but @return a full `ZSTD_parameters` object instead of sub-component `ZSTD_compressionParameters`. 1556a28cd43dSSascha Wildner * All fields of `ZSTD_frameParameters` are set to default : contentSize=1, checksum=0, noDictID=0 */ 1557a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize); 1558a28cd43dSSascha Wildner 1559a28cd43dSSascha Wildner /*! ZSTD_checkCParams() : 1560a28cd43dSSascha Wildner * Ensure param values remain within authorized range. 1561a28cd43dSSascha Wildner * @return 0 on success, or an error code (can be checked with ZSTD_isError()) */ 1562a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_checkCParams(ZSTD_compressionParameters params); 1563a28cd43dSSascha Wildner 1564a28cd43dSSascha Wildner /*! ZSTD_adjustCParams() : 1565a28cd43dSSascha Wildner * optimize params for a given `srcSize` and `dictSize`. 1566a28cd43dSSascha Wildner * `srcSize` can be unknown, in which case use ZSTD_CONTENTSIZE_UNKNOWN. 1567a28cd43dSSascha Wildner * `dictSize` must be `0` when there is no dictionary. 1568a28cd43dSSascha Wildner * cPar can be invalid : all parameters will be clamped within valid range in the @return struct. 1569a28cd43dSSascha Wildner * This function never fails (wide contract) */ 1570a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize); 1571a28cd43dSSascha Wildner 1572a28cd43dSSascha Wildner /*! ZSTD_compress_advanced() : 1573a28cd43dSSascha Wildner * Note : this function is now DEPRECATED. 1574a28cd43dSSascha Wildner * It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_setParameter() and other parameter setters. 1575a28cd43dSSascha Wildner * This prototype will be marked as deprecated and generate compilation warning on reaching v1.5.x */ 1576a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compress_advanced(ZSTD_CCtx* cctx, 1577a28cd43dSSascha Wildner void* dst, size_t dstCapacity, 1578a28cd43dSSascha Wildner const void* src, size_t srcSize, 1579a28cd43dSSascha Wildner const void* dict,size_t dictSize, 1580a28cd43dSSascha Wildner ZSTD_parameters params); 1581a28cd43dSSascha Wildner 1582a28cd43dSSascha Wildner /*! ZSTD_compress_usingCDict_advanced() : 1583a28cd43dSSascha Wildner * Note : this function is now REDUNDANT. 1584a28cd43dSSascha Wildner * It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_loadDictionary() and other parameter setters. 1585a28cd43dSSascha Wildner * This prototype will be marked as deprecated and generate compilation warning in some future version */ 1586a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx, 1587a28cd43dSSascha Wildner void* dst, size_t dstCapacity, 1588a28cd43dSSascha Wildner const void* src, size_t srcSize, 1589a28cd43dSSascha Wildner const ZSTD_CDict* cdict, 1590a28cd43dSSascha Wildner ZSTD_frameParameters fParams); 1591a28cd43dSSascha Wildner 1592a28cd43dSSascha Wildner 1593a28cd43dSSascha Wildner /*! ZSTD_CCtx_loadDictionary_byReference() : 1594a28cd43dSSascha Wildner * Same as ZSTD_CCtx_loadDictionary(), but dictionary content is referenced, instead of being copied into CCtx. 1595a28cd43dSSascha Wildner * It saves some memory, but also requires that `dict` outlives its usage within `cctx` */ 1596a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_byReference(ZSTD_CCtx* cctx, const void* dict, size_t dictSize); 1597a28cd43dSSascha Wildner 1598a28cd43dSSascha Wildner /*! ZSTD_CCtx_loadDictionary_advanced() : 1599a28cd43dSSascha Wildner * Same as ZSTD_CCtx_loadDictionary(), but gives finer control over 1600a28cd43dSSascha Wildner * how to load the dictionary (by copy ? by reference ?) 1601a28cd43dSSascha Wildner * and how to interpret it (automatic ? force raw mode ? full mode only ?) */ 1602a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType); 1603a28cd43dSSascha Wildner 1604a28cd43dSSascha Wildner /*! ZSTD_CCtx_refPrefix_advanced() : 1605a28cd43dSSascha Wildner * Same as ZSTD_CCtx_refPrefix(), but gives finer control over 1606a28cd43dSSascha Wildner * how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?) */ 1607a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType); 1608a28cd43dSSascha Wildner 1609a28cd43dSSascha Wildner /* === experimental parameters === */ 1610a28cd43dSSascha Wildner /* these parameters can be used with ZSTD_setParameter() 1611a28cd43dSSascha Wildner * they are not guaranteed to remain supported in the future */ 1612a28cd43dSSascha Wildner 1613a28cd43dSSascha Wildner /* Enables rsyncable mode, 1614a28cd43dSSascha Wildner * which makes compressed files more rsync friendly 1615a28cd43dSSascha Wildner * by adding periodic synchronization points to the compressed data. 1616a28cd43dSSascha Wildner * The target average block size is ZSTD_c_jobSize / 2. 1617a28cd43dSSascha Wildner * It's possible to modify the job size to increase or decrease 1618a28cd43dSSascha Wildner * the granularity of the synchronization point. 1619a28cd43dSSascha Wildner * Once the jobSize is smaller than the window size, 1620a28cd43dSSascha Wildner * it will result in compression ratio degradation. 1621a28cd43dSSascha Wildner * NOTE 1: rsyncable mode only works when multithreading is enabled. 1622a28cd43dSSascha Wildner * NOTE 2: rsyncable performs poorly in combination with long range mode, 1623a28cd43dSSascha Wildner * since it will decrease the effectiveness of synchronization points, 1624a28cd43dSSascha Wildner * though mileage may vary. 1625a28cd43dSSascha Wildner * NOTE 3: Rsyncable mode limits maximum compression speed to ~400 MB/s. 1626a28cd43dSSascha Wildner * If the selected compression level is already running significantly slower, 1627a28cd43dSSascha Wildner * the overall speed won't be significantly impacted. 1628a28cd43dSSascha Wildner */ 1629a28cd43dSSascha Wildner #define ZSTD_c_rsyncable ZSTD_c_experimentalParam1 1630a28cd43dSSascha Wildner 1631a28cd43dSSascha Wildner /* Select a compression format. 1632a28cd43dSSascha Wildner * The value must be of type ZSTD_format_e. 1633a28cd43dSSascha Wildner * See ZSTD_format_e enum definition for details */ 1634a28cd43dSSascha Wildner #define ZSTD_c_format ZSTD_c_experimentalParam2 1635a28cd43dSSascha Wildner 1636a28cd43dSSascha Wildner /* Force back-reference distances to remain < windowSize, 1637a28cd43dSSascha Wildner * even when referencing into Dictionary content (default:0) */ 1638a28cd43dSSascha Wildner #define ZSTD_c_forceMaxWindow ZSTD_c_experimentalParam3 1639a28cd43dSSascha Wildner 1640a28cd43dSSascha Wildner /* Controls whether the contents of a CDict 1641a28cd43dSSascha Wildner * are used in place, or copied into the working context. 1642a28cd43dSSascha Wildner * Accepts values from the ZSTD_dictAttachPref_e enum. 1643a28cd43dSSascha Wildner * See the comments on that enum for an explanation of the feature. */ 1644a28cd43dSSascha Wildner #define ZSTD_c_forceAttachDict ZSTD_c_experimentalParam4 1645a28cd43dSSascha Wildner 1646a28cd43dSSascha Wildner /* Controls how the literals are compressed (default is auto). 1647a28cd43dSSascha Wildner * The value must be of type ZSTD_literalCompressionMode_e. 1648a28cd43dSSascha Wildner * See ZSTD_literalCompressionMode_t enum definition for details. 1649a28cd43dSSascha Wildner */ 1650a28cd43dSSascha Wildner #define ZSTD_c_literalCompressionMode ZSTD_c_experimentalParam5 1651a28cd43dSSascha Wildner 1652a28cd43dSSascha Wildner /* Tries to fit compressed block size to be around targetCBlockSize. 1653a28cd43dSSascha Wildner * No target when targetCBlockSize == 0. 1654a28cd43dSSascha Wildner * There is no guarantee on compressed block size (default:0) */ 1655a28cd43dSSascha Wildner #define ZSTD_c_targetCBlockSize ZSTD_c_experimentalParam6 1656a28cd43dSSascha Wildner 1657a28cd43dSSascha Wildner /* User's best guess of source size. 1658a28cd43dSSascha Wildner * Hint is not valid when srcSizeHint == 0. 1659a28cd43dSSascha Wildner * There is no guarantee that hint is close to actual source size, 1660a28cd43dSSascha Wildner * but compression ratio may regress significantly if guess considerably underestimates */ 1661a28cd43dSSascha Wildner #define ZSTD_c_srcSizeHint ZSTD_c_experimentalParam7 1662a28cd43dSSascha Wildner 1663a28cd43dSSascha Wildner /* Controls whether the new and experimental "dedicated dictionary search 1664a28cd43dSSascha Wildner * structure" can be used. This feature is still rough around the edges, be 1665a28cd43dSSascha Wildner * prepared for surprising behavior! 1666a28cd43dSSascha Wildner * 1667a28cd43dSSascha Wildner * How to use it: 1668a28cd43dSSascha Wildner * 1669a28cd43dSSascha Wildner * When using a CDict, whether to use this feature or not is controlled at 1670a28cd43dSSascha Wildner * CDict creation, and it must be set in a CCtxParams set passed into that 1671a28cd43dSSascha Wildner * construction (via ZSTD_createCDict_advanced2()). A compression will then 1672a28cd43dSSascha Wildner * use the feature or not based on how the CDict was constructed; the value of 1673a28cd43dSSascha Wildner * this param, set in the CCtx, will have no effect. 1674a28cd43dSSascha Wildner * 1675a28cd43dSSascha Wildner * However, when a dictionary buffer is passed into a CCtx, such as via 1676a28cd43dSSascha Wildner * ZSTD_CCtx_loadDictionary(), this param can be set on the CCtx to control 1677a28cd43dSSascha Wildner * whether the CDict that is created internally can use the feature or not. 1678a28cd43dSSascha Wildner * 1679a28cd43dSSascha Wildner * What it does: 1680a28cd43dSSascha Wildner * 1681a28cd43dSSascha Wildner * Normally, the internal data structures of the CDict are analogous to what 1682a28cd43dSSascha Wildner * would be stored in a CCtx after compressing the contents of a dictionary. 1683a28cd43dSSascha Wildner * To an approximation, a compression using a dictionary can then use those 1684a28cd43dSSascha Wildner * data structures to simply continue what is effectively a streaming 1685a28cd43dSSascha Wildner * compression where the simulated compression of the dictionary left off. 1686a28cd43dSSascha Wildner * Which is to say, the search structures in the CDict are normally the same 1687a28cd43dSSascha Wildner * format as in the CCtx. 1688a28cd43dSSascha Wildner * 1689a28cd43dSSascha Wildner * It is possible to do better, since the CDict is not like a CCtx: the search 1690a28cd43dSSascha Wildner * structures are written once during CDict creation, and then are only read 1691a28cd43dSSascha Wildner * after that, while the search structures in the CCtx are both read and 1692a28cd43dSSascha Wildner * written as the compression goes along. This means we can choose a search 1693a28cd43dSSascha Wildner * structure for the dictionary that is read-optimized. 1694a28cd43dSSascha Wildner * 1695a28cd43dSSascha Wildner * This feature enables the use of that different structure. 1696a28cd43dSSascha Wildner * 1697a28cd43dSSascha Wildner * Note that some of the members of the ZSTD_compressionParameters struct have 1698a28cd43dSSascha Wildner * different semantics and constraints in the dedicated search structure. It is 1699a28cd43dSSascha Wildner * highly recommended that you simply set a compression level in the CCtxParams 1700a28cd43dSSascha Wildner * you pass into the CDict creation call, and avoid messing with the cParams 1701a28cd43dSSascha Wildner * directly. 1702a28cd43dSSascha Wildner * 1703a28cd43dSSascha Wildner * Effects: 1704a28cd43dSSascha Wildner * 1705a28cd43dSSascha Wildner * This will only have any effect when the selected ZSTD_strategy 1706a28cd43dSSascha Wildner * implementation supports this feature. Currently, that's limited to 1707a28cd43dSSascha Wildner * ZSTD_greedy, ZSTD_lazy, and ZSTD_lazy2. 1708a28cd43dSSascha Wildner * 1709a28cd43dSSascha Wildner * Note that this means that the CDict tables can no longer be copied into the 1710a28cd43dSSascha Wildner * CCtx, so the dict attachment mode ZSTD_dictForceCopy will no longer be 1711a28cd43dSSascha Wildner * useable. The dictionary can only be attached or reloaded. 1712a28cd43dSSascha Wildner * 1713a28cd43dSSascha Wildner * In general, you should expect compression to be faster--sometimes very much 1714a28cd43dSSascha Wildner * so--and CDict creation to be slightly slower. Eventually, we will probably 1715a28cd43dSSascha Wildner * make this mode the default. 1716a28cd43dSSascha Wildner */ 1717a28cd43dSSascha Wildner #define ZSTD_c_enableDedicatedDictSearch ZSTD_c_experimentalParam8 1718a28cd43dSSascha Wildner 1719a28cd43dSSascha Wildner /* ZSTD_c_stableInBuffer 1720a28cd43dSSascha Wildner * Experimental parameter. 1721a28cd43dSSascha Wildner * Default is 0 == disabled. Set to 1 to enable. 1722a28cd43dSSascha Wildner * 1723a28cd43dSSascha Wildner * Tells the compressor that the ZSTD_inBuffer will ALWAYS be the same 1724a28cd43dSSascha Wildner * between calls, except for the modifications that zstd makes to pos (the 1725a28cd43dSSascha Wildner * caller must not modify pos). This is checked by the compressor, and 1726a28cd43dSSascha Wildner * compression will fail if it ever changes. This means the only flush 1727a28cd43dSSascha Wildner * mode that makes sense is ZSTD_e_end, so zstd will error if ZSTD_e_end 1728a28cd43dSSascha Wildner * is not used. The data in the ZSTD_inBuffer in the range [src, src + pos) 1729a28cd43dSSascha Wildner * MUST not be modified during compression or you will get data corruption. 1730a28cd43dSSascha Wildner * 1731a28cd43dSSascha Wildner * When this flag is enabled zstd won't allocate an input window buffer, 1732a28cd43dSSascha Wildner * because the user guarantees it can reference the ZSTD_inBuffer until 1733a28cd43dSSascha Wildner * the frame is complete. But, it will still allocate an output buffer 1734a28cd43dSSascha Wildner * large enough to fit a block (see ZSTD_c_stableOutBuffer). This will also 1735a28cd43dSSascha Wildner * avoid the memcpy() from the input buffer to the input window buffer. 1736a28cd43dSSascha Wildner * 1737a28cd43dSSascha Wildner * NOTE: ZSTD_compressStream2() will error if ZSTD_e_end is not used. 1738a28cd43dSSascha Wildner * That means this flag cannot be used with ZSTD_compressStream(). 1739a28cd43dSSascha Wildner * 1740a28cd43dSSascha Wildner * NOTE: So long as the ZSTD_inBuffer always points to valid memory, using 1741a28cd43dSSascha Wildner * this flag is ALWAYS memory safe, and will never access out-of-bounds 1742a28cd43dSSascha Wildner * memory. However, compression WILL fail if you violate the preconditions. 1743a28cd43dSSascha Wildner * 1744a28cd43dSSascha Wildner * WARNING: The data in the ZSTD_inBuffer in the range [dst, dst + pos) MUST 1745a28cd43dSSascha Wildner * not be modified during compression or you will get data corruption. This 1746a28cd43dSSascha Wildner * is because zstd needs to reference data in the ZSTD_inBuffer to find 1747a28cd43dSSascha Wildner * matches. Normally zstd maintains its own window buffer for this purpose, 1748a28cd43dSSascha Wildner * but passing this flag tells zstd to use the user provided buffer. 1749a28cd43dSSascha Wildner */ 1750a28cd43dSSascha Wildner #define ZSTD_c_stableInBuffer ZSTD_c_experimentalParam9 1751a28cd43dSSascha Wildner 1752a28cd43dSSascha Wildner /* ZSTD_c_stableOutBuffer 1753a28cd43dSSascha Wildner * Experimental parameter. 1754a28cd43dSSascha Wildner * Default is 0 == disabled. Set to 1 to enable. 1755a28cd43dSSascha Wildner * 1756a28cd43dSSascha Wildner * Tells he compressor that the ZSTD_outBuffer will not be resized between 1757a28cd43dSSascha Wildner * calls. Specifically: (out.size - out.pos) will never grow. This gives the 1758a28cd43dSSascha Wildner * compressor the freedom to say: If the compressed data doesn't fit in the 1759a28cd43dSSascha Wildner * output buffer then return ZSTD_error_dstSizeTooSmall. This allows us to 1760a28cd43dSSascha Wildner * always decompress directly into the output buffer, instead of decompressing 1761a28cd43dSSascha Wildner * into an internal buffer and copying to the output buffer. 1762a28cd43dSSascha Wildner * 1763a28cd43dSSascha Wildner * When this flag is enabled zstd won't allocate an output buffer, because 1764a28cd43dSSascha Wildner * it can write directly to the ZSTD_outBuffer. It will still allocate the 1765a28cd43dSSascha Wildner * input window buffer (see ZSTD_c_stableInBuffer). 1766a28cd43dSSascha Wildner * 1767a28cd43dSSascha Wildner * Zstd will check that (out.size - out.pos) never grows and return an error 1768a28cd43dSSascha Wildner * if it does. While not strictly necessary, this should prevent surprises. 1769a28cd43dSSascha Wildner */ 1770a28cd43dSSascha Wildner #define ZSTD_c_stableOutBuffer ZSTD_c_experimentalParam10 1771a28cd43dSSascha Wildner 1772a28cd43dSSascha Wildner /* ZSTD_c_blockDelimiters 1773a28cd43dSSascha Wildner * Default is 0 == ZSTD_sf_noBlockDelimiters. 1774a28cd43dSSascha Wildner * 1775a28cd43dSSascha Wildner * For use with sequence compression API: ZSTD_compressSequences(). 1776a28cd43dSSascha Wildner * 1777a28cd43dSSascha Wildner * Designates whether or not the given array of ZSTD_Sequence contains block delimiters 1778a28cd43dSSascha Wildner * and last literals, which are defined as sequences with offset == 0 and matchLength == 0. 1779a28cd43dSSascha Wildner * See the definition of ZSTD_Sequence for more specifics. 1780a28cd43dSSascha Wildner */ 1781a28cd43dSSascha Wildner #define ZSTD_c_blockDelimiters ZSTD_c_experimentalParam11 1782a28cd43dSSascha Wildner 1783a28cd43dSSascha Wildner /* ZSTD_c_validateSequences 1784a28cd43dSSascha Wildner * Default is 0 == disabled. Set to 1 to enable sequence validation. 1785a28cd43dSSascha Wildner * 1786a28cd43dSSascha Wildner * For use with sequence compression API: ZSTD_compressSequences(). 1787a28cd43dSSascha Wildner * Designates whether or not we validate sequences provided to ZSTD_compressSequences() 1788a28cd43dSSascha Wildner * during function execution. 1789a28cd43dSSascha Wildner * 1790a28cd43dSSascha Wildner * Without validation, providing a sequence that does not conform to the zstd spec will cause 1791a28cd43dSSascha Wildner * undefined behavior, and may produce a corrupted block. 1792a28cd43dSSascha Wildner * 1793a28cd43dSSascha Wildner * With validation enabled, a if sequence is invalid (see doc/zstd_compression_format.md for 1794a28cd43dSSascha Wildner * specifics regarding offset/matchlength requirements) then the function will bail out and 1795a28cd43dSSascha Wildner * return an error. 1796a28cd43dSSascha Wildner * 1797a28cd43dSSascha Wildner */ 1798a28cd43dSSascha Wildner #define ZSTD_c_validateSequences ZSTD_c_experimentalParam12 1799a28cd43dSSascha Wildner 1800a28cd43dSSascha Wildner /*! ZSTD_CCtx_getParameter() : 1801a28cd43dSSascha Wildner * Get the requested compression parameter value, selected by enum ZSTD_cParameter, 1802a28cd43dSSascha Wildner * and store it into int* value. 1803a28cd43dSSascha Wildner * @return : 0, or an error code (which can be tested with ZSTD_isError()). 1804a28cd43dSSascha Wildner */ 1805a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_getParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int* value); 1806a28cd43dSSascha Wildner 1807a28cd43dSSascha Wildner 1808a28cd43dSSascha Wildner /*! ZSTD_CCtx_params : 1809a28cd43dSSascha Wildner * Quick howto : 1810a28cd43dSSascha Wildner * - ZSTD_createCCtxParams() : Create a ZSTD_CCtx_params structure 1811a28cd43dSSascha Wildner * - ZSTD_CCtxParams_setParameter() : Push parameters one by one into 1812a28cd43dSSascha Wildner * an existing ZSTD_CCtx_params structure. 1813a28cd43dSSascha Wildner * This is similar to 1814a28cd43dSSascha Wildner * ZSTD_CCtx_setParameter(). 1815a28cd43dSSascha Wildner * - ZSTD_CCtx_setParametersUsingCCtxParams() : Apply parameters to 1816a28cd43dSSascha Wildner * an existing CCtx. 1817a28cd43dSSascha Wildner * These parameters will be applied to 1818a28cd43dSSascha Wildner * all subsequent frames. 1819a28cd43dSSascha Wildner * - ZSTD_compressStream2() : Do compression using the CCtx. 1820a28cd43dSSascha Wildner * - ZSTD_freeCCtxParams() : Free the memory. 1821a28cd43dSSascha Wildner * 1822a28cd43dSSascha Wildner * This can be used with ZSTD_estimateCCtxSize_advanced_usingCCtxParams() 1823a28cd43dSSascha Wildner * for static allocation of CCtx for single-threaded compression. 1824a28cd43dSSascha Wildner */ 1825a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_CCtx_params* ZSTD_createCCtxParams(void); 1826a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params); 1827a28cd43dSSascha Wildner 1828a28cd43dSSascha Wildner /*! ZSTD_CCtxParams_reset() : 1829a28cd43dSSascha Wildner * Reset params to default values. 1830a28cd43dSSascha Wildner */ 1831a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtxParams_reset(ZSTD_CCtx_params* params); 1832a28cd43dSSascha Wildner 1833a28cd43dSSascha Wildner /*! ZSTD_CCtxParams_init() : 1834a28cd43dSSascha Wildner * Initializes the compression parameters of cctxParams according to 1835a28cd43dSSascha Wildner * compression level. All other parameters are reset to their default values. 1836a28cd43dSSascha Wildner */ 1837a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel); 1838a28cd43dSSascha Wildner 1839a28cd43dSSascha Wildner /*! ZSTD_CCtxParams_init_advanced() : 1840a28cd43dSSascha Wildner * Initializes the compression and frame parameters of cctxParams according to 1841a28cd43dSSascha Wildner * params. All other parameters are reset to their default values. 1842a28cd43dSSascha Wildner */ 1843a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params); 1844a28cd43dSSascha Wildner 1845a28cd43dSSascha Wildner /*! ZSTD_CCtxParams_setParameter() : 1846a28cd43dSSascha Wildner * Similar to ZSTD_CCtx_setParameter. 1847a28cd43dSSascha Wildner * Set one compression parameter, selected by enum ZSTD_cParameter. 1848a28cd43dSSascha Wildner * Parameters must be applied to a ZSTD_CCtx using 1849a28cd43dSSascha Wildner * ZSTD_CCtx_setParametersUsingCCtxParams(). 1850a28cd43dSSascha Wildner * @result : a code representing success or failure (which can be tested with 1851a28cd43dSSascha Wildner * ZSTD_isError()). 1852a28cd43dSSascha Wildner */ 1853a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, int value); 1854a28cd43dSSascha Wildner 1855a28cd43dSSascha Wildner /*! ZSTD_CCtxParams_getParameter() : 1856a28cd43dSSascha Wildner * Similar to ZSTD_CCtx_getParameter. 1857a28cd43dSSascha Wildner * Get the requested value of one compression parameter, selected by enum ZSTD_cParameter. 1858a28cd43dSSascha Wildner * @result : 0, or an error code (which can be tested with ZSTD_isError()). 1859a28cd43dSSascha Wildner */ 1860a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtxParams_getParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, int* value); 1861a28cd43dSSascha Wildner 1862a28cd43dSSascha Wildner /*! ZSTD_CCtx_setParametersUsingCCtxParams() : 1863a28cd43dSSascha Wildner * Apply a set of ZSTD_CCtx_params to the compression context. 1864a28cd43dSSascha Wildner * This can be done even after compression is started, 1865a28cd43dSSascha Wildner * if nbWorkers==0, this will have no impact until a new compression is started. 1866a28cd43dSSascha Wildner * if nbWorkers>=1, new parameters will be picked up at next job, 1867a28cd43dSSascha Wildner * with a few restrictions (windowLog, pledgedSrcSize, nbWorkers, jobSize, and overlapLog are not updated). 1868a28cd43dSSascha Wildner */ 1869a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_setParametersUsingCCtxParams( 1870a28cd43dSSascha Wildner ZSTD_CCtx* cctx, const ZSTD_CCtx_params* params); 1871a28cd43dSSascha Wildner 1872a28cd43dSSascha Wildner /*! ZSTD_compressStream2_simpleArgs() : 1873a28cd43dSSascha Wildner * Same as ZSTD_compressStream2(), 1874a28cd43dSSascha Wildner * but using only integral types as arguments. 1875a28cd43dSSascha Wildner * This variant might be helpful for binders from dynamic languages 1876a28cd43dSSascha Wildner * which have troubles handling structures containing memory pointers. 1877a28cd43dSSascha Wildner */ 1878a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressStream2_simpleArgs ( 1879a28cd43dSSascha Wildner ZSTD_CCtx* cctx, 1880a28cd43dSSascha Wildner void* dst, size_t dstCapacity, size_t* dstPos, 1881a28cd43dSSascha Wildner const void* src, size_t srcSize, size_t* srcPos, 1882a28cd43dSSascha Wildner ZSTD_EndDirective endOp); 1883a28cd43dSSascha Wildner 1884a28cd43dSSascha Wildner 1885a28cd43dSSascha Wildner /*************************************** 1886a28cd43dSSascha Wildner * Advanced decompression functions 1887a28cd43dSSascha Wildner ***************************************/ 1888a28cd43dSSascha Wildner 1889a28cd43dSSascha Wildner /*! ZSTD_isFrame() : 1890a28cd43dSSascha Wildner * Tells if the content of `buffer` starts with a valid Frame Identifier. 1891a28cd43dSSascha Wildner * Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0. 1892a28cd43dSSascha Wildner * Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled. 1893a28cd43dSSascha Wildner * Note 3 : Skippable Frame Identifiers are considered valid. */ 1894a28cd43dSSascha Wildner ZSTDLIB_API unsigned ZSTD_isFrame(const void* buffer, size_t size); 1895a28cd43dSSascha Wildner 1896a28cd43dSSascha Wildner /*! ZSTD_createDDict_byReference() : 1897a28cd43dSSascha Wildner * Create a digested dictionary, ready to start decompression operation without startup delay. 1898a28cd43dSSascha Wildner * Dictionary content is referenced, and therefore stays in dictBuffer. 1899a28cd43dSSascha Wildner * It is important that dictBuffer outlives DDict, 1900a28cd43dSSascha Wildner * it must remain read accessible throughout the lifetime of DDict */ 1901a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize); 1902a28cd43dSSascha Wildner 1903a28cd43dSSascha Wildner /*! ZSTD_DCtx_loadDictionary_byReference() : 1904a28cd43dSSascha Wildner * Same as ZSTD_DCtx_loadDictionary(), 1905a28cd43dSSascha Wildner * but references `dict` content instead of copying it into `dctx`. 1906a28cd43dSSascha Wildner * This saves memory if `dict` remains around., 1907a28cd43dSSascha Wildner * However, it's imperative that `dict` remains accessible (and unmodified) while being used, so it must outlive decompression. */ 1908a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary_byReference(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); 1909a28cd43dSSascha Wildner 1910a28cd43dSSascha Wildner /*! ZSTD_DCtx_loadDictionary_advanced() : 1911a28cd43dSSascha Wildner * Same as ZSTD_DCtx_loadDictionary(), 1912a28cd43dSSascha Wildner * but gives direct control over 1913a28cd43dSSascha Wildner * how to load the dictionary (by copy ? by reference ?) 1914a28cd43dSSascha Wildner * and how to interpret it (automatic ? force raw mode ? full mode only ?). */ 1915a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType); 1916a28cd43dSSascha Wildner 1917a28cd43dSSascha Wildner /*! ZSTD_DCtx_refPrefix_advanced() : 1918a28cd43dSSascha Wildner * Same as ZSTD_DCtx_refPrefix(), but gives finer control over 1919a28cd43dSSascha Wildner * how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?) */ 1920a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType); 1921a28cd43dSSascha Wildner 1922a28cd43dSSascha Wildner /*! ZSTD_DCtx_setMaxWindowSize() : 1923a28cd43dSSascha Wildner * Refuses allocating internal buffers for frames requiring a window size larger than provided limit. 1924a28cd43dSSascha Wildner * This protects a decoder context from reserving too much memory for itself (potential attack scenario). 1925a28cd43dSSascha Wildner * This parameter is only useful in streaming mode, since no internal buffer is allocated in single-pass mode. 1926a28cd43dSSascha Wildner * By default, a decompression context accepts all window sizes <= (1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT) 1927a28cd43dSSascha Wildner * @return : 0, or an error code (which can be tested using ZSTD_isError()). 1928a28cd43dSSascha Wildner */ 1929a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize); 1930a28cd43dSSascha Wildner 1931a28cd43dSSascha Wildner /*! ZSTD_DCtx_getParameter() : 1932a28cd43dSSascha Wildner * Get the requested decompression parameter value, selected by enum ZSTD_dParameter, 1933a28cd43dSSascha Wildner * and store it into int* value. 1934a28cd43dSSascha Wildner * @return : 0, or an error code (which can be tested with ZSTD_isError()). 1935a28cd43dSSascha Wildner */ 1936a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int* value); 1937a28cd43dSSascha Wildner 1938a28cd43dSSascha Wildner /* ZSTD_d_format 1939a28cd43dSSascha Wildner * experimental parameter, 1940a28cd43dSSascha Wildner * allowing selection between ZSTD_format_e input compression formats 1941a28cd43dSSascha Wildner */ 1942a28cd43dSSascha Wildner #define ZSTD_d_format ZSTD_d_experimentalParam1 1943a28cd43dSSascha Wildner /* ZSTD_d_stableOutBuffer 1944a28cd43dSSascha Wildner * Experimental parameter. 1945a28cd43dSSascha Wildner * Default is 0 == disabled. Set to 1 to enable. 1946a28cd43dSSascha Wildner * 1947a28cd43dSSascha Wildner * Tells the decompressor that the ZSTD_outBuffer will ALWAYS be the same 1948a28cd43dSSascha Wildner * between calls, except for the modifications that zstd makes to pos (the 1949a28cd43dSSascha Wildner * caller must not modify pos). This is checked by the decompressor, and 1950a28cd43dSSascha Wildner * decompression will fail if it ever changes. Therefore the ZSTD_outBuffer 1951a28cd43dSSascha Wildner * MUST be large enough to fit the entire decompressed frame. This will be 1952a28cd43dSSascha Wildner * checked when the frame content size is known. The data in the ZSTD_outBuffer 1953a28cd43dSSascha Wildner * in the range [dst, dst + pos) MUST not be modified during decompression 1954a28cd43dSSascha Wildner * or you will get data corruption. 1955a28cd43dSSascha Wildner * 1956a28cd43dSSascha Wildner * When this flags is enabled zstd won't allocate an output buffer, because 1957a28cd43dSSascha Wildner * it can write directly to the ZSTD_outBuffer, but it will still allocate 1958a28cd43dSSascha Wildner * an input buffer large enough to fit any compressed block. This will also 1959a28cd43dSSascha Wildner * avoid the memcpy() from the internal output buffer to the ZSTD_outBuffer. 1960a28cd43dSSascha Wildner * If you need to avoid the input buffer allocation use the buffer-less 1961a28cd43dSSascha Wildner * streaming API. 1962a28cd43dSSascha Wildner * 1963a28cd43dSSascha Wildner * NOTE: So long as the ZSTD_outBuffer always points to valid memory, using 1964a28cd43dSSascha Wildner * this flag is ALWAYS memory safe, and will never access out-of-bounds 1965a28cd43dSSascha Wildner * memory. However, decompression WILL fail if you violate the preconditions. 1966a28cd43dSSascha Wildner * 1967a28cd43dSSascha Wildner * WARNING: The data in the ZSTD_outBuffer in the range [dst, dst + pos) MUST 1968a28cd43dSSascha Wildner * not be modified during decompression or you will get data corruption. This 1969a28cd43dSSascha Wildner * is because zstd needs to reference data in the ZSTD_outBuffer to regenerate 1970a28cd43dSSascha Wildner * matches. Normally zstd maintains its own buffer for this purpose, but passing 1971a28cd43dSSascha Wildner * this flag tells zstd to use the user provided buffer. 1972a28cd43dSSascha Wildner */ 1973a28cd43dSSascha Wildner #define ZSTD_d_stableOutBuffer ZSTD_d_experimentalParam2 1974a28cd43dSSascha Wildner 1975a28cd43dSSascha Wildner /* ZSTD_d_forceIgnoreChecksum 1976a28cd43dSSascha Wildner * Experimental parameter. 1977a28cd43dSSascha Wildner * Default is 0 == disabled. Set to 1 to enable 1978a28cd43dSSascha Wildner * 1979a28cd43dSSascha Wildner * Tells the decompressor to skip checksum validation during decompression, regardless 1980a28cd43dSSascha Wildner * of whether checksumming was specified during compression. This offers some 1981a28cd43dSSascha Wildner * slight performance benefits, and may be useful for debugging. 1982a28cd43dSSascha Wildner * Param has values of type ZSTD_forceIgnoreChecksum_e 1983a28cd43dSSascha Wildner */ 1984a28cd43dSSascha Wildner #define ZSTD_d_forceIgnoreChecksum ZSTD_d_experimentalParam3 1985a28cd43dSSascha Wildner 1986a28cd43dSSascha Wildner /*! ZSTD_DCtx_setFormat() : 1987a28cd43dSSascha Wildner * Instruct the decoder context about what kind of data to decode next. 1988a28cd43dSSascha Wildner * This instruction is mandatory to decode data without a fully-formed header, 1989a28cd43dSSascha Wildner * such ZSTD_f_zstd1_magicless for example. 1990a28cd43dSSascha Wildner * @return : 0, or an error code (which can be tested using ZSTD_isError()). */ 1991a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format); 1992a28cd43dSSascha Wildner 1993a28cd43dSSascha Wildner /*! ZSTD_decompressStream_simpleArgs() : 1994a28cd43dSSascha Wildner * Same as ZSTD_decompressStream(), 1995a28cd43dSSascha Wildner * but using only integral types as arguments. 1996a28cd43dSSascha Wildner * This can be helpful for binders from dynamic languages 1997a28cd43dSSascha Wildner * which have troubles handling structures containing memory pointers. 1998a28cd43dSSascha Wildner */ 1999a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decompressStream_simpleArgs ( 2000a28cd43dSSascha Wildner ZSTD_DCtx* dctx, 2001a28cd43dSSascha Wildner void* dst, size_t dstCapacity, size_t* dstPos, 2002a28cd43dSSascha Wildner const void* src, size_t srcSize, size_t* srcPos); 2003a28cd43dSSascha Wildner 2004a28cd43dSSascha Wildner 2005a28cd43dSSascha Wildner /******************************************************************** 2006a28cd43dSSascha Wildner * Advanced streaming functions 2007a28cd43dSSascha Wildner * Warning : most of these functions are now redundant with the Advanced API. 2008a28cd43dSSascha Wildner * Once Advanced API reaches "stable" status, 2009a28cd43dSSascha Wildner * redundant functions will be deprecated, and then at some point removed. 2010a28cd43dSSascha Wildner ********************************************************************/ 2011a28cd43dSSascha Wildner 2012a28cd43dSSascha Wildner /*===== Advanced Streaming compression functions =====*/ 2013a28cd43dSSascha Wildner 2014a28cd43dSSascha Wildner /*! ZSTD_initCStream_srcSize() : 2015a28cd43dSSascha Wildner * This function is deprecated, and equivalent to: 2016a28cd43dSSascha Wildner * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); 2017a28cd43dSSascha Wildner * ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any) 2018a28cd43dSSascha Wildner * ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel); 2019a28cd43dSSascha Wildner * ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize); 2020a28cd43dSSascha Wildner * 2021a28cd43dSSascha Wildner * pledgedSrcSize must be correct. If it is not known at init time, use 2022a28cd43dSSascha Wildner * ZSTD_CONTENTSIZE_UNKNOWN. Note that, for compatibility with older programs, 2023a28cd43dSSascha Wildner * "0" also disables frame content size field. It may be enabled in the future. 2024a28cd43dSSascha Wildner * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x 2025a28cd43dSSascha Wildner */ 2026a28cd43dSSascha Wildner ZSTDLIB_API size_t 2027a28cd43dSSascha Wildner ZSTD_initCStream_srcSize(ZSTD_CStream* zcs, 2028a28cd43dSSascha Wildner int compressionLevel, 2029a28cd43dSSascha Wildner unsigned long long pledgedSrcSize); 2030a28cd43dSSascha Wildner 2031a28cd43dSSascha Wildner /*! ZSTD_initCStream_usingDict() : 2032a28cd43dSSascha Wildner * This function is deprecated, and is equivalent to: 2033a28cd43dSSascha Wildner * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); 2034a28cd43dSSascha Wildner * ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel); 2035a28cd43dSSascha Wildner * ZSTD_CCtx_loadDictionary(zcs, dict, dictSize); 2036a28cd43dSSascha Wildner * 2037a28cd43dSSascha Wildner * Creates of an internal CDict (incompatible with static CCtx), except if 2038a28cd43dSSascha Wildner * dict == NULL or dictSize < 8, in which case no dict is used. 2039a28cd43dSSascha Wildner * Note: dict is loaded with ZSTD_dct_auto (treated as a full zstd dictionary if 2040a28cd43dSSascha Wildner * it begins with ZSTD_MAGIC_DICTIONARY, else as raw content) and ZSTD_dlm_byCopy. 2041a28cd43dSSascha Wildner * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x 2042a28cd43dSSascha Wildner */ 2043a28cd43dSSascha Wildner ZSTDLIB_API size_t 2044a28cd43dSSascha Wildner ZSTD_initCStream_usingDict(ZSTD_CStream* zcs, 2045a28cd43dSSascha Wildner const void* dict, size_t dictSize, 2046a28cd43dSSascha Wildner int compressionLevel); 2047a28cd43dSSascha Wildner 2048a28cd43dSSascha Wildner /*! ZSTD_initCStream_advanced() : 2049a28cd43dSSascha Wildner * This function is deprecated, and is approximately equivalent to: 2050a28cd43dSSascha Wildner * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); 2051a28cd43dSSascha Wildner * // Pseudocode: Set each zstd parameter and leave the rest as-is. 2052a28cd43dSSascha Wildner * for ((param, value) : params) { 2053a28cd43dSSascha Wildner * ZSTD_CCtx_setParameter(zcs, param, value); 2054a28cd43dSSascha Wildner * } 2055a28cd43dSSascha Wildner * ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize); 2056a28cd43dSSascha Wildner * ZSTD_CCtx_loadDictionary(zcs, dict, dictSize); 2057a28cd43dSSascha Wildner * 2058a28cd43dSSascha Wildner * dict is loaded with ZSTD_dct_auto and ZSTD_dlm_byCopy. 2059a28cd43dSSascha Wildner * pledgedSrcSize must be correct. 2060a28cd43dSSascha Wildner * If srcSize is not known at init time, use value ZSTD_CONTENTSIZE_UNKNOWN. 2061a28cd43dSSascha Wildner * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x 2062a28cd43dSSascha Wildner */ 2063a28cd43dSSascha Wildner ZSTDLIB_API size_t 2064a28cd43dSSascha Wildner ZSTD_initCStream_advanced(ZSTD_CStream* zcs, 2065a28cd43dSSascha Wildner const void* dict, size_t dictSize, 2066a28cd43dSSascha Wildner ZSTD_parameters params, 2067a28cd43dSSascha Wildner unsigned long long pledgedSrcSize); 2068a28cd43dSSascha Wildner 2069a28cd43dSSascha Wildner /*! ZSTD_initCStream_usingCDict() : 2070a28cd43dSSascha Wildner * This function is deprecated, and equivalent to: 2071a28cd43dSSascha Wildner * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); 2072a28cd43dSSascha Wildner * ZSTD_CCtx_refCDict(zcs, cdict); 2073a28cd43dSSascha Wildner * 2074a28cd43dSSascha Wildner * note : cdict will just be referenced, and must outlive compression session 2075a28cd43dSSascha Wildner * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x 2076a28cd43dSSascha Wildner */ 2077a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict); 2078a28cd43dSSascha Wildner 2079a28cd43dSSascha Wildner /*! ZSTD_initCStream_usingCDict_advanced() : 2080a28cd43dSSascha Wildner * This function is DEPRECATED, and is approximately equivalent to: 2081a28cd43dSSascha Wildner * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); 2082a28cd43dSSascha Wildner * // Pseudocode: Set each zstd frame parameter and leave the rest as-is. 2083a28cd43dSSascha Wildner * for ((fParam, value) : fParams) { 2084a28cd43dSSascha Wildner * ZSTD_CCtx_setParameter(zcs, fParam, value); 2085a28cd43dSSascha Wildner * } 2086a28cd43dSSascha Wildner * ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize); 2087a28cd43dSSascha Wildner * ZSTD_CCtx_refCDict(zcs, cdict); 2088a28cd43dSSascha Wildner * 2089a28cd43dSSascha Wildner * same as ZSTD_initCStream_usingCDict(), with control over frame parameters. 2090a28cd43dSSascha Wildner * pledgedSrcSize must be correct. If srcSize is not known at init time, use 2091a28cd43dSSascha Wildner * value ZSTD_CONTENTSIZE_UNKNOWN. 2092a28cd43dSSascha Wildner * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x 2093a28cd43dSSascha Wildner */ 2094a28cd43dSSascha Wildner ZSTDLIB_API size_t 2095a28cd43dSSascha Wildner ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs, 2096a28cd43dSSascha Wildner const ZSTD_CDict* cdict, 2097a28cd43dSSascha Wildner ZSTD_frameParameters fParams, 2098a28cd43dSSascha Wildner unsigned long long pledgedSrcSize); 2099a28cd43dSSascha Wildner 2100a28cd43dSSascha Wildner /*! ZSTD_resetCStream() : 2101a28cd43dSSascha Wildner * This function is deprecated, and is equivalent to: 2102a28cd43dSSascha Wildner * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); 2103a28cd43dSSascha Wildner * ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize); 2104a28cd43dSSascha Wildner * 2105a28cd43dSSascha Wildner * start a new frame, using same parameters from previous frame. 2106a28cd43dSSascha Wildner * This is typically useful to skip dictionary loading stage, since it will re-use it in-place. 2107a28cd43dSSascha Wildner * Note that zcs must be init at least once before using ZSTD_resetCStream(). 2108a28cd43dSSascha Wildner * If pledgedSrcSize is not known at reset time, use macro ZSTD_CONTENTSIZE_UNKNOWN. 2109a28cd43dSSascha Wildner * If pledgedSrcSize > 0, its value must be correct, as it will be written in header, and controlled at the end. 2110a28cd43dSSascha Wildner * For the time being, pledgedSrcSize==0 is interpreted as "srcSize unknown" for compatibility with older programs, 2111a28cd43dSSascha Wildner * but it will change to mean "empty" in future version, so use macro ZSTD_CONTENTSIZE_UNKNOWN instead. 2112a28cd43dSSascha Wildner * @return : 0, or an error code (which can be tested using ZSTD_isError()) 2113a28cd43dSSascha Wildner * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x 2114a28cd43dSSascha Wildner */ 2115a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize); 2116a28cd43dSSascha Wildner 2117a28cd43dSSascha Wildner 2118a28cd43dSSascha Wildner typedef struct { 2119a28cd43dSSascha Wildner unsigned long long ingested; /* nb input bytes read and buffered */ 2120a28cd43dSSascha Wildner unsigned long long consumed; /* nb input bytes actually compressed */ 2121a28cd43dSSascha Wildner unsigned long long produced; /* nb of compressed bytes generated and buffered */ 2122a28cd43dSSascha Wildner unsigned long long flushed; /* nb of compressed bytes flushed : not provided; can be tracked from caller side */ 2123a28cd43dSSascha Wildner unsigned currentJobID; /* MT only : latest started job nb */ 2124a28cd43dSSascha Wildner unsigned nbActiveWorkers; /* MT only : nb of workers actively compressing at probe time */ 2125a28cd43dSSascha Wildner } ZSTD_frameProgression; 2126a28cd43dSSascha Wildner 2127a28cd43dSSascha Wildner /* ZSTD_getFrameProgression() : 2128a28cd43dSSascha Wildner * tells how much data has been ingested (read from input) 2129a28cd43dSSascha Wildner * consumed (input actually compressed) and produced (output) for current frame. 2130a28cd43dSSascha Wildner * Note : (ingested - consumed) is amount of input data buffered internally, not yet compressed. 2131a28cd43dSSascha Wildner * Aggregates progression inside active worker threads. 2132a28cd43dSSascha Wildner */ 2133a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_frameProgression ZSTD_getFrameProgression(const ZSTD_CCtx* cctx); 2134a28cd43dSSascha Wildner 2135a28cd43dSSascha Wildner /*! ZSTD_toFlushNow() : 2136a28cd43dSSascha Wildner * Tell how many bytes are ready to be flushed immediately. 2137a28cd43dSSascha Wildner * Useful for multithreading scenarios (nbWorkers >= 1). 2138a28cd43dSSascha Wildner * Probe the oldest active job, defined as oldest job not yet entirely flushed, 2139a28cd43dSSascha Wildner * and check its output buffer. 2140a28cd43dSSascha Wildner * @return : amount of data stored in oldest job and ready to be flushed immediately. 2141a28cd43dSSascha Wildner * if @return == 0, it means either : 2142a28cd43dSSascha Wildner * + there is no active job (could be checked with ZSTD_frameProgression()), or 2143a28cd43dSSascha Wildner * + oldest job is still actively compressing data, 2144a28cd43dSSascha Wildner * but everything it has produced has also been flushed so far, 2145a28cd43dSSascha Wildner * therefore flush speed is limited by production speed of oldest job 2146a28cd43dSSascha Wildner * irrespective of the speed of concurrent (and newer) jobs. 2147a28cd43dSSascha Wildner */ 2148a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_toFlushNow(ZSTD_CCtx* cctx); 2149a28cd43dSSascha Wildner 2150a28cd43dSSascha Wildner 2151a28cd43dSSascha Wildner /*===== Advanced Streaming decompression functions =====*/ 2152a28cd43dSSascha Wildner 2153a28cd43dSSascha Wildner /*! 2154a28cd43dSSascha Wildner * This function is deprecated, and is equivalent to: 2155a28cd43dSSascha Wildner * 2156a28cd43dSSascha Wildner * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); 2157a28cd43dSSascha Wildner * ZSTD_DCtx_loadDictionary(zds, dict, dictSize); 2158a28cd43dSSascha Wildner * 2159a28cd43dSSascha Wildner * note: no dictionary will be used if dict == NULL or dictSize < 8 2160a28cd43dSSascha Wildner * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x 2161a28cd43dSSascha Wildner */ 2162a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize); 2163a28cd43dSSascha Wildner 2164a28cd43dSSascha Wildner /*! 2165a28cd43dSSascha Wildner * This function is deprecated, and is equivalent to: 2166a28cd43dSSascha Wildner * 2167a28cd43dSSascha Wildner * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); 2168a28cd43dSSascha Wildner * ZSTD_DCtx_refDDict(zds, ddict); 2169a28cd43dSSascha Wildner * 2170a28cd43dSSascha Wildner * note : ddict is referenced, it must outlive decompression session 2171a28cd43dSSascha Wildner * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x 2172a28cd43dSSascha Wildner */ 2173a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDict* ddict); 2174a28cd43dSSascha Wildner 2175a28cd43dSSascha Wildner /*! 2176a28cd43dSSascha Wildner * This function is deprecated, and is equivalent to: 2177a28cd43dSSascha Wildner * 2178a28cd43dSSascha Wildner * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); 2179a28cd43dSSascha Wildner * 2180a28cd43dSSascha Wildner * re-use decompression parameters from previous init; saves dictionary loading 2181a28cd43dSSascha Wildner * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x 2182a28cd43dSSascha Wildner */ 2183a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); 2184a28cd43dSSascha Wildner 2185a28cd43dSSascha Wildner 2186a28cd43dSSascha Wildner /********************************************************************* 2187a28cd43dSSascha Wildner * Buffer-less and synchronous inner streaming functions 2188a28cd43dSSascha Wildner * 2189a28cd43dSSascha Wildner * This is an advanced API, giving full control over buffer management, for users which need direct control over memory. 2190a28cd43dSSascha Wildner * But it's also a complex one, with several restrictions, documented below. 2191a28cd43dSSascha Wildner * Prefer normal streaming API for an easier experience. 2192a28cd43dSSascha Wildner ********************************************************************* */ 2193a28cd43dSSascha Wildner 2194a28cd43dSSascha Wildner /** 2195a28cd43dSSascha Wildner Buffer-less streaming compression (synchronous mode) 2196a28cd43dSSascha Wildner 2197a28cd43dSSascha Wildner A ZSTD_CCtx object is required to track streaming operations. 2198a28cd43dSSascha Wildner Use ZSTD_createCCtx() / ZSTD_freeCCtx() to manage resource. 2199a28cd43dSSascha Wildner ZSTD_CCtx object can be re-used multiple times within successive compression operations. 2200a28cd43dSSascha Wildner 2201a28cd43dSSascha Wildner Start by initializing a context. 2202a28cd43dSSascha Wildner Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression, 2203a28cd43dSSascha Wildner or ZSTD_compressBegin_advanced(), for finer parameter control. 2204a28cd43dSSascha Wildner It's also possible to duplicate a reference context which has already been initialized, using ZSTD_copyCCtx() 2205a28cd43dSSascha Wildner 2206a28cd43dSSascha Wildner Then, consume your input using ZSTD_compressContinue(). 2207a28cd43dSSascha Wildner There are some important considerations to keep in mind when using this advanced function : 2208a28cd43dSSascha Wildner - ZSTD_compressContinue() has no internal buffer. It uses externally provided buffers only. 2209a28cd43dSSascha Wildner - Interface is synchronous : input is consumed entirely and produces 1+ compressed blocks. 2210a28cd43dSSascha Wildner - Caller must ensure there is enough space in `dst` to store compressed data under worst case scenario. 2211a28cd43dSSascha Wildner Worst case evaluation is provided by ZSTD_compressBound(). 2212a28cd43dSSascha Wildner ZSTD_compressContinue() doesn't guarantee recover after a failed compression. 2213a28cd43dSSascha Wildner - ZSTD_compressContinue() presumes prior input ***is still accessible and unmodified*** (up to maximum distance size, see WindowLog). 2214a28cd43dSSascha Wildner It remembers all previous contiguous blocks, plus one separated memory segment (which can itself consists of multiple contiguous blocks) 2215a28cd43dSSascha Wildner - ZSTD_compressContinue() detects that prior input has been overwritten when `src` buffer overlaps. 2216a28cd43dSSascha Wildner In which case, it will "discard" the relevant memory section from its history. 2217a28cd43dSSascha Wildner 2218a28cd43dSSascha Wildner Finish a frame with ZSTD_compressEnd(), which will write the last block(s) and optional checksum. 2219a28cd43dSSascha Wildner It's possible to use srcSize==0, in which case, it will write a final empty block to end the frame. 2220a28cd43dSSascha Wildner Without last block mark, frames are considered unfinished (hence corrupted) by compliant decoders. 2221a28cd43dSSascha Wildner 2222a28cd43dSSascha Wildner `ZSTD_CCtx` object can be re-used (ZSTD_compressBegin()) to compress again. 2223a28cd43dSSascha Wildner */ 2224a28cd43dSSascha Wildner 2225a28cd43dSSascha Wildner /*===== Buffer-less streaming compression functions =====*/ 2226a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel); 2227a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel); 2228a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_parameters params, unsigned long long pledgedSrcSize); /**< pledgedSrcSize : If srcSize is not known at init time, use ZSTD_CONTENTSIZE_UNKNOWN */ 2229a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); /**< note: fails if cdict==NULL */ 2230a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressBegin_usingCDict_advanced(ZSTD_CCtx* const cctx, const ZSTD_CDict* const cdict, ZSTD_frameParameters const fParams, unsigned long long const pledgedSrcSize); /* compression parameters are already set within cdict. pledgedSrcSize must be correct. If srcSize is not known, use macro ZSTD_CONTENTSIZE_UNKNOWN */ 2231a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, unsigned long long pledgedSrcSize); /**< note: if pledgedSrcSize is not known, use ZSTD_CONTENTSIZE_UNKNOWN */ 2232a28cd43dSSascha Wildner 2233a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressContinue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); 2234a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); 2235a28cd43dSSascha Wildner 2236a28cd43dSSascha Wildner 2237a28cd43dSSascha Wildner /** 2238a28cd43dSSascha Wildner Buffer-less streaming decompression (synchronous mode) 2239a28cd43dSSascha Wildner 2240a28cd43dSSascha Wildner A ZSTD_DCtx object is required to track streaming operations. 2241a28cd43dSSascha Wildner Use ZSTD_createDCtx() / ZSTD_freeDCtx() to manage it. 2242a28cd43dSSascha Wildner A ZSTD_DCtx object can be re-used multiple times. 2243a28cd43dSSascha Wildner 2244a28cd43dSSascha Wildner First typical operation is to retrieve frame parameters, using ZSTD_getFrameHeader(). 2245a28cd43dSSascha Wildner Frame header is extracted from the beginning of compressed frame, so providing only the frame's beginning is enough. 2246a28cd43dSSascha Wildner Data fragment must be large enough to ensure successful decoding. 2247a28cd43dSSascha Wildner `ZSTD_frameHeaderSize_max` bytes is guaranteed to always be large enough. 2248a28cd43dSSascha Wildner @result : 0 : successful decoding, the `ZSTD_frameHeader` structure is correctly filled. 2249a28cd43dSSascha Wildner >0 : `srcSize` is too small, please provide at least @result bytes on next attempt. 2250a28cd43dSSascha Wildner errorCode, which can be tested using ZSTD_isError(). 2251a28cd43dSSascha Wildner 2252a28cd43dSSascha Wildner It fills a ZSTD_frameHeader structure with important information to correctly decode the frame, 2253a28cd43dSSascha Wildner such as the dictionary ID, content size, or maximum back-reference distance (`windowSize`). 2254a28cd43dSSascha Wildner Note that these values could be wrong, either because of data corruption, or because a 3rd party deliberately spoofs false information. 2255a28cd43dSSascha Wildner As a consequence, check that values remain within valid application range. 2256a28cd43dSSascha Wildner For example, do not allocate memory blindly, check that `windowSize` is within expectation. 2257a28cd43dSSascha Wildner Each application can set its own limits, depending on local restrictions. 2258a28cd43dSSascha Wildner For extended interoperability, it is recommended to support `windowSize` of at least 8 MB. 2259a28cd43dSSascha Wildner 2260a28cd43dSSascha Wildner ZSTD_decompressContinue() needs previous data blocks during decompression, up to `windowSize` bytes. 2261a28cd43dSSascha Wildner ZSTD_decompressContinue() is very sensitive to contiguity, 2262a28cd43dSSascha Wildner if 2 blocks don't follow each other, make sure that either the compressor breaks contiguity at the same place, 2263a28cd43dSSascha Wildner or that previous contiguous segment is large enough to properly handle maximum back-reference distance. 2264a28cd43dSSascha Wildner There are multiple ways to guarantee this condition. 2265a28cd43dSSascha Wildner 2266a28cd43dSSascha Wildner The most memory efficient way is to use a round buffer of sufficient size. 2267a28cd43dSSascha Wildner Sufficient size is determined by invoking ZSTD_decodingBufferSize_min(), 2268a28cd43dSSascha Wildner which can @return an error code if required value is too large for current system (in 32-bits mode). 2269a28cd43dSSascha Wildner In a round buffer methodology, ZSTD_decompressContinue() decompresses each block next to previous one, 2270a28cd43dSSascha Wildner up to the moment there is not enough room left in the buffer to guarantee decoding another full block, 2271a28cd43dSSascha Wildner which maximum size is provided in `ZSTD_frameHeader` structure, field `blockSizeMax`. 2272a28cd43dSSascha Wildner At which point, decoding can resume from the beginning of the buffer. 2273a28cd43dSSascha Wildner Note that already decoded data stored in the buffer should be flushed before being overwritten. 2274a28cd43dSSascha Wildner 2275a28cd43dSSascha Wildner There are alternatives possible, for example using two or more buffers of size `windowSize` each, though they consume more memory. 2276a28cd43dSSascha Wildner 2277a28cd43dSSascha Wildner Finally, if you control the compression process, you can also ignore all buffer size rules, 2278a28cd43dSSascha Wildner as long as the encoder and decoder progress in "lock-step", 2279a28cd43dSSascha Wildner aka use exactly the same buffer sizes, break contiguity at the same place, etc. 2280a28cd43dSSascha Wildner 2281a28cd43dSSascha Wildner Once buffers are setup, start decompression, with ZSTD_decompressBegin(). 2282a28cd43dSSascha Wildner If decompression requires a dictionary, use ZSTD_decompressBegin_usingDict() or ZSTD_decompressBegin_usingDDict(). 2283a28cd43dSSascha Wildner 2284a28cd43dSSascha Wildner Then use ZSTD_nextSrcSizeToDecompress() and ZSTD_decompressContinue() alternatively. 2285a28cd43dSSascha Wildner ZSTD_nextSrcSizeToDecompress() tells how many bytes to provide as 'srcSize' to ZSTD_decompressContinue(). 2286a28cd43dSSascha Wildner ZSTD_decompressContinue() requires this _exact_ amount of bytes, or it will fail. 2287a28cd43dSSascha Wildner 2288a28cd43dSSascha Wildner @result of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst' (necessarily <= dstCapacity). 2289a28cd43dSSascha Wildner It can be zero : it just means ZSTD_decompressContinue() has decoded some metadata item. 2290a28cd43dSSascha Wildner It can also be an error code, which can be tested with ZSTD_isError(). 2291a28cd43dSSascha Wildner 2292a28cd43dSSascha Wildner A frame is fully decoded when ZSTD_nextSrcSizeToDecompress() returns zero. 2293a28cd43dSSascha Wildner Context can then be reset to start a new decompression. 2294a28cd43dSSascha Wildner 2295a28cd43dSSascha Wildner Note : it's possible to know if next input to present is a header or a block, using ZSTD_nextInputType(). 2296a28cd43dSSascha Wildner This information is not required to properly decode a frame. 2297a28cd43dSSascha Wildner 2298a28cd43dSSascha Wildner == Special case : skippable frames == 2299a28cd43dSSascha Wildner 2300a28cd43dSSascha Wildner Skippable frames allow integration of user-defined data into a flow of concatenated frames. 2301a28cd43dSSascha Wildner Skippable frames will be ignored (skipped) by decompressor. 2302a28cd43dSSascha Wildner The format of skippable frames is as follows : 2303a28cd43dSSascha Wildner a) Skippable frame ID - 4 Bytes, Little endian format, any value from 0x184D2A50 to 0x184D2A5F 2304a28cd43dSSascha Wildner b) Frame Size - 4 Bytes, Little endian format, unsigned 32-bits 2305a28cd43dSSascha Wildner c) Frame Content - any content (User Data) of length equal to Frame Size 2306a28cd43dSSascha Wildner For skippable frames ZSTD_getFrameHeader() returns zfhPtr->frameType==ZSTD_skippableFrame. 2307a28cd43dSSascha Wildner For skippable frames ZSTD_decompressContinue() always returns 0 : it only skips the content. 2308a28cd43dSSascha Wildner */ 2309a28cd43dSSascha Wildner 2310a28cd43dSSascha Wildner /*===== Buffer-less streaming decompression functions =====*/ 2311a28cd43dSSascha Wildner typedef enum { ZSTD_frame, ZSTD_skippableFrame } ZSTD_frameType_e; 2312a28cd43dSSascha Wildner typedef struct { 2313a28cd43dSSascha Wildner unsigned long long frameContentSize; /* if == ZSTD_CONTENTSIZE_UNKNOWN, it means this field is not available. 0 means "empty" */ 2314a28cd43dSSascha Wildner unsigned long long windowSize; /* can be very large, up to <= frameContentSize */ 2315a28cd43dSSascha Wildner unsigned blockSizeMax; 2316a28cd43dSSascha Wildner ZSTD_frameType_e frameType; /* if == ZSTD_skippableFrame, frameContentSize is the size of skippable content */ 2317a28cd43dSSascha Wildner unsigned headerSize; 2318a28cd43dSSascha Wildner unsigned dictID; 2319a28cd43dSSascha Wildner unsigned checksumFlag; 2320a28cd43dSSascha Wildner } ZSTD_frameHeader; 2321a28cd43dSSascha Wildner 2322a28cd43dSSascha Wildner /*! ZSTD_getFrameHeader() : 2323a28cd43dSSascha Wildner * decode Frame Header, or requires larger `srcSize`. 2324a28cd43dSSascha Wildner * @return : 0, `zfhPtr` is correctly filled, 2325a28cd43dSSascha Wildner * >0, `srcSize` is too small, value is wanted `srcSize` amount, 2326a28cd43dSSascha Wildner * or an error code, which can be tested using ZSTD_isError() */ 2327a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize); /**< doesn't consume input */ 2328a28cd43dSSascha Wildner /*! ZSTD_getFrameHeader_advanced() : 2329a28cd43dSSascha Wildner * same as ZSTD_getFrameHeader(), 2330a28cd43dSSascha Wildner * with added capability to select a format (like ZSTD_f_zstd1_magicless) */ 2331a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format); 2332a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize); /**< when frame content size is not known, pass in frameContentSize == ZSTD_CONTENTSIZE_UNKNOWN */ 2333a28cd43dSSascha Wildner 2334a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx); 2335a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); 2336a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decompressBegin_usingDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict); 2337a28cd43dSSascha Wildner 2338a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx); 2339a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); 2340a28cd43dSSascha Wildner 2341a28cd43dSSascha Wildner /* misc */ 2342a28cd43dSSascha Wildner ZSTDLIB_API void ZSTD_copyDCtx(ZSTD_DCtx* dctx, const ZSTD_DCtx* preparedDCtx); 2343a28cd43dSSascha Wildner typedef enum { ZSTDnit_frameHeader, ZSTDnit_blockHeader, ZSTDnit_block, ZSTDnit_lastBlock, ZSTDnit_checksum, ZSTDnit_skippableFrame } ZSTD_nextInputType_e; 2344a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); 2345a28cd43dSSascha Wildner 2346a28cd43dSSascha Wildner 2347a28cd43dSSascha Wildner 2348a28cd43dSSascha Wildner 2349a28cd43dSSascha Wildner /* ============================ */ 2350a28cd43dSSascha Wildner /** Block level API */ 2351a28cd43dSSascha Wildner /* ============================ */ 2352a28cd43dSSascha Wildner 2353a28cd43dSSascha Wildner /*! 2354a28cd43dSSascha Wildner Block functions produce and decode raw zstd blocks, without frame metadata. 2355a28cd43dSSascha Wildner Frame metadata cost is typically ~12 bytes, which can be non-negligible for very small blocks (< 100 bytes). 2356a28cd43dSSascha Wildner But users will have to take in charge needed metadata to regenerate data, such as compressed and content sizes. 2357a28cd43dSSascha Wildner 2358a28cd43dSSascha Wildner A few rules to respect : 2359a28cd43dSSascha Wildner - Compressing and decompressing require a context structure 2360a28cd43dSSascha Wildner + Use ZSTD_createCCtx() and ZSTD_createDCtx() 2361a28cd43dSSascha Wildner - It is necessary to init context before starting 2362a28cd43dSSascha Wildner + compression : any ZSTD_compressBegin*() variant, including with dictionary 2363a28cd43dSSascha Wildner + decompression : any ZSTD_decompressBegin*() variant, including with dictionary 2364a28cd43dSSascha Wildner + copyCCtx() and copyDCtx() can be used too 2365a28cd43dSSascha Wildner - Block size is limited, it must be <= ZSTD_getBlockSize() <= ZSTD_BLOCKSIZE_MAX == 128 KB 2366a28cd43dSSascha Wildner + If input is larger than a block size, it's necessary to split input data into multiple blocks 2367a28cd43dSSascha Wildner + For inputs larger than a single block, consider using regular ZSTD_compress() instead. 2368a28cd43dSSascha Wildner Frame metadata is not that costly, and quickly becomes negligible as source size grows larger than a block. 2369a28cd43dSSascha Wildner - When a block is considered not compressible enough, ZSTD_compressBlock() result will be 0 (zero) ! 2370a28cd43dSSascha Wildner ===> In which case, nothing is produced into `dst` ! 2371a28cd43dSSascha Wildner + User __must__ test for such outcome and deal directly with uncompressed data 2372a28cd43dSSascha Wildner + A block cannot be declared incompressible if ZSTD_compressBlock() return value was != 0. 2373a28cd43dSSascha Wildner Doing so would mess up with statistics history, leading to potential data corruption. 2374a28cd43dSSascha Wildner + ZSTD_decompressBlock() _doesn't accept uncompressed data as input_ !! 2375a28cd43dSSascha Wildner + In case of multiple successive blocks, should some of them be uncompressed, 2376a28cd43dSSascha Wildner decoder must be informed of their existence in order to follow proper history. 2377a28cd43dSSascha Wildner Use ZSTD_insertBlock() for such a case. 2378a28cd43dSSascha Wildner */ 2379a28cd43dSSascha Wildner 2380a28cd43dSSascha Wildner /*===== Raw zstd block functions =====*/ 2381a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_getBlockSize (const ZSTD_CCtx* cctx); 2382a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressBlock (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); 2383a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); 2384a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_insertBlock (ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize); /**< insert uncompressed block into `dctx` history. Useful for multi-blocks decompression. */ 2385a28cd43dSSascha Wildner 2386a28cd43dSSascha Wildner 2387a28cd43dSSascha Wildner #endif /* ZSTD_H_ZSTD_STATIC_LINKING_ONLY */ 2388a28cd43dSSascha Wildner 2389a28cd43dSSascha Wildner #if defined (__cplusplus) 2390a28cd43dSSascha Wildner } 2391a28cd43dSSascha Wildner #endif 2392