182 typedef struct ZSTD_DCtx_s ZSTD_DCtx; |
184 typedef struct ZSTD_DCtx_s ZSTD_DCtx; |
183 ZSTDLIB_API ZSTD_DCtx* ZSTD_createDCtx(void); |
185 ZSTDLIB_API ZSTD_DCtx* ZSTD_createDCtx(void); |
184 ZSTDLIB_API size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx); |
186 ZSTDLIB_API size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx); |
185 |
187 |
186 /*! ZSTD_decompressDCtx() : |
188 /*! ZSTD_decompressDCtx() : |
187 * Same as ZSTD_decompress(), requires an allocated ZSTD_DCtx (see ZSTD_createDCtx()) */ |
189 * Same as ZSTD_decompress(), |
188 ZSTDLIB_API size_t ZSTD_decompressDCtx(ZSTD_DCtx* ctx, |
190 * requires an allocated ZSTD_DCtx. |
|
191 * Compatible with sticky parameters. |
|
192 */ |
|
193 ZSTDLIB_API size_t ZSTD_decompressDCtx(ZSTD_DCtx* dctx, |
189 void* dst, size_t dstCapacity, |
194 void* dst, size_t dstCapacity, |
190 const void* src, size_t srcSize); |
195 const void* src, size_t srcSize); |
191 |
196 |
192 |
197 |
193 /************************** |
198 /************************** |
194 * Simple dictionary API |
199 * Simple dictionary API |
195 ***************************/ |
200 ***************************/ |
196 /*! ZSTD_compress_usingDict() : |
201 /*! ZSTD_compress_usingDict() : |
197 * Compression using a predefined Dictionary (see dictBuilder/zdict.h). |
202 * Compression at an explicit compression level using a Dictionary. |
|
203 * A dictionary can be any arbitrary data segment (also called a prefix), |
|
204 * or a buffer with specified information (see dictBuilder/zdict.h). |
198 * Note : This function loads the dictionary, resulting in significant startup delay. |
205 * Note : This function loads the dictionary, resulting in significant startup delay. |
199 * Note : When `dict == NULL || dictSize < 8` no dictionary is used. */ |
206 * It's intended for a dictionary used only once. |
|
207 * Note 2 : When `dict == NULL || dictSize < 8` no dictionary is used. */ |
200 ZSTDLIB_API size_t ZSTD_compress_usingDict(ZSTD_CCtx* ctx, |
208 ZSTDLIB_API size_t ZSTD_compress_usingDict(ZSTD_CCtx* ctx, |
201 void* dst, size_t dstCapacity, |
209 void* dst, size_t dstCapacity, |
202 const void* src, size_t srcSize, |
210 const void* src, size_t srcSize, |
203 const void* dict,size_t dictSize, |
211 const void* dict,size_t dictSize, |
204 int compressionLevel); |
212 int compressionLevel); |
205 |
213 |
206 /*! ZSTD_decompress_usingDict() : |
214 /*! ZSTD_decompress_usingDict() : |
207 * Decompression using a predefined Dictionary (see dictBuilder/zdict.h). |
215 * Decompression using a known Dictionary. |
208 * Dictionary must be identical to the one used during compression. |
216 * Dictionary must be identical to the one used during compression. |
209 * Note : This function loads the dictionary, resulting in significant startup delay. |
217 * Note : This function loads the dictionary, resulting in significant startup delay. |
|
218 * It's intended for a dictionary used only once. |
210 * Note : When `dict == NULL || dictSize < 8` no dictionary is used. */ |
219 * Note : When `dict == NULL || dictSize < 8` no dictionary is used. */ |
211 ZSTDLIB_API size_t ZSTD_decompress_usingDict(ZSTD_DCtx* dctx, |
220 ZSTDLIB_API size_t ZSTD_decompress_usingDict(ZSTD_DCtx* dctx, |
212 void* dst, size_t dstCapacity, |
221 void* dst, size_t dstCapacity, |
213 const void* src, size_t srcSize, |
222 const void* src, size_t srcSize, |
214 const void* dict,size_t dictSize); |
223 const void* dict,size_t dictSize); |
215 |
224 |
216 |
225 |
217 /********************************** |
226 /*********************************** |
218 * Bulk processing dictionary API |
227 * Bulk processing dictionary API |
219 *********************************/ |
228 **********************************/ |
220 typedef struct ZSTD_CDict_s ZSTD_CDict; |
229 typedef struct ZSTD_CDict_s ZSTD_CDict; |
221 |
230 |
222 /*! ZSTD_createCDict() : |
231 /*! ZSTD_createCDict() : |
223 * When compressing multiple messages / blocks with the same dictionary, it's recommended to load it just once. |
232 * When compressing multiple messages / blocks using the same dictionary, it's recommended to load it only once. |
224 * ZSTD_createCDict() will create a digested dictionary, ready to start future compression operations without startup delay. |
233 * ZSTD_createCDict() will create a digested dictionary, ready to start future compression operations without startup cost. |
225 * ZSTD_CDict can be created once and shared by multiple threads concurrently, since its usage is read-only. |
234 * ZSTD_CDict can be created once and shared by multiple threads concurrently, since its usage is read-only. |
226 * `dictBuffer` can be released after ZSTD_CDict creation, since its content is copied within CDict |
235 * `dictBuffer` can be released after ZSTD_CDict creation, because its content is copied within CDict. |
227 * Note : A ZSTD_CDict can be created with an empty dictionary, but it is inefficient for small data. */ |
236 * Consider experimental function `ZSTD_createCDict_byReference()` if you prefer to not duplicate `dictBuffer` content. |
|
237 * Note : A ZSTD_CDict can be created from an empty dictBuffer, but it is inefficient when used to compress small data. */ |
228 ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict(const void* dictBuffer, size_t dictSize, |
238 ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict(const void* dictBuffer, size_t dictSize, |
229 int compressionLevel); |
239 int compressionLevel); |
230 |
240 |
231 /*! ZSTD_freeCDict() : |
241 /*! ZSTD_freeCDict() : |
232 * Function frees memory allocated by ZSTD_createCDict(). */ |
242 * Function frees memory allocated by ZSTD_createCDict(). */ |
233 ZSTDLIB_API size_t ZSTD_freeCDict(ZSTD_CDict* CDict); |
243 ZSTDLIB_API size_t ZSTD_freeCDict(ZSTD_CDict* CDict); |
234 |
244 |
235 /*! ZSTD_compress_usingCDict() : |
245 /*! ZSTD_compress_usingCDict() : |
236 * Compression using a digested Dictionary. |
246 * Compression using a digested Dictionary. |
237 * Faster startup than ZSTD_compress_usingDict(), recommended when same dictionary is used multiple times. |
247 * Recommended when same dictionary is used multiple times. |
238 * Note that compression level is decided during dictionary creation. |
248 * Note : compression level is _decided at dictionary creation time_, |
239 * Frame parameters are hardcoded (dictID=yes, contentSize=yes, checksum=no) |
249 * and frame parameters are hardcoded (dictID=yes, contentSize=yes, checksum=no) */ |
240 * Note : ZSTD_compress_usingCDict() can be used with a ZSTD_CDict created from an empty dictionary. |
|
241 * But it is inefficient for small data, and it is recommended to use ZSTD_compressCCtx(). */ |
|
242 ZSTDLIB_API size_t ZSTD_compress_usingCDict(ZSTD_CCtx* cctx, |
250 ZSTDLIB_API size_t ZSTD_compress_usingCDict(ZSTD_CCtx* cctx, |
243 void* dst, size_t dstCapacity, |
251 void* dst, size_t dstCapacity, |
244 const void* src, size_t srcSize, |
252 const void* src, size_t srcSize, |
245 const ZSTD_CDict* cdict); |
253 const ZSTD_CDict* cdict); |
246 |
254 |
247 |
255 |
248 typedef struct ZSTD_DDict_s ZSTD_DDict; |
256 typedef struct ZSTD_DDict_s ZSTD_DDict; |
249 |
257 |
250 /*! ZSTD_createDDict() : |
258 /*! ZSTD_createDDict() : |
251 * Create a digested dictionary, ready to start decompression operation without startup delay. |
259 * Create a digested dictionary, ready to start decompression operation without startup delay. |
252 * dictBuffer can be released after DDict creation, as its content is copied inside DDict */ |
260 * dictBuffer can be released after DDict creation, as its content is copied inside DDict. */ |
253 ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict(const void* dictBuffer, size_t dictSize); |
261 ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict(const void* dictBuffer, size_t dictSize); |
254 |
262 |
255 /*! ZSTD_freeDDict() : |
263 /*! ZSTD_freeDDict() : |
256 * Function frees memory allocated with ZSTD_createDDict() */ |
264 * Function frees memory allocated with ZSTD_createDDict() */ |
257 ZSTDLIB_API size_t ZSTD_freeDDict(ZSTD_DDict* ddict); |
265 ZSTDLIB_API size_t ZSTD_freeDDict(ZSTD_DDict* ddict); |
258 |
266 |
259 /*! ZSTD_decompress_usingDDict() : |
267 /*! ZSTD_decompress_usingDDict() : |
260 * Decompression using a digested Dictionary. |
268 * Decompression using a digested Dictionary. |
261 * Faster startup than ZSTD_decompress_usingDict(), recommended when same dictionary is used multiple times. */ |
269 * Recommended when same dictionary is used multiple times. */ |
262 ZSTDLIB_API size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx, |
270 ZSTDLIB_API size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx, |
263 void* dst, size_t dstCapacity, |
271 void* dst, size_t dstCapacity, |
264 const void* src, size_t srcSize, |
272 const void* src, size_t srcSize, |
265 const ZSTD_DDict* ddict); |
273 const ZSTD_DDict* ddict); |
266 |
274 |
384 #endif /* ZSTD_H_235446 */ |
400 #endif /* ZSTD_H_235446 */ |
385 |
401 |
386 |
402 |
387 |
403 |
388 |
404 |
389 #if defined(ZSTD_STATIC_LINKING_ONLY) && !defined(ZSTD_H_ZSTD_STATIC_LINKING_ONLY) |
|
390 #define ZSTD_H_ZSTD_STATIC_LINKING_ONLY |
|
391 |
|
392 /**************************************************************************************** |
405 /**************************************************************************************** |
393 * ADVANCED AND EXPERIMENTAL FUNCTIONS |
406 * ADVANCED AND EXPERIMENTAL FUNCTIONS |
394 **************************************************************************************** |
407 **************************************************************************************** |
395 * The definitions in this section are considered experimental. |
408 * The definitions in the following section are considered experimental. |
|
409 * They are provided for advanced scenarios. |
396 * They should never be used with a dynamic library, as prototypes may change in the future. |
410 * They should never be used with a dynamic library, as prototypes may change in the future. |
397 * They are provided for advanced scenarios. |
|
398 * Use them only in association with static linking. |
411 * Use them only in association with static linking. |
399 * ***************************************************************************************/ |
412 * ***************************************************************************************/ |
400 |
413 |
|
414 #if defined(ZSTD_STATIC_LINKING_ONLY) && !defined(ZSTD_H_ZSTD_STATIC_LINKING_ONLY) |
|
415 #define ZSTD_H_ZSTD_STATIC_LINKING_ONLY |
|
416 |
|
417 |
|
418 /**************************************************************************************** |
|
419 * Candidate API for promotion to stable status |
|
420 **************************************************************************************** |
|
421 * The following symbols and constants form the "staging area" : |
|
422 * they are considered to join "stable API" by v1.4.0. |
|
423 * The proposal is written so that it can be made stable "as is", |
|
424 * though it's still possible to suggest improvements. |
|
425 * Staging is in fact last chance for changes, |
|
426 * the API is locked once reaching "stable" status. |
|
427 * ***************************************************************************************/ |
|
428 |
|
429 |
|
430 /* === Constants === */ |
|
431 |
|
432 /* all magic numbers are supposed read/written to/from files/memory using little-endian convention */ |
|
433 #define ZSTD_MAGICNUMBER 0xFD2FB528 /* valid since v0.8.0 */ |
|
434 #define ZSTD_MAGIC_DICTIONARY 0xEC30A437 /* valid since v0.7.0 */ |
|
435 #define ZSTD_MAGIC_SKIPPABLE_START 0x184D2A50 /* all 16 values, from 0x184D2A50 to 0x184D2A5F, signal the beginning of a skippable frame */ |
|
436 #define ZSTD_MAGIC_SKIPPABLE_MASK 0xFFFFFFF0 |
|
437 |
|
438 #define ZSTD_BLOCKSIZELOG_MAX 17 |
|
439 #define ZSTD_BLOCKSIZE_MAX (1<<ZSTD_BLOCKSIZELOG_MAX) |
|
440 |
|
441 |
|
442 /* === query limits === */ |
|
443 |
401 ZSTDLIB_API int ZSTD_minCLevel(void); /*!< minimum negative compression level allowed */ |
444 ZSTDLIB_API int ZSTD_minCLevel(void); /*!< minimum negative compression level allowed */ |
402 |
445 |
403 /* --- Constants ---*/ |
446 |
404 #define ZSTD_MAGICNUMBER 0xFD2FB528 /* v0.8+ */ |
447 /* === frame size === */ |
405 #define ZSTD_MAGIC_DICTIONARY 0xEC30A437 /* v0.7+ */ |
448 |
406 #define ZSTD_MAGIC_SKIPPABLE_START 0x184D2A50U |
449 /*! ZSTD_findFrameCompressedSize() : |
407 |
450 * `src` should point to the start of a ZSTD frame or skippable frame. |
408 #define ZSTD_BLOCKSIZELOG_MAX 17 |
451 * `srcSize` must be >= first frame size |
409 #define ZSTD_BLOCKSIZE_MAX (1<<ZSTD_BLOCKSIZELOG_MAX) /* define, for static allocation */ |
452 * @return : the compressed size of the first frame starting at `src`, |
410 |
453 * suitable to pass as `srcSize` to `ZSTD_decompress` or similar, |
411 #define ZSTD_WINDOWLOG_MAX_32 30 |
454 * or an error code if input is invalid */ |
412 #define ZSTD_WINDOWLOG_MAX_64 31 |
455 ZSTDLIB_API size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize); |
413 #define ZSTD_WINDOWLOG_MAX ((unsigned)(sizeof(size_t) == 4 ? ZSTD_WINDOWLOG_MAX_32 : ZSTD_WINDOWLOG_MAX_64)) |
456 |
414 #define ZSTD_WINDOWLOG_MIN 10 |
457 |
415 #define ZSTD_HASHLOG_MAX ((ZSTD_WINDOWLOG_MAX < 30) ? ZSTD_WINDOWLOG_MAX : 30) |
458 /* === Memory management === */ |
416 #define ZSTD_HASHLOG_MIN 6 |
459 |
417 #define ZSTD_CHAINLOG_MAX_32 29 |
460 /*! ZSTD_sizeof_*() : |
418 #define ZSTD_CHAINLOG_MAX_64 30 |
461 * These functions give the _current_ memory usage of selected object. |
419 #define ZSTD_CHAINLOG_MAX ((unsigned)(sizeof(size_t) == 4 ? ZSTD_CHAINLOG_MAX_32 : ZSTD_CHAINLOG_MAX_64)) |
462 * Note that object memory usage can evolve (increase or decrease) over time. */ |
420 #define ZSTD_CHAINLOG_MIN ZSTD_HASHLOG_MIN |
463 ZSTDLIB_API size_t ZSTD_sizeof_CCtx(const ZSTD_CCtx* cctx); |
421 #define ZSTD_HASHLOG3_MAX 17 |
464 ZSTDLIB_API size_t ZSTD_sizeof_DCtx(const ZSTD_DCtx* dctx); |
422 #define ZSTD_SEARCHLOG_MAX (ZSTD_WINDOWLOG_MAX-1) |
465 ZSTDLIB_API size_t ZSTD_sizeof_CStream(const ZSTD_CStream* zcs); |
423 #define ZSTD_SEARCHLOG_MIN 1 |
466 ZSTDLIB_API size_t ZSTD_sizeof_DStream(const ZSTD_DStream* zds); |
424 #define ZSTD_SEARCHLENGTH_MAX 7 /* only for ZSTD_fast, other strategies are limited to 6 */ |
467 ZSTDLIB_API size_t ZSTD_sizeof_CDict(const ZSTD_CDict* cdict); |
425 #define ZSTD_SEARCHLENGTH_MIN 3 /* only for ZSTD_btopt, other strategies are limited to 4 */ |
468 ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); |
426 #define ZSTD_TARGETLENGTH_MAX ZSTD_BLOCKSIZE_MAX |
469 |
427 #define ZSTD_TARGETLENGTH_MIN 0 /* note : comparing this constant to an unsigned results in a tautological test */ |
470 |
428 #define ZSTD_LDM_MINMATCH_MAX 4096 |
471 /*************************************** |
429 #define ZSTD_LDM_MINMATCH_MIN 4 |
472 * Advanced compression API |
430 #define ZSTD_LDM_BUCKETSIZELOG_MAX 8 |
473 ***************************************/ |
431 |
474 |
432 #define ZSTD_FRAMEHEADERSIZE_PREFIX 5 /* minimum input size to know frame header size */ |
475 /* API design : |
|
476 * Parameters are pushed one by one into an existing context, |
|
477 * using ZSTD_CCtx_set*() functions. |
|
478 * Pushed parameters are sticky : they are valid for next compressed frame, and any subsequent frame. |
|
479 * "sticky" parameters are applicable to `ZSTD_compress2()` and `ZSTD_compressStream*()` ! |
|
480 * They do not apply to "simple" one-shot variants such as ZSTD_compressCCtx() |
|
481 * |
|
482 * It's possible to reset all parameters to "default" using ZSTD_CCtx_reset(). |
|
483 * |
|
484 * This API supercedes all other "advanced" API entry points in the experimental section. |
|
485 * In the future, we expect to remove from experimental API entry points which are redundant with this API. |
|
486 */ |
|
487 |
|
488 |
|
489 /* Compression strategies, listed from fastest to strongest */ |
|
490 typedef enum { ZSTD_fast=1, |
|
491 ZSTD_dfast=2, |
|
492 ZSTD_greedy=3, |
|
493 ZSTD_lazy=4, |
|
494 ZSTD_lazy2=5, |
|
495 ZSTD_btlazy2=6, |
|
496 ZSTD_btopt=7, |
|
497 ZSTD_btultra=8, |
|
498 ZSTD_btultra2=9 |
|
499 /* note : new strategies _might_ be added in the future. |
|
500 Only the order (from fast to strong) is guaranteed */ |
|
501 } ZSTD_strategy; |
|
502 |
|
503 |
|
504 typedef enum { |
|
505 |
|
506 /* compression parameters */ |
|
507 ZSTD_c_compressionLevel=100, /* Update all compression parameters according to pre-defined cLevel table |
|
508 * Default level is ZSTD_CLEVEL_DEFAULT==3. |
|
509 * Special: value 0 means default, which is controlled by ZSTD_CLEVEL_DEFAULT. |
|
510 * Note 1 : it's possible to pass a negative compression level. |
|
511 * Note 2 : setting a level sets all default values of other compression parameters */ |
|
512 ZSTD_c_windowLog=101, /* Maximum allowed back-reference distance, expressed as power of 2. |
|
513 * Must be clamped between ZSTD_WINDOWLOG_MIN and ZSTD_WINDOWLOG_MAX. |
|
514 * Special: value 0 means "use default windowLog". |
|
515 * Note: Using a windowLog greater than ZSTD_WINDOWLOG_LIMIT_DEFAULT |
|
516 * requires explicitly allowing such window size at decompression stage if using streaming. */ |
|
517 ZSTD_c_hashLog=102, /* Size of the initial probe table, as a power of 2. |
|
518 * Resulting memory usage is (1 << (hashLog+2)). |
|
519 * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX. |
|
520 * Larger tables improve compression ratio of strategies <= dFast, |
|
521 * and improve speed of strategies > dFast. |
|
522 * Special: value 0 means "use default hashLog". */ |
|
523 ZSTD_c_chainLog=103, /* Size of the multi-probe search table, as a power of 2. |
|
524 * Resulting memory usage is (1 << (chainLog+2)). |
|
525 * Must be clamped between ZSTD_CHAINLOG_MIN and ZSTD_CHAINLOG_MAX. |
|
526 * Larger tables result in better and slower compression. |
|
527 * This parameter is useless when using "fast" strategy. |
|
528 * It's still useful when using "dfast" strategy, |
|
529 * in which case it defines a secondary probe table. |
|
530 * Special: value 0 means "use default chainLog". */ |
|
531 ZSTD_c_searchLog=104, /* Number of search attempts, as a power of 2. |
|
532 * More attempts result in better and slower compression. |
|
533 * This parameter is useless when using "fast" and "dFast" strategies. |
|
534 * Special: value 0 means "use default searchLog". */ |
|
535 ZSTD_c_minMatch=105, /* Minimum size of searched matches. |
|
536 * Note that Zstandard can still find matches of smaller size, |
|
537 * it just tweaks its search algorithm to look for this size and larger. |
|
538 * Larger values increase compression and decompression speed, but decrease ratio. |
|
539 * Must be clamped between ZSTD_MINMATCH_MIN and ZSTD_MINMATCH_MAX. |
|
540 * Note that currently, for all strategies < btopt, effective minimum is 4. |
|
541 * , for all strategies > fast, effective maximum is 6. |
|
542 * Special: value 0 means "use default minMatchLength". */ |
|
543 ZSTD_c_targetLength=106, /* Impact of this field depends on strategy. |
|
544 * For strategies btopt, btultra & btultra2: |
|
545 * Length of Match considered "good enough" to stop search. |
|
546 * Larger values make compression stronger, and slower. |
|
547 * For strategy fast: |
|
548 * Distance between match sampling. |
|
549 * Larger values make compression faster, and weaker. |
|
550 * Special: value 0 means "use default targetLength". */ |
|
551 ZSTD_c_strategy=107, /* See ZSTD_strategy enum definition. |
|
552 * The higher the value of selected strategy, the more complex it is, |
|
553 * resulting in stronger and slower compression. |
|
554 * Special: value 0 means "use default strategy". */ |
|
555 |
|
556 /* LDM mode parameters */ |
|
557 ZSTD_c_enableLongDistanceMatching=160, /* Enable long distance matching. |
|
558 * This parameter is designed to improve compression ratio |
|
559 * for large inputs, by finding large matches at long distance. |
|
560 * It increases memory usage and window size. |
|
561 * Note: enabling this parameter increases default ZSTD_c_windowLog to 128 MB |
|
562 * except when expressly set to a different value. */ |
|
563 ZSTD_c_ldmHashLog=161, /* Size of the table for long distance matching, as a power of 2. |
|
564 * Larger values increase memory usage and compression ratio, |
|
565 * but decrease compression speed. |
|
566 * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX |
|
567 * default: windowlog - 7. |
|
568 * Special: value 0 means "automatically determine hashlog". */ |
|
569 ZSTD_c_ldmMinMatch=162, /* Minimum match size for long distance matcher. |
|
570 * Larger/too small values usually decrease compression ratio. |
|
571 * Must be clamped between ZSTD_LDM_MINMATCH_MIN and ZSTD_LDM_MINMATCH_MAX. |
|
572 * Special: value 0 means "use default value" (default: 64). */ |
|
573 ZSTD_c_ldmBucketSizeLog=163, /* Log size of each bucket in the LDM hash table for collision resolution. |
|
574 * Larger values improve collision resolution but decrease compression speed. |
|
575 * The maximum value is ZSTD_LDM_BUCKETSIZELOG_MAX. |
|
576 * Special: value 0 means "use default value" (default: 3). */ |
|
577 ZSTD_c_ldmHashRateLog=164, /* Frequency of inserting/looking up entries into the LDM hash table. |
|
578 * Must be clamped between 0 and (ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN). |
|
579 * Default is MAX(0, (windowLog - ldmHashLog)), optimizing hash table usage. |
|
580 * Larger values improve compression speed. |
|
581 * Deviating far from default value will likely result in a compression ratio decrease. |
|
582 * Special: value 0 means "automatically determine hashRateLog". */ |
|
583 |
|
584 /* frame parameters */ |
|
585 ZSTD_c_contentSizeFlag=200, /* Content size will be written into frame header _whenever known_ (default:1) |
|
586 * Content size must be known at the beginning of compression. |
|
587 * This is automatically the case when using ZSTD_compress2(), |
|
588 * For streaming variants, content size must be provided with ZSTD_CCtx_setPledgedSrcSize() */ |
|
589 ZSTD_c_checksumFlag=201, /* A 32-bits checksum of content is written at end of frame (default:0) */ |
|
590 ZSTD_c_dictIDFlag=202, /* When applicable, dictionary's ID is written into frame header (default:1) */ |
|
591 |
|
592 /* multi-threading parameters */ |
|
593 /* These parameters are only useful if multi-threading is enabled (compiled with build macro ZSTD_MULTITHREAD). |
|
594 * They return an error otherwise. */ |
|
595 ZSTD_c_nbWorkers=400, /* Select how many threads will be spawned to compress in parallel. |
|
596 * When nbWorkers >= 1, triggers asynchronous mode when used with ZSTD_compressStream*() : |
|
597 * ZSTD_compressStream*() consumes input and flush output if possible, but immediately gives back control to caller, |
|
598 * while compression work is performed in parallel, within worker threads. |
|
599 * (note : a strong exception to this rule is when first invocation of ZSTD_compressStream2() sets ZSTD_e_end : |
|
600 * in which case, ZSTD_compressStream2() delegates to ZSTD_compress2(), which is always a blocking call). |
|
601 * More workers improve speed, but also increase memory usage. |
|
602 * Default value is `0`, aka "single-threaded mode" : no worker is spawned, compression is performed inside Caller's thread, all invocations are blocking */ |
|
603 ZSTD_c_jobSize=401, /* Size of a compression job. This value is enforced only when nbWorkers >= 1. |
|
604 * Each compression job is completed in parallel, so this value can indirectly impact the nb of active threads. |
|
605 * 0 means default, which is dynamically determined based on compression parameters. |
|
606 * Job size must be a minimum of overlap size, or 1 MB, whichever is largest. |
|
607 * The minimum size is automatically and transparently enforced */ |
|
608 ZSTD_c_overlapLog=402, /* Control the overlap size, as a fraction of window size. |
|
609 * The overlap size is an amount of data reloaded from previous job at the beginning of a new job. |
|
610 * It helps preserve compression ratio, while each job is compressed in parallel. |
|
611 * This value is enforced only when nbWorkers >= 1. |
|
612 * Larger values increase compression ratio, but decrease speed. |
|
613 * Possible values range from 0 to 9 : |
|
614 * - 0 means "default" : value will be determined by the library, depending on strategy |
|
615 * - 1 means "no overlap" |
|
616 * - 9 means "full overlap", using a full window size. |
|
617 * Each intermediate rank increases/decreases load size by a factor 2 : |
|
618 * 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 |
|
619 * default value varies between 6 and 9, depending on strategy */ |
|
620 |
|
621 /* note : additional experimental parameters are also available |
|
622 * within the experimental section of the API. |
|
623 * At the time of this writing, they include : |
|
624 * ZSTD_c_rsyncable |
|
625 * ZSTD_c_format |
|
626 * ZSTD_c_forceMaxWindow |
|
627 * ZSTD_c_forceAttachDict |
|
628 * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. |
|
629 * note : never ever use experimentalParam? names directly; |
|
630 * also, the enums values themselves are unstable and can still change. |
|
631 */ |
|
632 ZSTD_c_experimentalParam1=500, |
|
633 ZSTD_c_experimentalParam2=10, |
|
634 ZSTD_c_experimentalParam3=1000, |
|
635 ZSTD_c_experimentalParam4=1001 |
|
636 } ZSTD_cParameter; |
|
637 |
|
638 |
|
639 typedef struct { |
|
640 size_t error; |
|
641 int lowerBound; |
|
642 int upperBound; |
|
643 } ZSTD_bounds; |
|
644 |
|
645 /*! ZSTD_cParam_getBounds() : |
|
646 * All parameters must belong to an interval with lower and upper bounds, |
|
647 * otherwise they will either trigger an error or be automatically clamped. |
|
648 * @return : a structure, ZSTD_bounds, which contains |
|
649 * - an error status field, which must be tested using ZSTD_isError() |
|
650 * - lower and upper bounds, both inclusive |
|
651 */ |
|
652 ZSTDLIB_API ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter cParam); |
|
653 |
|
654 /*! ZSTD_CCtx_setParameter() : |
|
655 * Set one compression parameter, selected by enum ZSTD_cParameter. |
|
656 * All parameters have valid bounds. Bounds can be queried using ZSTD_cParam_getBounds(). |
|
657 * Providing a value beyond bound will either clamp it, or trigger an error (depending on parameter). |
|
658 * Setting a parameter is generally only possible during frame initialization (before starting compression). |
|
659 * Exception : when using multi-threading mode (nbWorkers >= 1), |
|
660 * the following parameters can be updated _during_ compression (within same frame): |
|
661 * => compressionLevel, hashLog, chainLog, searchLog, minMatch, targetLength and strategy. |
|
662 * new parameters will be active for next job only (after a flush()). |
|
663 * @return : an error code (which can be tested using ZSTD_isError()). |
|
664 */ |
|
665 ZSTDLIB_API size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value); |
|
666 |
|
667 /*! ZSTD_CCtx_setPledgedSrcSize() : |
|
668 * Total input data size to be compressed as a single frame. |
|
669 * Value will be written in frame header, unless if explicitly forbidden using ZSTD_c_contentSizeFlag. |
|
670 * This value will also be controlled at end of frame, and trigger an error if not respected. |
|
671 * @result : 0, or an error code (which can be tested with ZSTD_isError()). |
|
672 * Note 1 : pledgedSrcSize==0 actually means zero, aka an empty frame. |
|
673 * In order to mean "unknown content size", pass constant ZSTD_CONTENTSIZE_UNKNOWN. |
|
674 * ZSTD_CONTENTSIZE_UNKNOWN is default value for any new frame. |
|
675 * Note 2 : pledgedSrcSize is only valid once, for the next frame. |
|
676 * It's discarded at the end of the frame, and replaced by ZSTD_CONTENTSIZE_UNKNOWN. |
|
677 * Note 3 : Whenever all input data is provided and consumed in a single round, |
|
678 * for example with ZSTD_compress2(), |
|
679 * or invoking immediately ZSTD_compressStream2(,,,ZSTD_e_end), |
|
680 * this value is automatically overriden by srcSize instead. |
|
681 */ |
|
682 ZSTDLIB_API size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize); |
|
683 |
|
684 /*! ZSTD_CCtx_loadDictionary() : |
|
685 * Create an internal CDict from `dict` buffer. |
|
686 * Decompression will have to use same dictionary. |
|
687 * @result : 0, or an error code (which can be tested with ZSTD_isError()). |
|
688 * Special: Loading a NULL (or 0-size) dictionary invalidates previous dictionary, |
|
689 * meaning "return to no-dictionary mode". |
|
690 * Note 1 : Dictionary is sticky, it will be used for all future compressed frames. |
|
691 * To return to "no-dictionary" situation, load a NULL dictionary (or reset parameters). |
|
692 * Note 2 : Loading a dictionary involves building tables. |
|
693 * It's also a CPU consuming operation, with non-negligible impact on latency. |
|
694 * Tables are dependent on compression parameters, and for this reason, |
|
695 * compression parameters can no longer be changed after loading a dictionary. |
|
696 * Note 3 :`dict` content will be copied internally. |
|
697 * Use experimental ZSTD_CCtx_loadDictionary_byReference() to reference content instead. |
|
698 * In such a case, dictionary buffer must outlive its users. |
|
699 * Note 4 : Use ZSTD_CCtx_loadDictionary_advanced() |
|
700 * to precisely select how dictionary content must be interpreted. */ |
|
701 ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize); |
|
702 |
|
703 /*! ZSTD_CCtx_refCDict() : |
|
704 * Reference a prepared dictionary, to be used for all next compressed frames. |
|
705 * Note that compression parameters are enforced from within CDict, |
|
706 * and supercede any compression parameter previously set within CCtx. |
|
707 * The dictionary will remain valid for future compressed frames using same CCtx. |
|
708 * @result : 0, or an error code (which can be tested with ZSTD_isError()). |
|
709 * Special : Referencing a NULL CDict means "return to no-dictionary mode". |
|
710 * Note 1 : Currently, only one dictionary can be managed. |
|
711 * Referencing a new dictionary effectively "discards" any previous one. |
|
712 * Note 2 : CDict is just referenced, its lifetime must outlive its usage within CCtx. */ |
|
713 ZSTDLIB_API size_t ZSTD_CCtx_refCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); |
|
714 |
|
715 /*! ZSTD_CCtx_refPrefix() : |
|
716 * Reference a prefix (single-usage dictionary) for next compressed frame. |
|
717 * A prefix is **only used once**. Tables are discarded at end of frame (ZSTD_e_end). |
|
718 * Decompression will need same prefix to properly regenerate data. |
|
719 * Compressing with a prefix is similar in outcome as performing a diff and compressing it, |
|
720 * but performs much faster, especially during decompression (compression speed is tunable with compression level). |
|
721 * @result : 0, or an error code (which can be tested with ZSTD_isError()). |
|
722 * Special: Adding any prefix (including NULL) invalidates any previous prefix or dictionary |
|
723 * Note 1 : Prefix buffer is referenced. It **must** outlive compression. |
|
724 * Its content must remain unmodified during compression. |
|
725 * Note 2 : If the intention is to diff some large src data blob with some prior version of itself, |
|
726 * ensure that the window size is large enough to contain the entire source. |
|
727 * See ZSTD_c_windowLog. |
|
728 * Note 3 : Referencing a prefix involves building tables, which are dependent on compression parameters. |
|
729 * It's a CPU consuming operation, with non-negligible impact on latency. |
|
730 * If there is a need to use the same prefix multiple times, consider loadDictionary instead. |
|
731 * Note 4 : By default, the prefix is interpreted as raw content (ZSTD_dm_rawContent). |
|
732 * Use experimental ZSTD_CCtx_refPrefix_advanced() to alter dictionary interpretation. */ |
|
733 ZSTDLIB_API size_t ZSTD_CCtx_refPrefix(ZSTD_CCtx* cctx, |
|
734 const void* prefix, size_t prefixSize); |
|
735 |
|
736 |
|
737 typedef enum { |
|
738 ZSTD_reset_session_only = 1, |
|
739 ZSTD_reset_parameters = 2, |
|
740 ZSTD_reset_session_and_parameters = 3 |
|
741 } ZSTD_ResetDirective; |
|
742 |
|
743 /*! ZSTD_CCtx_reset() : |
|
744 * There are 2 different things that can be reset, independently or jointly : |
|
745 * - The session : will stop compressing current frame, and make CCtx ready to start a new one. |
|
746 * Useful after an error, or to interrupt any ongoing compression. |
|
747 * Any internal data not yet flushed is cancelled. |
|
748 * Compression parameters and dictionary remain unchanged. |
|
749 * They will be used to compress next frame. |
|
750 * Resetting session never fails. |
|
751 * - The parameters : changes all parameters back to "default". |
|
752 * This removes any reference to any dictionary too. |
|
753 * Parameters can only be changed between 2 sessions (i.e. no compression is currently ongoing) |
|
754 * otherwise the reset fails, and function returns an error value (which can be tested using ZSTD_isError()) |
|
755 * - Both : similar to resetting the session, followed by resetting parameters. |
|
756 */ |
|
757 ZSTDLIB_API size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_ResetDirective reset); |
|
758 |
|
759 |
|
760 |
|
761 /*! ZSTD_compress2() : |
|
762 * Behave the same as ZSTD_compressCCtx(), but compression parameters are set using the advanced API. |
|
763 * ZSTD_compress2() always starts a new frame. |
|
764 * Should cctx hold data from a previously unfinished frame, everything about it is forgotten. |
|
765 * - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*() |
|
766 * - The function is always blocking, returns when compression is completed. |
|
767 * Hint : compression runs faster if `dstCapacity` >= `ZSTD_compressBound(srcSize)`. |
|
768 * @return : compressed size written into `dst` (<= `dstCapacity), |
|
769 * or an error code if it fails (which can be tested using ZSTD_isError()). |
|
770 */ |
|
771 ZSTDLIB_API size_t ZSTD_compress2( ZSTD_CCtx* cctx, |
|
772 void* dst, size_t dstCapacity, |
|
773 const void* src, size_t srcSize); |
|
774 |
|
775 typedef enum { |
|
776 ZSTD_e_continue=0, /* collect more data, encoder decides when to output compressed result, for optimal compression ratio */ |
|
777 ZSTD_e_flush=1, /* flush any data provided so far, |
|
778 * it creates (at least) one new block, that can be decoded immediately on reception; |
|
779 * frame will continue: any future data can still reference previously compressed data, improving compression. */ |
|
780 ZSTD_e_end=2 /* flush any remaining data _and_ close current frame. |
|
781 * note that frame is only closed after compressed data is fully flushed (return value == 0). |
|
782 * After that point, any additional data starts a new frame. |
|
783 * note : each frame is independent (does not reference any content from previous frame). */ |
|
784 } ZSTD_EndDirective; |
|
785 |
|
786 /*! ZSTD_compressStream2() : |
|
787 * Behaves about the same as ZSTD_compressStream, with additional control on end directive. |
|
788 * - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*() |
|
789 * - Compression parameters cannot be changed once compression is started (save a list of exceptions in multi-threading mode) |
|
790 * - outpot->pos must be <= dstCapacity, input->pos must be <= srcSize |
|
791 * - outpot->pos and input->pos will be updated. They are guaranteed to remain below their respective limit. |
|
792 * - When nbWorkers==0 (default), function is blocking : it completes its job before returning to caller. |
|
793 * - When nbWorkers>=1, function is non-blocking : it just acquires a copy of input, and distributes jobs to internal worker threads, flush whatever is available, |
|
794 * and then immediately returns, just indicating that there is some data remaining to be flushed. |
|
795 * The function nonetheless guarantees forward progress : it will return only after it reads or write at least 1+ byte. |
|
796 * - 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. |
|
797 * - @return provides a minimum amount of data remaining to be flushed from internal buffers |
|
798 * or an error code, which can be tested using ZSTD_isError(). |
|
799 * if @return != 0, flush is not fully completed, there is still some data left within internal buffers. |
|
800 * This is useful for ZSTD_e_flush, since in this case more flushes are necessary to empty all buffers. |
|
801 * For ZSTD_e_end, @return == 0 when internal buffers are fully flushed and frame is completed. |
|
802 * - after a ZSTD_e_end directive, if internal buffer is not fully flushed (@return != 0), |
|
803 * only ZSTD_e_end or ZSTD_e_flush operations are allowed. |
|
804 * Before starting a new compression job, or changing compression parameters, |
|
805 * it is required to fully flush internal buffers. |
|
806 */ |
|
807 ZSTDLIB_API size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, |
|
808 ZSTD_outBuffer* output, |
|
809 ZSTD_inBuffer* input, |
|
810 ZSTD_EndDirective endOp); |
|
811 |
|
812 |
|
813 |
|
814 /* ============================== */ |
|
815 /* Advanced decompression API */ |
|
816 /* ============================== */ |
|
817 |
|
818 /* The advanced API pushes parameters one by one into an existing DCtx context. |
|
819 * Parameters are sticky, and remain valid for all following frames |
|
820 * using the same DCtx context. |
|
821 * It's possible to reset parameters to default values using ZSTD_DCtx_reset(). |
|
822 * Note : This API is compatible with existing ZSTD_decompressDCtx() and ZSTD_decompressStream(). |
|
823 * Therefore, no new decompression function is necessary. |
|
824 */ |
|
825 |
|
826 |
|
827 typedef enum { |
|
828 |
|
829 ZSTD_d_windowLogMax=100, /* Select a size limit (in power of 2) beyond which |
|
830 * the streaming API will refuse to allocate memory buffer |
|
831 * in order to protect the host from unreasonable memory requirements. |
|
832 * This parameter is only useful in streaming mode, since no internal buffer is allocated in single-pass mode. |
|
833 * By default, a decompression context accepts window sizes <= (1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT) */ |
|
834 |
|
835 /* note : additional experimental parameters are also available |
|
836 * within the experimental section of the API. |
|
837 * At the time of this writing, they include : |
|
838 * ZSTD_c_format |
|
839 * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. |
|
840 * note : never ever use experimentalParam? names directly |
|
841 */ |
|
842 ZSTD_d_experimentalParam1=1000 |
|
843 |
|
844 } ZSTD_dParameter; |
|
845 |
|
846 |
|
847 /*! ZSTD_dParam_getBounds() : |
|
848 * All parameters must belong to an interval with lower and upper bounds, |
|
849 * otherwise they will either trigger an error or be automatically clamped. |
|
850 * @return : a structure, ZSTD_bounds, which contains |
|
851 * - an error status field, which must be tested using ZSTD_isError() |
|
852 * - both lower and upper bounds, inclusive |
|
853 */ |
|
854 ZSTDLIB_API ZSTD_bounds ZSTD_dParam_getBounds(ZSTD_dParameter dParam); |
|
855 |
|
856 /*! ZSTD_DCtx_setParameter() : |
|
857 * Set one compression parameter, selected by enum ZSTD_dParameter. |
|
858 * All parameters have valid bounds. Bounds can be queried using ZSTD_dParam_getBounds(). |
|
859 * Providing a value beyond bound will either clamp it, or trigger an error (depending on parameter). |
|
860 * Setting a parameter is only possible during frame initialization (before starting decompression). |
|
861 * @return : 0, or an error code (which can be tested using ZSTD_isError()). |
|
862 */ |
|
863 ZSTDLIB_API size_t ZSTD_DCtx_setParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int value); |
|
864 |
|
865 |
|
866 /*! ZSTD_DCtx_loadDictionary() : |
|
867 * Create an internal DDict from dict buffer, |
|
868 * to be used to decompress next frames. |
|
869 * The dictionary remains valid for all future frames, until explicitly invalidated. |
|
870 * @result : 0, or an error code (which can be tested with ZSTD_isError()). |
|
871 * Special : Adding a NULL (or 0-size) dictionary invalidates any previous dictionary, |
|
872 * meaning "return to no-dictionary mode". |
|
873 * Note 1 : Loading a dictionary involves building tables, |
|
874 * which has a non-negligible impact on CPU usage and latency. |
|
875 * It's recommended to "load once, use many times", to amortize the cost |
|
876 * Note 2 :`dict` content will be copied internally, so `dict` can be released after loading. |
|
877 * Use ZSTD_DCtx_loadDictionary_byReference() to reference dictionary content instead. |
|
878 * Note 3 : Use ZSTD_DCtx_loadDictionary_advanced() to take control of |
|
879 * how dictionary content is loaded and interpreted. |
|
880 */ |
|
881 ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); |
|
882 |
|
883 /*! ZSTD_DCtx_refDDict() : |
|
884 * Reference a prepared dictionary, to be used to decompress next frames. |
|
885 * The dictionary remains active for decompression of future frames using same DCtx. |
|
886 * @result : 0, or an error code (which can be tested with ZSTD_isError()). |
|
887 * Note 1 : Currently, only one dictionary can be managed. |
|
888 * Referencing a new dictionary effectively "discards" any previous one. |
|
889 * Special: referencing a NULL DDict means "return to no-dictionary mode". |
|
890 * Note 2 : DDict is just referenced, its lifetime must outlive its usage from DCtx. |
|
891 */ |
|
892 ZSTDLIB_API size_t ZSTD_DCtx_refDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict); |
|
893 |
|
894 /*! ZSTD_DCtx_refPrefix() : |
|
895 * Reference a prefix (single-usage dictionary) to decompress next frame. |
|
896 * This is the reverse operation of ZSTD_CCtx_refPrefix(), |
|
897 * and must use the same prefix as the one used during compression. |
|
898 * Prefix is **only used once**. Reference is discarded at end of frame. |
|
899 * End of frame is reached when ZSTD_decompressStream() returns 0. |
|
900 * @result : 0, or an error code (which can be tested with ZSTD_isError()). |
|
901 * Note 1 : Adding any prefix (including NULL) invalidates any previously set prefix or dictionary |
|
902 * Note 2 : Prefix buffer is referenced. It **must** outlive decompression. |
|
903 * Prefix buffer must remain unmodified up to the end of frame, |
|
904 * reached when ZSTD_decompressStream() returns 0. |
|
905 * Note 3 : By default, the prefix is treated as raw content (ZSTD_dm_rawContent). |
|
906 * Use ZSTD_CCtx_refPrefix_advanced() to alter dictMode (Experimental section) |
|
907 * Note 4 : Referencing a raw content prefix has almost no cpu nor memory cost. |
|
908 * A full dictionary is more costly, as it requires building tables. |
|
909 */ |
|
910 ZSTDLIB_API size_t ZSTD_DCtx_refPrefix(ZSTD_DCtx* dctx, |
|
911 const void* prefix, size_t prefixSize); |
|
912 |
|
913 /*! ZSTD_DCtx_reset() : |
|
914 * Return a DCtx to clean state. |
|
915 * Session and parameters can be reset jointly or separately. |
|
916 * Parameters can only be reset when no active frame is being decompressed. |
|
917 * @return : 0, or an error code, which can be tested with ZSTD_isError() |
|
918 */ |
|
919 ZSTDLIB_API size_t ZSTD_DCtx_reset(ZSTD_DCtx* dctx, ZSTD_ResetDirective reset); |
|
920 |
|
921 |
|
922 |
|
923 /**************************************************************************************** |
|
924 * experimental API (static linking only) |
|
925 **************************************************************************************** |
|
926 * The following symbols and constants |
|
927 * are not planned to join "stable API" status in the near future. |
|
928 * They can still change in future versions. |
|
929 * Some of them are planned to remain in the static_only section indefinitely. |
|
930 * Some of them might be removed in the future (especially when redundant with existing stable functions) |
|
931 * ***************************************************************************************/ |
|
932 |
|
933 #define ZSTD_FRAMEHEADERSIZE_PREFIX 5 /* minimum input size required to query frame header size */ |
433 #define ZSTD_FRAMEHEADERSIZE_MIN 6 |
934 #define ZSTD_FRAMEHEADERSIZE_MIN 6 |
434 #define ZSTD_FRAMEHEADERSIZE_MAX 18 /* for static allocation */ |
935 #define ZSTD_FRAMEHEADERSIZE_MAX 18 /* can be useful for static allocation */ |
435 static const size_t ZSTD_frameHeaderSize_prefix = ZSTD_FRAMEHEADERSIZE_PREFIX; |
936 #define ZSTD_SKIPPABLEHEADERSIZE 8 |
436 static const size_t ZSTD_frameHeaderSize_min = ZSTD_FRAMEHEADERSIZE_MIN; |
937 |
437 static const size_t ZSTD_frameHeaderSize_max = ZSTD_FRAMEHEADERSIZE_MAX; |
938 /* compression parameter bounds */ |
438 static const size_t ZSTD_skippableHeaderSize = 8; /* magic number + skippable frame length */ |
939 #define ZSTD_WINDOWLOG_MAX_32 30 |
439 |
940 #define ZSTD_WINDOWLOG_MAX_64 31 |
|
941 #define ZSTD_WINDOWLOG_MAX ((int)(sizeof(size_t) == 4 ? ZSTD_WINDOWLOG_MAX_32 : ZSTD_WINDOWLOG_MAX_64)) |
|
942 #define ZSTD_WINDOWLOG_MIN 10 |
|
943 #define ZSTD_HASHLOG_MAX ((ZSTD_WINDOWLOG_MAX < 30) ? ZSTD_WINDOWLOG_MAX : 30) |
|
944 #define ZSTD_HASHLOG_MIN 6 |
|
945 #define ZSTD_CHAINLOG_MAX_32 29 |
|
946 #define ZSTD_CHAINLOG_MAX_64 30 |
|
947 #define ZSTD_CHAINLOG_MAX ((int)(sizeof(size_t) == 4 ? ZSTD_CHAINLOG_MAX_32 : ZSTD_CHAINLOG_MAX_64)) |
|
948 #define ZSTD_CHAINLOG_MIN ZSTD_HASHLOG_MIN |
|
949 #define ZSTD_SEARCHLOG_MAX (ZSTD_WINDOWLOG_MAX-1) |
|
950 #define ZSTD_SEARCHLOG_MIN 1 |
|
951 #define ZSTD_MINMATCH_MAX 7 /* only for ZSTD_fast, other strategies are limited to 6 */ |
|
952 #define ZSTD_MINMATCH_MIN 3 /* only for ZSTD_btopt+, faster strategies are limited to 4 */ |
|
953 #define ZSTD_TARGETLENGTH_MAX ZSTD_BLOCKSIZE_MAX |
|
954 #define ZSTD_TARGETLENGTH_MIN 0 /* note : comparing this constant to an unsigned results in a tautological test */ |
|
955 #define ZSTD_STRATEGY_MIN ZSTD_fast |
|
956 #define ZSTD_STRATEGY_MAX ZSTD_btultra2 |
|
957 |
|
958 |
|
959 #define ZSTD_OVERLAPLOG_MIN 0 |
|
960 #define ZSTD_OVERLAPLOG_MAX 9 |
|
961 |
|
962 #define ZSTD_WINDOWLOG_LIMIT_DEFAULT 27 /* by default, the streaming decoder will refuse any frame |
|
963 * requiring larger than (1<<ZSTD_WINDOWLOG_LIMIT_DEFAULT) window size, |
|
964 * to preserve host's memory from unreasonable requirements. |
|
965 * This limit can be overriden using ZSTD_DCtx_setParameter(,ZSTD_d_windowLogMax,). |
|
966 * The limit does not apply for one-pass decoders (such as ZSTD_decompress()), since no additional memory is allocated */ |
|
967 |
|
968 |
|
969 /* LDM parameter bounds */ |
|
970 #define ZSTD_LDM_HASHLOG_MIN ZSTD_HASHLOG_MIN |
|
971 #define ZSTD_LDM_HASHLOG_MAX ZSTD_HASHLOG_MAX |
|
972 #define ZSTD_LDM_MINMATCH_MIN 4 |
|
973 #define ZSTD_LDM_MINMATCH_MAX 4096 |
|
974 #define ZSTD_LDM_BUCKETSIZELOG_MIN 1 |
|
975 #define ZSTD_LDM_BUCKETSIZELOG_MAX 8 |
|
976 #define ZSTD_LDM_HASHRATELOG_MIN 0 |
|
977 #define ZSTD_LDM_HASHRATELOG_MAX (ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN) |
|
978 |
|
979 /* internal */ |
|
980 #define ZSTD_HASHLOG3_MAX 17 |
440 |
981 |
441 |
982 |
442 /* --- Advanced types --- */ |
983 /* --- Advanced types --- */ |
443 typedef enum { ZSTD_fast=1, ZSTD_dfast, ZSTD_greedy, ZSTD_lazy, ZSTD_lazy2, |
984 |
444 ZSTD_btlazy2, ZSTD_btopt, ZSTD_btultra } ZSTD_strategy; /* from faster to stronger */ |
985 typedef struct ZSTD_CCtx_params_s ZSTD_CCtx_params; |
445 |
986 |
446 typedef struct { |
987 typedef struct { |
447 unsigned windowLog; /**< largest match distance : larger == more compression, more memory needed during decompression */ |
988 unsigned windowLog; /**< largest match distance : larger == more compression, more memory needed during decompression */ |
448 unsigned chainLog; /**< fully searched segment : larger == more compression, slower, more memory (useless for fast) */ |
989 unsigned chainLog; /**< fully searched segment : larger == more compression, slower, more memory (useless for fast) */ |
449 unsigned hashLog; /**< dispatch table : larger == faster, more memory */ |
990 unsigned hashLog; /**< dispatch table : larger == faster, more memory */ |
450 unsigned searchLog; /**< nb of searches : larger == more compression, slower */ |
991 unsigned searchLog; /**< nb of searches : larger == more compression, slower */ |
451 unsigned searchLength; /**< match length searched : larger == faster decompression, sometimes less compression */ |
992 unsigned minMatch; /**< match length searched : larger == faster decompression, sometimes less compression */ |
452 unsigned targetLength; /**< acceptable match size for optimal parser (only) : larger == more compression, slower */ |
993 unsigned targetLength; /**< acceptable match size for optimal parser (only) : larger == more compression, slower */ |
453 ZSTD_strategy strategy; |
994 ZSTD_strategy strategy; /**< see ZSTD_strategy definition above */ |
454 } ZSTD_compressionParameters; |
995 } ZSTD_compressionParameters; |
455 |
996 |
456 typedef struct { |
997 typedef struct { |
457 unsigned contentSizeFlag; /**< 1: content size will be in frame header (when known) */ |
998 int contentSizeFlag; /**< 1: content size will be in frame header (when known) */ |
458 unsigned checksumFlag; /**< 1: generate a 32-bits checksum at end of frame, for error detection */ |
999 int checksumFlag; /**< 1: generate a 32-bits checksum using XXH64 algorithm at end of frame, for error detection */ |
459 unsigned noDictIDFlag; /**< 1: no dictID will be saved into frame header (if dictionary compression) */ |
1000 int noDictIDFlag; /**< 1: no dictID will be saved into frame header (dictID is only useful for dictionary compression) */ |
460 } ZSTD_frameParameters; |
1001 } ZSTD_frameParameters; |
461 |
1002 |
462 typedef struct { |
1003 typedef struct { |
463 ZSTD_compressionParameters cParams; |
1004 ZSTD_compressionParameters cParams; |
464 ZSTD_frameParameters fParams; |
1005 ZSTD_frameParameters fParams; |
465 } ZSTD_parameters; |
1006 } ZSTD_parameters; |
466 |
1007 |
467 typedef struct ZSTD_CCtx_params_s ZSTD_CCtx_params; |
|
468 |
|
469 typedef enum { |
1008 typedef enum { |
470 ZSTD_dct_auto=0, /* dictionary is "full" when starting with ZSTD_MAGIC_DICTIONARY, otherwise it is "rawContent" */ |
1009 ZSTD_dct_auto = 0, /* dictionary is "full" when starting with ZSTD_MAGIC_DICTIONARY, otherwise it is "rawContent" */ |
471 ZSTD_dct_rawContent, /* ensures dictionary is always loaded as rawContent, even if it starts with ZSTD_MAGIC_DICTIONARY */ |
1010 ZSTD_dct_rawContent = 1, /* ensures dictionary is always loaded as rawContent, even if it starts with ZSTD_MAGIC_DICTIONARY */ |
472 ZSTD_dct_fullDict /* refuses to load a dictionary if it does not respect Zstandard's specification */ |
1011 ZSTD_dct_fullDict = 2 /* refuses to load a dictionary if it does not respect Zstandard's specification, starting with ZSTD_MAGIC_DICTIONARY */ |
473 } ZSTD_dictContentType_e; |
1012 } ZSTD_dictContentType_e; |
474 |
1013 |
475 typedef enum { |
1014 typedef enum { |
476 ZSTD_dlm_byCopy = 0, /**< Copy dictionary content internally */ |
1015 ZSTD_dlm_byCopy = 0, /**< Copy dictionary content internally */ |
477 ZSTD_dlm_byRef, /**< Reference dictionary content -- the dictionary buffer must outlive its users. */ |
1016 ZSTD_dlm_byRef = 1, /**< Reference dictionary content -- the dictionary buffer must outlive its users. */ |
478 } ZSTD_dictLoadMethod_e; |
1017 } ZSTD_dictLoadMethod_e; |
479 |
1018 |
|
1019 typedef enum { |
|
1020 /* Opened question : should we have a format ZSTD_f_auto ? |
|
1021 * Today, it would mean exactly the same as ZSTD_f_zstd1. |
|
1022 * But, in the future, should several formats become supported, |
|
1023 * on the compression side, it would mean "default format". |
|
1024 * On the decompression side, it would mean "automatic format detection", |
|
1025 * so that ZSTD_f_zstd1 would mean "accept *only* zstd frames". |
|
1026 * Since meaning is a little different, another option could be to define different enums for compression and decompression. |
|
1027 * This question could be kept for later, when there are actually multiple formats to support, |
|
1028 * but there is also the question of pinning enum values, and pinning value `0` is especially important */ |
|
1029 ZSTD_f_zstd1 = 0, /* zstd frame format, specified in zstd_compression_format.md (default) */ |
|
1030 ZSTD_f_zstd1_magicless = 1, /* Variant of zstd frame format, without initial 4-bytes magic number. |
|
1031 * Useful to save 4 bytes per generated frame. |
|
1032 * Decoder cannot recognise automatically this format, requiring this instruction. */ |
|
1033 } ZSTD_format_e; |
|
1034 |
|
1035 typedef enum { |
|
1036 /* Note: this enum and the behavior it controls are effectively internal |
|
1037 * implementation details of the compressor. They are expected to continue |
|
1038 * to evolve and should be considered only in the context of extremely |
|
1039 * advanced performance tuning. |
|
1040 * |
|
1041 * Zstd currently supports the use of a CDict in two ways: |
|
1042 * |
|
1043 * - The contents of the CDict can be copied into the working context. This |
|
1044 * means that the compression can search both the dictionary and input |
|
1045 * while operating on a single set of internal tables. This makes |
|
1046 * the compression faster per-byte of input. However, the initial copy of |
|
1047 * the CDict's tables incurs a fixed cost at the beginning of the |
|
1048 * compression. For small compressions (< 8 KB), that copy can dominate |
|
1049 * the cost of the compression. |
|
1050 * |
|
1051 * - The CDict's tables can be used in-place. In this model, compression is |
|
1052 * slower per input byte, because the compressor has to search two sets of |
|
1053 * tables. However, this model incurs no start-up cost (as long as the |
|
1054 * working context's tables can be reused). For small inputs, this can be |
|
1055 * faster than copying the CDict's tables. |
|
1056 * |
|
1057 * Zstd has a simple internal heuristic that selects which strategy to use |
|
1058 * at the beginning of a compression. However, if experimentation shows that |
|
1059 * Zstd is making poor choices, it is possible to override that choice with |
|
1060 * this enum. |
|
1061 */ |
|
1062 ZSTD_dictDefaultAttach = 0, /* Use the default heuristic. */ |
|
1063 ZSTD_dictForceAttach = 1, /* Never copy the dictionary. */ |
|
1064 ZSTD_dictForceCopy = 2, /* Always copy the dictionary. */ |
|
1065 } ZSTD_dictAttachPref_e; |
480 |
1066 |
481 |
1067 |
482 /*************************************** |
1068 /*************************************** |
483 * Frame size functions |
1069 * Frame size functions |
484 ***************************************/ |
1070 ***************************************/ |
485 |
|
486 /*! ZSTD_findFrameCompressedSize() : |
|
487 * `src` should point to the start of a ZSTD encoded frame or skippable frame |
|
488 * `srcSize` must be >= first frame size |
|
489 * @return : the compressed size of the first frame starting at `src`, |
|
490 * suitable to pass to `ZSTD_decompress` or similar, |
|
491 * or an error code if input is invalid */ |
|
492 ZSTDLIB_API size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize); |
|
493 |
1071 |
494 /*! ZSTD_findDecompressedSize() : |
1072 /*! ZSTD_findDecompressedSize() : |
495 * `src` should point the start of a series of ZSTD encoded and/or skippable frames |
1073 * `src` should point the start of a series of ZSTD encoded and/or skippable frames |
496 * `srcSize` must be the _exact_ size of this series |
1074 * `srcSize` must be the _exact_ size of this series |
497 * (i.e. there should be a frame boundary exactly at `srcSize` bytes after `src`) |
1075 * (i.e. there should be a frame boundary exactly at `srcSize` bytes after `src`) |
673 * optimize params for a given `srcSize` and `dictSize`. |
1243 * optimize params for a given `srcSize` and `dictSize`. |
674 * both values are optional, select `0` if unknown. */ |
1244 * both values are optional, select `0` if unknown. */ |
675 ZSTDLIB_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize); |
1245 ZSTDLIB_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize); |
676 |
1246 |
677 /*! ZSTD_compress_advanced() : |
1247 /*! ZSTD_compress_advanced() : |
678 * Same as ZSTD_compress_usingDict(), with fine-tune control over each compression parameter */ |
1248 * Same as ZSTD_compress_usingDict(), with fine-tune control over compression parameters (by structure) */ |
679 ZSTDLIB_API size_t ZSTD_compress_advanced (ZSTD_CCtx* cctx, |
1249 ZSTDLIB_API size_t ZSTD_compress_advanced(ZSTD_CCtx* cctx, |
680 void* dst, size_t dstCapacity, |
1250 void* dst, size_t dstCapacity, |
681 const void* src, size_t srcSize, |
1251 const void* src, size_t srcSize, |
682 const void* dict,size_t dictSize, |
1252 const void* dict,size_t dictSize, |
683 ZSTD_parameters params); |
1253 ZSTD_parameters params); |
684 |
1254 |
685 /*! ZSTD_compress_usingCDict_advanced() : |
1255 /*! ZSTD_compress_usingCDict_advanced() : |
686 * Same as ZSTD_compress_usingCDict(), with fine-tune control over frame parameters */ |
1256 * Same as ZSTD_compress_usingCDict(), with fine-tune control over frame parameters */ |
687 ZSTDLIB_API size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx, |
1257 ZSTDLIB_API size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx, |
688 void* dst, size_t dstCapacity, |
1258 void* dst, size_t dstCapacity, |
689 const void* src, size_t srcSize, |
1259 const void* src, size_t srcSize, |
690 const ZSTD_CDict* cdict, ZSTD_frameParameters fParams); |
1260 const ZSTD_CDict* cdict, |
691 |
1261 ZSTD_frameParameters fParams); |
692 |
1262 |
693 /*--- Advanced decompression functions ---*/ |
1263 |
|
1264 /*! ZSTD_CCtx_loadDictionary_byReference() : |
|
1265 * Same as ZSTD_CCtx_loadDictionary(), but dictionary content is referenced, instead of being copied into CCtx. |
|
1266 * It saves some memory, but also requires that `dict` outlives its usage within `cctx` */ |
|
1267 ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_byReference(ZSTD_CCtx* cctx, const void* dict, size_t dictSize); |
|
1268 |
|
1269 /*! ZSTD_CCtx_loadDictionary_advanced() : |
|
1270 * Same as ZSTD_CCtx_loadDictionary(), but gives finer control over |
|
1271 * how to load the dictionary (by copy ? by reference ?) |
|
1272 * and how to interpret it (automatic ? force raw mode ? full mode only ?) */ |
|
1273 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); |
|
1274 |
|
1275 /*! ZSTD_CCtx_refPrefix_advanced() : |
|
1276 * Same as ZSTD_CCtx_refPrefix(), but gives finer control over |
|
1277 * how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?) */ |
|
1278 ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType); |
|
1279 |
|
1280 /* === experimental parameters === */ |
|
1281 /* these parameters can be used with ZSTD_setParameter() |
|
1282 * they are not guaranteed to remain supported in the future */ |
|
1283 |
|
1284 /* Enables rsyncable mode, |
|
1285 * which makes compressed files more rsync friendly |
|
1286 * by adding periodic synchronization points to the compressed data. |
|
1287 * The target average block size is ZSTD_c_jobSize / 2. |
|
1288 * It's possible to modify the job size to increase or decrease |
|
1289 * the granularity of the synchronization point. |
|
1290 * Once the jobSize is smaller than the window size, |
|
1291 * it will result in compression ratio degradation. |
|
1292 * NOTE 1: rsyncable mode only works when multithreading is enabled. |
|
1293 * NOTE 2: rsyncable performs poorly in combination with long range mode, |
|
1294 * since it will decrease the effectiveness of synchronization points, |
|
1295 * though mileage may vary. |
|
1296 * NOTE 3: Rsyncable mode limits maximum compression speed to ~400 MB/s. |
|
1297 * If the selected compression level is already running significantly slower, |
|
1298 * the overall speed won't be significantly impacted. |
|
1299 */ |
|
1300 #define ZSTD_c_rsyncable ZSTD_c_experimentalParam1 |
|
1301 |
|
1302 /* Select a compression format. |
|
1303 * The value must be of type ZSTD_format_e. |
|
1304 * See ZSTD_format_e enum definition for details */ |
|
1305 #define ZSTD_c_format ZSTD_c_experimentalParam2 |
|
1306 |
|
1307 /* Force back-reference distances to remain < windowSize, |
|
1308 * even when referencing into Dictionary content (default:0) */ |
|
1309 #define ZSTD_c_forceMaxWindow ZSTD_c_experimentalParam3 |
|
1310 |
|
1311 /* Controls whether the contents of a CDict |
|
1312 * are used in place, or copied into the working context. |
|
1313 * Accepts values from the ZSTD_dictAttachPref_e enum. |
|
1314 * See the comments on that enum for an explanation of the feature. */ |
|
1315 #define ZSTD_c_forceAttachDict ZSTD_c_experimentalParam4 |
|
1316 |
|
1317 /*! ZSTD_CCtx_getParameter() : |
|
1318 * Get the requested compression parameter value, selected by enum ZSTD_cParameter, |
|
1319 * and store it into int* value. |
|
1320 * @return : 0, or an error code (which can be tested with ZSTD_isError()). |
|
1321 */ |
|
1322 ZSTDLIB_API size_t ZSTD_CCtx_getParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int* value); |
|
1323 |
|
1324 |
|
1325 /*! ZSTD_CCtx_params : |
|
1326 * Quick howto : |
|
1327 * - ZSTD_createCCtxParams() : Create a ZSTD_CCtx_params structure |
|
1328 * - ZSTD_CCtxParam_setParameter() : Push parameters one by one into |
|
1329 * an existing ZSTD_CCtx_params structure. |
|
1330 * This is similar to |
|
1331 * ZSTD_CCtx_setParameter(). |
|
1332 * - ZSTD_CCtx_setParametersUsingCCtxParams() : Apply parameters to |
|
1333 * an existing CCtx. |
|
1334 * These parameters will be applied to |
|
1335 * all subsequent frames. |
|
1336 * - ZSTD_compressStream2() : Do compression using the CCtx. |
|
1337 * - ZSTD_freeCCtxParams() : Free the memory. |
|
1338 * |
|
1339 * This can be used with ZSTD_estimateCCtxSize_advanced_usingCCtxParams() |
|
1340 * for static allocation of CCtx for single-threaded compression. |
|
1341 */ |
|
1342 ZSTDLIB_API ZSTD_CCtx_params* ZSTD_createCCtxParams(void); |
|
1343 ZSTDLIB_API size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params); |
|
1344 |
|
1345 /*! ZSTD_CCtxParams_reset() : |
|
1346 * Reset params to default values. |
|
1347 */ |
|
1348 ZSTDLIB_API size_t ZSTD_CCtxParams_reset(ZSTD_CCtx_params* params); |
|
1349 |
|
1350 /*! ZSTD_CCtxParams_init() : |
|
1351 * Initializes the compression parameters of cctxParams according to |
|
1352 * compression level. All other parameters are reset to their default values. |
|
1353 */ |
|
1354 ZSTDLIB_API size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel); |
|
1355 |
|
1356 /*! ZSTD_CCtxParams_init_advanced() : |
|
1357 * Initializes the compression and frame parameters of cctxParams according to |
|
1358 * params. All other parameters are reset to their default values. |
|
1359 */ |
|
1360 ZSTDLIB_API size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params); |
|
1361 |
|
1362 /*! ZSTD_CCtxParam_setParameter() : |
|
1363 * Similar to ZSTD_CCtx_setParameter. |
|
1364 * Set one compression parameter, selected by enum ZSTD_cParameter. |
|
1365 * Parameters must be applied to a ZSTD_CCtx using ZSTD_CCtx_setParametersUsingCCtxParams(). |
|
1366 * @result : 0, or an error code (which can be tested with ZSTD_isError()). |
|
1367 */ |
|
1368 ZSTDLIB_API size_t ZSTD_CCtxParam_setParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, int value); |
|
1369 |
|
1370 /*! ZSTD_CCtxParam_getParameter() : |
|
1371 * Similar to ZSTD_CCtx_getParameter. |
|
1372 * Get the requested value of one compression parameter, selected by enum ZSTD_cParameter. |
|
1373 * @result : 0, or an error code (which can be tested with ZSTD_isError()). |
|
1374 */ |
|
1375 ZSTDLIB_API size_t ZSTD_CCtxParam_getParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, int* value); |
|
1376 |
|
1377 /*! ZSTD_CCtx_setParametersUsingCCtxParams() : |
|
1378 * Apply a set of ZSTD_CCtx_params to the compression context. |
|
1379 * This can be done even after compression is started, |
|
1380 * if nbWorkers==0, this will have no impact until a new compression is started. |
|
1381 * if nbWorkers>=1, new parameters will be picked up at next job, |
|
1382 * with a few restrictions (windowLog, pledgedSrcSize, nbWorkers, jobSize, and overlapLog are not updated). |
|
1383 */ |
|
1384 ZSTDLIB_API size_t ZSTD_CCtx_setParametersUsingCCtxParams( |
|
1385 ZSTD_CCtx* cctx, const ZSTD_CCtx_params* params); |
|
1386 |
|
1387 /*! ZSTD_compressStream2_simpleArgs() : |
|
1388 * Same as ZSTD_compressStream2(), |
|
1389 * but using only integral types as arguments. |
|
1390 * This variant might be helpful for binders from dynamic languages |
|
1391 * which have troubles handling structures containing memory pointers. |
|
1392 */ |
|
1393 ZSTDLIB_API size_t ZSTD_compressStream2_simpleArgs ( |
|
1394 ZSTD_CCtx* cctx, |
|
1395 void* dst, size_t dstCapacity, size_t* dstPos, |
|
1396 const void* src, size_t srcSize, size_t* srcPos, |
|
1397 ZSTD_EndDirective endOp); |
|
1398 |
|
1399 |
|
1400 /*************************************** |
|
1401 * Advanced decompression functions |
|
1402 ***************************************/ |
694 |
1403 |
695 /*! ZSTD_isFrame() : |
1404 /*! ZSTD_isFrame() : |
696 * Tells if the content of `buffer` starts with a valid Frame Identifier. |
1405 * Tells if the content of `buffer` starts with a valid Frame Identifier. |
697 * Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0. |
1406 * Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0. |
698 * Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled. |
1407 * Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled. |
952 /* misc */ |
1718 /* misc */ |
953 ZSTDLIB_API void ZSTD_copyDCtx(ZSTD_DCtx* dctx, const ZSTD_DCtx* preparedDCtx); |
1719 ZSTDLIB_API void ZSTD_copyDCtx(ZSTD_DCtx* dctx, const ZSTD_DCtx* preparedDCtx); |
954 typedef enum { ZSTDnit_frameHeader, ZSTDnit_blockHeader, ZSTDnit_block, ZSTDnit_lastBlock, ZSTDnit_checksum, ZSTDnit_skippableFrame } ZSTD_nextInputType_e; |
1720 typedef enum { ZSTDnit_frameHeader, ZSTDnit_blockHeader, ZSTDnit_block, ZSTDnit_lastBlock, ZSTDnit_checksum, ZSTDnit_skippableFrame } ZSTD_nextInputType_e; |
955 ZSTDLIB_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); |
1721 ZSTDLIB_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); |
956 |
1722 |
957 |
|
958 |
|
959 /* ============================================ */ |
|
960 /** New advanced API (experimental) */ |
|
961 /* ============================================ */ |
|
962 |
|
963 /* API design : |
|
964 * In this advanced API, parameters are pushed one by one into an existing context, |
|
965 * using ZSTD_CCtx_set*() functions. |
|
966 * Pushed parameters are sticky : they are applied to next job, and any subsequent job. |
|
967 * It's possible to reset parameters to "default" using ZSTD_CCtx_reset(). |
|
968 * Important : "sticky" parameters only work with `ZSTD_compress_generic()` ! |
|
969 * For any other entry point, "sticky" parameters are ignored ! |
|
970 * |
|
971 * This API is intended to replace all others advanced / experimental API entry points. |
|
972 */ |
|
973 |
|
974 /* note on enum design : |
|
975 * All enum will be pinned to explicit values before reaching "stable API" status */ |
|
976 |
|
977 typedef enum { |
|
978 /* Opened question : should we have a format ZSTD_f_auto ? |
|
979 * Today, it would mean exactly the same as ZSTD_f_zstd1. |
|
980 * But, in the future, should several formats become supported, |
|
981 * on the compression side, it would mean "default format". |
|
982 * On the decompression side, it would mean "automatic format detection", |
|
983 * so that ZSTD_f_zstd1 would mean "accept *only* zstd frames". |
|
984 * Since meaning is a little different, another option could be to define different enums for compression and decompression. |
|
985 * This question could be kept for later, when there are actually multiple formats to support, |
|
986 * but there is also the question of pinning enum values, and pinning value `0` is especially important */ |
|
987 ZSTD_f_zstd1 = 0, /* zstd frame format, specified in zstd_compression_format.md (default) */ |
|
988 ZSTD_f_zstd1_magicless, /* Variant of zstd frame format, without initial 4-bytes magic number. |
|
989 * Useful to save 4 bytes per generated frame. |
|
990 * Decoder cannot recognise automatically this format, requiring instructions. */ |
|
991 } ZSTD_format_e; |
|
992 |
|
993 typedef enum { |
|
994 /* compression format */ |
|
995 ZSTD_p_format = 10, /* See ZSTD_format_e enum definition. |
|
996 * Cast selected format as unsigned for ZSTD_CCtx_setParameter() compatibility. */ |
|
997 |
|
998 /* compression parameters */ |
|
999 ZSTD_p_compressionLevel=100, /* Update all compression parameters according to pre-defined cLevel table |
|
1000 * Default level is ZSTD_CLEVEL_DEFAULT==3. |
|
1001 * Special: value 0 means default, which is controlled by ZSTD_CLEVEL_DEFAULT. |
|
1002 * Note 1 : it's possible to pass a negative compression level by casting it to unsigned type. |
|
1003 * Note 2 : setting a level sets all default values of other compression parameters. |
|
1004 * Note 3 : setting compressionLevel automatically updates ZSTD_p_compressLiterals. */ |
|
1005 ZSTD_p_windowLog, /* Maximum allowed back-reference distance, expressed as power of 2. |
|
1006 * Must be clamped between ZSTD_WINDOWLOG_MIN and ZSTD_WINDOWLOG_MAX. |
|
1007 * Special: value 0 means "use default windowLog". |
|
1008 * Note: Using a window size greater than ZSTD_MAXWINDOWSIZE_DEFAULT (default: 2^27) |
|
1009 * requires explicitly allowing such window size during decompression stage. */ |
|
1010 ZSTD_p_hashLog, /* Size of the initial probe table, as a power of 2. |
|
1011 * Resulting table size is (1 << (hashLog+2)). |
|
1012 * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX. |
|
1013 * Larger tables improve compression ratio of strategies <= dFast, |
|
1014 * and improve speed of strategies > dFast. |
|
1015 * Special: value 0 means "use default hashLog". */ |
|
1016 ZSTD_p_chainLog, /* Size of the multi-probe search table, as a power of 2. |
|
1017 * Resulting table size is (1 << (chainLog+2)). |
|
1018 * Must be clamped between ZSTD_CHAINLOG_MIN and ZSTD_CHAINLOG_MAX. |
|
1019 * Larger tables result in better and slower compression. |
|
1020 * This parameter is useless when using "fast" strategy. |
|
1021 * Note it's still useful when using "dfast" strategy, |
|
1022 * in which case it defines a secondary probe table. |
|
1023 * Special: value 0 means "use default chainLog". */ |
|
1024 ZSTD_p_searchLog, /* Number of search attempts, as a power of 2. |
|
1025 * More attempts result in better and slower compression. |
|
1026 * This parameter is useless when using "fast" and "dFast" strategies. |
|
1027 * Special: value 0 means "use default searchLog". */ |
|
1028 ZSTD_p_minMatch, /* Minimum size of searched matches (note : repCode matches can be smaller). |
|
1029 * Larger values make faster compression and decompression, but decrease ratio. |
|
1030 * Must be clamped between ZSTD_SEARCHLENGTH_MIN and ZSTD_SEARCHLENGTH_MAX. |
|
1031 * Note that currently, for all strategies < btopt, effective minimum is 4. |
|
1032 * , for all strategies > fast, effective maximum is 6. |
|
1033 * Special: value 0 means "use default minMatchLength". */ |
|
1034 ZSTD_p_targetLength, /* Impact of this field depends on strategy. |
|
1035 * For strategies btopt & btultra: |
|
1036 * Length of Match considered "good enough" to stop search. |
|
1037 * Larger values make compression stronger, and slower. |
|
1038 * For strategy fast: |
|
1039 * Distance between match sampling. |
|
1040 * Larger values make compression faster, and weaker. |
|
1041 * Special: value 0 means "use default targetLength". */ |
|
1042 ZSTD_p_compressionStrategy, /* See ZSTD_strategy enum definition. |
|
1043 * Cast selected strategy as unsigned for ZSTD_CCtx_setParameter() compatibility. |
|
1044 * The higher the value of selected strategy, the more complex it is, |
|
1045 * resulting in stronger and slower compression. |
|
1046 * Special: value 0 means "use default strategy". */ |
|
1047 |
|
1048 ZSTD_p_enableLongDistanceMatching=160, /* Enable long distance matching. |
|
1049 * This parameter is designed to improve compression ratio |
|
1050 * for large inputs, by finding large matches at long distance. |
|
1051 * It increases memory usage and window size. |
|
1052 * Note: enabling this parameter increases ZSTD_p_windowLog to 128 MB |
|
1053 * except when expressly set to a different value. */ |
|
1054 ZSTD_p_ldmHashLog, /* Size of the table for long distance matching, as a power of 2. |
|
1055 * Larger values increase memory usage and compression ratio, |
|
1056 * but decrease compression speed. |
|
1057 * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX |
|
1058 * default: windowlog - 7. |
|
1059 * Special: value 0 means "automatically determine hashlog". */ |
|
1060 ZSTD_p_ldmMinMatch, /* Minimum match size for long distance matcher. |
|
1061 * Larger/too small values usually decrease compression ratio. |
|
1062 * Must be clamped between ZSTD_LDM_MINMATCH_MIN and ZSTD_LDM_MINMATCH_MAX. |
|
1063 * Special: value 0 means "use default value" (default: 64). */ |
|
1064 ZSTD_p_ldmBucketSizeLog, /* Log size of each bucket in the LDM hash table for collision resolution. |
|
1065 * Larger values improve collision resolution but decrease compression speed. |
|
1066 * The maximum value is ZSTD_LDM_BUCKETSIZELOG_MAX . |
|
1067 * Special: value 0 means "use default value" (default: 3). */ |
|
1068 ZSTD_p_ldmHashEveryLog, /* Frequency of inserting/looking up entries in the LDM hash table. |
|
1069 * Must be clamped between 0 and (ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN). |
|
1070 * Default is MAX(0, (windowLog - ldmHashLog)), optimizing hash table usage. |
|
1071 * Larger values improve compression speed. |
|
1072 * Deviating far from default value will likely result in a compression ratio decrease. |
|
1073 * Special: value 0 means "automatically determine hashEveryLog". */ |
|
1074 |
|
1075 /* frame parameters */ |
|
1076 ZSTD_p_contentSizeFlag=200, /* Content size will be written into frame header _whenever known_ (default:1) |
|
1077 * Content size must be known at the beginning of compression, |
|
1078 * it is provided using ZSTD_CCtx_setPledgedSrcSize() */ |
|
1079 ZSTD_p_checksumFlag, /* A 32-bits checksum of content is written at end of frame (default:0) */ |
|
1080 ZSTD_p_dictIDFlag, /* When applicable, dictionary's ID is written into frame header (default:1) */ |
|
1081 |
|
1082 /* multi-threading parameters */ |
|
1083 /* These parameters are only useful if multi-threading is enabled (ZSTD_MULTITHREAD). |
|
1084 * They return an error otherwise. */ |
|
1085 ZSTD_p_nbWorkers=400, /* Select how many threads will be spawned to compress in parallel. |
|
1086 * When nbWorkers >= 1, triggers asynchronous mode : |
|
1087 * ZSTD_compress_generic() consumes some input, flush some output if possible, and immediately gives back control to caller, |
|
1088 * while compression work is performed in parallel, within worker threads. |
|
1089 * (note : a strong exception to this rule is when first invocation sets ZSTD_e_end : it becomes a blocking call). |
|
1090 * More workers improve speed, but also increase memory usage. |
|
1091 * Default value is `0`, aka "single-threaded mode" : no worker is spawned, compression is performed inside Caller's thread, all invocations are blocking */ |
|
1092 ZSTD_p_jobSize, /* Size of a compression job. This value is enforced only in non-blocking mode. |
|
1093 * Each compression job is completed in parallel, so this value indirectly controls the nb of active threads. |
|
1094 * 0 means default, which is dynamically determined based on compression parameters. |
|
1095 * Job size must be a minimum of overlapSize, or 1 MB, whichever is largest. |
|
1096 * The minimum size is automatically and transparently enforced */ |
|
1097 ZSTD_p_overlapSizeLog, /* Size of previous input reloaded at the beginning of each job. |
|
1098 * 0 => no overlap, 6(default) => use 1/8th of windowSize, >=9 => use full windowSize */ |
|
1099 |
|
1100 /* =================================================================== */ |
|
1101 /* experimental parameters - no stability guaranteed */ |
|
1102 /* =================================================================== */ |
|
1103 |
|
1104 ZSTD_p_forceMaxWindow=1100, /* Force back-reference distances to remain < windowSize, |
|
1105 * even when referencing into Dictionary content (default:0) */ |
|
1106 ZSTD_p_forceAttachDict, /* ZSTD supports usage of a CDict in-place |
|
1107 * (avoiding having to copy the compression tables |
|
1108 * from the CDict into the working context). Using |
|
1109 * a CDict in this way saves an initial setup step, |
|
1110 * but comes at the cost of more work per byte of |
|
1111 * input. ZSTD has a simple internal heuristic that |
|
1112 * guesses which strategy will be faster. You can |
|
1113 * use this flag to override that guess. |
|
1114 * |
|
1115 * Note that the by-reference, in-place strategy is |
|
1116 * only used when reusing a compression context |
|
1117 * with compatible compression parameters. (If |
|
1118 * incompatible / uninitialized, the working |
|
1119 * context needs to be cleared anyways, which is |
|
1120 * about as expensive as overwriting it with the |
|
1121 * dictionary context, so there's no savings in |
|
1122 * using the CDict by-ref.) |
|
1123 * |
|
1124 * Values greater than 0 force attaching the dict. |
|
1125 * Values less than 0 force copying the dict. |
|
1126 * 0 selects the default heuristic-guided behavior. |
|
1127 */ |
|
1128 |
|
1129 } ZSTD_cParameter; |
|
1130 |
|
1131 |
|
1132 /*! ZSTD_CCtx_setParameter() : |
|
1133 * Set one compression parameter, selected by enum ZSTD_cParameter. |
|
1134 * Setting a parameter is generally only possible during frame initialization (before starting compression). |
|
1135 * Exception : when using multi-threading mode (nbThreads >= 1), |
|
1136 * following parameters can be updated _during_ compression (within same frame): |
|
1137 * => compressionLevel, hashLog, chainLog, searchLog, minMatch, targetLength and strategy. |
|
1138 * new parameters will be active on next job, or after a flush(). |
|
1139 * Note : when `value` type is not unsigned (int, or enum), cast it to unsigned for proper type checking. |
|
1140 * @result : informational value (typically, value being set, correctly clamped), |
|
1141 * or an error code (which can be tested with ZSTD_isError()). */ |
|
1142 ZSTDLIB_API size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, unsigned value); |
|
1143 |
|
1144 /*! ZSTD_CCtx_getParameter() : |
|
1145 * Get the requested value of one compression parameter, selected by enum ZSTD_cParameter. |
|
1146 * @result : 0, or an error code (which can be tested with ZSTD_isError()). |
|
1147 */ |
|
1148 ZSTDLIB_API size_t ZSTD_CCtx_getParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, unsigned* value); |
|
1149 |
|
1150 /*! ZSTD_CCtx_setPledgedSrcSize() : |
|
1151 * Total input data size to be compressed as a single frame. |
|
1152 * This value will be controlled at the end, and result in error if not respected. |
|
1153 * @result : 0, or an error code (which can be tested with ZSTD_isError()). |
|
1154 * Note 1 : 0 means zero, empty. |
|
1155 * In order to mean "unknown content size", pass constant ZSTD_CONTENTSIZE_UNKNOWN. |
|
1156 * ZSTD_CONTENTSIZE_UNKNOWN is default value for any new compression job. |
|
1157 * Note 2 : If all data is provided and consumed in a single round, |
|
1158 * this value is overriden by srcSize instead. */ |
|
1159 ZSTDLIB_API size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize); |
|
1160 |
|
1161 /*! ZSTD_CCtx_loadDictionary() : |
|
1162 * Create an internal CDict from `dict` buffer. |
|
1163 * Decompression will have to use same dictionary. |
|
1164 * @result : 0, or an error code (which can be tested with ZSTD_isError()). |
|
1165 * Special: Adding a NULL (or 0-size) dictionary invalidates previous dictionary, |
|
1166 * meaning "return to no-dictionary mode". |
|
1167 * Note 1 : Dictionary will be used for all future compression jobs. |
|
1168 * To return to "no-dictionary" situation, load a NULL dictionary |
|
1169 * Note 2 : Loading a dictionary involves building tables, which are dependent on compression parameters. |
|
1170 * For this reason, compression parameters cannot be changed anymore after loading a dictionary. |
|
1171 * It's also a CPU consuming operation, with non-negligible impact on latency. |
|
1172 * Note 3 :`dict` content will be copied internally. |
|
1173 * Use ZSTD_CCtx_loadDictionary_byReference() to reference dictionary content instead. |
|
1174 * In such a case, dictionary buffer must outlive its users. |
|
1175 * Note 4 : Use ZSTD_CCtx_loadDictionary_advanced() |
|
1176 * to precisely select how dictionary content must be interpreted. */ |
|
1177 ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize); |
|
1178 ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_byReference(ZSTD_CCtx* cctx, const void* dict, size_t dictSize); |
|
1179 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); |
|
1180 |
|
1181 |
|
1182 /*! ZSTD_CCtx_refCDict() : |
|
1183 * Reference a prepared dictionary, to be used for all next compression jobs. |
|
1184 * Note that compression parameters are enforced from within CDict, |
|
1185 * and supercede any compression parameter previously set within CCtx. |
|
1186 * The dictionary will remain valid for future compression jobs using same CCtx. |
|
1187 * @result : 0, or an error code (which can be tested with ZSTD_isError()). |
|
1188 * Special : adding a NULL CDict means "return to no-dictionary mode". |
|
1189 * Note 1 : Currently, only one dictionary can be managed. |
|
1190 * Adding a new dictionary effectively "discards" any previous one. |
|
1191 * Note 2 : CDict is just referenced, its lifetime must outlive CCtx. */ |
|
1192 ZSTDLIB_API size_t ZSTD_CCtx_refCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); |
|
1193 |
|
1194 /*! ZSTD_CCtx_refPrefix() : |
|
1195 * Reference a prefix (single-usage dictionary) for next compression job. |
|
1196 * Decompression will need same prefix to properly regenerate data. |
|
1197 * Compressing with a prefix is similar in outcome as performing a diff and compressing it, |
|
1198 * but performs much faster, especially during decompression (compression speed is tunable with compression level). |
|
1199 * Note that prefix is **only used once**. Tables are discarded at end of compression job (ZSTD_e_end). |
|
1200 * @result : 0, or an error code (which can be tested with ZSTD_isError()). |
|
1201 * Special: Adding any prefix (including NULL) invalidates any previous prefix or dictionary |
|
1202 * Note 1 : Prefix buffer is referenced. It **must** outlive compression job. |
|
1203 * Its contain must remain unmodified up to end of compression (ZSTD_e_end). |
|
1204 * Note 2 : If the intention is to diff some large src data blob with some prior version of itself, |
|
1205 * ensure that the window size is large enough to contain the entire source. |
|
1206 * See ZSTD_p_windowLog. |
|
1207 * Note 3 : Referencing a prefix involves building tables, which are dependent on compression parameters. |
|
1208 * It's a CPU consuming operation, with non-negligible impact on latency. |
|
1209 * If there is a need to use same prefix multiple times, consider loadDictionary instead. |
|
1210 * Note 4 : By default, the prefix is treated as raw content (ZSTD_dm_rawContent). |
|
1211 * Use ZSTD_CCtx_refPrefix_advanced() to alter dictMode. */ |
|
1212 ZSTDLIB_API size_t ZSTD_CCtx_refPrefix(ZSTD_CCtx* cctx, |
|
1213 const void* prefix, size_t prefixSize); |
|
1214 ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, |
|
1215 const void* prefix, size_t prefixSize, |
|
1216 ZSTD_dictContentType_e dictContentType); |
|
1217 |
|
1218 /*! ZSTD_CCtx_reset() : |
|
1219 * Return a CCtx to clean state. |
|
1220 * Useful after an error, or to interrupt an ongoing compression job and start a new one. |
|
1221 * Any internal data not yet flushed is cancelled. |
|
1222 * The parameters and dictionary are kept unchanged, to reset them use ZSTD_CCtx_resetParameters(). |
|
1223 */ |
|
1224 ZSTDLIB_API void ZSTD_CCtx_reset(ZSTD_CCtx* cctx); |
|
1225 |
|
1226 /*! ZSTD_CCtx_resetParameters() : |
|
1227 * All parameters are back to default values (compression level is ZSTD_CLEVEL_DEFAULT). |
|
1228 * Dictionary (if any) is dropped. |
|
1229 * Resetting parameters is only possible during frame initialization (before starting compression). |
|
1230 * To reset the context use ZSTD_CCtx_reset(). |
|
1231 * @return 0 or an error code (which can be checked with ZSTD_isError()). |
|
1232 */ |
|
1233 ZSTDLIB_API size_t ZSTD_CCtx_resetParameters(ZSTD_CCtx* cctx); |
|
1234 |
|
1235 |
|
1236 |
|
1237 typedef enum { |
|
1238 ZSTD_e_continue=0, /* collect more data, encoder decides when to output compressed result, for optimal conditions */ |
|
1239 ZSTD_e_flush, /* flush any data provided so far - frame will continue, future data can still reference previous data for better compression */ |
|
1240 ZSTD_e_end /* flush any remaining data and close current frame. Any additional data starts a new frame. */ |
|
1241 } ZSTD_EndDirective; |
|
1242 |
|
1243 /*! ZSTD_compress_generic() : |
|
1244 * Behave about the same as ZSTD_compressStream. To note : |
|
1245 * - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_setParameter() |
|
1246 * - Compression parameters cannot be changed once compression is started. |
|
1247 * - outpot->pos must be <= dstCapacity, input->pos must be <= srcSize |
|
1248 * - outpot->pos and input->pos will be updated. They are guaranteed to remain below their respective limit. |
|
1249 * - In single-thread mode (default), function is blocking : it completed its job before returning to caller. |
|
1250 * - In multi-thread mode, function is non-blocking : it just acquires a copy of input, and distribute job to internal worker threads, |
|
1251 * and then immediately returns, just indicating that there is some data remaining to be flushed. |
|
1252 * The function nonetheless guarantees forward progress : it will return only after it reads or write at least 1+ byte. |
|
1253 * - Exception : in multi-threading mode, if the first call requests a ZSTD_e_end directive, it is blocking : it will complete compression before giving back control to caller. |
|
1254 * - @return provides a minimum amount of data remaining to be flushed from internal buffers |
|
1255 * or an error code, which can be tested using ZSTD_isError(). |
|
1256 * if @return != 0, flush is not fully completed, there is still some data left within internal buffers. |
|
1257 * This is useful for ZSTD_e_flush, since in this case more flushes are necessary to empty all buffers. |
|
1258 * For ZSTD_e_end, @return == 0 when internal buffers are fully flushed and frame is completed. |
|
1259 * - after a ZSTD_e_end directive, if internal buffer is not fully flushed (@return != 0), |
|
1260 * only ZSTD_e_end or ZSTD_e_flush operations are allowed. |
|
1261 * Before starting a new compression job, or changing compression parameters, |
|
1262 * it is required to fully flush internal buffers. |
|
1263 */ |
|
1264 ZSTDLIB_API size_t ZSTD_compress_generic (ZSTD_CCtx* cctx, |
|
1265 ZSTD_outBuffer* output, |
|
1266 ZSTD_inBuffer* input, |
|
1267 ZSTD_EndDirective endOp); |
|
1268 |
|
1269 |
|
1270 /*! ZSTD_compress_generic_simpleArgs() : |
|
1271 * Same as ZSTD_compress_generic(), |
|
1272 * but using only integral types as arguments. |
|
1273 * Argument list is larger than ZSTD_{in,out}Buffer, |
|
1274 * but can be helpful for binders from dynamic languages |
|
1275 * which have troubles handling structures containing memory pointers. |
|
1276 */ |
|
1277 ZSTDLIB_API size_t ZSTD_compress_generic_simpleArgs ( |
|
1278 ZSTD_CCtx* cctx, |
|
1279 void* dst, size_t dstCapacity, size_t* dstPos, |
|
1280 const void* src, size_t srcSize, size_t* srcPos, |
|
1281 ZSTD_EndDirective endOp); |
|
1282 |
|
1283 |
|
1284 /*! ZSTD_CCtx_params : |
|
1285 * Quick howto : |
|
1286 * - ZSTD_createCCtxParams() : Create a ZSTD_CCtx_params structure |
|
1287 * - ZSTD_CCtxParam_setParameter() : Push parameters one by one into |
|
1288 * an existing ZSTD_CCtx_params structure. |
|
1289 * This is similar to |
|
1290 * ZSTD_CCtx_setParameter(). |
|
1291 * - ZSTD_CCtx_setParametersUsingCCtxParams() : Apply parameters to |
|
1292 * an existing CCtx. |
|
1293 * These parameters will be applied to |
|
1294 * all subsequent compression jobs. |
|
1295 * - ZSTD_compress_generic() : Do compression using the CCtx. |
|
1296 * - ZSTD_freeCCtxParams() : Free the memory. |
|
1297 * |
|
1298 * This can be used with ZSTD_estimateCCtxSize_advanced_usingCCtxParams() |
|
1299 * for static allocation for single-threaded compression. |
|
1300 */ |
|
1301 ZSTDLIB_API ZSTD_CCtx_params* ZSTD_createCCtxParams(void); |
|
1302 ZSTDLIB_API size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params); |
|
1303 |
|
1304 |
|
1305 /*! ZSTD_CCtxParams_reset() : |
|
1306 * Reset params to default values. |
|
1307 */ |
|
1308 ZSTDLIB_API size_t ZSTD_CCtxParams_reset(ZSTD_CCtx_params* params); |
|
1309 |
|
1310 /*! ZSTD_CCtxParams_init() : |
|
1311 * Initializes the compression parameters of cctxParams according to |
|
1312 * compression level. All other parameters are reset to their default values. |
|
1313 */ |
|
1314 ZSTDLIB_API size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel); |
|
1315 |
|
1316 /*! ZSTD_CCtxParams_init_advanced() : |
|
1317 * Initializes the compression and frame parameters of cctxParams according to |
|
1318 * params. All other parameters are reset to their default values. |
|
1319 */ |
|
1320 ZSTDLIB_API size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params); |
|
1321 |
|
1322 |
|
1323 /*! ZSTD_CCtxParam_setParameter() : |
|
1324 * Similar to ZSTD_CCtx_setParameter. |
|
1325 * Set one compression parameter, selected by enum ZSTD_cParameter. |
|
1326 * Parameters must be applied to a ZSTD_CCtx using ZSTD_CCtx_setParametersUsingCCtxParams(). |
|
1327 * Note : when `value` is an enum, cast it to unsigned for proper type checking. |
|
1328 * @result : 0, or an error code (which can be tested with ZSTD_isError()). |
|
1329 */ |
|
1330 ZSTDLIB_API size_t ZSTD_CCtxParam_setParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, unsigned value); |
|
1331 |
|
1332 /*! ZSTD_CCtxParam_getParameter() : |
|
1333 * Similar to ZSTD_CCtx_getParameter. |
|
1334 * Get the requested value of one compression parameter, selected by enum ZSTD_cParameter. |
|
1335 * @result : 0, or an error code (which can be tested with ZSTD_isError()). |
|
1336 */ |
|
1337 ZSTDLIB_API size_t ZSTD_CCtxParam_getParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, unsigned* value); |
|
1338 |
|
1339 /*! ZSTD_CCtx_setParametersUsingCCtxParams() : |
|
1340 * Apply a set of ZSTD_CCtx_params to the compression context. |
|
1341 * This can be done even after compression is started, |
|
1342 * if nbWorkers==0, this will have no impact until a new compression is started. |
|
1343 * if nbWorkers>=1, new parameters will be picked up at next job, |
|
1344 * with a few restrictions (windowLog, pledgedSrcSize, nbWorkers, jobSize, and overlapLog are not updated). |
|
1345 */ |
|
1346 ZSTDLIB_API size_t ZSTD_CCtx_setParametersUsingCCtxParams( |
|
1347 ZSTD_CCtx* cctx, const ZSTD_CCtx_params* params); |
|
1348 |
|
1349 |
|
1350 /* ==================================== */ |
|
1351 /*=== Advanced decompression API ===*/ |
|
1352 /* ==================================== */ |
|
1353 |
|
1354 /* The following API works the same way as the advanced compression API : |
|
1355 * a context is created, parameters are pushed into it one by one, |
|
1356 * then the context can be used to decompress data using an interface similar to the straming API. |
|
1357 */ |
|
1358 |
|
1359 /*! ZSTD_DCtx_loadDictionary() : |
|
1360 * Create an internal DDict from dict buffer, |
|
1361 * to be used to decompress next frames. |
|
1362 * @result : 0, or an error code (which can be tested with ZSTD_isError()). |
|
1363 * Special : Adding a NULL (or 0-size) dictionary invalidates any previous dictionary, |
|
1364 * meaning "return to no-dictionary mode". |
|
1365 * Note 1 : `dict` content will be copied internally. |
|
1366 * Use ZSTD_DCtx_loadDictionary_byReference() |
|
1367 * to reference dictionary content instead. |
|
1368 * In which case, the dictionary buffer must outlive its users. |
|
1369 * Note 2 : Loading a dictionary involves building tables, |
|
1370 * which has a non-negligible impact on CPU usage and latency. |
|
1371 * Note 3 : Use ZSTD_DCtx_loadDictionary_advanced() to select |
|
1372 * how dictionary content will be interpreted and loaded. |
|
1373 */ |
|
1374 ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); |
|
1375 ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary_byReference(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); |
|
1376 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); |
|
1377 |
|
1378 |
|
1379 /*! ZSTD_DCtx_refDDict() : |
|
1380 * Reference a prepared dictionary, to be used to decompress next frames. |
|
1381 * The dictionary remains active for decompression of future frames using same DCtx. |
|
1382 * @result : 0, or an error code (which can be tested with ZSTD_isError()). |
|
1383 * Note 1 : Currently, only one dictionary can be managed. |
|
1384 * Referencing a new dictionary effectively "discards" any previous one. |
|
1385 * Special : adding a NULL DDict means "return to no-dictionary mode". |
|
1386 * Note 2 : DDict is just referenced, its lifetime must outlive its usage from DCtx. |
|
1387 */ |
|
1388 ZSTDLIB_API size_t ZSTD_DCtx_refDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict); |
|
1389 |
|
1390 |
|
1391 /*! ZSTD_DCtx_refPrefix() : |
|
1392 * Reference a prefix (single-usage dictionary) for next compression job. |
|
1393 * This is the reverse operation of ZSTD_CCtx_refPrefix(), |
|
1394 * and must use the same prefix as the one used during compression. |
|
1395 * Prefix is **only used once**. Reference is discarded at end of frame. |
|
1396 * End of frame is reached when ZSTD_DCtx_decompress_generic() returns 0. |
|
1397 * @result : 0, or an error code (which can be tested with ZSTD_isError()). |
|
1398 * Note 1 : Adding any prefix (including NULL) invalidates any previously set prefix or dictionary |
|
1399 * Note 2 : Prefix buffer is referenced. It **must** outlive decompression job. |
|
1400 * Prefix buffer must remain unmodified up to the end of frame, |
|
1401 * reached when ZSTD_DCtx_decompress_generic() returns 0. |
|
1402 * Note 3 : By default, the prefix is treated as raw content (ZSTD_dm_rawContent). |
|
1403 * Use ZSTD_CCtx_refPrefix_advanced() to alter dictMode. |
|
1404 * Note 4 : Referencing a raw content prefix has almost no cpu nor memory cost. |
|
1405 * A fulldict prefix is more costly though. |
|
1406 */ |
|
1407 ZSTDLIB_API size_t ZSTD_DCtx_refPrefix(ZSTD_DCtx* dctx, |
|
1408 const void* prefix, size_t prefixSize); |
|
1409 ZSTDLIB_API size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, |
|
1410 const void* prefix, size_t prefixSize, |
|
1411 ZSTD_dictContentType_e dictContentType); |
|
1412 |
|
1413 |
|
1414 /*! ZSTD_DCtx_setMaxWindowSize() : |
|
1415 * Refuses allocating internal buffers for frames requiring a window size larger than provided limit. |
|
1416 * This is useful to prevent a decoder context from reserving too much memory for itself (potential attack scenario). |
|
1417 * This parameter is only useful in streaming mode, since no internal buffer is allocated in direct mode. |
|
1418 * By default, a decompression context accepts all window sizes <= (1 << ZSTD_WINDOWLOG_MAX) |
|
1419 * @return : 0, or an error code (which can be tested using ZSTD_isError()). |
|
1420 */ |
|
1421 ZSTDLIB_API size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize); |
|
1422 |
|
1423 |
|
1424 /*! ZSTD_DCtx_setFormat() : |
|
1425 * Instruct the decoder context about what kind of data to decode next. |
|
1426 * This instruction is mandatory to decode data without a fully-formed header, |
|
1427 * such ZSTD_f_zstd1_magicless for example. |
|
1428 * @return : 0, or an error code (which can be tested using ZSTD_isError()). |
|
1429 */ |
|
1430 ZSTDLIB_API size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format); |
|
1431 |
|
1432 |
|
1433 /*! ZSTD_getFrameHeader_advanced() : |
|
1434 * same as ZSTD_getFrameHeader(), |
|
1435 * with added capability to select a format (like ZSTD_f_zstd1_magicless) */ |
|
1436 ZSTDLIB_API size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, |
|
1437 const void* src, size_t srcSize, ZSTD_format_e format); |
|
1438 |
|
1439 |
|
1440 /*! ZSTD_decompress_generic() : |
|
1441 * Behave the same as ZSTD_decompressStream. |
|
1442 * Decompression parameters cannot be changed once decompression is started. |
|
1443 * @return : an error code, which can be tested using ZSTD_isError() |
|
1444 * if >0, a hint, nb of expected input bytes for next invocation. |
|
1445 * `0` means : a frame has just been fully decoded and flushed. |
|
1446 */ |
|
1447 ZSTDLIB_API size_t ZSTD_decompress_generic(ZSTD_DCtx* dctx, |
|
1448 ZSTD_outBuffer* output, |
|
1449 ZSTD_inBuffer* input); |
|
1450 |
|
1451 |
|
1452 /*! ZSTD_decompress_generic_simpleArgs() : |
|
1453 * Same as ZSTD_decompress_generic(), |
|
1454 * but using only integral types as arguments. |
|
1455 * Argument list is larger than ZSTD_{in,out}Buffer, |
|
1456 * but can be helpful for binders from dynamic languages |
|
1457 * which have troubles handling structures containing memory pointers. |
|
1458 */ |
|
1459 ZSTDLIB_API size_t ZSTD_decompress_generic_simpleArgs ( |
|
1460 ZSTD_DCtx* dctx, |
|
1461 void* dst, size_t dstCapacity, size_t* dstPos, |
|
1462 const void* src, size_t srcSize, size_t* srcPos); |
|
1463 |
|
1464 |
|
1465 /*! ZSTD_DCtx_reset() : |
|
1466 * Return a DCtx to clean state. |
|
1467 * If a decompression was ongoing, any internal data not yet flushed is cancelled. |
|
1468 * All parameters are back to default values, including sticky ones. |
|
1469 * Dictionary (if any) is dropped. |
|
1470 * Parameters can be modified again after a reset. |
|
1471 */ |
|
1472 ZSTDLIB_API void ZSTD_DCtx_reset(ZSTD_DCtx* dctx); |
|
1473 |
1723 |
1474 |
1724 |
1475 |
1725 |
1476 /* ============================ */ |
1726 /* ============================ */ |
1477 /** Block level API */ |
1727 /** Block level API */ |