]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
MINMATCH=3 or 4 selected in ZSTD frame
authorinikep <inikep@gmail.com>
Mon, 22 Feb 2016 14:53:42 +0000 (15:53 +0100)
committerinikep <inikep@gmail.com>
Mon, 22 Feb 2016 14:53:42 +0000 (15:53 +0100)
lib/zstd_compress.c
lib/zstd_decompress.c

index 8e572b4ac595f2a257f5718e0975ab2784351a84..bb15afb89da1b8630dc3df92b1d1443803965fad 100644 (file)
@@ -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 */
index bfa0ea334a1d754329c52ed26797f04a72e2490b..8cedb3ea97c26f8475e731e8c98df8038c1ca687 100644 (file)
@@ -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;