From 6b3739c8e5cc3f8e96d45d72a23708b76fcfa0be Mon Sep 17 00:00:00 2001 From: inikep Date: Mon, 22 Feb 2016 15:53:42 +0100 Subject: [PATCH] MINMATCH=3 or 4 selected in ZSTD frame --- lib/zstd_compress.c | 17 ++++++++++------- lib/zstd_decompress.c | 10 ++++++---- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lib/zstd_compress.c b/lib/zstd_compress.c index 8e572b4a..bb15afb8 100644 --- a/lib/zstd_compress.c +++ b/lib/zstd_compress.c @@ -2144,7 +2144,7 @@ size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* zc, if (ZSTD_isError(errorCode)) return errorCode; MEM_writeLE32(zc->headerBuffer, ZSTD_MAGICNUMBER); /* Write Header */ - ((BYTE*)zc->headerBuffer)[4] = (BYTE)(params.windowLog - ZSTD_WINDOWLOG_ABSOLUTEMIN); + ((BYTE*)zc->headerBuffer)[4] = (BYTE)(params.windowLog - ZSTD_WINDOWLOG_ABSOLUTEMIN + ((params.searchLength==3)<<4)); zc->hbSize = ZSTD_frameHeaderSize_min; zc->stage = 0; @@ -2259,7 +2259,7 @@ size_t ZSTD_compress(void* dst, size_t maxDstSize, const void* src, size_t srcSi /*-===== Pre-defined compression levels =====-*/ -#define ZSTD_MAX_CLEVEL 22 +#define ZSTD_MAX_CLEVEL 25 unsigned ZSTD_maxCLevel(void) { return ZSTD_MAX_CLEVEL; } @@ -2284,11 +2284,14 @@ static const ZSTD_parameters ZSTD_defaultParameters[4][ZSTD_MAX_CLEVEL+1] = { { 0, 23, 23, 23, 0, 5, 5, 4, ZSTD_lazy2 }, /* level 15 */ { 0, 23, 22, 22, 0, 5, 5, 4, ZSTD_btlazy2 }, /* level 16 */ { 0, 24, 24, 23, 0, 4, 5, 4, ZSTD_btlazy2 }, /* level 17 */ - { 0, 24, 24, 23, 16, 5, 5, 30, ZSTD_btopt }, /* level 18 */ - { 0, 25, 25, 24, 16, 5, 4, 40, ZSTD_btopt }, /* level 19 */ - { 0, 26, 26, 25, 16, 8, 4,256, ZSTD_btopt }, /* level 20 */ - { 0, 26, 27, 25, 24, 10, 4,256, ZSTD_btopt }, /* level 21 */ - { 0, 26, 26, 25, 16, 8, 3,256, ZSTD_btopt }, /* level 20+MM3 */ + { 0, 24, 24, 23, 0, 5, 5, 30, ZSTD_btopt }, /* level 18 */ + { 0, 25, 25, 24, 0, 5, 4, 40, ZSTD_btopt }, /* level 19 */ + { 0, 26, 26, 25, 0, 8, 4,256, ZSTD_btopt }, /* level 20 */ + { 0, 26, 27, 25, 0, 10, 4,256, ZSTD_btopt }, /* level 21 */ + { 0, 24, 24, 23, 16, 5, 3, 30, ZSTD_btopt }, /* level 22 */ + { 0, 25, 25, 24, 16, 5, 3, 40, ZSTD_btopt }, /* level 23 */ + { 0, 26, 26, 25, 16, 8, 3,256, ZSTD_btopt }, /* level 24 */ + { 0, 26, 27, 25, 24, 10, 3,256, ZSTD_btopt }, /* level 25 */ }, { /* for srcSize <= 256 KB */ /* l, W, C, H, H3, S, L, T, strat */ diff --git a/lib/zstd_decompress.c b/lib/zstd_decompress.c index bfa0ea33..8cedb3ea 100644 --- a/lib/zstd_decompress.c +++ b/lib/zstd_decompress.c @@ -292,7 +292,8 @@ size_t ZSTD_getFrameParams(ZSTD_parameters* params, const void* src, size_t srcS if (magicNumber != ZSTD_MAGICNUMBER) return ERROR(prefix_unknown); memset(params, 0, sizeof(*params)); params->windowLog = (((const BYTE*)src)[4] & 15) + ZSTD_WINDOWLOG_ABSOLUTEMIN; - if ((((const BYTE*)src)[4] >> 4) != 0) return ERROR(frameParameter_unsupported); /* reserved bits */ + params->searchLength = (((const BYTE*)src)[4] & 16) ? MINMATCH-1 : MINMATCH; + if ((((const BYTE*)src)[4] >> 5) != 0) return ERROR(frameParameter_unsupported); /* reserved 3 bits */ return 0; } @@ -614,7 +615,7 @@ typedef struct { -static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState) +static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState, const U32 mls) { size_t litLength; size_t prevOffset; @@ -669,7 +670,7 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState) } if (dumps >= de) dumps = de-1; /* late correction, to avoid read overflow (data is now corrupted anyway) */ } - matchLength += MINMATCH; + matchLength += mls; /* save result */ seq->litLength = litLength; @@ -784,6 +785,7 @@ static size_t ZSTD_decompressSequences( const BYTE* const base = (const BYTE*) (dctx->base); const BYTE* const vBase = (const BYTE*) (dctx->vBase); const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd); + const U32 mls = dctx->params.searchLength; /* Build Decoding Tables */ errorCode = ZSTD_decodeSeqHeaders(&nbSeq, &dumps, &dumpsLength, @@ -811,7 +813,7 @@ static size_t ZSTD_decompressSequences( for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && nbSeq ; ) { size_t oneSeqSize; nbSeq--; - ZSTD_decodeSequence(&sequence, &seqState); + ZSTD_decodeSequence(&sequence, &seqState, mls); oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litLimit_8, base, vBase, dictEnd); if (ZSTD_isError(oneSeqSize)) return oneSeqSize; op += oneSeqSize;