added negative compression levels
negative compression level trade compression ratio for more compression speed. They turn off huffman compression of literals, and use row 0 as baseline with a stepSize = -cLevel. added associated test in fuzzer also added : new advanced parameter ZSTD_p_literalCompression
This commit is contained in:
@@ -252,6 +252,7 @@ static int ZSTD_isUpdateAuthorized(ZSTD_cParameter param)
|
|||||||
case ZSTD_p_minMatch:
|
case ZSTD_p_minMatch:
|
||||||
case ZSTD_p_targetLength:
|
case ZSTD_p_targetLength:
|
||||||
case ZSTD_p_compressionStrategy:
|
case ZSTD_p_compressionStrategy:
|
||||||
|
case ZSTD_p_literalCompression:
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case ZSTD_p_format:
|
case ZSTD_p_format:
|
||||||
@@ -305,6 +306,7 @@ size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, unsigned v
|
|||||||
}
|
}
|
||||||
return ZSTD_CCtxParam_setParameter(&cctx->requestedParams, param, value);
|
return ZSTD_CCtxParam_setParameter(&cctx->requestedParams, param, value);
|
||||||
|
|
||||||
|
case ZSTD_p_literalCompression:
|
||||||
case ZSTD_p_contentSizeFlag:
|
case ZSTD_p_contentSizeFlag:
|
||||||
case ZSTD_p_checksumFlag:
|
case ZSTD_p_checksumFlag:
|
||||||
case ZSTD_p_dictIDFlag:
|
case ZSTD_p_dictIDFlag:
|
||||||
@@ -417,6 +419,10 @@ size_t ZSTD_CCtxParam_setParameter(
|
|||||||
}
|
}
|
||||||
return (size_t)CCtxParams->cParams.strategy;
|
return (size_t)CCtxParams->cParams.strategy;
|
||||||
|
|
||||||
|
case ZSTD_p_literalCompression:
|
||||||
|
CCtxParams->disableLiteralCompression = !value;
|
||||||
|
return !!value;
|
||||||
|
|
||||||
case ZSTD_p_contentSizeFlag :
|
case ZSTD_p_contentSizeFlag :
|
||||||
/* Content size written in frame header _when known_ (default:1) */
|
/* Content size written in frame header _when known_ (default:1) */
|
||||||
DEBUGLOG(4, "set content size flag = %u", (value>0));
|
DEBUGLOG(4, "set content size flag = %u", (value>0));
|
||||||
@@ -1376,7 +1382,7 @@ static size_t ZSTD_minGain(size_t srcSize) { return (srcSize >> 6) + 2; }
|
|||||||
|
|
||||||
static size_t ZSTD_compressLiterals (ZSTD_entropyCTables_t const* prevEntropy,
|
static size_t ZSTD_compressLiterals (ZSTD_entropyCTables_t const* prevEntropy,
|
||||||
ZSTD_entropyCTables_t* nextEntropy,
|
ZSTD_entropyCTables_t* nextEntropy,
|
||||||
ZSTD_strategy strategy,
|
ZSTD_strategy strategy, int disableLiteralCompression,
|
||||||
void* dst, size_t dstCapacity,
|
void* dst, size_t dstCapacity,
|
||||||
const void* src, size_t srcSize,
|
const void* src, size_t srcSize,
|
||||||
U32* workspace, const int bmi2)
|
U32* workspace, const int bmi2)
|
||||||
@@ -1393,10 +1399,14 @@ static size_t ZSTD_compressLiterals (ZSTD_entropyCTables_t const* prevEntropy,
|
|||||||
memcpy(nextEntropy->hufCTable, prevEntropy->hufCTable,
|
memcpy(nextEntropy->hufCTable, prevEntropy->hufCTable,
|
||||||
sizeof(prevEntropy->hufCTable));
|
sizeof(prevEntropy->hufCTable));
|
||||||
|
|
||||||
|
if (disableLiteralCompression)
|
||||||
|
return ZSTD_noCompressLiterals(dst, dstCapacity, src, srcSize);
|
||||||
|
|
||||||
/* small ? don't even attempt compression (speed opt) */
|
/* small ? don't even attempt compression (speed opt) */
|
||||||
# define LITERAL_NOENTROPY 63
|
# define LITERAL_NOENTROPY 63
|
||||||
{ size_t const minLitSize = prevEntropy->hufCTable_repeatMode == HUF_repeat_valid ? 6 : LITERAL_NOENTROPY;
|
{ size_t const minLitSize = (prevEntropy->hufCTable_repeatMode == HUF_repeat_valid) ? 6 : LITERAL_NOENTROPY;
|
||||||
if (srcSize <= minLitSize) return ZSTD_noCompressLiterals(dst, dstCapacity, src, srcSize);
|
if (srcSize <= minLitSize)
|
||||||
|
return ZSTD_noCompressLiterals(dst, dstCapacity, src, srcSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dstCapacity < lhSize+1) return ERROR(dstSize_tooSmall); /* not enough space for compression */
|
if (dstCapacity < lhSize+1) return ERROR(dstSize_tooSmall); /* not enough space for compression */
|
||||||
@@ -1604,11 +1614,11 @@ size_t ZSTD_encodeSequences(
|
|||||||
MEM_STATIC size_t ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
|
MEM_STATIC size_t ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
|
||||||
ZSTD_entropyCTables_t const* prevEntropy,
|
ZSTD_entropyCTables_t const* prevEntropy,
|
||||||
ZSTD_entropyCTables_t* nextEntropy,
|
ZSTD_entropyCTables_t* nextEntropy,
|
||||||
ZSTD_compressionParameters const* cParams,
|
ZSTD_CCtx_params const* cctxParams,
|
||||||
void* dst, size_t dstCapacity, U32* workspace,
|
void* dst, size_t dstCapacity, U32* workspace,
|
||||||
const int bmi2)
|
const int bmi2)
|
||||||
{
|
{
|
||||||
const int longOffsets = cParams->windowLog > STREAM_ACCUMULATOR_MIN;
|
const int longOffsets = cctxParams->cParams.windowLog > STREAM_ACCUMULATOR_MIN;
|
||||||
U32 count[MaxSeq+1];
|
U32 count[MaxSeq+1];
|
||||||
FSE_CTable* CTable_LitLength = nextEntropy->litlengthCTable;
|
FSE_CTable* CTable_LitLength = nextEntropy->litlengthCTable;
|
||||||
FSE_CTable* CTable_OffsetBits = nextEntropy->offcodeCTable;
|
FSE_CTable* CTable_OffsetBits = nextEntropy->offcodeCTable;
|
||||||
@@ -1629,8 +1639,11 @@ MEM_STATIC size_t ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
|
|||||||
/* Compress literals */
|
/* Compress literals */
|
||||||
{ const BYTE* const literals = seqStorePtr->litStart;
|
{ const BYTE* const literals = seqStorePtr->litStart;
|
||||||
size_t const litSize = seqStorePtr->lit - literals;
|
size_t const litSize = seqStorePtr->lit - literals;
|
||||||
size_t const cSize = ZSTD_compressLiterals(prevEntropy, nextEntropy,
|
size_t const cSize = ZSTD_compressLiterals(
|
||||||
cParams->strategy, op, dstCapacity, literals, litSize,
|
prevEntropy, nextEntropy,
|
||||||
|
cctxParams->cParams.strategy, cctxParams->disableLiteralCompression,
|
||||||
|
op, dstCapacity,
|
||||||
|
literals, litSize,
|
||||||
workspace, bmi2);
|
workspace, bmi2);
|
||||||
if (ZSTD_isError(cSize))
|
if (ZSTD_isError(cSize))
|
||||||
return cSize;
|
return cSize;
|
||||||
@@ -1722,28 +1735,24 @@ MEM_STATIC size_t ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
|
|||||||
MEM_STATIC size_t ZSTD_compressSequences(seqStore_t* seqStorePtr,
|
MEM_STATIC size_t ZSTD_compressSequences(seqStore_t* seqStorePtr,
|
||||||
ZSTD_entropyCTables_t const* prevEntropy,
|
ZSTD_entropyCTables_t const* prevEntropy,
|
||||||
ZSTD_entropyCTables_t* nextEntropy,
|
ZSTD_entropyCTables_t* nextEntropy,
|
||||||
ZSTD_compressionParameters const* cParams,
|
ZSTD_CCtx_params const* cctxParams,
|
||||||
void* dst, size_t dstCapacity,
|
void* dst, size_t dstCapacity,
|
||||||
size_t srcSize, U32* workspace, int bmi2)
|
size_t srcSize, U32* workspace, int bmi2)
|
||||||
{
|
{
|
||||||
size_t const cSize = ZSTD_compressSequences_internal(
|
size_t const cSize = ZSTD_compressSequences_internal(
|
||||||
seqStorePtr, prevEntropy, nextEntropy, cParams, dst, dstCapacity,
|
seqStorePtr, prevEntropy, nextEntropy, cctxParams, dst, dstCapacity,
|
||||||
workspace, bmi2);
|
workspace, bmi2);
|
||||||
/* If the srcSize <= dstCapacity, then there is enough space to write a
|
/* When srcSize <= dstCapacity, there is enough space to write a raw uncompressed block.
|
||||||
* raw uncompressed block. Since we ran out of space, the block must not
|
* Since we ran out of space, block must be not compressible, so fall back to raw uncompressed block.
|
||||||
* be compressible, so fall back to a raw uncompressed block.
|
|
||||||
*/
|
*/
|
||||||
int const uncompressibleError = (cSize == ERROR(dstSize_tooSmall)) && (srcSize <= dstCapacity);
|
if ((cSize == ERROR(dstSize_tooSmall)) & (srcSize <= dstCapacity))
|
||||||
if (ZSTD_isError(cSize) && !uncompressibleError)
|
return 0; /* block not compressed */
|
||||||
return cSize;
|
if (ZSTD_isError(cSize)) return cSize;
|
||||||
|
|
||||||
/* Check compressibility */
|
/* Check compressibility */
|
||||||
{ size_t const minGain = ZSTD_minGain(srcSize); /* note : fixed formula, maybe should depend on compression level, or strategy */
|
{ size_t const maxCSize = srcSize - ZSTD_minGain(srcSize); /* note : fixed formula, maybe should depend on compression level, or strategy */
|
||||||
size_t const maxCSize = srcSize - minGain;
|
if (cSize >= maxCSize) return 0; /* block not compressed */
|
||||||
if (cSize >= maxCSize || uncompressibleError) {
|
}
|
||||||
return 0; /* block not compressed */
|
|
||||||
} }
|
|
||||||
assert(!ZSTD_isError(cSize));
|
|
||||||
|
|
||||||
/* We check that dictionaries have offset codes available for the first
|
/* We check that dictionaries have offset codes available for the first
|
||||||
* block. After the first block, the offcode table might not have large
|
* block. After the first block, the offcode table might not have large
|
||||||
@@ -1813,7 +1822,10 @@ static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc,
|
|||||||
/* select and store sequences */
|
/* select and store sequences */
|
||||||
{ U32 const extDict = ZSTD_window_hasExtDict(ms->window);
|
{ U32 const extDict = ZSTD_window_hasExtDict(ms->window);
|
||||||
size_t lastLLSize;
|
size_t lastLLSize;
|
||||||
{ int i; for (i = 0; i < ZSTD_REP_NUM; ++i) zc->blockState.nextCBlock->rep[i] = zc->blockState.prevCBlock->rep[i]; }
|
{ int i;
|
||||||
|
for (i = 0; i < ZSTD_REP_NUM; ++i)
|
||||||
|
zc->blockState.nextCBlock->rep[i] = zc->blockState.prevCBlock->rep[i];
|
||||||
|
}
|
||||||
if (zc->appliedParams.ldmParams.enableLdm) {
|
if (zc->appliedParams.ldmParams.enableLdm) {
|
||||||
size_t const nbSeq =
|
size_t const nbSeq =
|
||||||
ZSTD_ldm_generateSequences(&zc->ldmState, zc->ldmSequences,
|
ZSTD_ldm_generateSequences(&zc->ldmState, zc->ldmSequences,
|
||||||
@@ -1834,7 +1846,11 @@ static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc,
|
|||||||
} }
|
} }
|
||||||
|
|
||||||
/* encode sequences and literals */
|
/* encode sequences and literals */
|
||||||
{ size_t const cSize = ZSTD_compressSequences(&zc->seqStore, &zc->blockState.prevCBlock->entropy, &zc->blockState.nextCBlock->entropy, &zc->appliedParams.cParams, dst, dstCapacity, srcSize, zc->entropyWorkspace, zc->bmi2);
|
{ size_t const cSize = ZSTD_compressSequences(&zc->seqStore,
|
||||||
|
&zc->blockState.prevCBlock->entropy, &zc->blockState.nextCBlock->entropy,
|
||||||
|
&zc->appliedParams,
|
||||||
|
dst, dstCapacity,
|
||||||
|
srcSize, zc->entropyWorkspace, zc->bmi2);
|
||||||
if (ZSTD_isError(cSize) || cSize == 0) return cSize;
|
if (ZSTD_isError(cSize) || cSize == 0) return cSize;
|
||||||
/* confirm repcodes and entropy tables */
|
/* confirm repcodes and entropy tables */
|
||||||
{ ZSTD_compressedBlockState_t* const tmp = zc->blockState.prevCBlock;
|
{ ZSTD_compressedBlockState_t* const tmp = zc->blockState.prevCBlock;
|
||||||
@@ -2422,20 +2438,20 @@ size_t ZSTD_compress_advanced_internal(
|
|||||||
return ZSTD_compressEnd(cctx, dst, dstCapacity, src, srcSize);
|
return ZSTD_compressEnd(cctx, dst, dstCapacity, src, srcSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t ZSTD_compress_usingDict(ZSTD_CCtx* ctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize,
|
size_t ZSTD_compress_usingDict(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize,
|
||||||
const void* dict, size_t dictSize, int compressionLevel)
|
const void* dict, size_t dictSize, int compressionLevel)
|
||||||
{
|
{
|
||||||
ZSTD_parameters params = ZSTD_getParams(compressionLevel, srcSize ? srcSize : 1, dict ? dictSize : 0);
|
ZSTD_parameters const params = ZSTD_getParams(compressionLevel, srcSize ? srcSize : 1, dict ? dictSize : 0);
|
||||||
params.fParams.contentSizeFlag = 1;
|
ZSTD_CCtx_params cctxParams = ZSTD_assignParamsToCCtxParams(cctx->requestedParams, params);
|
||||||
DEBUGLOG(4, "ZSTD_compress_usingDict (level=%i, srcSize=%u, dictSize=%u)",
|
assert(params.fParams.contentSizeFlag == 1);
|
||||||
compressionLevel, (U32)srcSize, (U32)dictSize);
|
ZSTD_CCtxParam_setParameter(&cctxParams, ZSTD_p_literalCompression, compressionLevel>=0);
|
||||||
return ZSTD_compress_internal(ctx, dst, dstCapacity, src, srcSize, dict, dictSize, params);
|
return ZSTD_compress_advanced_internal(cctx, dst, dstCapacity, src, srcSize, dict, dictSize, cctxParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t ZSTD_compressCCtx (ZSTD_CCtx* ctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize, int compressionLevel)
|
size_t ZSTD_compressCCtx (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize, int compressionLevel)
|
||||||
{
|
{
|
||||||
DEBUGLOG(4, "ZSTD_compressCCtx (srcSize=%u)", (U32)srcSize);
|
DEBUGLOG(4, "ZSTD_compressCCtx (srcSize=%u)", (U32)srcSize);
|
||||||
return ZSTD_compress_usingDict(ctx, dst, dstCapacity, src, srcSize, NULL, 0, compressionLevel);
|
return ZSTD_compress_usingDict(cctx, dst, dstCapacity, src, srcSize, NULL, 0, compressionLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t ZSTD_compress(void* dst, size_t dstCapacity, const void* src, size_t srcSize, int compressionLevel)
|
size_t ZSTD_compress(void* dst, size_t dstCapacity, const void* src, size_t srcSize, int compressionLevel)
|
||||||
@@ -3178,11 +3194,11 @@ int ZSTD_maxCLevel(void) { return ZSTD_MAX_CLEVEL; }
|
|||||||
static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEVEL+1] = {
|
static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEVEL+1] = {
|
||||||
{ /* "default" - guarantees a monotonically increasing memory budget */
|
{ /* "default" - guarantees a monotonically increasing memory budget */
|
||||||
/* W, C, H, S, L, TL, strat */
|
/* W, C, H, S, L, TL, strat */
|
||||||
{ 18, 12, 12, 1, 7, 16, ZSTD_fast }, /* level 0 - never used */
|
{ 19, 12, 13, 1, 6, 1, ZSTD_fast }, /* base for negative levels */
|
||||||
{ 19, 13, 14, 1, 7, 16, ZSTD_fast }, /* level 1 */
|
{ 19, 13, 14, 1, 7, 1, ZSTD_fast }, /* level 1 */
|
||||||
{ 19, 15, 16, 1, 6, 16, ZSTD_fast }, /* level 2 */
|
{ 19, 15, 16, 1, 6, 1, ZSTD_fast }, /* level 2 */
|
||||||
{ 20, 16, 17, 1, 5, 16, ZSTD_dfast }, /* level 3 */
|
{ 20, 16, 17, 1, 5, 8, ZSTD_dfast }, /* level 3 */
|
||||||
{ 20, 17, 18, 1, 5, 16, ZSTD_dfast }, /* level 4 */
|
{ 20, 17, 18, 1, 5, 8, ZSTD_dfast }, /* level 4 */
|
||||||
{ 20, 17, 18, 2, 5, 16, ZSTD_greedy }, /* level 5 */
|
{ 20, 17, 18, 2, 5, 16, ZSTD_greedy }, /* level 5 */
|
||||||
{ 21, 17, 19, 2, 5, 16, ZSTD_lazy }, /* level 6 */
|
{ 21, 17, 19, 2, 5, 16, ZSTD_lazy }, /* level 6 */
|
||||||
{ 21, 18, 19, 3, 5, 16, ZSTD_lazy }, /* level 7 */
|
{ 21, 18, 19, 3, 5, 16, ZSTD_lazy }, /* level 7 */
|
||||||
@@ -3191,9 +3207,9 @@ static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEV
|
|||||||
{ 21, 19, 21, 4, 5, 16, ZSTD_lazy2 }, /* level 10 */
|
{ 21, 19, 21, 4, 5, 16, ZSTD_lazy2 }, /* level 10 */
|
||||||
{ 22, 20, 22, 4, 5, 16, ZSTD_lazy2 }, /* level 11 */
|
{ 22, 20, 22, 4, 5, 16, ZSTD_lazy2 }, /* level 11 */
|
||||||
{ 22, 20, 22, 5, 5, 16, ZSTD_lazy2 }, /* level 12 */
|
{ 22, 20, 22, 5, 5, 16, ZSTD_lazy2 }, /* level 12 */
|
||||||
{ 22, 21, 22, 4, 5, 16, ZSTD_btlazy2 }, /* level 13 */
|
{ 22, 21, 22, 4, 5, 32, ZSTD_btlazy2 }, /* level 13 */
|
||||||
{ 22, 21, 22, 5, 5, 16, ZSTD_btlazy2 }, /* level 14 */
|
{ 22, 21, 22, 5, 5, 32, ZSTD_btlazy2 }, /* level 14 */
|
||||||
{ 22, 22, 22, 6, 5, 16, ZSTD_btlazy2 }, /* level 15 */
|
{ 22, 22, 22, 6, 5, 32, ZSTD_btlazy2 }, /* level 15 */
|
||||||
{ 22, 21, 22, 4, 5, 48, ZSTD_btopt }, /* level 16 */
|
{ 22, 21, 22, 4, 5, 48, ZSTD_btopt }, /* level 16 */
|
||||||
{ 23, 22, 22, 4, 4, 48, ZSTD_btopt }, /* level 17 */
|
{ 23, 22, 22, 4, 4, 48, ZSTD_btopt }, /* level 17 */
|
||||||
{ 23, 22, 22, 5, 3, 64, ZSTD_btopt }, /* level 18 */
|
{ 23, 22, 22, 5, 3, 64, ZSTD_btopt }, /* level 18 */
|
||||||
@@ -3204,8 +3220,8 @@ static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEV
|
|||||||
},
|
},
|
||||||
{ /* for srcSize <= 256 KB */
|
{ /* for srcSize <= 256 KB */
|
||||||
/* W, C, H, S, L, T, strat */
|
/* W, C, H, S, L, T, strat */
|
||||||
{ 0, 0, 0, 0, 0, 0, ZSTD_fast }, /* level 0 - not used */
|
{ 18, 12, 13, 1, 5, 1, ZSTD_fast }, /* base for negative levels */
|
||||||
{ 18, 13, 14, 1, 6, 8, ZSTD_fast }, /* level 1 */
|
{ 18, 13, 14, 1, 6, 1, ZSTD_fast }, /* level 1 */
|
||||||
{ 18, 14, 13, 1, 5, 8, ZSTD_dfast }, /* level 2 */
|
{ 18, 14, 13, 1, 5, 8, ZSTD_dfast }, /* level 2 */
|
||||||
{ 18, 16, 15, 1, 5, 8, ZSTD_dfast }, /* level 3 */
|
{ 18, 16, 15, 1, 5, 8, ZSTD_dfast }, /* level 3 */
|
||||||
{ 18, 15, 17, 1, 5, 8, ZSTD_greedy }, /* level 4.*/
|
{ 18, 15, 17, 1, 5, 8, ZSTD_greedy }, /* level 4.*/
|
||||||
@@ -3230,9 +3246,9 @@ static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEV
|
|||||||
},
|
},
|
||||||
{ /* for srcSize <= 128 KB */
|
{ /* for srcSize <= 128 KB */
|
||||||
/* W, C, H, S, L, T, strat */
|
/* W, C, H, S, L, T, strat */
|
||||||
{ 17, 12, 12, 1, 7, 8, ZSTD_fast }, /* level 0 - not used */
|
{ 17, 12, 12, 1, 5, 1, ZSTD_fast }, /* level 0 - not used */
|
||||||
{ 17, 12, 13, 1, 6, 8, ZSTD_fast }, /* level 1 */
|
{ 17, 12, 13, 1, 6, 1, ZSTD_fast }, /* level 1 */
|
||||||
{ 17, 13, 16, 1, 5, 8, ZSTD_fast }, /* level 2 */
|
{ 17, 13, 16, 1, 5, 1, ZSTD_fast }, /* level 2 */
|
||||||
{ 17, 16, 16, 2, 5, 8, ZSTD_dfast }, /* level 3 */
|
{ 17, 16, 16, 2, 5, 8, ZSTD_dfast }, /* level 3 */
|
||||||
{ 17, 13, 15, 3, 4, 8, ZSTD_greedy }, /* level 4 */
|
{ 17, 13, 15, 3, 4, 8, ZSTD_greedy }, /* level 4 */
|
||||||
{ 17, 15, 17, 4, 4, 8, ZSTD_greedy }, /* level 5 */
|
{ 17, 15, 17, 4, 4, 8, ZSTD_greedy }, /* level 5 */
|
||||||
@@ -3256,9 +3272,9 @@ static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEV
|
|||||||
},
|
},
|
||||||
{ /* for srcSize <= 16 KB */
|
{ /* for srcSize <= 16 KB */
|
||||||
/* W, C, H, S, L, T, strat */
|
/* W, C, H, S, L, T, strat */
|
||||||
{ 14, 12, 12, 1, 7, 6, ZSTD_fast }, /* level 0 - not used */
|
{ 14, 12, 13, 1, 5, 1, ZSTD_fast }, /* base for negative levels */
|
||||||
{ 14, 14, 14, 1, 6, 6, ZSTD_fast }, /* level 1 */
|
{ 14, 14, 14, 1, 6, 1, ZSTD_fast }, /* level 1 */
|
||||||
{ 14, 14, 14, 1, 4, 6, ZSTD_fast }, /* level 2 */
|
{ 14, 14, 14, 1, 4, 1, ZSTD_fast }, /* level 2 */
|
||||||
{ 14, 14, 14, 1, 4, 6, ZSTD_dfast }, /* level 3.*/
|
{ 14, 14, 14, 1, 4, 6, ZSTD_dfast }, /* level 3.*/
|
||||||
{ 14, 14, 14, 4, 4, 6, ZSTD_greedy }, /* level 4.*/
|
{ 14, 14, 14, 4, 4, 6, ZSTD_greedy }, /* level 4.*/
|
||||||
{ 14, 14, 14, 3, 4, 6, ZSTD_lazy }, /* level 5.*/
|
{ 14, 14, 14, 3, 4, 6, ZSTD_lazy }, /* level 5.*/
|
||||||
@@ -3290,11 +3306,11 @@ ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long l
|
|||||||
size_t const addedSize = srcSizeHint ? 0 : 500;
|
size_t const addedSize = srcSizeHint ? 0 : 500;
|
||||||
U64 const rSize = srcSizeHint+dictSize ? srcSizeHint+dictSize+addedSize : (U64)-1;
|
U64 const rSize = srcSizeHint+dictSize ? srcSizeHint+dictSize+addedSize : (U64)-1;
|
||||||
U32 const tableID = (rSize <= 256 KB) + (rSize <= 128 KB) + (rSize <= 16 KB); /* intentional underflow for srcSizeHint == 0 */
|
U32 const tableID = (rSize <= 256 KB) + (rSize <= 128 KB) + (rSize <= 16 KB); /* intentional underflow for srcSizeHint == 0 */
|
||||||
DEBUGLOG(4, "ZSTD_getCParams: cLevel=%i, srcSize=%u, dictSize=%u => table %u",
|
if (compressionLevel == 0) compressionLevel = ZSTD_CLEVEL_DEFAULT; /* 0 == default */
|
||||||
compressionLevel, (U32)srcSizeHint, (U32)dictSize, tableID);
|
if (compressionLevel < 0) compressionLevel = 0; /* entry 0 is baseline for fast mode */
|
||||||
if (compressionLevel <= 0) compressionLevel = ZSTD_CLEVEL_DEFAULT; /* 0 == default; no negative compressionLevel yet */
|
|
||||||
if (compressionLevel > ZSTD_MAX_CLEVEL) compressionLevel = ZSTD_MAX_CLEVEL;
|
if (compressionLevel > ZSTD_MAX_CLEVEL) compressionLevel = ZSTD_MAX_CLEVEL;
|
||||||
{ ZSTD_compressionParameters const cp = ZSTD_defaultCParameters[tableID][compressionLevel];
|
{ ZSTD_compressionParameters cp = ZSTD_defaultCParameters[tableID][compressionLevel];
|
||||||
|
if (compressionLevel < 0) cp.targetLength = (unsigned)(-compressionLevel); /* acceleration factor */
|
||||||
return ZSTD_adjustCParams_internal(cp, srcSizeHint, dictSize); }
|
return ZSTD_adjustCParams_internal(cp, srcSizeHint, dictSize); }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -158,6 +158,7 @@ struct ZSTD_CCtx_params_s {
|
|||||||
ZSTD_frameParameters fParams;
|
ZSTD_frameParameters fParams;
|
||||||
|
|
||||||
int compressionLevel;
|
int compressionLevel;
|
||||||
|
int disableLiteralCompression;
|
||||||
int forceWindow; /* force back-references to respect limit of
|
int forceWindow; /* force back-references to respect limit of
|
||||||
* 1<<wLog, even for dictionary */
|
* 1<<wLog, even for dictionary */
|
||||||
|
|
||||||
@@ -395,10 +396,12 @@ MEM_STATIC size_t ZSTD_count(const BYTE* pIn, const BYTE* pMatch, const BYTE* co
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** ZSTD_count_2segments() :
|
/** ZSTD_count_2segments() :
|
||||||
* can count match length with `ip` & `match` in 2 different segments.
|
* can count match length with `ip` & `match` in 2 different segments.
|
||||||
* convention : on reaching mEnd, match count continue starting from iStart
|
* convention : on reaching mEnd, match count continue starting from iStart
|
||||||
*/
|
*/
|
||||||
MEM_STATIC size_t ZSTD_count_2segments(const BYTE* ip, const BYTE* match, const BYTE* iEnd, const BYTE* mEnd, const BYTE* iStart)
|
MEM_STATIC size_t
|
||||||
|
ZSTD_count_2segments(const BYTE* ip, const BYTE* match,
|
||||||
|
const BYTE* iEnd, const BYTE* mEnd, const BYTE* iStart)
|
||||||
{
|
{
|
||||||
const BYTE* const vEnd = MIN( ip + (mEnd - match), iEnd);
|
const BYTE* const vEnd = MIN( ip + (mEnd - match), iEnd);
|
||||||
size_t const matchLength = ZSTD_count(ip, match, vEnd);
|
size_t const matchLength = ZSTD_count(ip, match, vEnd);
|
||||||
@@ -408,8 +411,8 @@ MEM_STATIC size_t ZSTD_count_2segments(const BYTE* ip, const BYTE* match, const
|
|||||||
|
|
||||||
|
|
||||||
/*-*************************************
|
/*-*************************************
|
||||||
* Hashes
|
* Hashes
|
||||||
***************************************/
|
***************************************/
|
||||||
static const U32 prime3bytes = 506832829U;
|
static const U32 prime3bytes = 506832829U;
|
||||||
static U32 ZSTD_hash3(U32 u, U32 h) { return ((u << (32-24)) * prime3bytes) >> (32-h) ; }
|
static U32 ZSTD_hash3(U32 u, U32 h) { return ((u << (32-24)) * prime3bytes) >> (32-h) ; }
|
||||||
MEM_STATIC size_t ZSTD_hash3Ptr(const void* ptr, U32 h) { return ZSTD_hash3(MEM_readLE32(ptr), h); } /* only in zstd_opt.h */
|
MEM_STATIC size_t ZSTD_hash3Ptr(const void* ptr, U32 h) { return ZSTD_hash3(MEM_readLE32(ptr), h); } /* only in zstd_opt.h */
|
||||||
|
|||||||
+20
-17
@@ -42,7 +42,7 @@ FORCE_INLINE_TEMPLATE
|
|||||||
size_t ZSTD_compressBlock_fast_generic(
|
size_t ZSTD_compressBlock_fast_generic(
|
||||||
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
||||||
void const* src, size_t srcSize,
|
void const* src, size_t srcSize,
|
||||||
U32 const hlog, U32 const mls)
|
U32 const hlog, U32 const stepSize, U32 const mls)
|
||||||
{
|
{
|
||||||
U32* const hashTable = ms->hashTable;
|
U32* const hashTable = ms->hashTable;
|
||||||
const BYTE* const base = ms->window.base;
|
const BYTE* const base = ms->window.base;
|
||||||
@@ -77,19 +77,19 @@ size_t ZSTD_compressBlock_fast_generic(
|
|||||||
ip++;
|
ip++;
|
||||||
ZSTD_storeSeq(seqStore, ip-anchor, anchor, 0, mLength-MINMATCH);
|
ZSTD_storeSeq(seqStore, ip-anchor, anchor, 0, mLength-MINMATCH);
|
||||||
} else {
|
} else {
|
||||||
U32 offset;
|
if ( (matchIndex <= lowestIndex)
|
||||||
if ( (matchIndex <= lowestIndex) || (MEM_read32(match) != MEM_read32(ip)) ) {
|
|| (MEM_read32(match) != MEM_read32(ip)) ) {
|
||||||
ip += ((ip-anchor) >> kSearchStrength) + 1;
|
assert(stepSize >= 1);
|
||||||
|
ip += ((ip-anchor) >> kSearchStrength) + stepSize;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
mLength = ZSTD_count(ip+4, match+4, iend) + 4;
|
mLength = ZSTD_count(ip+4, match+4, iend) + 4;
|
||||||
offset = (U32)(ip-match);
|
{ U32 const offset = (U32)(ip-match);
|
||||||
while (((ip>anchor) & (match>lowest)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */
|
while (((ip>anchor) & (match>lowest)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */
|
||||||
offset_2 = offset_1;
|
offset_2 = offset_1;
|
||||||
offset_1 = offset;
|
offset_1 = offset;
|
||||||
|
|
||||||
ZSTD_storeSeq(seqStore, ip-anchor, anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH);
|
ZSTD_storeSeq(seqStore, ip-anchor, anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH);
|
||||||
}
|
} }
|
||||||
|
|
||||||
/* match found */
|
/* match found */
|
||||||
ip += mLength;
|
ip += mLength;
|
||||||
@@ -128,17 +128,18 @@ size_t ZSTD_compressBlock_fast(
|
|||||||
{
|
{
|
||||||
U32 const hlog = cParams->hashLog;
|
U32 const hlog = cParams->hashLog;
|
||||||
U32 const mls = cParams->searchLength;
|
U32 const mls = cParams->searchLength;
|
||||||
|
U32 const stepSize = cParams->targetLength;
|
||||||
switch(mls)
|
switch(mls)
|
||||||
{
|
{
|
||||||
default: /* includes case 3 */
|
default: /* includes case 3 */
|
||||||
case 4 :
|
case 4 :
|
||||||
return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, hlog, 4);
|
return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 4);
|
||||||
case 5 :
|
case 5 :
|
||||||
return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, hlog, 5);
|
return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 5);
|
||||||
case 6 :
|
case 6 :
|
||||||
return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, hlog, 6);
|
return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 6);
|
||||||
case 7 :
|
case 7 :
|
||||||
return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, hlog, 7);
|
return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 7);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,7 +147,7 @@ size_t ZSTD_compressBlock_fast(
|
|||||||
static size_t ZSTD_compressBlock_fast_extDict_generic(
|
static size_t ZSTD_compressBlock_fast_extDict_generic(
|
||||||
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
|
||||||
void const* src, size_t srcSize,
|
void const* src, size_t srcSize,
|
||||||
U32 const hlog, U32 const mls)
|
U32 const hlog, U32 const stepSize, U32 const mls)
|
||||||
{
|
{
|
||||||
U32* hashTable = ms->hashTable;
|
U32* hashTable = ms->hashTable;
|
||||||
const BYTE* const base = ms->window.base;
|
const BYTE* const base = ms->window.base;
|
||||||
@@ -185,7 +186,8 @@ static size_t ZSTD_compressBlock_fast_extDict_generic(
|
|||||||
} else {
|
} else {
|
||||||
if ( (matchIndex < lowestIndex) ||
|
if ( (matchIndex < lowestIndex) ||
|
||||||
(MEM_read32(match) != MEM_read32(ip)) ) {
|
(MEM_read32(match) != MEM_read32(ip)) ) {
|
||||||
ip += ((ip-anchor) >> kSearchStrength) + 1;
|
assert(stepSize >= 1);
|
||||||
|
ip += ((ip-anchor) >> kSearchStrength) + stepSize;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
{ const BYTE* matchEnd = matchIndex < dictLimit ? dictEnd : iend;
|
{ const BYTE* matchEnd = matchIndex < dictLimit ? dictEnd : iend;
|
||||||
@@ -241,16 +243,17 @@ size_t ZSTD_compressBlock_fast_extDict(
|
|||||||
{
|
{
|
||||||
U32 const hlog = cParams->hashLog;
|
U32 const hlog = cParams->hashLog;
|
||||||
U32 const mls = cParams->searchLength;
|
U32 const mls = cParams->searchLength;
|
||||||
|
U32 const stepSize = cParams->targetLength;
|
||||||
switch(mls)
|
switch(mls)
|
||||||
{
|
{
|
||||||
default: /* includes case 3 */
|
default: /* includes case 3 */
|
||||||
case 4 :
|
case 4 :
|
||||||
return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, hlog, 4);
|
return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 4);
|
||||||
case 5 :
|
case 5 :
|
||||||
return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, hlog, 5);
|
return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 5);
|
||||||
case 6 :
|
case 6 :
|
||||||
return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, hlog, 6);
|
return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 6);
|
||||||
case 7 :
|
case 7 :
|
||||||
return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, hlog, 7);
|
return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 7);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+22
-24
@@ -390,7 +390,7 @@ ZSTDLIB_API size_t ZSTD_DStreamOutSize(void); /*!< recommended size for output
|
|||||||
#define ZSTD_SEARCHLOG_MIN 1
|
#define ZSTD_SEARCHLOG_MIN 1
|
||||||
#define ZSTD_SEARCHLENGTH_MAX 7 /* only for ZSTD_fast, other strategies are limited to 6 */
|
#define ZSTD_SEARCHLENGTH_MAX 7 /* only for ZSTD_fast, other strategies are limited to 6 */
|
||||||
#define ZSTD_SEARCHLENGTH_MIN 3 /* only for ZSTD_btopt, other strategies are limited to 4 */
|
#define ZSTD_SEARCHLENGTH_MIN 3 /* only for ZSTD_btopt, other strategies are limited to 4 */
|
||||||
#define ZSTD_TARGETLENGTH_MIN 4 /* only useful for btopt */
|
#define ZSTD_TARGETLENGTH_MIN 1 /* only useful for btopt */
|
||||||
#define ZSTD_TARGETLENGTH_MAX 999 /* only useful for btopt */
|
#define ZSTD_TARGETLENGTH_MAX 999 /* only useful for btopt */
|
||||||
#define ZSTD_LDM_MINMATCH_MIN 4
|
#define ZSTD_LDM_MINMATCH_MIN 4
|
||||||
#define ZSTD_LDM_MINMATCH_MAX 4096
|
#define ZSTD_LDM_MINMATCH_MAX 4096
|
||||||
@@ -1001,15 +1001,17 @@ typedef enum {
|
|||||||
* (note : a strong exception to this rule is when first invocation sets ZSTD_e_end : it becomes a blocking call).
|
* (note : a strong exception to this rule is when first invocation sets ZSTD_e_end : it becomes a blocking call).
|
||||||
* More workers improve speed, but also increase memory usage.
|
* More workers improve speed, but also increase memory usage.
|
||||||
* Default value is `0`, aka "single-threaded mode" : no worker is spawned, compression is performed inside Caller's thread, all invocations are blocking */
|
* Default value is `0`, aka "single-threaded mode" : no worker is spawned, compression is performed inside Caller's thread, all invocations are blocking */
|
||||||
ZSTD_p_jobSize, /* Size of a compression job. This value is only enforced in streaming (non-blocking) mode.
|
ZSTD_p_jobSize, /* Size of a compression job. This value is enforced only in non-blocking mode.
|
||||||
* Each compression job is completed in parallel, so indirectly controls the nb of active threads.
|
* Each compression job is completed in parallel, so this value indirectly controls the nb of active threads.
|
||||||
* 0 means default, which is dynamically determined based on compression parameters.
|
* 0 means default, which is dynamically determined based on compression parameters.
|
||||||
* Job size must be a minimum of overlapSize, or 1 KB, whichever is largest
|
* Job size must be a minimum of overlapSize, or 1 MB, whichever is largest.
|
||||||
* The minimum size is automatically and transparently enforced */
|
* The minimum size is automatically and transparently enforced */
|
||||||
ZSTD_p_overlapSizeLog, /* Size of previous input reloaded at the beginning of each job.
|
ZSTD_p_overlapSizeLog, /* Size of previous input reloaded at the beginning of each job.
|
||||||
* 0 => no overlap, 6(default) => use 1/8th of windowSize, >=9 => use full windowSize */
|
* 0 => no overlap, 6(default) => use 1/8th of windowSize, >=9 => use full windowSize */
|
||||||
|
|
||||||
/* advanced parameters - may not remain available after API update */
|
/* advanced parameters - may not remain available after API update */
|
||||||
|
ZSTD_p_literalCompression=1000, /* control huffman compression of literals (enabled) by default.
|
||||||
|
* disabling it improves speed and decreases compression ratio by a large amount. */
|
||||||
ZSTD_p_forceMaxWindow=1100, /* Force back-reference distances to remain < windowSize,
|
ZSTD_p_forceMaxWindow=1100, /* Force back-reference distances to remain < windowSize,
|
||||||
* even when referencing into Dictionary content (default:0) */
|
* even when referencing into Dictionary content (default:0) */
|
||||||
ZSTD_p_enableLongDistanceMatching=1200, /* Enable long distance matching.
|
ZSTD_p_enableLongDistanceMatching=1200, /* Enable long distance matching.
|
||||||
@@ -1070,23 +1072,21 @@ ZSTDLIB_API size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param
|
|||||||
ZSTDLIB_API size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize);
|
ZSTDLIB_API size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize);
|
||||||
|
|
||||||
/*! ZSTD_CCtx_loadDictionary() :
|
/*! ZSTD_CCtx_loadDictionary() :
|
||||||
* Create an internal CDict from dict buffer.
|
* Create an internal CDict from `dict` buffer.
|
||||||
* Decompression will have to use same buffer.
|
* Decompression will have to use same dictionary.
|
||||||
* @result : 0, or an error code (which can be tested with ZSTD_isError()).
|
* @result : 0, or an error code (which can be tested with ZSTD_isError()).
|
||||||
* Special : Adding a NULL (or 0-size) dictionary invalidates any previous dictionary,
|
* Special: Adding a NULL (or 0-size) dictionary invalidates previous dictionary,
|
||||||
* meaning "return to no-dictionary mode".
|
* meaning "return to no-dictionary mode".
|
||||||
* Note 1 : `dict` content will be copied internally. Use
|
* Note 1 : Dictionary will be used for all future compression jobs.
|
||||||
* ZSTD_CCtx_loadDictionary_byReference() to reference dictionary
|
* To return to "no-dictionary" situation, load a NULL dictionary
|
||||||
* content instead. The dictionary buffer must then outlive its
|
|
||||||
* users.
|
|
||||||
* Note 2 : Loading a dictionary involves building tables, which are dependent on compression parameters.
|
* Note 2 : Loading a dictionary involves building tables, which are dependent on compression parameters.
|
||||||
* For this reason, compression parameters cannot be changed anymore after loading a dictionary.
|
* For this reason, compression parameters cannot be changed anymore after loading a dictionary.
|
||||||
* It's also a CPU-heavy operation, with non-negligible impact on latency.
|
* It's also a CPU consuming operation, with non-negligible impact on latency.
|
||||||
* Note 3 : Dictionary will be used for all future compression jobs.
|
* Note 3 :`dict` content will be copied internally.
|
||||||
* To return to "no-dictionary" situation, load a NULL dictionary
|
* Use ZSTD_CCtx_loadDictionary_byReference() to reference dictionary content instead.
|
||||||
* Note 5 : Use ZSTD_CCtx_loadDictionary_advanced() to select how dictionary
|
* In such a case, dictionary buffer must outlive its users.
|
||||||
* content will be interpreted.
|
* Note 4 : Use ZSTD_CCtx_loadDictionary_advanced()
|
||||||
*/
|
* to precisely select how dictionary content must be interpreted. */
|
||||||
ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize);
|
ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize);
|
||||||
ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_byReference(ZSTD_CCtx* cctx, const void* dict, size_t dictSize);
|
ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_byReference(ZSTD_CCtx* cctx, const void* dict, size_t dictSize);
|
||||||
ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictMode_e dictMode);
|
ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictMode_e dictMode);
|
||||||
@@ -1101,8 +1101,7 @@ ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_advanced(ZSTD_CCtx* cctx, const void
|
|||||||
* Special : adding a NULL CDict means "return to no-dictionary mode".
|
* Special : adding a NULL CDict means "return to no-dictionary mode".
|
||||||
* Note 1 : Currently, only one dictionary can be managed.
|
* Note 1 : Currently, only one dictionary can be managed.
|
||||||
* Adding a new dictionary effectively "discards" any previous one.
|
* Adding a new dictionary effectively "discards" any previous one.
|
||||||
* Note 2 : CDict is just referenced, its lifetime must outlive CCtx.
|
* Note 2 : CDict is just referenced, its lifetime must outlive CCtx. */
|
||||||
*/
|
|
||||||
ZSTDLIB_API size_t ZSTD_CCtx_refCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict);
|
ZSTDLIB_API size_t ZSTD_CCtx_refCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict);
|
||||||
|
|
||||||
/*! ZSTD_CCtx_refPrefix() :
|
/*! ZSTD_CCtx_refPrefix() :
|
||||||
@@ -1112,13 +1111,12 @@ ZSTDLIB_API size_t ZSTD_CCtx_refCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict);
|
|||||||
* Subsequent compression jobs will be done without prefix (if none is explicitly referenced).
|
* Subsequent compression jobs will be done without prefix (if none is explicitly referenced).
|
||||||
* If there is a need to use same prefix multiple times, consider embedding it into a ZSTD_CDict instead.
|
* If there is a need to use same prefix multiple times, consider embedding it into a ZSTD_CDict instead.
|
||||||
* @result : 0, or an error code (which can be tested with ZSTD_isError()).
|
* @result : 0, or an error code (which can be tested with ZSTD_isError()).
|
||||||
* Special : Adding any prefix (including NULL) invalidates any previous prefix or dictionary
|
* Special: Adding any prefix (including NULL) invalidates any previous prefix or dictionary
|
||||||
* Note 1 : Prefix buffer is referenced. It must outlive compression job.
|
* Note 1 : Prefix buffer is referenced. It must outlive compression job.
|
||||||
* Note 2 : Referencing a prefix involves building tables, which are dependent on compression parameters.
|
* Note 2 : Referencing a prefix involves building tables, which are dependent on compression parameters.
|
||||||
* It's a CPU-heavy operation, with non-negligible impact on latency.
|
* It's a CPU consuming operation, with non-negligible impact on latency.
|
||||||
* Note 3 : By default, the prefix is treated as raw content
|
* Note 3 : By default, the prefix is treated as raw content (ZSTD_dm_rawContent).
|
||||||
* (ZSTD_dm_rawContent). Use ZSTD_CCtx_refPrefix_advanced() to alter
|
* Use ZSTD_CCtx_refPrefix_advanced() to alter dictMode. */
|
||||||
* dictMode. */
|
|
||||||
ZSTDLIB_API size_t ZSTD_CCtx_refPrefix(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize);
|
ZSTDLIB_API size_t ZSTD_CCtx_refPrefix(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize);
|
||||||
ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize, ZSTD_dictMode_e dictMode);
|
ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize, ZSTD_dictMode_e dictMode);
|
||||||
|
|
||||||
|
|||||||
+5
-2
@@ -34,7 +34,7 @@
|
|||||||
#include "zdict.h" /* ZDICT_trainFromBuffer */
|
#include "zdict.h" /* ZDICT_trainFromBuffer */
|
||||||
#include "datagen.h" /* RDG_genBuffer */
|
#include "datagen.h" /* RDG_genBuffer */
|
||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
#define XXH_STATIC_LINKING_ONLY
|
#define XXH_STATIC_LINKING_ONLY /* XXH64_state_t */
|
||||||
#include "xxhash.h" /* XXH64 */
|
#include "xxhash.h" /* XXH64 */
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
@@ -1382,10 +1382,13 @@ static int fuzzerTests(U32 seed, U32 nbTests, unsigned startTest, U32 const maxD
|
|||||||
crcOrig = XXH64(sampleBuffer, sampleSize, 0);
|
crcOrig = XXH64(sampleBuffer, sampleSize, 0);
|
||||||
|
|
||||||
/* compression tests */
|
/* compression tests */
|
||||||
{ int const cLevel =
|
{ int const cLevelPositive =
|
||||||
( FUZ_rand(&lseed) %
|
( FUZ_rand(&lseed) %
|
||||||
(ZSTD_maxCLevel() - (FUZ_highbit32((U32)sampleSize) / cLevelLimiter)) )
|
(ZSTD_maxCLevel() - (FUZ_highbit32((U32)sampleSize) / cLevelLimiter)) )
|
||||||
+ 1;
|
+ 1;
|
||||||
|
int const cLevel = ((FUZ_rand(&lseed) & 15) == 3) ?
|
||||||
|
- (int)((FUZ_rand(&lseed) & 7) + 1) : /* test negative cLevel */
|
||||||
|
cLevelPositive;
|
||||||
DISPLAYLEVEL(5, "fuzzer t%u: Simple compression test (level %i) \n", testNb, cLevel);
|
DISPLAYLEVEL(5, "fuzzer t%u: Simple compression test (level %i) \n", testNb, cLevel);
|
||||||
cSize = ZSTD_compressCCtx(ctx, cBuffer, cBufferSize, sampleBuffer, sampleSize, cLevel);
|
cSize = ZSTD_compressCCtx(ctx, cBuffer, cBufferSize, sampleBuffer, sampleSize, cLevel);
|
||||||
CHECK(ZSTD_isError(cSize), "ZSTD_compressCCtx failed : %s", ZSTD_getErrorName(cSize));
|
CHECK(ZSTD_isError(cSize), "ZSTD_compressCCtx failed : %s", ZSTD_getErrorName(cSize));
|
||||||
|
|||||||
Reference in New Issue
Block a user