Add block splitter to experimental params

This commit is contained in:
senhuang42 2020-12-07 17:11:23 -05:00 committed by Sen Huang
parent 2949a95224
commit c56d6e49e8
3 changed files with 31 additions and 3 deletions

View File

@ -486,6 +486,11 @@ ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter param)
bounds.upperBound = 1; bounds.upperBound = 1;
return bounds; return bounds;
case ZSTD_c_splitBlocks:
bounds.lowerBound = 0;
bounds.upperBound = 1;
return bounds;
default: default:
bounds.error = ERROR(parameter_unsupported); bounds.error = ERROR(parameter_unsupported);
return bounds; return bounds;
@ -547,6 +552,7 @@ static int ZSTD_isUpdateAuthorized(ZSTD_cParameter param)
case ZSTD_c_stableOutBuffer: case ZSTD_c_stableOutBuffer:
case ZSTD_c_blockDelimiters: case ZSTD_c_blockDelimiters:
case ZSTD_c_validateSequences: case ZSTD_c_validateSequences:
case ZSTD_c_splitBlocks:
default: default:
return 0; return 0;
} }
@ -599,6 +605,7 @@ size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value)
case ZSTD_c_stableOutBuffer: case ZSTD_c_stableOutBuffer:
case ZSTD_c_blockDelimiters: case ZSTD_c_blockDelimiters:
case ZSTD_c_validateSequences: case ZSTD_c_validateSequences:
case ZSTD_c_splitBlocks:
break; break;
default: RETURN_ERROR(parameter_unsupported, "unknown parameter"); default: RETURN_ERROR(parameter_unsupported, "unknown parameter");
@ -810,6 +817,11 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams,
CCtxParams->validateSequences = value; CCtxParams->validateSequences = value;
return CCtxParams->validateSequences; return CCtxParams->validateSequences;
case ZSTD_c_splitBlocks:
BOUNDCHECK(ZSTD_c_splitBlocks, value);
CCtxParams->splitBlocks = value;
return CCtxParams->splitBlocks;
default: RETURN_ERROR(parameter_unsupported, "unknown parameter"); default: RETURN_ERROR(parameter_unsupported, "unknown parameter");
} }
} }
@ -933,6 +945,9 @@ size_t ZSTD_CCtxParams_getParameter(
case ZSTD_c_validateSequences : case ZSTD_c_validateSequences :
*value = (int)CCtxParams->validateSequences; *value = (int)CCtxParams->validateSequences;
break; break;
case ZSTD_c_splitBlocks :
*value = (int)CCtxParams->splitBlocks;
break;
default: RETURN_ERROR(parameter_unsupported, "unknown parameter"); default: RETURN_ERROR(parameter_unsupported, "unknown parameter");
} }
return 0; return 0;
@ -3293,7 +3308,8 @@ static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc,
nbSeq = (size_t)(zc->seqStore.sequences - zc->seqStore.sequencesStart); nbSeq = (size_t)(zc->seqStore.sequences - zc->seqStore.sequencesStart);
} }
if (nbSeq >= 2) { zc->appliedParams.splitBlocks = 1; /* remove */
if (zc->appliedParams.splitBlocks && nbSeq >= 2) {
size_t splitBlocksCompressedSize; size_t splitBlocksCompressedSize;
splitBlocksCompressedSize = ZSTD_compressBlock_splitBlock(zc, dst, dstCapacity, src, srcSize, frame, lastBlock, nbSeq); splitBlocksCompressedSize = ZSTD_compressBlock_splitBlock(zc, dst, dstCapacity, src, srcSize, frame, lastBlock, nbSeq);
if (splitBlocksCompressedSize != 0) { if (splitBlocksCompressedSize != 0) {

View File

@ -312,6 +312,9 @@ struct ZSTD_CCtx_params_s {
ZSTD_sequenceFormat_e blockDelimiters; ZSTD_sequenceFormat_e blockDelimiters;
int validateSequences; int validateSequences;
/* Block splitting */
int splitBlocks;
/* Internal use, for createCCtxParams() and freeCCtxParams() only */ /* Internal use, for createCCtxParams() and freeCCtxParams() only */
ZSTD_customMem customMem; ZSTD_customMem customMem;
}; /* typedef'd to ZSTD_CCtx_params within "zstd.h" */ }; /* typedef'd to ZSTD_CCtx_params within "zstd.h" */

View File

@ -419,6 +419,7 @@ typedef enum {
* ZSTD_c_stableOutBuffer * ZSTD_c_stableOutBuffer
* ZSTD_c_blockDelimiters * ZSTD_c_blockDelimiters
* ZSTD_c_validateSequences * ZSTD_c_validateSequences
* ZSTD_c_splitBlocks
* Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them.
* note : never ever use experimentalParam? names directly; * note : never ever use experimentalParam? names directly;
* also, the enums values themselves are unstable and can still change. * also, the enums values themselves are unstable and can still change.
@ -434,7 +435,8 @@ typedef enum {
ZSTD_c_experimentalParam9=1006, ZSTD_c_experimentalParam9=1006,
ZSTD_c_experimentalParam10=1007, ZSTD_c_experimentalParam10=1007,
ZSTD_c_experimentalParam11=1008, ZSTD_c_experimentalParam11=1008,
ZSTD_c_experimentalParam12=1009 ZSTD_c_experimentalParam12=1009,
ZSTD_c_experimentalParam13=1010
} ZSTD_cParameter; } ZSTD_cParameter;
typedef struct { typedef struct {
@ -1834,6 +1836,13 @@ ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* pre
*/ */
#define ZSTD_c_validateSequences ZSTD_c_experimentalParam12 #define ZSTD_c_validateSequences ZSTD_c_experimentalParam12
/* ZSTD_c_splitBlocks
* Default is 0 == disabled. Set to 1 to enable block splitting.
*
* Will attempt to split blocks in order to improve compression ratio at the cost of speed.
*/
#define ZSTD_c_splitBlocks ZSTD_c_experimentalParam13
/*! ZSTD_CCtx_getParameter() : /*! ZSTD_CCtx_getParameter() :
* Get the requested compression parameter value, selected by enum ZSTD_cParameter, * Get the requested compression parameter value, selected by enum ZSTD_cParameter,
* and store it into int* value. * and store it into int* value.