From: Yann Collet Date: Wed, 14 Nov 2018 21:05:35 +0000 (-0800) Subject: finalized retrofit of ZSTD_CCtx_reset() X-Git-Tag: v1.3.8~33^2~34 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7b0391e37e3d9ac360174e91aaecbd40c66f6d72;p=thirdparty%2Fzstd.git finalized retrofit of ZSTD_CCtx_reset() updated all depending sources --- diff --git a/doc/zstd_manual.html b/doc/zstd_manual.html index f8a189293..1bae5c394 100644 --- a/doc/zstd_manual.html +++ b/doc/zstd_manual.html @@ -21,16 +21,16 @@
  • ADVANCED AND EXPERIMENTAL FUNCTIONS
  • Candidate API for promotion into stable
  • Memory management
  • -
  • Purely experimental API
  • -
  • Frame size functions
  • -
  • Memory management
  • -
  • Advanced compression functions
  • -
  • Advanced decompression functions
  • -
  • Advanced streaming functions
  • -
  • Buffer-less and synchronous inner streaming functions
  • -
  • Buffer-less streaming compression (synchronous mode)
  • -
  • Buffer-less streaming decompression (synchronous mode)
  • -
  • New advanced API (experimental)
  • +
  • Advanced compression API
  • +
  • experimental API (static linking only)
  • +
  • Frame size functions
  • +
  • Memory management
  • +
  • Advanced compression functions
  • +
  • Advanced decompression functions
  • +
  • Advanced streaming functions
  • +
  • Buffer-less and synchronous inner streaming functions
  • +
  • Buffer-less streaming compression (synchronous mode)
  • +
  • Buffer-less streaming decompression (synchronous mode)
  • Block level API

  • @@ -370,442 +370,7 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); Object memory usage can evolve when re-used.


    -

    Purely experimental API

    - The following symbols and constants
    - are not planned to join "stable API" status anytime soon.
    - Some will never reach "stable", and remain in the static_only section.
    - Some of them might be removed in the future.
    - 
    -
    - -
    typedef enum { ZSTD_fast=1,
    -               ZSTD_dfast=2,
    -               ZSTD_greedy=3,
    -               ZSTD_lazy=4,
    -               ZSTD_lazy2=5,
    -               ZSTD_btlazy2=6,
    -               ZSTD_btopt=7,
    -               ZSTD_btultra=8
    -               /* note : new strategies might be added in the future */
    -           } ZSTD_strategy;
    -

    -
    typedef struct {
    -    unsigned windowLog;       /**< largest match distance : larger == more compression, more memory needed during decompression */
    -    unsigned chainLog;        /**< fully searched segment : larger == more compression, slower, more memory (useless for fast) */
    -    unsigned hashLog;         /**< dispatch table : larger == faster, more memory */
    -    unsigned searchLog;       /**< nb of searches : larger == more compression, slower */
    -    unsigned searchLength;    /**< match length searched : larger == faster decompression, sometimes less compression */
    -    unsigned targetLength;    /**< acceptable match size for optimal parser (only) : larger == more compression, slower */
    -    ZSTD_strategy strategy;   /**< see ZSTD_strategy definition above */
    -} ZSTD_compressionParameters;
    -

    -
    typedef struct {
    -    unsigned contentSizeFlag; /**< 1: content size will be in frame header (when known) */
    -    unsigned checksumFlag;    /**< 1: generate a 32-bits checksum using XXH64 algorithm at end of frame, for error detection */
    -    unsigned noDictIDFlag;    /**< 1: no dictID will be saved into frame header (dictID is only useful for dictionary compression) */
    -} ZSTD_frameParameters;
    -

    -
    typedef struct {
    -    ZSTD_compressionParameters cParams;
    -    ZSTD_frameParameters fParams;
    -} ZSTD_parameters;
    -

    -
    typedef enum {
    -    ZSTD_dct_auto = 0,       /* dictionary is "full" when starting with ZSTD_MAGIC_DICTIONARY, otherwise it is "rawContent" */
    -    ZSTD_dct_rawContent = 1, /* ensures dictionary is always loaded as rawContent, even if it starts with ZSTD_MAGIC_DICTIONARY */
    -    ZSTD_dct_fullDict = 2    /* refuses to load a dictionary if it does not respect Zstandard's specification, starting with ZSTD_MAGIC_DICTIONARY */
    -} ZSTD_dictContentType_e;
    -

    -
    typedef enum {
    -    ZSTD_dlm_byCopy = 0,  /**< Copy dictionary content internally */
    -    ZSTD_dlm_byRef = 1,   /**< Reference dictionary content -- the dictionary buffer must outlive its users. */
    -} ZSTD_dictLoadMethod_e;
    -

    -

    Frame size functions

    
    -
    -
    size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize);
    -

    `src` should point to the start of a ZSTD encoded frame or skippable frame - `srcSize` must be >= first frame size - @return : the compressed size of the first frame starting at `src`, - suitable to pass to `ZSTD_decompress` or similar, - or an error code if input is invalid -


    - -
    unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize);
    -

    `src` should point the start of a series of ZSTD encoded and/or skippable frames - `srcSize` must be the _exact_ size of this series - (i.e. there should be a frame boundary exactly at `srcSize` bytes after `src`) - @return : - decompressed size of all data in all successive frames - - if the decompressed size cannot be determined: ZSTD_CONTENTSIZE_UNKNOWN - - if an error occurred: ZSTD_CONTENTSIZE_ERROR - - note 1 : decompressed size is an optional field, that may not be present, especially in streaming mode. - When `return==ZSTD_CONTENTSIZE_UNKNOWN`, data to decompress could be any size. - In which case, it's necessary to use streaming mode to decompress data. - note 2 : decompressed size is always present when compression is done with ZSTD_compress() - note 3 : decompressed size can be very large (64-bits value), - potentially larger than what local system can handle as a single memory segment. - In which case, it's necessary to use streaming mode to decompress data. - note 4 : If source is untrusted, decompressed size could be wrong or intentionally modified. - Always ensure result fits within application's authorized limits. - Each application can set its own limits. - note 5 : ZSTD_findDecompressedSize handles multiple frames, and so it must traverse the input to - read each contained frame header. This is fast as most of the data is skipped, - however it does mean that all frame data must be present and valid. -


    - -
    size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize);
    -

    srcSize must be >= ZSTD_frameHeaderSize_prefix. - @return : size of the Frame Header, - or an error code (if srcSize is too small) -


    - -

    Memory management

    
    -
    -
    size_t ZSTD_estimateCCtxSize(int compressionLevel);
    -size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams);
    -size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params);
    -size_t ZSTD_estimateDCtxSize(void);
    -

    These functions make it possible to estimate memory usage - of a future {D,C}Ctx, before its creation. - ZSTD_estimateCCtxSize() will provide a budget large enough for any compression level up to selected one. - It will also consider src size to be arbitrarily "large", which is worst case. - If srcSize is known to always be small, ZSTD_estimateCCtxSize_usingCParams() can provide a tighter estimation. - ZSTD_estimateCCtxSize_usingCParams() can be used in tandem with ZSTD_getCParams() to create cParams from compressionLevel. - ZSTD_estimateCCtxSize_usingCCtxParams() can be used in tandem with ZSTD_CCtxParam_setParameter(). Only single-threaded compression is supported. This function will return an error code if ZSTD_p_nbWorkers is >= 1. - Note : CCtx size estimation is only correct for single-threaded compression. -


    - -
    size_t ZSTD_estimateCStreamSize(int compressionLevel);
    -size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams);
    -size_t ZSTD_estimateCStreamSize_usingCCtxParams(const ZSTD_CCtx_params* params);
    -size_t ZSTD_estimateDStreamSize(size_t windowSize);
    -size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize);
    -

    ZSTD_estimateCStreamSize() will provide a budget large enough for any compression level up to selected one. - It will also consider src size to be arbitrarily "large", which is worst case. - If srcSize is known to always be small, ZSTD_estimateCStreamSize_usingCParams() can provide a tighter estimation. - ZSTD_estimateCStreamSize_usingCParams() can be used in tandem with ZSTD_getCParams() to create cParams from compressionLevel. - ZSTD_estimateCStreamSize_usingCCtxParams() can be used in tandem with ZSTD_CCtxParam_setParameter(). Only single-threaded compression is supported. This function will return an error code if ZSTD_p_nbWorkers is >= 1. - Note : CStream size estimation is only correct for single-threaded compression. - ZSTD_DStream memory budget depends on window Size. - This information can be passed manually, using ZSTD_estimateDStreamSize, - or deducted from a valid frame Header, using ZSTD_estimateDStreamSize_fromFrame(); - Note : if streaming is init with function ZSTD_init?Stream_usingDict(), - an internal ?Dict will be created, which additional size is not estimated here. - In this case, get total size by adding ZSTD_estimate?DictSize -


    - -
    size_t ZSTD_estimateCDictSize(size_t dictSize, int compressionLevel);
    -size_t ZSTD_estimateCDictSize_advanced(size_t dictSize, ZSTD_compressionParameters cParams, ZSTD_dictLoadMethod_e dictLoadMethod);
    -size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod);
    -

    ZSTD_estimateCDictSize() will bet that src size is relatively "small", and content is copied, like ZSTD_createCDict(). - ZSTD_estimateCDictSize_advanced() makes it possible to control compression parameters precisely, like ZSTD_createCDict_advanced(). - Note : dictionaries created by reference (`ZSTD_dlm_byRef`) are logically smaller. - -


    - -
    ZSTD_CCtx*    ZSTD_initStaticCCtx(void* workspace, size_t workspaceSize);
    -ZSTD_CStream* ZSTD_initStaticCStream(void* workspace, size_t workspaceSize);    /**< same as ZSTD_initStaticCCtx() */
    -

    Initialize an object using a pre-allocated fixed-size buffer. - workspace: The memory area to emplace the object into. - Provided pointer *must be 8-bytes aligned*. - Buffer must outlive object. - workspaceSize: Use ZSTD_estimate*Size() to determine - how large workspace must be to support target scenario. - @return : pointer to object (same address as workspace, just different type), - or NULL if error (size too small, incorrect alignment, etc.) - Note : zstd will never resize nor malloc() when using a static buffer. - If the object requires more memory than available, - zstd will just error out (typically ZSTD_error_memory_allocation). - Note 2 : there is no corresponding "free" function. - Since workspace is allocated externally, it must be freed externally too. - Note 3 : cParams : use ZSTD_getCParams() to convert a compression level - into its associated cParams. - Limitation 1 : currently not compatible with internal dictionary creation, triggered by - ZSTD_CCtx_loadDictionary(), ZSTD_initCStream_usingDict() or ZSTD_initDStream_usingDict(). - Limitation 2 : static cctx currently not compatible with multi-threading. - Limitation 3 : static dctx is incompatible with legacy support. - -


    - -
    ZSTD_DStream* ZSTD_initStaticDStream(void* workspace, size_t workspaceSize);    /**< same as ZSTD_initStaticDCtx() */
    -

    -
    typedef void* (*ZSTD_allocFunction) (void* opaque, size_t size);
    -typedef void  (*ZSTD_freeFunction) (void* opaque, void* address);
    -typedef struct { ZSTD_allocFunction customAlloc; ZSTD_freeFunction customFree; void* opaque; } ZSTD_customMem;
    -static ZSTD_customMem const ZSTD_defaultCMem = { NULL, NULL, NULL };  /**< this constant defers to stdlib's functions */
    -

    These prototypes make it possible to pass your own allocation/free functions. - ZSTD_customMem is provided at creation time, using ZSTD_create*_advanced() variants listed below. - All allocation/free operations will be completed using these custom variants instead of regular ones. - -


    - -

    Advanced compression functions

    
    -
    -
    ZSTD_CDict* ZSTD_createCDict_byReference(const void* dictBuffer, size_t dictSize, int compressionLevel);
    -

    Create a digested dictionary for compression - Dictionary content is simply referenced, and therefore stays in dictBuffer. - It is important that dictBuffer outlives CDict, it must remain read accessible throughout the lifetime of CDict -


    - -
    ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize);
    -

    @return ZSTD_compressionParameters structure for a selected compression level and estimated srcSize. - `estimatedSrcSize` value is optional, select 0 if not known -


    - -
    ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize);
    -

    same as ZSTD_getCParams(), but @return a full `ZSTD_parameters` object instead of sub-component `ZSTD_compressionParameters`. - All fields of `ZSTD_frameParameters` are set to default : contentSize=1, checksum=0, noDictID=0 -


    - -
    size_t ZSTD_checkCParams(ZSTD_compressionParameters params);
    -

    Ensure param values remain within authorized range -


    - -
    ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize);
    -

    optimize params for a given `srcSize` and `dictSize`. - both values are optional, select `0` if unknown. -


    - -
    size_t ZSTD_compress_advanced (ZSTD_CCtx* cctx,
    -                      void* dst, size_t dstCapacity,
    -                const void* src, size_t srcSize,
    -                const void* dict,size_t dictSize,
    -                      ZSTD_parameters params);
    -

    Same as ZSTD_compress_usingDict(), with fine-tune control over each compression parameter -


    - -
    size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx,
    -                      void* dst, size_t dstCapacity,
    -                const void* src, size_t srcSize,
    -                const ZSTD_CDict* cdict, ZSTD_frameParameters fParams);
    -

    Same as ZSTD_compress_usingCDict(), with fine-tune control over frame parameters -


    - -

    Advanced decompression functions

    
    -
    -
    unsigned ZSTD_isFrame(const void* buffer, size_t size);
    -

    Tells if the content of `buffer` starts with a valid Frame Identifier. - Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0. - Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled. - Note 3 : Skippable Frame Identifiers are considered valid. -


    - -
    ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize);
    -

    Create a digested dictionary, ready to start decompression operation without startup delay. - Dictionary content is referenced, and therefore stays in dictBuffer. - It is important that dictBuffer outlives DDict, - it must remain read accessible throughout the lifetime of DDict -


    - -
    unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize);
    -

    Provides the dictID stored within dictionary. - if @return == 0, the dictionary is not conformant with Zstandard specification. - It can still be loaded, but as a content-only dictionary. -


    - -
    unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict);
    -

    Provides the dictID of the dictionary loaded into `ddict`. - If @return == 0, the dictionary is not conformant to Zstandard specification, or empty. - Non-conformant dictionaries can still be loaded, but as content-only dictionaries. -


    - -
    unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize);
    -

    Provides the dictID required to decompressed the frame stored within `src`. - If @return == 0, the dictID could not be decoded. - This could for one of the following reasons : - - The frame does not require a dictionary to be decoded (most common case). - - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden information. - Note : this use case also happens when using a non-conformant dictionary. - - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`). - - This is not a Zstandard frame. - When identifying the exact failure cause, it's possible to use ZSTD_getFrameHeader(), which will provide a more precise error code. -


    - -

    Advanced streaming functions

    
    -
    -

    Advanced Streaming compression functions

    size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs, int compressionLevel, unsigned long long pledgedSrcSize);   /**< pledgedSrcSize must be correct. If it is not known at init time, use ZSTD_CONTENTSIZE_UNKNOWN. Note that, for compatibility with older programs, "0" also disables frame content size field. It may be enabled in the future. */
    -size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs, const void* dict, size_t dictSize, int compressionLevel); /**< creates of an internal CDict (incompatible with static CCtx), except if dict == NULL or dictSize < 8, in which case no dict is used. Note: dict is loaded with ZSTD_dm_auto (treated as a full zstd dictionary if it begins with ZSTD_MAGIC_DICTIONARY, else as raw content) and ZSTD_dlm_byCopy.*/
    -size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs, const void* dict, size_t dictSize,
    -                                             ZSTD_parameters params, unsigned long long pledgedSrcSize);  /**< pledgedSrcSize must be correct. If srcSize is not known at init time, use value ZSTD_CONTENTSIZE_UNKNOWN. dict is loaded with ZSTD_dm_auto and ZSTD_dlm_byCopy. */
    -size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict);  /**< note : cdict will just be referenced, and must outlive compression session */
    -size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs, const ZSTD_CDict* cdict, ZSTD_frameParameters fParams, unsigned long long pledgedSrcSize);  /**< same as ZSTD_initCStream_usingCDict(), with control over frame parameters. pledgedSrcSize must be correct. If srcSize is not known at init time, use value ZSTD_CONTENTSIZE_UNKNOWN. */
    -

    -
    size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize);
    -

    start a new compression job, using same parameters from previous job. - This is typically useful to skip dictionary loading stage, since it will re-use it in-place. - Note that zcs must be init at least once before using ZSTD_resetCStream(). - If pledgedSrcSize is not known at reset time, use macro ZSTD_CONTENTSIZE_UNKNOWN. - If pledgedSrcSize > 0, its value must be correct, as it will be written in header, and controlled at the end. - For the time being, pledgedSrcSize==0 is interpreted as "srcSize unknown" for compatibility with older programs, - but it will change to mean "empty" in future version, so use macro ZSTD_CONTENTSIZE_UNKNOWN instead. - @return : 0, or an error code (which can be tested using ZSTD_isError()) - -


    - -
    typedef struct {
    -    unsigned long long ingested;   /* nb input bytes read and buffered */
    -    unsigned long long consumed;   /* nb input bytes actually compressed */
    -    unsigned long long produced;   /* nb of compressed bytes generated and buffered */
    -    unsigned long long flushed;    /* nb of compressed bytes flushed : not provided; can be tracked from caller side */
    -    unsigned currentJobID;         /* MT only : latest started job nb */
    -    unsigned nbActiveWorkers;      /* MT only : nb of workers actively compressing at probe time */
    -} ZSTD_frameProgression;
    -

    -
    size_t ZSTD_toFlushNow(ZSTD_CCtx* cctx);
    -

    Tell how many bytes are ready to be flushed immediately. - Useful for multithreading scenarios (nbWorkers >= 1). - Probe the oldest active job, defined as oldest job not yet entirely flushed, - and check its output buffer. - @return : amount of data stored in oldest job and ready to be flushed immediately. - if @return == 0, it means either : - + there is no active job (could be checked with ZSTD_frameProgression()), or - + oldest job is still actively compressing data, - but everything it has produced has also been flushed so far, - therefore flush speed is limited by production speed of oldest job - irrespective of the speed of concurrent (and newer) jobs. - -


    - -

    Advanced Streaming decompression functions

    size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize); /**< note: no dictionary will be used if dict == NULL or dictSize < 8 */
    -size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDict* ddict);  /**< note : ddict is referenced, it must outlive decompression session */
    -size_t ZSTD_resetDStream(ZSTD_DStream* zds);  /**< re-use decompression parameters from previous init; saves dictionary loading */
    -

    -

    Buffer-less and synchronous inner streaming functions

    -  This is an advanced API, giving full control over buffer management, for users which need direct control over memory.
    -  But it's also a complex one, with several restrictions, documented below.
    -  Prefer normal streaming API for an easier experience.
    - 
    -
    - -

    Buffer-less streaming compression (synchronous mode)

    -  A ZSTD_CCtx object is required to track streaming operations.
    -  Use ZSTD_createCCtx() / ZSTD_freeCCtx() to manage resource.
    -  ZSTD_CCtx object can be re-used multiple times within successive compression operations.
    -
    -  Start by initializing a context.
    -  Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression,
    -  or ZSTD_compressBegin_advanced(), for finer parameter control.
    -  It's also possible to duplicate a reference context which has already been initialized, using ZSTD_copyCCtx()
    -
    -  Then, consume your input using ZSTD_compressContinue().
    -  There are some important considerations to keep in mind when using this advanced function :
    -  - ZSTD_compressContinue() has no internal buffer. It uses externally provided buffers only.
    -  - Interface is synchronous : input is consumed entirely and produces 1+ compressed blocks.
    -  - Caller must ensure there is enough space in `dst` to store compressed data under worst case scenario.
    -    Worst case evaluation is provided by ZSTD_compressBound().
    -    ZSTD_compressContinue() doesn't guarantee recover after a failed compression.
    -  - ZSTD_compressContinue() presumes prior input ***is still accessible and unmodified*** (up to maximum distance size, see WindowLog).
    -    It remembers all previous contiguous blocks, plus one separated memory segment (which can itself consists of multiple contiguous blocks)
    -  - ZSTD_compressContinue() detects that prior input has been overwritten when `src` buffer overlaps.
    -    In which case, it will "discard" the relevant memory section from its history.
    -
    -  Finish a frame with ZSTD_compressEnd(), which will write the last block(s) and optional checksum.
    -  It's possible to use srcSize==0, in which case, it will write a final empty block to end the frame.
    -  Without last block mark, frames are considered unfinished (hence corrupted) by compliant decoders.
    -
    -  `ZSTD_CCtx` object can be re-used (ZSTD_compressBegin()) to compress again.
    -
    - -

    Buffer-less streaming compression functions

    size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel);
    -size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel);
    -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 */
    -size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); /**< note: fails if cdict==NULL */
    -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 */
    -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 */
    -

    -

    Buffer-less streaming decompression (synchronous mode)

    -  A ZSTD_DCtx object is required to track streaming operations.
    -  Use ZSTD_createDCtx() / ZSTD_freeDCtx() to manage it.
    -  A ZSTD_DCtx object can be re-used multiple times.
    -
    -  First typical operation is to retrieve frame parameters, using ZSTD_getFrameHeader().
    -  Frame header is extracted from the beginning of compressed frame, so providing only the frame's beginning is enough.
    -  Data fragment must be large enough to ensure successful decoding.
    - `ZSTD_frameHeaderSize_max` bytes is guaranteed to always be large enough.
    -  @result : 0 : successful decoding, the `ZSTD_frameHeader` structure is correctly filled.
    -           >0 : `srcSize` is too small, please provide at least @result bytes on next attempt.
    -           errorCode, which can be tested using ZSTD_isError().
    -
    -  It fills a ZSTD_frameHeader structure with important information to correctly decode the frame,
    -  such as the dictionary ID, content size, or maximum back-reference distance (`windowSize`).
    -  Note that these values could be wrong, either because of data corruption, or because a 3rd party deliberately spoofs false information.
    -  As a consequence, check that values remain within valid application range.
    -  For example, do not allocate memory blindly, check that `windowSize` is within expectation.
    -  Each application can set its own limits, depending on local restrictions.
    -  For extended interoperability, it is recommended to support `windowSize` of at least 8 MB.
    -
    -  ZSTD_decompressContinue() needs previous data blocks during decompression, up to `windowSize` bytes.
    -  ZSTD_decompressContinue() is very sensitive to contiguity,
    -  if 2 blocks don't follow each other, make sure that either the compressor breaks contiguity at the same place,
    -  or that previous contiguous segment is large enough to properly handle maximum back-reference distance.
    -  There are multiple ways to guarantee this condition.
    -
    -  The most memory efficient way is to use a round buffer of sufficient size.
    -  Sufficient size is determined by invoking ZSTD_decodingBufferSize_min(),
    -  which can @return an error code if required value is too large for current system (in 32-bits mode).
    -  In a round buffer methodology, ZSTD_decompressContinue() decompresses each block next to previous one,
    -  up to the moment there is not enough room left in the buffer to guarantee decoding another full block,
    -  which maximum size is provided in `ZSTD_frameHeader` structure, field `blockSizeMax`.
    -  At which point, decoding can resume from the beginning of the buffer.
    -  Note that already decoded data stored in the buffer should be flushed before being overwritten.
    -
    -  There are alternatives possible, for example using two or more buffers of size `windowSize` each, though they consume more memory.
    -
    -  Finally, if you control the compression process, you can also ignore all buffer size rules,
    -  as long as the encoder and decoder progress in "lock-step",
    -  aka use exactly the same buffer sizes, break contiguity at the same place, etc.
    -
    -  Once buffers are setup, start decompression, with ZSTD_decompressBegin().
    -  If decompression requires a dictionary, use ZSTD_decompressBegin_usingDict() or ZSTD_decompressBegin_usingDDict().
    -
    -  Then use ZSTD_nextSrcSizeToDecompress() and ZSTD_decompressContinue() alternatively.
    -  ZSTD_nextSrcSizeToDecompress() tells how many bytes to provide as 'srcSize' to ZSTD_decompressContinue().
    -  ZSTD_decompressContinue() requires this _exact_ amount of bytes, or it will fail.
    -
    - @result of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst' (necessarily <= dstCapacity).
    -  It can be zero : it just means ZSTD_decompressContinue() has decoded some metadata item.
    -  It can also be an error code, which can be tested with ZSTD_isError().
    -
    -  A frame is fully decoded when ZSTD_nextSrcSizeToDecompress() returns zero.
    -  Context can then be reset to start a new decompression.
    -
    -  Note : it's possible to know if next input to present is a header or a block, using ZSTD_nextInputType().
    -  This information is not required to properly decode a frame.
    -
    -  == Special case : skippable frames 
    -
    -  Skippable frames allow integration of user-defined data into a flow of concatenated frames.
    -  Skippable frames will be ignored (skipped) by decompressor.
    -  The format of skippable frames is as follows :
    -  a) Skippable frame ID - 4 Bytes, Little endian format, any value from 0x184D2A50 to 0x184D2A5F
    -  b) Frame Size - 4 Bytes, Little endian format, unsigned 32-bits
    -  c) Frame Content - any content (User Data) of length equal to Frame Size
    -  For skippable frames ZSTD_getFrameHeader() returns zfhPtr->frameType==ZSTD_skippableFrame.
    -  For skippable frames ZSTD_decompressContinue() always returns 0 : it only skips the content.
    -
    - -

    Buffer-less streaming decompression functions

    typedef enum { ZSTD_frame, ZSTD_skippableFrame } ZSTD_frameType_e;
    -typedef struct {
    -    unsigned long long frameContentSize; /* if == ZSTD_CONTENTSIZE_UNKNOWN, it means this field is not available. 0 means "empty" */
    -    unsigned long long windowSize;       /* can be very large, up to <= frameContentSize */
    -    unsigned blockSizeMax;
    -    ZSTD_frameType_e frameType;          /* if == ZSTD_skippableFrame, frameContentSize is the size of skippable content */
    -    unsigned headerSize;
    -    unsigned dictID;
    -    unsigned checksumFlag;
    -} ZSTD_frameHeader;
    -/** ZSTD_getFrameHeader() :
    - *  decode Frame Header, or requires larger `srcSize`.
    - * @return : 0, `zfhPtr` is correctly filled,
    - *          >0, `srcSize` is too small, value is wanted `srcSize` amount,
    - *           or an error code, which can be tested using ZSTD_isError() */
    -size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize);   /**< doesn't consume input */
    -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 */
    -

    -
    typedef enum { ZSTDnit_frameHeader, ZSTDnit_blockHeader, ZSTDnit_block, ZSTDnit_lastBlock, ZSTDnit_checksum, ZSTDnit_skippableFrame } ZSTD_nextInputType_e;
    -

    -

    New advanced API (experimental)

    
    +

    Advanced compression API

    
     
     
    typedef enum {
         /* Opened question : should we have a format ZSTD_f_auto ?
    @@ -817,12 +382,23 @@ size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long
          * Since meaning is a little different, another option could be to define different enums for compression and decompression.
          * This question could be kept for later, when there are actually multiple formats to support,
          * but there is also the question of pinning enum values, and pinning value `0` is especially important */
    -    ZSTD_f_zstd1 = 0,        /* zstd frame format, specified in zstd_compression_format.md (default) */
    -    ZSTD_f_zstd1_magicless,  /* Variant of zstd frame format, without initial 4-bytes magic number.
    -                              * Useful to save 4 bytes per generated frame.
    -                              * Decoder cannot recognise automatically this format, requiring instructions. */
    +    ZSTD_f_zstd1 = 0,           /* zstd frame format, specified in zstd_compression_format.md (default) */
    +    ZSTD_f_zstd1_magicless = 1, /* Variant of zstd frame format, without initial 4-bytes magic number.
    +                                 * Useful to save 4 bytes per generated frame.
    +                                 * Decoder cannot recognise automatically this format, requiring instructions. */
     } ZSTD_format_e;
     

    +
    typedef enum { ZSTD_fast=1,
    +               ZSTD_dfast=2,
    +               ZSTD_greedy=3,
    +               ZSTD_lazy=4,
    +               ZSTD_lazy2=5,
    +               ZSTD_btlazy2=6,
    +               ZSTD_btopt=7,
    +               ZSTD_btultra=8
    +               /* note : new strategies might be added in the future */
    +           } ZSTD_strategy;
    +

    typedef enum {
         /* Note: this enum and the behavior it controls are effectively internal
          * implementation details of the compressor. They are expected to continue
    @@ -856,9 +432,6 @@ size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long
     } ZSTD_dictAttachPref_e;
     

    typedef enum {
    -    /* compression format */
    -    ZSTD_p_format = 10,      /* See ZSTD_format_e enum definition.
    -                              * Cast selected format as unsigned for ZSTD_CCtx_setParameter() compatibility. */
     
         /* compression parameters */
         ZSTD_p_compressionLevel=100, /* Update all compression parameters according to pre-defined cLevel table
    @@ -867,18 +440,18 @@ size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long
                                   * Note 1 : it's possible to pass a negative compression level by casting it to unsigned type.
                                   * Note 2 : setting a level sets all default values of other compression parameters.
                                   * Note 3 : setting compressionLevel automatically updates ZSTD_p_compressLiterals. */
    -    ZSTD_p_windowLog,        /* Maximum allowed back-reference distance, expressed as power of 2.
    +    ZSTD_p_windowLog=101,    /* Maximum allowed back-reference distance, expressed as power of 2.
                                   * Must be clamped between ZSTD_WINDOWLOG_MIN and ZSTD_WINDOWLOG_MAX.
                                   * Special: value 0 means "use default windowLog".
                                   * Note: Using a window size greater than ZSTD_MAXWINDOWSIZE_DEFAULT (default: 2^27)
                                   *       requires explicitly allowing such window size during decompression stage. */
    -    ZSTD_p_hashLog,          /* Size of the initial probe table, as a power of 2.
    +    ZSTD_p_hashLog=102,      /* Size of the initial probe table, as a power of 2.
                                   * Resulting table size is (1 << (hashLog+2)).
                                   * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX.
                                   * Larger tables improve compression ratio of strategies <= dFast,
                                   * and improve speed of strategies > dFast.
                                   * Special: value 0 means "use default hashLog". */
    -    ZSTD_p_chainLog,         /* Size of the multi-probe search table, as a power of 2.
    +    ZSTD_p_chainLog=103,     /* Size of the multi-probe search table, as a power of 2.
                                   * Resulting table size is (1 << (chainLog+2)).
                                   * Must be clamped between ZSTD_CHAINLOG_MIN and ZSTD_CHAINLOG_MAX.
                                   * Larger tables result in better and slower compression.
    @@ -886,17 +459,17 @@ size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long
                                   * Note it's still useful when using "dfast" strategy,
                                   * in which case it defines a secondary probe table.
                                   * Special: value 0 means "use default chainLog". */
    -    ZSTD_p_searchLog,        /* Number of search attempts, as a power of 2.
    +    ZSTD_p_searchLog=104,    /* Number of search attempts, as a power of 2.
                                   * More attempts result in better and slower compression.
                                   * This parameter is useless when using "fast" and "dFast" strategies.
                                   * Special: value 0 means "use default searchLog". */
    -    ZSTD_p_minMatch,         /* Minimum size of searched matches (note : repCode matches can be smaller).
    +    ZSTD_p_minMatch=105,     /* Minimum size of searched matches (note : repCode matches can be smaller).
                                   * Larger values make faster compression and decompression, but decrease ratio.
                                   * Must be clamped between ZSTD_SEARCHLENGTH_MIN and ZSTD_SEARCHLENGTH_MAX.
                                   * Note that currently, for all strategies < btopt, effective minimum is 4.
                                   *                    , for all strategies > fast, effective maximum is 6.
                                   * Special: value 0 means "use default minMatchLength". */
    -    ZSTD_p_targetLength,     /* Impact of this field depends on strategy.
    +    ZSTD_p_targetLength=106, /* Impact of this field depends on strategy.
                                   * For strategies btopt & btultra:
                                   *     Length of Match considered "good enough" to stop search.
                                   *     Larger values make compression stronger, and slower.
    @@ -904,33 +477,34 @@ size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long
                                   *     Distance between match sampling.
                                   *     Larger values make compression faster, and weaker.
                                   * Special: value 0 means "use default targetLength". */
    -    ZSTD_p_compressionStrategy, /* See ZSTD_strategy enum definition.
    +    ZSTD_p_compressionStrategy=107, /* See ZSTD_strategy enum definition.
                                   * Cast selected strategy as unsigned for ZSTD_CCtx_setParameter() compatibility.
                                   * The higher the value of selected strategy, the more complex it is,
                                   * resulting in stronger and slower compression.
                                   * Special: value 0 means "use default strategy". */
     
    +    /* LDM mode parameters */
         ZSTD_p_enableLongDistanceMatching=160, /* Enable long distance matching.
    -                                         * This parameter is designed to improve compression ratio
    -                                         * for large inputs, by finding large matches at long distance.
    -                                         * It increases memory usage and window size.
    -                                         * Note: enabling this parameter increases ZSTD_p_windowLog to 128 MB
    -                                         * except when expressly set to a different value. */
    -    ZSTD_p_ldmHashLog,       /* Size of the table for long distance matching, as a power of 2.
    +                                     * This parameter is designed to improve compression ratio
    +                                     * for large inputs, by finding large matches at long distance.
    +                                     * It increases memory usage and window size.
    +                                     * Note: enabling this parameter increases ZSTD_p_windowLog to 128 MB
    +                                     * except when expressly set to a different value. */
    +    ZSTD_p_ldmHashLog=161,   /* Size of the table for long distance matching, as a power of 2.
                                   * Larger values increase memory usage and compression ratio,
                                   * but decrease compression speed.
                                   * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX
                                   * default: windowlog - 7.
                                   * Special: value 0 means "automatically determine hashlog". */
    -    ZSTD_p_ldmMinMatch,      /* Minimum match size for long distance matcher.
    +    ZSTD_p_ldmMinMatch=162,  /* Minimum match size for long distance matcher.
                                   * Larger/too small values usually decrease compression ratio.
                                   * Must be clamped between ZSTD_LDM_MINMATCH_MIN and ZSTD_LDM_MINMATCH_MAX.
                                   * Special: value 0 means "use default value" (default: 64). */
    -    ZSTD_p_ldmBucketSizeLog, /* Log size of each bucket in the LDM hash table for collision resolution.
    +    ZSTD_p_ldmBucketSizeLog=163, /* Log size of each bucket in the LDM hash table for collision resolution.
                                   * Larger values improve collision resolution but decrease compression speed.
                                   * The maximum value is ZSTD_LDM_BUCKETSIZELOG_MAX .
                                   * Special: value 0 means "use default value" (default: 3). */
    -    ZSTD_p_ldmHashEveryLog,  /* Frequency of inserting/looking up entries in the LDM hash table.
    +    ZSTD_p_ldmHashEveryLog=164, /* Frequency of inserting/looking up entries into the LDM hash table.
                                   * Must be clamped between 0 and (ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN).
                                   * Default is MAX(0, (windowLog - ldmHashLog)), optimizing hash table usage.
                                   * Larger values improve compression speed.
    @@ -941,8 +515,8 @@ size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long
         ZSTD_p_contentSizeFlag=200, /* Content size will be written into frame header _whenever known_ (default:1)
                                   * Content size must be known at the beginning of compression,
                                   * it is provided using ZSTD_CCtx_setPledgedSrcSize() */
    -    ZSTD_p_checksumFlag,     /* A 32-bits checksum of content is written at end of frame (default:0) */
    -    ZSTD_p_dictIDFlag,       /* When applicable, dictionary's ID is written into frame header (default:1) */
    +    ZSTD_p_checksumFlag=201, /* A 32-bits checksum of content is written at end of frame (default:0) */
    +    ZSTD_p_dictIDFlag=202,   /* When applicable, dictionary's ID is written into frame header (default:1) */
     
         /* multi-threading parameters */
         /* These parameters are only useful if multi-threading is enabled (ZSTD_MULTITHREAD).
    @@ -954,18 +528,23 @@ size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long
                                   * (note : a strong exception to this rule is when first invocation sets ZSTD_e_end : it becomes a blocking call).
                                   * More workers improve speed, but also increase memory usage.
                                   * Default value is `0`, aka "single-threaded mode" : no worker is spawned, compression is performed inside Caller's thread, all invocations are blocking */
    -    ZSTD_p_jobSize,          /* Size of a compression job. This value is enforced only in non-blocking mode.
    +    ZSTD_p_jobSize=401,      /* Size of a compression job. This value is enforced only in non-blocking mode.
                                   * Each compression job is completed in parallel, so this value indirectly controls the nb of active threads.
                                   * 0 means default, which is dynamically determined based on compression parameters.
                                   * Job size must be a minimum of overlapSize, or 1 MB, whichever is largest.
                                   * The minimum size is automatically and transparently enforced */
    -    ZSTD_p_overlapSizeLog,   /* Size of previous input reloaded at the beginning of each job.
    +    ZSTD_p_overlapSizeLog=402, /* Size of previous input reloaded at the beginning of each job.
                                   * 0 => no overlap, 6(default) => use 1/8th of windowSize, >=9 => use full windowSize */
     
         /* =================================================================== */
         /* experimental parameters - no stability guaranteed                   */
    +    /* note : should this be exported in a different section of zstd.h ?   */
         /* =================================================================== */
     
    +    /* compression format */
    +    ZSTD_p_format = 10,      /* See ZSTD_format_e enum definition.
    +                              * Cast selected format as unsigned for ZSTD_CCtx_setParameter() compatibility. */
    +
         ZSTD_p_forceMaxWindow=1100, /* Force back-reference distances to remain < windowSize,
                                   * even when referencing into Dictionary content (default:0) */
         ZSTD_p_forceAttachDict,  /* Controls whether the contents of a CDict are
    @@ -981,12 +560,12 @@ size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long
     
    size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, unsigned value);
     

    Set one compression parameter, selected by enum ZSTD_cParameter. Setting a parameter is generally only possible during frame initialization (before starting compression). - Exception : when using multi-threading mode (nbThreads >= 1), - following parameters can be updated _during_ compression (within same frame): + Exception : when using multi-threading mode (nbWorkers >= 1), + the following parameters can be updated _during_ compression (within same frame): => compressionLevel, hashLog, chainLog, searchLog, minMatch, targetLength and strategy. - new parameters will be active on next job, or after a flush(). - Note : when `value` type is not unsigned (int, or enum), cast it to unsigned for proper type checking. - @result : informational value (typically, value being set, correctly clamped), + new parameters will be active for next job only (after a flush()). + Note : when original `value` type is not unsigned (like int, or enum), cast it to unsigned. + @result : informational value (typically, value being effectively set, after clamping), or an error code (which can be tested with ZSTD_isError()).


    @@ -998,18 +577,16 @@ size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long
    size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize);
     

    Total input data size to be compressed as a single frame. - This value will be controlled at the end, and result in error if not respected. + This value will be controlled at end of frame, and trigger an error if not respected. @result : 0, or an error code (which can be tested with ZSTD_isError()). Note 1 : 0 means zero, empty. In order to mean "unknown content size", pass constant ZSTD_CONTENTSIZE_UNKNOWN. ZSTD_CONTENTSIZE_UNKNOWN is default value for any new compression job. Note 2 : If all data is provided and consumed in a single round, - this value is overriden by srcSize instead. + this value is automatically overriden by srcSize instead.


    size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize);
    -size_t ZSTD_CCtx_loadDictionary_byReference(ZSTD_CCtx* cctx, const void* dict, size_t dictSize);
    -size_t ZSTD_CCtx_loadDictionary_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType);
     

    Create an internal CDict from `dict` buffer. Decompression will have to use same dictionary. @result : 0, or an error code (which can be tested with ZSTD_isError()). @@ -1041,9 +618,6 @@ size_t ZSTD_CCtx_loadDictionary_advanced(ZSTD_CCtx* cctx, const void* dict, size

    size_t ZSTD_CCtx_refPrefix(ZSTD_CCtx* cctx,
                                const void* prefix, size_t prefixSize);
    -size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx,
    -                           const void* prefix, size_t prefixSize,
    -                           ZSTD_dictContentType_e dictContentType);
     

    Reference a prefix (single-usage dictionary) for next compression job. Decompression will need same prefix to properly regenerate data. Compressing with a prefix is similar in outcome as performing a diff and compressing it, @@ -1059,24 +633,31 @@ size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, Note 3 : Referencing a prefix involves building tables, which are dependent on compression parameters. It's a CPU consuming operation, with non-negligible impact on latency. If there is a need to use same prefix multiple times, consider loadDictionary instead. - Note 4 : By default, the prefix is treated as raw content (ZSTD_dm_rawContent). - Use ZSTD_CCtx_refPrefix_advanced() to alter dictMode. + Note 4 : By default, the prefix is interpreted as raw content (ZSTD_dm_rawContent). + Use ZSTD_CCtx_refPrefix_advanced() to alter dictionary intepretation.


    -
    void ZSTD_CCtx_reset(ZSTD_CCtx* cctx);
    +
    typedef enum {
    +    ZSTD_CCtx_reset_session_only = 1,
    +    ZSTD_CCtx_reset_parameters = 2,
    +    ZSTD_CCtx_reset_session_and_parameters = 3
    +} ZSTD_CCtx_reset_directive;
    +

    +
    size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_CCtx_reset_directive zcrd);
     

    Return a CCtx to clean state. - Useful after an error, or to interrupt an ongoing compression job and start a new one. - Any internal data not yet flushed is cancelled. - The parameters and dictionary are kept unchanged, to reset them use ZSTD_CCtx_resetParameters(). - -


    - -
    size_t ZSTD_CCtx_resetParameters(ZSTD_CCtx* cctx);
    -

    All parameters are back to default values (compression level is ZSTD_CLEVEL_DEFAULT). - Dictionary (if any) is dropped. - Resetting parameters is only possible during frame initialization (before starting compression). - To reset the context use ZSTD_CCtx_reset(). - @return 0 or an error code (which can be checked with ZSTD_isError()). + There 2 things that can be reset, independently or jointly : + - The session : will stop compressing current frame, and stand ready to start a new one. + This action never fails. + Useful after an error, or to interrupt any ongoing compression. + Any internal data not yet flushed is cancelled. + But parameters and dictionary are kept unchanged. + Therefore, same parameters and dictionary will be used for next frame. + - The parameters : changes all parameters back to "default". + This removes any dictionary too. + Parameters can only be changed between 2 sessions (i.e. no compression is currently ongoing) + otherwise the reset fails, and function returns an error value (which can be tested using ZSTD_isError()) + - Both : similar to resetting the session, followed by resetting parameters. + This action never fails.


    @@ -1116,17 +697,234 @@ size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx,


    -
    size_t ZSTD_compress_generic_simpleArgs (
    -                ZSTD_CCtx* cctx,
    -                void* dst, size_t dstCapacity, size_t* dstPos,
    -          const void* src, size_t srcSize, size_t* srcPos,
    -                ZSTD_EndDirective endOp);
    -

    Same as ZSTD_compress_generic(), - but using only integral types as arguments. - Argument list is larger than ZSTD_{in,out}Buffer, - but can be helpful for binders from dynamic languages - which have troubles handling structures containing memory pointers. - +

    size_t ZSTD_compress_generic_simpleArgs (
    +                ZSTD_CCtx* cctx,
    +                void* dst, size_t dstCapacity, size_t* dstPos,
    +          const void* src, size_t srcSize, size_t* srcPos,
    +                ZSTD_EndDirective endOp);
    +

    Same as ZSTD_compress_generic(), + but using only integral types as arguments. + Argument list is larger than ZSTD_{in,out}Buffer, + but can be helpful for binders from dynamic languages + which have troubles handling structures containing memory pointers. + +


    + +

    experimental API (static linking only)

    + The following symbols and constants
    + are not planned to join "stable API" status anytime soon.
    + Some will never reach "stable", and remain in the static_only section.
    + Some of them might be removed in the future.
    + 
    +
    + +
    typedef struct {
    +    unsigned windowLog;       /**< largest match distance : larger == more compression, more memory needed during decompression */
    +    unsigned chainLog;        /**< fully searched segment : larger == more compression, slower, more memory (useless for fast) */
    +    unsigned hashLog;         /**< dispatch table : larger == faster, more memory */
    +    unsigned searchLog;       /**< nb of searches : larger == more compression, slower */
    +    unsigned searchLength;    /**< match length searched : larger == faster decompression, sometimes less compression */
    +    unsigned targetLength;    /**< acceptable match size for optimal parser (only) : larger == more compression, slower */
    +    ZSTD_strategy strategy;   /**< see ZSTD_strategy definition above */
    +} ZSTD_compressionParameters;
    +

    +
    typedef struct {
    +    unsigned contentSizeFlag; /**< 1: content size will be in frame header (when known) */
    +    unsigned checksumFlag;    /**< 1: generate a 32-bits checksum using XXH64 algorithm at end of frame, for error detection */
    +    unsigned noDictIDFlag;    /**< 1: no dictID will be saved into frame header (dictID is only useful for dictionary compression) */
    +} ZSTD_frameParameters;
    +

    +
    typedef struct {
    +    ZSTD_compressionParameters cParams;
    +    ZSTD_frameParameters fParams;
    +} ZSTD_parameters;
    +

    +
    typedef enum {
    +    ZSTD_dct_auto = 0,       /* dictionary is "full" when starting with ZSTD_MAGIC_DICTIONARY, otherwise it is "rawContent" */
    +    ZSTD_dct_rawContent = 1, /* ensures dictionary is always loaded as rawContent, even if it starts with ZSTD_MAGIC_DICTIONARY */
    +    ZSTD_dct_fullDict = 2    /* refuses to load a dictionary if it does not respect Zstandard's specification, starting with ZSTD_MAGIC_DICTIONARY */
    +} ZSTD_dictContentType_e;
    +

    +
    typedef enum {
    +    ZSTD_dlm_byCopy = 0,  /**< Copy dictionary content internally */
    +    ZSTD_dlm_byRef = 1,   /**< Reference dictionary content -- the dictionary buffer must outlive its users. */
    +} ZSTD_dictLoadMethod_e;
    +

    +

    Frame size functions

    
    +
    +
    size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize);
    +

    `src` should point to the start of a ZSTD encoded frame or skippable frame + `srcSize` must be >= first frame size + @return : the compressed size of the first frame starting at `src`, + suitable to pass to `ZSTD_decompress` or similar, + or an error code if input is invalid +


    + +
    unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize);
    +

    `src` should point the start of a series of ZSTD encoded and/or skippable frames + `srcSize` must be the _exact_ size of this series + (i.e. there should be a frame boundary exactly at `srcSize` bytes after `src`) + @return : - decompressed size of all data in all successive frames + - if the decompressed size cannot be determined: ZSTD_CONTENTSIZE_UNKNOWN + - if an error occurred: ZSTD_CONTENTSIZE_ERROR + + note 1 : decompressed size is an optional field, that may not be present, especially in streaming mode. + When `return==ZSTD_CONTENTSIZE_UNKNOWN`, data to decompress could be any size. + In which case, it's necessary to use streaming mode to decompress data. + note 2 : decompressed size is always present when compression is done with ZSTD_compress() + note 3 : decompressed size can be very large (64-bits value), + potentially larger than what local system can handle as a single memory segment. + In which case, it's necessary to use streaming mode to decompress data. + note 4 : If source is untrusted, decompressed size could be wrong or intentionally modified. + Always ensure result fits within application's authorized limits. + Each application can set its own limits. + note 5 : ZSTD_findDecompressedSize handles multiple frames, and so it must traverse the input to + read each contained frame header. This is fast as most of the data is skipped, + however it does mean that all frame data must be present and valid. +


    + +
    size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize);
    +

    srcSize must be >= ZSTD_frameHeaderSize_prefix. + @return : size of the Frame Header, + or an error code (if srcSize is too small) +


    + +

    Memory management

    
    +
    +
    size_t ZSTD_estimateCCtxSize(int compressionLevel);
    +size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams);
    +size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params);
    +size_t ZSTD_estimateDCtxSize(void);
    +

    These functions make it possible to estimate memory usage + of a future {D,C}Ctx, before its creation. + ZSTD_estimateCCtxSize() will provide a budget large enough for any compression level up to selected one. + It will also consider src size to be arbitrarily "large", which is worst case. + If srcSize is known to always be small, ZSTD_estimateCCtxSize_usingCParams() can provide a tighter estimation. + ZSTD_estimateCCtxSize_usingCParams() can be used in tandem with ZSTD_getCParams() to create cParams from compressionLevel. + ZSTD_estimateCCtxSize_usingCCtxParams() can be used in tandem with ZSTD_CCtxParam_setParameter(). Only single-threaded compression is supported. This function will return an error code if ZSTD_p_nbWorkers is >= 1. + Note : CCtx size estimation is only correct for single-threaded compression. +


    + +
    size_t ZSTD_estimateCStreamSize(int compressionLevel);
    +size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams);
    +size_t ZSTD_estimateCStreamSize_usingCCtxParams(const ZSTD_CCtx_params* params);
    +size_t ZSTD_estimateDStreamSize(size_t windowSize);
    +size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize);
    +

    ZSTD_estimateCStreamSize() will provide a budget large enough for any compression level up to selected one. + It will also consider src size to be arbitrarily "large", which is worst case. + If srcSize is known to always be small, ZSTD_estimateCStreamSize_usingCParams() can provide a tighter estimation. + ZSTD_estimateCStreamSize_usingCParams() can be used in tandem with ZSTD_getCParams() to create cParams from compressionLevel. + ZSTD_estimateCStreamSize_usingCCtxParams() can be used in tandem with ZSTD_CCtxParam_setParameter(). Only single-threaded compression is supported. This function will return an error code if ZSTD_p_nbWorkers is >= 1. + Note : CStream size estimation is only correct for single-threaded compression. + ZSTD_DStream memory budget depends on window Size. + This information can be passed manually, using ZSTD_estimateDStreamSize, + or deducted from a valid frame Header, using ZSTD_estimateDStreamSize_fromFrame(); + Note : if streaming is init with function ZSTD_init?Stream_usingDict(), + an internal ?Dict will be created, which additional size is not estimated here. + In this case, get total size by adding ZSTD_estimate?DictSize +


    + +
    size_t ZSTD_estimateCDictSize(size_t dictSize, int compressionLevel);
    +size_t ZSTD_estimateCDictSize_advanced(size_t dictSize, ZSTD_compressionParameters cParams, ZSTD_dictLoadMethod_e dictLoadMethod);
    +size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod);
    +

    ZSTD_estimateCDictSize() will bet that src size is relatively "small", and content is copied, like ZSTD_createCDict(). + ZSTD_estimateCDictSize_advanced() makes it possible to control compression parameters precisely, like ZSTD_createCDict_advanced(). + Note : dictionaries created by reference (`ZSTD_dlm_byRef`) are logically smaller. + +


    + +
    ZSTD_CCtx*    ZSTD_initStaticCCtx(void* workspace, size_t workspaceSize);
    +ZSTD_CStream* ZSTD_initStaticCStream(void* workspace, size_t workspaceSize);    /**< same as ZSTD_initStaticCCtx() */
    +

    Initialize an object using a pre-allocated fixed-size buffer. + workspace: The memory area to emplace the object into. + Provided pointer *must be 8-bytes aligned*. + Buffer must outlive object. + workspaceSize: Use ZSTD_estimate*Size() to determine + how large workspace must be to support target scenario. + @return : pointer to object (same address as workspace, just different type), + or NULL if error (size too small, incorrect alignment, etc.) + Note : zstd will never resize nor malloc() when using a static buffer. + If the object requires more memory than available, + zstd will just error out (typically ZSTD_error_memory_allocation). + Note 2 : there is no corresponding "free" function. + Since workspace is allocated externally, it must be freed externally too. + Note 3 : cParams : use ZSTD_getCParams() to convert a compression level + into its associated cParams. + Limitation 1 : currently not compatible with internal dictionary creation, triggered by + ZSTD_CCtx_loadDictionary(), ZSTD_initCStream_usingDict() or ZSTD_initDStream_usingDict(). + Limitation 2 : static cctx currently not compatible with multi-threading. + Limitation 3 : static dctx is incompatible with legacy support. + +


    + +
    ZSTD_DStream* ZSTD_initStaticDStream(void* workspace, size_t workspaceSize);    /**< same as ZSTD_initStaticDCtx() */
    +

    +
    typedef void* (*ZSTD_allocFunction) (void* opaque, size_t size);
    +typedef void  (*ZSTD_freeFunction) (void* opaque, void* address);
    +typedef struct { ZSTD_allocFunction customAlloc; ZSTD_freeFunction customFree; void* opaque; } ZSTD_customMem;
    +static ZSTD_customMem const ZSTD_defaultCMem = { NULL, NULL, NULL };  /**< this constant defers to stdlib's functions */
    +

    These prototypes make it possible to pass your own allocation/free functions. + ZSTD_customMem is provided at creation time, using ZSTD_create*_advanced() variants listed below. + All allocation/free operations will be completed using these custom variants instead of regular ones. + +


    + +

    Advanced compression functions

    
    +
    +
    ZSTD_CDict* ZSTD_createCDict_byReference(const void* dictBuffer, size_t dictSize, int compressionLevel);
    +

    Create a digested dictionary for compression + Dictionary content is simply referenced, and therefore stays in dictBuffer. + It is important that dictBuffer outlives CDict, it must remain read accessible throughout the lifetime of CDict +


    + +
    ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize);
    +

    @return ZSTD_compressionParameters structure for a selected compression level and estimated srcSize. + `estimatedSrcSize` value is optional, select 0 if not known +


    + +
    ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize);
    +

    same as ZSTD_getCParams(), but @return a full `ZSTD_parameters` object instead of sub-component `ZSTD_compressionParameters`. + All fields of `ZSTD_frameParameters` are set to default : contentSize=1, checksum=0, noDictID=0 +


    + +
    size_t ZSTD_checkCParams(ZSTD_compressionParameters params);
    +

    Ensure param values remain within authorized range +


    + +
    ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize);
    +

    optimize params for a given `srcSize` and `dictSize`. + both values are optional, select `0` if unknown. +


    + +
    size_t ZSTD_compress_advanced (ZSTD_CCtx* cctx,
    +                      void* dst, size_t dstCapacity,
    +                const void* src, size_t srcSize,
    +                const void* dict,size_t dictSize,
    +                      ZSTD_parameters params);
    +

    Same as ZSTD_compress_usingDict(), with fine-tune control over each compression parameter +


    + +
    size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx,
    +                      void* dst, size_t dstCapacity,
    +                const void* src, size_t srcSize,
    +                const ZSTD_CDict* cdict, ZSTD_frameParameters fParams);
    +

    Same as ZSTD_compress_usingCDict(), with fine-tune control over frame parameters +


    + +
    size_t ZSTD_CCtx_loadDictionary_byReference(ZSTD_CCtx* cctx, const void* dict, size_t dictSize);
    +

    Same as ZSTD_CCtx_loadDictionary(), but dictionary content is referenced, instead of being copied into CCtx. + It saves some memory, but also requires that `dict` outlives its usage within `cctx` +


    + +
    size_t ZSTD_CCtx_loadDictionary_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType);
    +

    Same as ZSTD_CCtx_loadDictionary(), but gives finer control over + how to load the dictionary (by copy ? by reference ?) + and how to interpret it (automatic ? force raw mode ? full mode only ?) +


    + +
    size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType);
    +

    Same as ZSTD_CCtx_refPrefix(), but gives finer control over + and how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?)


    ZSTD_CCtx_params* ZSTD_createCCtxParams(void);
    @@ -1192,6 +990,229 @@ size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params);
      
     


    +

    Advanced decompression functions

    
    +
    +
    unsigned ZSTD_isFrame(const void* buffer, size_t size);
    +

    Tells if the content of `buffer` starts with a valid Frame Identifier. + Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0. + Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled. + Note 3 : Skippable Frame Identifiers are considered valid. +


    + +
    ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize);
    +

    Create a digested dictionary, ready to start decompression operation without startup delay. + Dictionary content is referenced, and therefore stays in dictBuffer. + It is important that dictBuffer outlives DDict, + it must remain read accessible throughout the lifetime of DDict +


    + +
    unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize);
    +

    Provides the dictID stored within dictionary. + if @return == 0, the dictionary is not conformant with Zstandard specification. + It can still be loaded, but as a content-only dictionary. +


    + +
    unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict);
    +

    Provides the dictID of the dictionary loaded into `ddict`. + If @return == 0, the dictionary is not conformant to Zstandard specification, or empty. + Non-conformant dictionaries can still be loaded, but as content-only dictionaries. +


    + +
    unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize);
    +

    Provides the dictID required to decompressed the frame stored within `src`. + If @return == 0, the dictID could not be decoded. + This could for one of the following reasons : + - The frame does not require a dictionary to be decoded (most common case). + - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden information. + Note : this use case also happens when using a non-conformant dictionary. + - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`). + - This is not a Zstandard frame. + When identifying the exact failure cause, it's possible to use ZSTD_getFrameHeader(), which will provide a more precise error code. +


    + +

    Advanced streaming functions

    
    +
    +

    Advanced Streaming compression functions

    size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs, int compressionLevel, unsigned long long pledgedSrcSize);   /**< pledgedSrcSize must be correct. If it is not known at init time, use ZSTD_CONTENTSIZE_UNKNOWN. Note that, for compatibility with older programs, "0" also disables frame content size field. It may be enabled in the future. */
    +size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs, const void* dict, size_t dictSize, int compressionLevel); /**< creates of an internal CDict (incompatible with static CCtx), except if dict == NULL or dictSize < 8, in which case no dict is used. Note: dict is loaded with ZSTD_dm_auto (treated as a full zstd dictionary if it begins with ZSTD_MAGIC_DICTIONARY, else as raw content) and ZSTD_dlm_byCopy.*/
    +size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs, const void* dict, size_t dictSize,
    +                                             ZSTD_parameters params, unsigned long long pledgedSrcSize);  /**< pledgedSrcSize must be correct. If srcSize is not known at init time, use value ZSTD_CONTENTSIZE_UNKNOWN. dict is loaded with ZSTD_dm_auto and ZSTD_dlm_byCopy. */
    +size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict);  /**< note : cdict will just be referenced, and must outlive compression session */
    +size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs, const ZSTD_CDict* cdict, ZSTD_frameParameters fParams, unsigned long long pledgedSrcSize);  /**< same as ZSTD_initCStream_usingCDict(), with control over frame parameters. pledgedSrcSize must be correct. If srcSize is not known at init time, use value ZSTD_CONTENTSIZE_UNKNOWN. */
    +

    +
    size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize);
    +

    start a new compression job, using same parameters from previous job. + This is typically useful to skip dictionary loading stage, since it will re-use it in-place. + Note that zcs must be init at least once before using ZSTD_resetCStream(). + If pledgedSrcSize is not known at reset time, use macro ZSTD_CONTENTSIZE_UNKNOWN. + If pledgedSrcSize > 0, its value must be correct, as it will be written in header, and controlled at the end. + For the time being, pledgedSrcSize==0 is interpreted as "srcSize unknown" for compatibility with older programs, + but it will change to mean "empty" in future version, so use macro ZSTD_CONTENTSIZE_UNKNOWN instead. + @return : 0, or an error code (which can be tested using ZSTD_isError()) + +


    + +
    typedef struct {
    +    unsigned long long ingested;   /* nb input bytes read and buffered */
    +    unsigned long long consumed;   /* nb input bytes actually compressed */
    +    unsigned long long produced;   /* nb of compressed bytes generated and buffered */
    +    unsigned long long flushed;    /* nb of compressed bytes flushed : not provided; can be tracked from caller side */
    +    unsigned currentJobID;         /* MT only : latest started job nb */
    +    unsigned nbActiveWorkers;      /* MT only : nb of workers actively compressing at probe time */
    +} ZSTD_frameProgression;
    +

    +
    size_t ZSTD_toFlushNow(ZSTD_CCtx* cctx);
    +

    Tell how many bytes are ready to be flushed immediately. + Useful for multithreading scenarios (nbWorkers >= 1). + Probe the oldest active job, defined as oldest job not yet entirely flushed, + and check its output buffer. + @return : amount of data stored in oldest job and ready to be flushed immediately. + if @return == 0, it means either : + + there is no active job (could be checked with ZSTD_frameProgression()), or + + oldest job is still actively compressing data, + but everything it has produced has also been flushed so far, + therefore flush speed is limited by production speed of oldest job + irrespective of the speed of concurrent (and newer) jobs. + +


    + +

    Advanced Streaming decompression functions

    size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize); /**< note: no dictionary will be used if dict == NULL or dictSize < 8 */
    +size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDict* ddict);  /**< note : ddict is referenced, it must outlive decompression session */
    +size_t ZSTD_resetDStream(ZSTD_DStream* zds);  /**< re-use decompression parameters from previous init; saves dictionary loading */
    +

    +

    Buffer-less and synchronous inner streaming functions

    +  This is an advanced API, giving full control over buffer management, for users which need direct control over memory.
    +  But it's also a complex one, with several restrictions, documented below.
    +  Prefer normal streaming API for an easier experience.
    + 
    +
    + +

    Buffer-less streaming compression (synchronous mode)

    +  A ZSTD_CCtx object is required to track streaming operations.
    +  Use ZSTD_createCCtx() / ZSTD_freeCCtx() to manage resource.
    +  ZSTD_CCtx object can be re-used multiple times within successive compression operations.
    +
    +  Start by initializing a context.
    +  Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression,
    +  or ZSTD_compressBegin_advanced(), for finer parameter control.
    +  It's also possible to duplicate a reference context which has already been initialized, using ZSTD_copyCCtx()
    +
    +  Then, consume your input using ZSTD_compressContinue().
    +  There are some important considerations to keep in mind when using this advanced function :
    +  - ZSTD_compressContinue() has no internal buffer. It uses externally provided buffers only.
    +  - Interface is synchronous : input is consumed entirely and produces 1+ compressed blocks.
    +  - Caller must ensure there is enough space in `dst` to store compressed data under worst case scenario.
    +    Worst case evaluation is provided by ZSTD_compressBound().
    +    ZSTD_compressContinue() doesn't guarantee recover after a failed compression.
    +  - ZSTD_compressContinue() presumes prior input ***is still accessible and unmodified*** (up to maximum distance size, see WindowLog).
    +    It remembers all previous contiguous blocks, plus one separated memory segment (which can itself consists of multiple contiguous blocks)
    +  - ZSTD_compressContinue() detects that prior input has been overwritten when `src` buffer overlaps.
    +    In which case, it will "discard" the relevant memory section from its history.
    +
    +  Finish a frame with ZSTD_compressEnd(), which will write the last block(s) and optional checksum.
    +  It's possible to use srcSize==0, in which case, it will write a final empty block to end the frame.
    +  Without last block mark, frames are considered unfinished (hence corrupted) by compliant decoders.
    +
    +  `ZSTD_CCtx` object can be re-used (ZSTD_compressBegin()) to compress again.
    +
    + +

    Buffer-less streaming compression functions

    size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel);
    +size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel);
    +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 */
    +size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); /**< note: fails if cdict==NULL */
    +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 */
    +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 */
    +

    +

    Buffer-less streaming decompression (synchronous mode)

    +  A ZSTD_DCtx object is required to track streaming operations.
    +  Use ZSTD_createDCtx() / ZSTD_freeDCtx() to manage it.
    +  A ZSTD_DCtx object can be re-used multiple times.
    +
    +  First typical operation is to retrieve frame parameters, using ZSTD_getFrameHeader().
    +  Frame header is extracted from the beginning of compressed frame, so providing only the frame's beginning is enough.
    +  Data fragment must be large enough to ensure successful decoding.
    + `ZSTD_frameHeaderSize_max` bytes is guaranteed to always be large enough.
    +  @result : 0 : successful decoding, the `ZSTD_frameHeader` structure is correctly filled.
    +           >0 : `srcSize` is too small, please provide at least @result bytes on next attempt.
    +           errorCode, which can be tested using ZSTD_isError().
    +
    +  It fills a ZSTD_frameHeader structure with important information to correctly decode the frame,
    +  such as the dictionary ID, content size, or maximum back-reference distance (`windowSize`).
    +  Note that these values could be wrong, either because of data corruption, or because a 3rd party deliberately spoofs false information.
    +  As a consequence, check that values remain within valid application range.
    +  For example, do not allocate memory blindly, check that `windowSize` is within expectation.
    +  Each application can set its own limits, depending on local restrictions.
    +  For extended interoperability, it is recommended to support `windowSize` of at least 8 MB.
    +
    +  ZSTD_decompressContinue() needs previous data blocks during decompression, up to `windowSize` bytes.
    +  ZSTD_decompressContinue() is very sensitive to contiguity,
    +  if 2 blocks don't follow each other, make sure that either the compressor breaks contiguity at the same place,
    +  or that previous contiguous segment is large enough to properly handle maximum back-reference distance.
    +  There are multiple ways to guarantee this condition.
    +
    +  The most memory efficient way is to use a round buffer of sufficient size.
    +  Sufficient size is determined by invoking ZSTD_decodingBufferSize_min(),
    +  which can @return an error code if required value is too large for current system (in 32-bits mode).
    +  In a round buffer methodology, ZSTD_decompressContinue() decompresses each block next to previous one,
    +  up to the moment there is not enough room left in the buffer to guarantee decoding another full block,
    +  which maximum size is provided in `ZSTD_frameHeader` structure, field `blockSizeMax`.
    +  At which point, decoding can resume from the beginning of the buffer.
    +  Note that already decoded data stored in the buffer should be flushed before being overwritten.
    +
    +  There are alternatives possible, for example using two or more buffers of size `windowSize` each, though they consume more memory.
    +
    +  Finally, if you control the compression process, you can also ignore all buffer size rules,
    +  as long as the encoder and decoder progress in "lock-step",
    +  aka use exactly the same buffer sizes, break contiguity at the same place, etc.
    +
    +  Once buffers are setup, start decompression, with ZSTD_decompressBegin().
    +  If decompression requires a dictionary, use ZSTD_decompressBegin_usingDict() or ZSTD_decompressBegin_usingDDict().
    +
    +  Then use ZSTD_nextSrcSizeToDecompress() and ZSTD_decompressContinue() alternatively.
    +  ZSTD_nextSrcSizeToDecompress() tells how many bytes to provide as 'srcSize' to ZSTD_decompressContinue().
    +  ZSTD_decompressContinue() requires this _exact_ amount of bytes, or it will fail.
    +
    + @result of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst' (necessarily <= dstCapacity).
    +  It can be zero : it just means ZSTD_decompressContinue() has decoded some metadata item.
    +  It can also be an error code, which can be tested with ZSTD_isError().
    +
    +  A frame is fully decoded when ZSTD_nextSrcSizeToDecompress() returns zero.
    +  Context can then be reset to start a new decompression.
    +
    +  Note : it's possible to know if next input to present is a header or a block, using ZSTD_nextInputType().
    +  This information is not required to properly decode a frame.
    +
    +  == Special case : skippable frames 
    +
    +  Skippable frames allow integration of user-defined data into a flow of concatenated frames.
    +  Skippable frames will be ignored (skipped) by decompressor.
    +  The format of skippable frames is as follows :
    +  a) Skippable frame ID - 4 Bytes, Little endian format, any value from 0x184D2A50 to 0x184D2A5F
    +  b) Frame Size - 4 Bytes, Little endian format, unsigned 32-bits
    +  c) Frame Content - any content (User Data) of length equal to Frame Size
    +  For skippable frames ZSTD_getFrameHeader() returns zfhPtr->frameType==ZSTD_skippableFrame.
    +  For skippable frames ZSTD_decompressContinue() always returns 0 : it only skips the content.
    +
    + +

    Buffer-less streaming decompression functions

    typedef enum { ZSTD_frame, ZSTD_skippableFrame } ZSTD_frameType_e;
    +typedef struct {
    +    unsigned long long frameContentSize; /* if == ZSTD_CONTENTSIZE_UNKNOWN, it means this field is not available. 0 means "empty" */
    +    unsigned long long windowSize;       /* can be very large, up to <= frameContentSize */
    +    unsigned blockSizeMax;
    +    ZSTD_frameType_e frameType;          /* if == ZSTD_skippableFrame, frameContentSize is the size of skippable content */
    +    unsigned headerSize;
    +    unsigned dictID;
    +    unsigned checksumFlag;
    +} ZSTD_frameHeader;
    +/** ZSTD_getFrameHeader() :
    + *  decode Frame Header, or requires larger `srcSize`.
    + * @return : 0, `zfhPtr` is correctly filled,
    + *          >0, `srcSize` is too small, value is wanted `srcSize` amount,
    + *           or an error code, which can be tested using ZSTD_isError() */
    +size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize);   /**< doesn't consume input */
    +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 */
    +

    +
    typedef enum { ZSTDnit_frameHeader, ZSTDnit_blockHeader, ZSTDnit_block, ZSTDnit_lastBlock, ZSTDnit_checksum, ZSTDnit_skippableFrame } ZSTD_nextInputType_e;
    +

    Advanced decompression API

    /* ==================================== */
     

    size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize);
    diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c
    index 2862f5a56..a896e0f0d 100644
    --- a/lib/compress/zstd_compress.c
    +++ b/lib/compress/zstd_compress.c
    @@ -3862,7 +3862,7 @@ size_t ZSTD_compress_generic (ZSTD_CCtx* cctx,
             {   size_t const flushMin = ZSTDMT_compressStream_generic(cctx->mtctx, output, input, endOp);
                 if ( ZSTD_isError(flushMin)
                   || (endOp == ZSTD_e_end && flushMin == 0) ) { /* compression completed */
    -                ZSTD_CCtx_reset(cctx);
    +                ZSTD_CCtx_reset(cctx, ZSTD_CCtx_reset_session_only);
                 }
                 DEBUGLOG(5, "completed ZSTD_compress_generic delegating to ZSTDMT_compressStream_generic");
                 return flushMin;
    diff --git a/programs/benchzstd.c b/programs/benchzstd.c
    index 5c3de10c2..134f88289 100644
    --- a/programs/benchzstd.c
    +++ b/programs/benchzstd.c
    @@ -160,8 +160,7 @@ typedef struct {
     static void BMK_initCCtx(ZSTD_CCtx* ctx,
         const void* dictBuffer, size_t dictBufferSize, int cLevel,
         const ZSTD_compressionParameters* comprParams, const BMK_advancedParams_t* adv) {
    -    ZSTD_CCtx_reset(ctx);
    -    ZSTD_CCtx_resetParameters(ctx);
    +    ZSTD_CCtx_reset(ctx, ZSTD_CCtx_reset_session_and_parameters);
         if (adv->nbWorkers==1) {
             ZSTD_CCtx_setParameter(ctx, ZSTD_p_nbWorkers, 0);
         } else {
    diff --git a/tests/fuzzer.c b/tests/fuzzer.c
    index 619f8a3d2..bbc3c2622 100644
    --- a/tests/fuzzer.c
    +++ b/tests/fuzzer.c
    @@ -527,13 +527,13 @@ static int basicUnitTests(U32 seed, double compressibility)
             CHECK_Z(ZSTD_CCtx_getParameter(cctx, ZSTD_p_hashLog, &value));
             CHECK_EQ(value, ZSTD_HASHLOG_MIN);
             /* Reset the CCtx */
    -        ZSTD_CCtx_reset(cctx);
    +        ZSTD_CCtx_reset(cctx, ZSTD_CCtx_reset_session_only);
             CHECK_Z(ZSTD_CCtx_getParameter(cctx, ZSTD_p_compressionLevel, &value));
             CHECK_EQ(value, 7);
             CHECK_Z(ZSTD_CCtx_getParameter(cctx, ZSTD_p_hashLog, &value));
             CHECK_EQ(value, ZSTD_HASHLOG_MIN);
             /* Reset the parameters */
    -        ZSTD_CCtx_resetParameters(cctx);
    +        ZSTD_CCtx_reset(cctx, ZSTD_CCtx_reset_parameters);
             CHECK_Z(ZSTD_CCtx_getParameter(cctx, ZSTD_p_compressionLevel, &value));
             CHECK_EQ(value, 3);
             CHECK_Z(ZSTD_CCtx_getParameter(cctx, ZSTD_p_hashLog, &value));
    diff --git a/tests/paramgrill.c b/tests/paramgrill.c
    index cd272d9af..30b91720e 100644
    --- a/tests/paramgrill.c
    +++ b/tests/paramgrill.c
    @@ -893,8 +893,7 @@ typedef struct {
     static size_t local_initCCtx(void* payload) {
         const BMK_initCCtxArgs* ag = (const BMK_initCCtxArgs*)payload;
         varInds_t i;
    -    ZSTD_CCtx_reset(ag->cctx);
    -    ZSTD_CCtx_resetParameters(ag->cctx);
    +    ZSTD_CCtx_reset(ag->cctx, ZSTD_CCtx_reset_session_and_parameters);
         ZSTD_CCtx_setParameter(ag->cctx, ZSTD_p_compressionLevel, ag->cLevel);
     
         for(i = 0; i < NUM_PARAMS; i++) {
    diff --git a/tests/zstreamtest.c b/tests/zstreamtest.c
    index e73a621a0..bd028f8ff 100644
    --- a/tests/zstreamtest.c
    +++ b/tests/zstreamtest.c
    @@ -930,7 +930,7 @@ static int basicUnitTests(U32 seed, double compressibility)
     
             if (!cdict || !ddict) goto _output_error;
     
    -        ZSTD_CCtx_reset(zc);
    +        ZSTD_CCtx_reset(zc, ZSTD_CCtx_reset_session_only);
             ZSTD_resetDStream(zd);
             CHECK_Z(ZSTD_CCtx_refCDict(zc, cdict));
             CHECK_Z(ZSTD_initDStream_usingDDict(zd, ddict));
    @@ -1077,8 +1077,7 @@ static int basicUnitTests(U32 seed, double compressibility)
             int remainingInput = 256 * 1024;
             int offset;
     
    -        ZSTD_CCtx_reset(zc);
    -        CHECK_Z(ZSTD_CCtx_resetParameters(zc));
    +        CHECK_Z(ZSTD_CCtx_reset(zc, ZSTD_CCtx_reset_session_and_parameters));
             CHECK_Z(ZSTD_CCtx_refCDict(zc, cdict));
             CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_p_checksumFlag, 1));
             /* Write a bunch of 6 byte blocks */