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