Merge pull request #344 from lz4/LZ4F_getFrameInfo
LZ4F_getFrameInfo and LZ4F_resetDecompressionContext
This commit is contained in:
commit
3d4ee35da4
108
lib/lz4frame.c
108
lib/lz4frame.c
@ -764,7 +764,7 @@ LZ4F_errorCode_t LZ4F_createDecompressionContext(LZ4F_dctx** LZ4F_decompressionC
|
||||
return LZ4F_OK_NoError;
|
||||
}
|
||||
|
||||
LZ4F_errorCode_t LZ4F_freeDecompressionContext(LZ4F_dctx* const dctxPtr)
|
||||
LZ4F_errorCode_t LZ4F_freeDecompressionContext(LZ4F_dctx* dctxPtr)
|
||||
{
|
||||
LZ4F_errorCode_t result = LZ4F_OK_NoError;
|
||||
if (dctxPtr != NULL) { /* can accept NULL input, like free() */
|
||||
@ -779,7 +779,9 @@ LZ4F_errorCode_t LZ4F_freeDecompressionContext(LZ4F_dctx* const dctxPtr)
|
||||
|
||||
/*==--- Streaming Decompression operations ---==*/
|
||||
|
||||
typedef enum { dstage_getHeader=0, dstage_storeHeader,
|
||||
typedef enum {
|
||||
dstage_getHeader=0, dstage_storeHeader,
|
||||
dstage_init,
|
||||
dstage_getCBlockSize, dstage_storeCBlockSize,
|
||||
dstage_copyDirect,
|
||||
dstage_getCBlock, dstage_storeCBlock,
|
||||
@ -790,6 +792,12 @@ typedef enum { dstage_getHeader=0, dstage_storeHeader,
|
||||
dstage_skipSkippable
|
||||
} dStage_t;
|
||||
|
||||
LZ4F_errorCode_t LZ4F_resetDecompressionContext(LZ4F_dctx* dctx)
|
||||
{
|
||||
dctx->dStage = dstage_getHeader;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*! LZ4F_headerSize() :
|
||||
* @return : size of frame header
|
||||
@ -896,65 +904,57 @@ static size_t LZ4F_decodeHeader(LZ4F_dctx* dctxPtr, const void* src, size_t srcS
|
||||
if (contentSizeFlag)
|
||||
dctxPtr->frameRemainingSize = dctxPtr->frameInfo.contentSize = LZ4F_readLE64(srcPtr+6);
|
||||
|
||||
/* init */
|
||||
if (contentChecksumFlag) XXH32_reset(&(dctxPtr->xxh), 0);
|
||||
|
||||
/* internal buffers allocation */
|
||||
{ size_t const bufferNeeded = dctxPtr->maxBlockSize + ((dctxPtr->frameInfo.blockMode==LZ4F_blockLinked) * 128 KB);
|
||||
if (bufferNeeded > dctxPtr->maxBufferSize) { /* tmp buffers too small */
|
||||
dctxPtr->maxBufferSize = 0; /* ensure allocation will be re-attempted on next entry*/
|
||||
FREEMEM(dctxPtr->tmpIn);
|
||||
dctxPtr->tmpIn = (BYTE*)ALLOCATOR(dctxPtr->maxBlockSize);
|
||||
if (dctxPtr->tmpIn == NULL) return err0r(LZ4F_ERROR_allocation_failed);
|
||||
FREEMEM(dctxPtr->tmpOutBuffer);
|
||||
dctxPtr->tmpOutBuffer= (BYTE*)ALLOCATOR(bufferNeeded);
|
||||
if (dctxPtr->tmpOutBuffer== NULL) return err0r(LZ4F_ERROR_allocation_failed);
|
||||
dctxPtr->maxBufferSize = bufferNeeded;
|
||||
} }
|
||||
dctxPtr->tmpInSize = 0;
|
||||
dctxPtr->tmpInTarget = 0;
|
||||
dctxPtr->dict = dctxPtr->tmpOutBuffer;
|
||||
dctxPtr->dictSize = 0;
|
||||
dctxPtr->tmpOut = dctxPtr->tmpOutBuffer;
|
||||
dctxPtr->tmpOutStart = 0;
|
||||
dctxPtr->tmpOutSize = 0;
|
||||
|
||||
dctxPtr->dStage = dstage_getCBlockSize;
|
||||
dctxPtr->dStage = dstage_init;
|
||||
|
||||
return frameHeaderSize;
|
||||
}
|
||||
|
||||
|
||||
/*! LZ4F_getFrameInfo() :
|
||||
* Decodes frame header information, such as blockSize. Usage is optional.
|
||||
* The objective is to extract header information before receiving decompressed data, typically for allocation purposes.
|
||||
* LZ4F_getFrameInfo() can also be used *after* starting decompression, on a valid LZ4F_decompressionContext_t.
|
||||
* The number of bytes consumed from srcBuffer will be provided within *srcSizePtr (necessarily <= original value).
|
||||
* Decompression must resume from where it stopped (srcBuffer + *srcSizePtr)
|
||||
* @return : hint of the better `srcSize` to use for next call to LZ4F_decompress,
|
||||
* or an error code which can be tested using LZ4F_isError().
|
||||
* This function extracts frame parameters (such as max blockSize, frame checksum, etc.).
|
||||
* Its usage is optional. The objective is to provide relevant information for allocation purposes.
|
||||
* This function works in 2 situations :
|
||||
* - At the beginning of a new frame, in which case it will decode this information from `srcBuffer`, and start the decoding process.
|
||||
* Amount of input data provided must be large enough to successfully decode the frame header.
|
||||
* A header size is variable, but is guaranteed to be <= LZ4F_HEADER_SIZE_MAX bytes. It's possible to provide more input data than this minimum.
|
||||
* - After decoding has been started. In which case, no input is read, frame parameters are extracted from dctx.
|
||||
* The number of bytes consumed from srcBuffer will be updated within *srcSizePtr (necessarily <= original value).
|
||||
* Decompression must resume from (srcBuffer + *srcSizePtr).
|
||||
* @return : an hint about how many srcSize bytes LZ4F_decompress() expects for next call,
|
||||
* or an error code which can be tested using LZ4F_isError()
|
||||
* note 1 : in case of error, dctx is not modified. Decoding operations can resume from where they stopped.
|
||||
* note 2 : frame parameters are *copied into* an already allocated LZ4F_frameInfo_t structure.
|
||||
*/
|
||||
LZ4F_errorCode_t LZ4F_getFrameInfo(LZ4F_dctx* dctxPtr, LZ4F_frameInfo_t* frameInfoPtr,
|
||||
const void* srcBuffer, size_t* srcSizePtr)
|
||||
{
|
||||
if (dctxPtr->dStage > dstage_storeHeader) { /* note : requires dstage_* header related to be at beginning of enum */
|
||||
if (dctxPtr->dStage > dstage_storeHeader) { /* assumption : dstage_* header enum at beginning of range */
|
||||
/* frameInfo already decoded */
|
||||
size_t o=0, i=0;
|
||||
*srcSizePtr = 0;
|
||||
*frameInfoPtr = dctxPtr->frameInfo;
|
||||
return LZ4F_decompress(dctxPtr, NULL, &o, NULL, &i, NULL); /* returns : recommended nb of bytes for LZ4F_decompress() */
|
||||
} else {
|
||||
size_t nextSrcSize, o=0;
|
||||
if (dctxPtr->dStage == dstage_storeHeader) {
|
||||
/* frame decoding already started, in the middle of header => automatic fail */
|
||||
*srcSizePtr = 0;
|
||||
return err0r(LZ4F_ERROR_frameDecoding_alreadyStarted);
|
||||
} else {
|
||||
size_t decodeResult;
|
||||
size_t const hSize = LZ4F_headerSize(srcBuffer, *srcSizePtr);
|
||||
if (LZ4F_isError(hSize)) { *srcSizePtr=0; return hSize; }
|
||||
if (*srcSizePtr < hSize) { *srcSizePtr=0; return err0r(LZ4F_ERROR_frameHeader_incomplete); }
|
||||
|
||||
*srcSizePtr = hSize;
|
||||
nextSrcSize = LZ4F_decompress(dctxPtr, NULL, &o, srcBuffer, srcSizePtr, NULL);
|
||||
if (dctxPtr->dStage <= dstage_storeHeader) return err0r(LZ4F_ERROR_frameHeader_incomplete); /* should not happen, already checked */
|
||||
*frameInfoPtr = dctxPtr->frameInfo;
|
||||
return nextSrcSize;
|
||||
decodeResult = LZ4F_decodeHeader(dctxPtr, srcBuffer, hSize);
|
||||
if (LZ4F_isError(decodeResult)) {
|
||||
*srcSizePtr = 0;
|
||||
} else {
|
||||
*srcSizePtr = decodeResult;
|
||||
decodeResult = BHSize; /* block header size */
|
||||
}
|
||||
*frameInfoPtr = dctxPtr->frameInfo;
|
||||
return decodeResult;
|
||||
} }
|
||||
}
|
||||
|
||||
|
||||
@ -1064,7 +1064,7 @@ size_t LZ4F_decompress(LZ4F_dctx* dctxPtr,
|
||||
*srcSizePtr = 0;
|
||||
*dstSizePtr = 0;
|
||||
|
||||
/* programmed as a state machine */
|
||||
/* behaves like a state machine */
|
||||
|
||||
while (doAnotherStage) {
|
||||
|
||||
@ -1079,6 +1079,7 @@ size_t LZ4F_decompress(LZ4F_dctx* dctxPtr,
|
||||
break;
|
||||
}
|
||||
dctxPtr->tmpInSize = 0;
|
||||
if (srcEnd-srcPtr == 0) return minFHSize; /* 0-size input */
|
||||
dctxPtr->tmpInTarget = minFHSize; /* minimum to attempt decode */
|
||||
dctxPtr->dStage = dstage_storeHeader;
|
||||
/* pass-through */
|
||||
@ -1100,6 +1101,31 @@ size_t LZ4F_decompress(LZ4F_dctx* dctxPtr,
|
||||
break;
|
||||
}
|
||||
|
||||
case dstage_init:
|
||||
if (dctxPtr->frameInfo.contentChecksumFlag) XXH32_reset(&(dctxPtr->xxh), 0);
|
||||
/* internal buffers allocation */
|
||||
{ size_t const bufferNeeded = dctxPtr->maxBlockSize + ((dctxPtr->frameInfo.blockMode==LZ4F_blockLinked) * 128 KB);
|
||||
if (bufferNeeded > dctxPtr->maxBufferSize) { /* tmp buffers too small */
|
||||
dctxPtr->maxBufferSize = 0; /* ensure allocation will be re-attempted on next entry*/
|
||||
FREEMEM(dctxPtr->tmpIn);
|
||||
dctxPtr->tmpIn = (BYTE*)ALLOCATOR(dctxPtr->maxBlockSize);
|
||||
if (dctxPtr->tmpIn == NULL) return err0r(LZ4F_ERROR_allocation_failed);
|
||||
FREEMEM(dctxPtr->tmpOutBuffer);
|
||||
dctxPtr->tmpOutBuffer= (BYTE*)ALLOCATOR(bufferNeeded);
|
||||
if (dctxPtr->tmpOutBuffer== NULL) return err0r(LZ4F_ERROR_allocation_failed);
|
||||
dctxPtr->maxBufferSize = bufferNeeded;
|
||||
} }
|
||||
dctxPtr->tmpInSize = 0;
|
||||
dctxPtr->tmpInTarget = 0;
|
||||
dctxPtr->dict = dctxPtr->tmpOutBuffer;
|
||||
dctxPtr->dictSize = 0;
|
||||
dctxPtr->tmpOut = dctxPtr->tmpOutBuffer;
|
||||
dctxPtr->tmpOutStart = 0;
|
||||
dctxPtr->tmpOutSize = 0;
|
||||
|
||||
dctxPtr->dStage = dstage_getCBlockSize;
|
||||
/* pass-through */
|
||||
|
||||
case dstage_getCBlockSize:
|
||||
if ((size_t)(srcEnd - srcPtr) >= BHSize) {
|
||||
selectedIn = srcPtr;
|
||||
|
@ -300,22 +300,30 @@ typedef struct {
|
||||
* That is, it should be == 0 if decompression has been completed fully and correctly.
|
||||
*/
|
||||
LZ4FLIB_API LZ4F_errorCode_t LZ4F_createDecompressionContext(LZ4F_dctx** dctxPtr, unsigned version);
|
||||
LZ4FLIB_API LZ4F_errorCode_t LZ4F_freeDecompressionContext(LZ4F_dctx* const dctx);
|
||||
LZ4FLIB_API LZ4F_errorCode_t LZ4F_freeDecompressionContext(LZ4F_dctx* dctx);
|
||||
|
||||
|
||||
/* ====== Decompression ======*/
|
||||
/*-***********************************
|
||||
* Streaming decompression functions
|
||||
*************************************/
|
||||
|
||||
/*! LZ4F_getFrameInfo() :
|
||||
* This function decodes frame header information (such as max blockSize, frame checksum, etc.).
|
||||
* Its usage is optional. The objective is to extract frame header information, typically for allocation purposes.
|
||||
* A header size is variable and can length from 7 to 15 bytes. It's possible to provide more input bytes than that.
|
||||
* This function extracts frame parameters (such as max blockSize, frame checksum, etc.).
|
||||
* Its usage is optional. Extracted information can be useful for allocation purposes, typically.
|
||||
* This function works in 2 situations :
|
||||
* - At the beginning of a new frame, in which case it will decode this information from `srcBuffer`, and start the decoding process.
|
||||
* Input size must be large enough to successfully decode the entire frame header.
|
||||
* Frame header size is variable, but is guaranteed to be <= LZ4F_HEADER_SIZE_MAX bytes.
|
||||
* It's allowed to provide more input data than this minimum.
|
||||
* - After decoding has been started.
|
||||
* In which case, no input is read, frame parameters are extracted from dctx.
|
||||
* If decoding has just started, but not yet extracted information from header, LZ4F_getFrameInfo() will fail.
|
||||
* The number of bytes consumed from srcBuffer will be updated within *srcSizePtr (necessarily <= original value).
|
||||
* Decompression must resume from this point (srcBuffer + *srcSizePtr).
|
||||
* Note that LZ4F_getFrameInfo() can also be used anytime *after* decompression is started, in which case 0 input byte can be enough.
|
||||
* Frame header info is *copied into* an already allocated LZ4F_frameInfo_t structure.
|
||||
* Decompression must resume from (srcBuffer + *srcSizePtr).
|
||||
* @return : an hint about how many srcSize bytes LZ4F_decompress() expects for next call,
|
||||
* or an error code which can be tested using LZ4F_isError()
|
||||
* (typically, when there is not enough src bytes to fully decode the frame header)
|
||||
* note 1 : in case of error, dctx is not modified. Decoding operations can resume from where they stopped.
|
||||
* note 2 : frame parameters are *copied into* an already allocated LZ4F_frameInfo_t structure.
|
||||
*/
|
||||
LZ4FLIB_API size_t LZ4F_getFrameInfo(LZ4F_dctx* dctx,
|
||||
LZ4F_frameInfo_t* frameInfoPtr,
|
||||
@ -337,12 +345,13 @@ LZ4FLIB_API size_t LZ4F_getFrameInfo(LZ4F_dctx* dctx,
|
||||
*
|
||||
* @return is an hint of how many `srcSize` bytes LZ4F_decompress() expects for next call.
|
||||
* Schematically, it's the size of the current (or remaining) compressed block + header of next block.
|
||||
* Respecting the hint provides some boost to performance, since it does skip intermediate buffers.
|
||||
* Respecting the hint provides some small speed benefit, because it skips intermediate buffers.
|
||||
* This is just a hint though, it's always possible to provide any srcSize.
|
||||
* When a frame is fully decoded, @return will be 0 (no more data expected).
|
||||
* If decompression failed, @return is an error code, which can be tested using LZ4F_isError().
|
||||
*
|
||||
* After a frame is fully decoded, dctx can be used again to decompress another frame.
|
||||
* After a decompression error, use LZ4F_resetDecompressionContext() before re-using dctx, to return to clean state.
|
||||
*/
|
||||
LZ4FLIB_API size_t LZ4F_decompress(LZ4F_dctx* dctx,
|
||||
void* dstBuffer, size_t* dstSizePtr,
|
||||
|
@ -43,34 +43,50 @@ extern "C" {
|
||||
/* lz4frame_static.h should be used solely in the context of static linking.
|
||||
* It contains definitions which are not stable and may change in the future.
|
||||
* Never use it in the context of DLL linking.
|
||||
* */
|
||||
*/
|
||||
|
||||
|
||||
/* --- Dependency --- */
|
||||
#include "lz4frame.h"
|
||||
|
||||
|
||||
/* --- Experimental functions --- */
|
||||
/* LZ4F_resetDecompressionContext() :
|
||||
* LZ4F_decompress() does not guarantee to leave dctx in clean state in case of errors.
|
||||
* In order to re-use a dctx after a decompression error,
|
||||
* use LZ4F_resetDecompressionContext() first.
|
||||
* dctx will be able to start decompression on a new frame */
|
||||
LZ4FLIB_API LZ4F_errorCode_t LZ4F_resetDecompressionContext(LZ4F_dctx* dctx);
|
||||
|
||||
|
||||
/* --- Error List --- */
|
||||
#define LZ4F_LIST_ERRORS(ITEM) \
|
||||
ITEM(OK_NoError) ITEM(ERROR_GENERIC) \
|
||||
ITEM(ERROR_maxBlockSize_invalid) ITEM(ERROR_blockMode_invalid) ITEM(ERROR_contentChecksumFlag_invalid) \
|
||||
ITEM(OK_NoError) \
|
||||
ITEM(ERROR_GENERIC) \
|
||||
ITEM(ERROR_maxBlockSize_invalid) \
|
||||
ITEM(ERROR_blockMode_invalid) \
|
||||
ITEM(ERROR_contentChecksumFlag_invalid) \
|
||||
ITEM(ERROR_compressionLevel_invalid) \
|
||||
ITEM(ERROR_headerVersion_wrong) ITEM(ERROR_blockChecksum_unsupported) ITEM(ERROR_reservedFlag_set) \
|
||||
ITEM(ERROR_headerVersion_wrong) \
|
||||
ITEM(ERROR_blockChecksum_unsupported) \
|
||||
ITEM(ERROR_reservedFlag_set) \
|
||||
ITEM(ERROR_allocation_failed) \
|
||||
ITEM(ERROR_srcSize_tooLarge) ITEM(ERROR_dstMaxSize_tooSmall) \
|
||||
ITEM(ERROR_frameHeader_incomplete) ITEM(ERROR_frameType_unknown) ITEM(ERROR_frameSize_wrong) \
|
||||
ITEM(ERROR_srcSize_tooLarge) \
|
||||
ITEM(ERROR_dstMaxSize_tooSmall) \
|
||||
ITEM(ERROR_frameHeader_incomplete) \
|
||||
ITEM(ERROR_frameType_unknown) \
|
||||
ITEM(ERROR_frameSize_wrong) \
|
||||
ITEM(ERROR_srcPtr_wrong) \
|
||||
ITEM(ERROR_decompressionFailed) \
|
||||
ITEM(ERROR_headerChecksum_invalid) ITEM(ERROR_contentChecksum_invalid) \
|
||||
ITEM(ERROR_headerChecksum_invalid) \
|
||||
ITEM(ERROR_contentChecksum_invalid) \
|
||||
ITEM(ERROR_frameDecoding_alreadyStarted) \
|
||||
ITEM(ERROR_maxCode)
|
||||
|
||||
#define LZ4F_DISABLE_OLD_ENUMS /* comment to enable deprecated enums */
|
||||
#ifndef LZ4F_DISABLE_OLD_ENUMS
|
||||
# define LZ4F_GENERATE_ENUM(ENUM) LZ4F_##ENUM, ENUM = LZ4F_##ENUM,
|
||||
#else
|
||||
#define LZ4F_GENERATE_ENUM(ENUM) LZ4F_##ENUM,
|
||||
#endif
|
||||
typedef enum { LZ4F_LIST_ERRORS(LZ4F_GENERATE_ENUM) } LZ4F_errorCodes; /* enum is exposed, to handle specific errors; compare function result to -enum value */
|
||||
|
||||
/* enum list is exposed, to handle specific errors */
|
||||
typedef enum { LZ4F_LIST_ERRORS(LZ4F_GENERATE_ENUM) } LZ4F_errorCodes;
|
||||
|
||||
LZ4F_errorCodes LZ4F_getErrorCode(size_t functionResult);
|
||||
|
||||
|
@ -195,7 +195,7 @@ int basicTests(U32 seed, double compressibility)
|
||||
|
||||
/* Special case : null-content frame */
|
||||
testSize = 0;
|
||||
DISPLAYLEVEL(3, "LZ4F_compressFrame, compress null content : \n");
|
||||
DISPLAYLEVEL(3, "LZ4F_compressFrame, compress null content : ");
|
||||
cSize = LZ4F_compressFrame(compressedBuffer, LZ4F_compressFrameBound(testSize, NULL), CNBuffer, testSize, NULL);
|
||||
if (LZ4F_isError(cSize)) goto _output_error;
|
||||
DISPLAYLEVEL(3, "Compressed null content into a %i bytes frame \n", (int)cSize);
|
||||
@ -218,7 +218,7 @@ int basicTests(U32 seed, double compressibility)
|
||||
|
||||
/* test one-pass frame compression */
|
||||
testSize = COMPRESSIBLE_NOISE_LENGTH;
|
||||
DISPLAYLEVEL(3, "LZ4F_compressFrame, using default preferences : \n");
|
||||
DISPLAYLEVEL(3, "LZ4F_compressFrame, using default preferences : ");
|
||||
cSize = LZ4F_compressFrame(compressedBuffer, LZ4F_compressFrameBound(testSize, NULL), CNBuffer, testSize, NULL);
|
||||
if (LZ4F_isError(cSize)) goto _output_error;
|
||||
DISPLAYLEVEL(3, "Compressed %u bytes into a %u bytes frame \n", (U32)testSize, (U32)cSize);
|
||||
@ -232,10 +232,10 @@ int basicTests(U32 seed, double compressibility)
|
||||
LZ4F_errorCode_t errorCode = LZ4F_createDecompressionContext(&dCtx, LZ4F_VERSION);
|
||||
if (LZ4F_isError(errorCode)) goto _output_error;
|
||||
|
||||
DISPLAYLEVEL(3, "Single Pass decompression : \n");
|
||||
DISPLAYLEVEL(3, "Single Pass decompression : ");
|
||||
{ size_t const decompressError = LZ4F_decompress(dCtx, decodedBuffer, &decodedBufferSize, compressedBuffer, &compressedBufferSize, NULL);
|
||||
if (LZ4F_isError(decompressError)) goto _output_error; }
|
||||
{ U64 const crcDest = XXH64(decodedBuffer, COMPRESSIBLE_NOISE_LENGTH, 1);
|
||||
{ U64 const crcDest = XXH64(decodedBuffer, decodedBufferSize, 1);
|
||||
if (crcDest != crcOrig) goto _output_error; }
|
||||
DISPLAYLEVEL(3, "Regenerated %u bytes \n", (U32)decodedBufferSize);
|
||||
|
||||
@ -276,19 +276,27 @@ int basicTests(U32 seed, double compressibility)
|
||||
if (LZ4F_isError(errorCode)) goto _output_error;
|
||||
DISPLAYLEVEL(3, " %u \n", (unsigned)errorCode);
|
||||
|
||||
DISPLAYLEVEL(3, "get FrameInfo on null input : ");
|
||||
errorCode = LZ4F_getFrameInfo(dCtx, &fi, ip, &iSize);
|
||||
if (errorCode != (size_t)-LZ4F_ERROR_frameHeader_incomplete) goto _output_error;
|
||||
DISPLAYLEVEL(3, " correctly failed : %s \n", LZ4F_getErrorName(errorCode));
|
||||
DISPLAYLEVEL(3, "LZ4F_getFrameInfo on zero-size input : ");
|
||||
{ size_t nullSize = 0;
|
||||
size_t const fiError = LZ4F_getFrameInfo(dCtx, &fi, ip, &nullSize);
|
||||
if (LZ4F_getErrorCode(fiError) != LZ4F_ERROR_frameHeader_incomplete) {
|
||||
DISPLAYLEVEL(3, "incorrect error : %s != ERROR_frameHeader_incomplete \n", LZ4F_getErrorName(fiError));
|
||||
goto _output_error;
|
||||
}
|
||||
DISPLAYLEVEL(3, " correctly failed : %s \n", LZ4F_getErrorName(fiError));
|
||||
}
|
||||
|
||||
DISPLAYLEVEL(3, "get FrameInfo on not enough input : ");
|
||||
iSize = 6;
|
||||
errorCode = LZ4F_getFrameInfo(dCtx, &fi, ip, &iSize);
|
||||
if (errorCode != (size_t)-LZ4F_ERROR_frameHeader_incomplete) goto _output_error;
|
||||
DISPLAYLEVEL(3, " correctly failed : %s \n", LZ4F_getErrorName(errorCode));
|
||||
ip += iSize;
|
||||
DISPLAYLEVEL(3, "LZ4F_getFrameInfo on not enough input : ");
|
||||
{ size_t inputSize = 6;
|
||||
size_t const fiError = LZ4F_getFrameInfo(dCtx, &fi, ip, &inputSize);
|
||||
if (LZ4F_getErrorCode(fiError) != LZ4F_ERROR_frameHeader_incomplete) {
|
||||
DISPLAYLEVEL(3, "incorrect error : %s != ERROR_frameHeader_incomplete \n", LZ4F_getErrorName(fiError));
|
||||
goto _output_error;
|
||||
}
|
||||
DISPLAYLEVEL(3, " correctly failed : %s \n", LZ4F_getErrorName(fiError));
|
||||
}
|
||||
|
||||
DISPLAYLEVEL(3, "get FrameInfo on enough input : ");
|
||||
DISPLAYLEVEL(3, "LZ4F_getFrameInfo on enough input : ");
|
||||
iSize = 15 - iSize;
|
||||
errorCode = LZ4F_getFrameInfo(dCtx, &fi, ip, &iSize);
|
||||
if (LZ4F_isError(errorCode)) goto _output_error;
|
||||
@ -296,7 +304,7 @@ int basicTests(U32 seed, double compressibility)
|
||||
ip += iSize;
|
||||
}
|
||||
|
||||
DISPLAYLEVEL(3, "Byte after byte : \n");
|
||||
DISPLAYLEVEL(3, "Byte after byte : ");
|
||||
{ BYTE* const ostart = (BYTE*)decodedBuffer;
|
||||
BYTE* op = ostart;
|
||||
BYTE* const oend = (BYTE*)decodedBuffer + COMPRESSIBLE_NOISE_LENGTH;
|
||||
@ -318,20 +326,20 @@ int basicTests(U32 seed, double compressibility)
|
||||
dCtx = NULL;
|
||||
}
|
||||
|
||||
DISPLAYLEVEL(3, "Using 64 KB block : \n");
|
||||
DISPLAYLEVEL(3, "Using 64 KB block : ");
|
||||
prefs.frameInfo.blockSizeID = LZ4F_max64KB;
|
||||
prefs.frameInfo.contentChecksumFlag = LZ4F_contentChecksumEnabled;
|
||||
cSize = LZ4F_compressFrame(compressedBuffer, LZ4F_compressFrameBound(testSize, &prefs), CNBuffer, testSize, &prefs);
|
||||
if (LZ4F_isError(cSize)) goto _output_error;
|
||||
DISPLAYLEVEL(3, "Compressed %i bytes into a %i bytes frame \n", (int)testSize, (int)cSize);
|
||||
|
||||
DISPLAYLEVEL(3, "without checksum : \n");
|
||||
DISPLAYLEVEL(3, "without checksum : ");
|
||||
prefs.frameInfo.contentChecksumFlag = LZ4F_noContentChecksum;
|
||||
cSize = LZ4F_compressFrame(compressedBuffer, LZ4F_compressFrameBound(testSize, &prefs), CNBuffer, testSize, &prefs);
|
||||
if (LZ4F_isError(cSize)) goto _output_error;
|
||||
DISPLAYLEVEL(3, "Compressed %i bytes into a %i bytes frame \n", (int)testSize, (int)cSize);
|
||||
|
||||
DISPLAYLEVEL(3, "Using 256 KB block : \n");
|
||||
DISPLAYLEVEL(3, "Using 256 KB block : ");
|
||||
prefs.frameInfo.blockSizeID = LZ4F_max256KB;
|
||||
prefs.frameInfo.contentChecksumFlag = LZ4F_contentChecksumEnabled;
|
||||
cSize = LZ4F_compressFrame(compressedBuffer, LZ4F_compressFrameBound(testSize, &prefs), CNBuffer, testSize, &prefs);
|
||||
@ -350,7 +358,7 @@ int basicTests(U32 seed, double compressibility)
|
||||
{ LZ4F_errorCode_t const createError = LZ4F_createDecompressionContext(&dCtx, LZ4F_VERSION);
|
||||
if (LZ4F_isError(createError)) goto _output_error; }
|
||||
|
||||
DISPLAYLEVEL(3, "random segment sizes : \n");
|
||||
DISPLAYLEVEL(3, "random segment sizes : ");
|
||||
while (ip < iend) {
|
||||
unsigned const nbBits = FUZ_rand(&randState) % maxBits;
|
||||
size_t iSize = (FUZ_rand(&randState) & ((1<<nbBits)-1)) + 1;
|
||||
@ -372,39 +380,39 @@ int basicTests(U32 seed, double compressibility)
|
||||
dCtx = NULL;
|
||||
}
|
||||
|
||||
DISPLAYLEVEL(3, "without checksum : \n");
|
||||
DISPLAYLEVEL(3, "without checksum : ");
|
||||
prefs.frameInfo.contentChecksumFlag = LZ4F_noContentChecksum;
|
||||
cSize = LZ4F_compressFrame(compressedBuffer, LZ4F_compressFrameBound(testSize, &prefs), CNBuffer, testSize, &prefs);
|
||||
if (LZ4F_isError(cSize)) goto _output_error;
|
||||
DISPLAYLEVEL(3, "Compressed %i bytes into a %i bytes frame \n", (int)testSize, (int)cSize);
|
||||
|
||||
DISPLAYLEVEL(3, "Using 1 MB block : \n");
|
||||
DISPLAYLEVEL(3, "Using 1 MB block : ");
|
||||
prefs.frameInfo.blockSizeID = LZ4F_max1MB;
|
||||
prefs.frameInfo.contentChecksumFlag = LZ4F_contentChecksumEnabled;
|
||||
cSize = LZ4F_compressFrame(compressedBuffer, LZ4F_compressFrameBound(testSize, &prefs), CNBuffer, testSize, &prefs);
|
||||
if (LZ4F_isError(cSize)) goto _output_error;
|
||||
DISPLAYLEVEL(3, "Compressed %i bytes into a %i bytes frame \n", (int)testSize, (int)cSize);
|
||||
|
||||
DISPLAYLEVEL(3, "without checksum : \n");
|
||||
DISPLAYLEVEL(3, "without checksum : ");
|
||||
prefs.frameInfo.contentChecksumFlag = LZ4F_noContentChecksum;
|
||||
cSize = LZ4F_compressFrame(compressedBuffer, LZ4F_compressFrameBound(testSize, &prefs), CNBuffer, testSize, &prefs);
|
||||
if (LZ4F_isError(cSize)) goto _output_error;
|
||||
DISPLAYLEVEL(3, "Compressed %i bytes into a %i bytes frame \n", (int)testSize, (int)cSize);
|
||||
|
||||
DISPLAYLEVEL(3, "Using 4 MB block : \n");
|
||||
DISPLAYLEVEL(3, "Using 4 MB block : ");
|
||||
prefs.frameInfo.blockSizeID = LZ4F_max4MB;
|
||||
prefs.frameInfo.contentChecksumFlag = LZ4F_contentChecksumEnabled;
|
||||
{ size_t const dstCapacity = LZ4F_compressFrameBound(testSize, &prefs);
|
||||
DISPLAYLEVEL(4, "dstCapacity = %u \n", (U32)dstCapacity)
|
||||
DISPLAYLEVEL(4, "dstCapacity = %u ; ", (U32)dstCapacity)
|
||||
cSize = LZ4F_compressFrame(compressedBuffer, dstCapacity, CNBuffer, testSize, &prefs);
|
||||
if (LZ4F_isError(cSize)) goto _output_error;
|
||||
DISPLAYLEVEL(3, "Compressed %u bytes into a %u bytes frame \n", (U32)testSize, (U32)cSize);
|
||||
}
|
||||
|
||||
DISPLAYLEVEL(3, "without checksum : \n");
|
||||
DISPLAYLEVEL(3, "without checksum : ");
|
||||
prefs.frameInfo.contentChecksumFlag = LZ4F_noContentChecksum;
|
||||
{ size_t const dstCapacity = LZ4F_compressFrameBound(testSize, &prefs);
|
||||
DISPLAYLEVEL(4, "dstCapacity = %u \n", (U32)dstCapacity)
|
||||
DISPLAYLEVEL(4, "dstCapacity = %u ; ", (U32)dstCapacity)
|
||||
cSize = LZ4F_compressFrame(compressedBuffer, dstCapacity, CNBuffer, testSize, &prefs);
|
||||
if (LZ4F_isError(cSize)) goto _output_error;
|
||||
DISPLAYLEVEL(3, "Compressed %u bytes into a %u bytes frame \n", (U32)testSize, (U32)cSize);
|
||||
@ -416,7 +424,7 @@ int basicTests(U32 seed, double compressibility)
|
||||
errorCode = LZ4F_createCompressionContext(&cctx, LZ4F_VERSION);
|
||||
if (LZ4F_isError(errorCode)) goto _output_error;
|
||||
|
||||
DISPLAYLEVEL(3, "compress without frameSize : \n");
|
||||
DISPLAYLEVEL(3, "compress without frameSize : ");
|
||||
memset(&(prefs.frameInfo), 0, sizeof(prefs.frameInfo));
|
||||
errorCode = LZ4F_compressBegin(cctx, compressedBuffer, testSize, &prefs);
|
||||
if (LZ4F_isError(errorCode)) goto _output_error;
|
||||
@ -428,7 +436,7 @@ int basicTests(U32 seed, double compressibility)
|
||||
if (LZ4F_isError(errorCode)) goto _output_error;
|
||||
DISPLAYLEVEL(3, "Compressed %i bytes into a %i bytes frame \n", (int)testSize, (int)(op-ostart));
|
||||
|
||||
DISPLAYLEVEL(3, "compress with frameSize : \n");
|
||||
DISPLAYLEVEL(3, "compress with frameSize : ");
|
||||
prefs.frameInfo.contentSize = testSize;
|
||||
op = ostart;
|
||||
errorCode = LZ4F_compressBegin(cctx, compressedBuffer, testSize, &prefs);
|
||||
@ -441,7 +449,7 @@ int basicTests(U32 seed, double compressibility)
|
||||
if (LZ4F_isError(errorCode)) goto _output_error;
|
||||
DISPLAYLEVEL(3, "Compressed %i bytes into a %i bytes frame \n", (int)testSize, (int)(op-ostart));
|
||||
|
||||
DISPLAYLEVEL(3, "compress with wrong frameSize : \n");
|
||||
DISPLAYLEVEL(3, "compress with wrong frameSize : ");
|
||||
prefs.frameInfo.contentSize = testSize+1;
|
||||
op = ostart;
|
||||
errorCode = LZ4F_compressBegin(cctx, compressedBuffer, testSize, &prefs);
|
||||
@ -497,7 +505,7 @@ int basicTests(U32 seed, double compressibility)
|
||||
iend = ip+8;
|
||||
|
||||
while (ip < iend) {
|
||||
unsigned nbBits = FUZ_rand(&randState) % maxBits;
|
||||
unsigned const nbBits = FUZ_rand(&randState) % maxBits;
|
||||
size_t iSize = (FUZ_rand(&randState) & ((1<<nbBits)-1)) + 1;
|
||||
size_t oSize = oend-op;
|
||||
if (iSize > (size_t)(iend-ip)) iSize = iend-ip;
|
||||
|
Loading…
Reference in New Issue
Block a user