Forbiding emission of RLE when its the first block
This commit is contained in:
parent
33b6446ca7
commit
ce264ce53b
@ -2276,7 +2276,7 @@ static int ZSTD_isRLE(const BYTE *ip, size_t length) {
|
|||||||
|
|
||||||
static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc,
|
static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc,
|
||||||
void* dst, size_t dstCapacity,
|
void* dst, size_t dstCapacity,
|
||||||
const void* src, size_t srcSize)
|
const void* src, size_t srcSize, U32 frame)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
This the upper bound for the length of an rle block.
|
This the upper bound for the length of an rle block.
|
||||||
@ -2305,7 +2305,18 @@ static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc,
|
|||||||
zc->entropyWorkspace, HUF_WORKSPACE_SIZE /* statically allocated in resetCCtx */,
|
zc->entropyWorkspace, HUF_WORKSPACE_SIZE /* statically allocated in resetCCtx */,
|
||||||
zc->bmi2);
|
zc->bmi2);
|
||||||
|
|
||||||
if (cSize < rleMaxLength && ZSTD_isRLE(ip, srcSize)) {
|
/*
|
||||||
|
We don't want to emit our first block as a RLE even if it qualifies because
|
||||||
|
doing so will cause the decoder to throw a "should consume all input error."
|
||||||
|
https://github.com/facebook/zstd/blob/dev/programs/fileio.c#L1723
|
||||||
|
*/
|
||||||
|
U32 isFirstBlock = zc->inBuffPos == srcSize;
|
||||||
|
|
||||||
|
if (frame &&
|
||||||
|
!isFirstBlock &&
|
||||||
|
cSize < rleMaxLength &&
|
||||||
|
ZSTD_isRLE(ip, srcSize))
|
||||||
|
{
|
||||||
cSize = 1;
|
cSize = 1;
|
||||||
op[0] = ip[0];
|
op[0] = ip[0];
|
||||||
}
|
}
|
||||||
@ -2387,7 +2398,7 @@ static size_t ZSTD_compress_frameChunk (ZSTD_CCtx* cctx,
|
|||||||
|
|
||||||
{ size_t cSize = ZSTD_compressBlock_internal(cctx,
|
{ size_t cSize = ZSTD_compressBlock_internal(cctx,
|
||||||
op+ZSTD_blockHeaderSize, dstCapacity-ZSTD_blockHeaderSize,
|
op+ZSTD_blockHeaderSize, dstCapacity-ZSTD_blockHeaderSize,
|
||||||
ip, blockSize);
|
ip, blockSize, 1 /* frame */);
|
||||||
FORWARD_IF_ERROR(cSize);
|
FORWARD_IF_ERROR(cSize);
|
||||||
|
|
||||||
if (cSize == 0) { /* block is not compressible */
|
if (cSize == 0) { /* block is not compressible */
|
||||||
@ -2527,7 +2538,7 @@ static size_t ZSTD_compressContinue_internal (ZSTD_CCtx* cctx,
|
|||||||
DEBUGLOG(5, "ZSTD_compressContinue_internal (blockSize=%u)", (unsigned)cctx->blockSize);
|
DEBUGLOG(5, "ZSTD_compressContinue_internal (blockSize=%u)", (unsigned)cctx->blockSize);
|
||||||
{ size_t const cSize = frame ?
|
{ size_t const cSize = frame ?
|
||||||
ZSTD_compress_frameChunk (cctx, dst, dstCapacity, src, srcSize, lastFrameChunk) :
|
ZSTD_compress_frameChunk (cctx, dst, dstCapacity, src, srcSize, lastFrameChunk) :
|
||||||
ZSTD_compressBlock_internal (cctx, dst, dstCapacity, src, srcSize);
|
ZSTD_compressBlock_internal (cctx, dst, dstCapacity, src, srcSize, 0 /* frame */);
|
||||||
FORWARD_IF_ERROR(cSize);
|
FORWARD_IF_ERROR(cSize);
|
||||||
cctx->consumedSrcSize += srcSize;
|
cctx->consumedSrcSize += srcSize;
|
||||||
cctx->producedCSize += (cSize + fhSize);
|
cctx->producedCSize += (cSize + fhSize);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user