diff options
author | Yann Collet <yann.collet.73@gmail.com> | 2014-09-22 01:36:20 (GMT) |
---|---|---|
committer | Yann Collet <yann.collet.73@gmail.com> | 2014-09-22 01:36:20 (GMT) |
commit | 0e6151b1379ed8e60c1ca345497c86f88e3967f6 (patch) | |
tree | a6eb00f8f7454073706185124909350c37f2b46e /lz4frame.c | |
parent | ff670f659a25160d6fc396842db67b241ba6bd9e (diff) | |
download | lz4-0e6151b1379ed8e60c1ca345497c86f88e3967f6.zip lz4-0e6151b1379ed8e60c1ca345497c86f88e3967f6.tar.gz lz4-0e6151b1379ed8e60c1ca345497c86f88e3967f6.tar.bz2 |
LZ4F_compressFrame() : auto-resize block size when unnecessarily large
Diffstat (limited to 'lz4frame.c')
-rw-r--r-- | lz4frame.c | 23 |
1 files changed, 20 insertions, 3 deletions
@@ -261,12 +261,29 @@ size_t LZ4F_compressFrame(void* dstBuffer, size_t dstMaxSize, const void* srcBuf BYTE* const dstEnd = dstStart + dstMaxSize; - if (preferencesPtr!=NULL) prefs = *preferencesPtr; cctxI.version = LZ4F_VERSION; - cctxI.maxBufferSize = 64 KB; /* mess with real buffer size, to prevent allocation; works because autoflush==1 & stableSrc==1 */ + cctxI.maxBufferSize = 64 KB; /* mess with real buffer size to prevent allocation; works because autoflush==1 & stableSrc==1 */ + + if (preferencesPtr!=NULL) prefs = *preferencesPtr; + { + blockSizeID_t proposedBSID = max64KB; + size_t maxBlockSize = 64 KB; + while (prefs.frameInfo.blockSizeID > proposedBSID) + { + if (srcSize <= maxBlockSize) + { + prefs.frameInfo.blockSizeID = proposedBSID; + break; + } + proposedBSID++; + maxBlockSize <<= 2; + } + } prefs.autoFlush = 1; + if (srcSize <= LZ4F_getBlockSize(prefs.frameInfo.blockSizeID)) + prefs.frameInfo.blockMode = blockIndependent; /* no need for linked blocks */ + options.stableSrc = 1; - if (srcSize <= 64 KB) prefs.frameInfo.blockMode = blockIndependent; /* no need for linked blocks */ if (dstMaxSize < LZ4F_compressFrameBound(srcSize, &prefs)) return -ERROR_dstMaxSize_tooSmall; |