mirror of
https://github.com/emmanuel-marty/lzsa.git
synced 2024-12-23 22:29:27 +00:00
Fix self-tests, in-memory benchmarks in raw mode
This commit is contained in:
parent
659f6c14a9
commit
2e48e926a1
@ -93,22 +93,27 @@ size_t lzsa_get_max_decompressed_size_inmem(const unsigned char *pFileData, size
|
|||||||
* @param pOutBuffer buffer for decompressed data
|
* @param pOutBuffer buffer for decompressed data
|
||||||
* @param nFileSize compressed size in bytes
|
* @param nFileSize compressed size in bytes
|
||||||
* @param nMaxOutBufferSize maximum capacity of decompression buffer
|
* @param nMaxOutBufferSize maximum capacity of decompression buffer
|
||||||
|
* @param nFlags compression flags (LZSA_FLAG_xxx)
|
||||||
* @param pFormatVersion pointer to format version, updated if this function is successful
|
* @param pFormatVersion pointer to format version, updated if this function is successful
|
||||||
*
|
*
|
||||||
* @return actual decompressed size, or -1 for error
|
* @return actual decompressed size, or -1 for error
|
||||||
*/
|
*/
|
||||||
size_t lzsa_decompress_inmem(const unsigned char *pFileData, unsigned char *pOutBuffer, size_t nFileSize, size_t nMaxOutBufferSize, int *pFormatVersion) {
|
size_t lzsa_decompress_inmem(const unsigned char *pFileData, unsigned char *pOutBuffer, size_t nFileSize, size_t nMaxOutBufferSize, const unsigned int nFlags, int *pFormatVersion) {
|
||||||
const unsigned char *pCurFileData = pFileData;
|
const unsigned char *pCurFileData = pFileData;
|
||||||
const unsigned char *pEndFileData = pCurFileData + nFileSize;
|
const unsigned char *pEndFileData = pCurFileData + nFileSize;
|
||||||
unsigned char *pCurOutBuffer = pOutBuffer;
|
unsigned char *pCurOutBuffer = pOutBuffer;
|
||||||
const unsigned char *pEndOutBuffer = pCurOutBuffer + nMaxOutBufferSize;
|
const unsigned char *pEndOutBuffer = pCurOutBuffer + nMaxOutBufferSize;
|
||||||
int nFormatVersion = 0;
|
|
||||||
int nPreviousBlockSize;
|
int nPreviousBlockSize;
|
||||||
const int nHeaderSize = lzsa_get_header_size();
|
const int nHeaderSize = lzsa_get_header_size();
|
||||||
|
|
||||||
|
if (nFlags & LZSA_FLAG_RAW_BLOCK) {
|
||||||
|
int nEODBytes = (*pFormatVersion == 2) ? 2 : 4;
|
||||||
|
return (size_t)lzsa_decompressor_expand_block(pFileData, (int)nFileSize - nEODBytes /* EOD marker */, pOutBuffer, 0, (int)nMaxOutBufferSize, *pFormatVersion);
|
||||||
|
}
|
||||||
|
|
||||||
/* Check header */
|
/* Check header */
|
||||||
if ((pCurFileData + nHeaderSize) > pEndFileData ||
|
if ((pCurFileData + nHeaderSize) > pEndFileData ||
|
||||||
lzsa_decode_header(pCurFileData, nHeaderSize, &nFormatVersion) != 0)
|
lzsa_decode_header(pCurFileData, nHeaderSize, pFormatVersion) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
pCurFileData += nHeaderSize;
|
pCurFileData += nHeaderSize;
|
||||||
@ -135,7 +140,7 @@ size_t lzsa_decompress_inmem(const unsigned char *pFileData, unsigned char *pOut
|
|||||||
if ((pCurFileData + nBlockDataSize) > pEndFileData)
|
if ((pCurFileData + nBlockDataSize) > pEndFileData)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
nDecompressedSize = lzsa_decompressor_expand_block(pCurFileData, nBlockDataSize, pCurOutBuffer - nPreviousBlockSize, nPreviousBlockSize, (int)(pEndOutBuffer - pCurOutBuffer + nPreviousBlockSize), nFormatVersion);
|
nDecompressedSize = lzsa_decompressor_expand_block(pCurFileData, nBlockDataSize, pCurOutBuffer - nPreviousBlockSize, nPreviousBlockSize, (int)(pEndOutBuffer - pCurOutBuffer + nPreviousBlockSize), *pFormatVersion);
|
||||||
if (nDecompressedSize < 0)
|
if (nDecompressedSize < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -155,6 +160,5 @@ size_t lzsa_decompress_inmem(const unsigned char *pFileData, unsigned char *pOut
|
|||||||
pCurFileData += nBlockDataSize;
|
pCurFileData += nBlockDataSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
*pFormatVersion = nFormatVersion;
|
|
||||||
return (int)(pCurOutBuffer - pOutBuffer);
|
return (int)(pCurOutBuffer - pOutBuffer);
|
||||||
}
|
}
|
||||||
|
@ -56,11 +56,12 @@ size_t lzsa_get_max_decompressed_size_inmem(const unsigned char *pFileData, size
|
|||||||
* @param pOutBuffer buffer for decompressed data
|
* @param pOutBuffer buffer for decompressed data
|
||||||
* @param nFileSize compressed size in bytes
|
* @param nFileSize compressed size in bytes
|
||||||
* @param nMaxOutBufferSize maximum capacity of decompression buffer
|
* @param nMaxOutBufferSize maximum capacity of decompression buffer
|
||||||
|
* @param nFlags compression flags (LZSA_FLAG_xxx)
|
||||||
* @param pFormatVersion pointer to format version, updated if this function is successful
|
* @param pFormatVersion pointer to format version, updated if this function is successful
|
||||||
*
|
*
|
||||||
* @return actual decompressed size, or -1 for error
|
* @return actual decompressed size, or -1 for error
|
||||||
*/
|
*/
|
||||||
size_t lzsa_decompress_inmem(const unsigned char *pFileData, unsigned char *pOutBuffer, size_t nFileSize, size_t nMaxOutBufferSize, int *pFormatVersion);
|
size_t lzsa_decompress_inmem(const unsigned char *pFileData, unsigned char *pOutBuffer, size_t nFileSize, size_t nMaxOutBufferSize, const unsigned int nFlags, int *pFormatVersion);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
21
src/lzsa.c
21
src/lzsa.c
@ -470,11 +470,11 @@ static int do_self_test(const unsigned int nOptions, const int nMinMatchSize, in
|
|||||||
size_t nDataSizeStep = 128;
|
size_t nDataSizeStep = 128;
|
||||||
float fProbabilitySizeStep = 0.0005f;
|
float fProbabilitySizeStep = 0.0005f;
|
||||||
|
|
||||||
for (nGeneratedDataSize = 1024; nGeneratedDataSize <= (4 * BLOCK_SIZE); nGeneratedDataSize += nDataSizeStep) {
|
for (nGeneratedDataSize = 1024; nGeneratedDataSize <= ((nOptions & OPT_RAW) ? BLOCK_SIZE : (4 * BLOCK_SIZE)); nGeneratedDataSize += nDataSizeStep) {
|
||||||
float fMatchProbability;
|
float fMatchProbability;
|
||||||
|
|
||||||
fprintf(stdout, "size %zd", nGeneratedDataSize);
|
fprintf(stdout, "size %zd", nGeneratedDataSize);
|
||||||
for (fMatchProbability = 0; fMatchProbability <= 0.995f; fMatchProbability += fProbabilitySizeStep) {
|
for (fMatchProbability = ((nOptions & OPT_RAW) ? 0.5f : 0.1f); fMatchProbability <= 0.995f; fMatchProbability += fProbabilitySizeStep) {
|
||||||
int nNumLiteralValues[12] = { 1, 2, 3, 15, 30, 56, 96, 137, 178, 191, 255, 256 };
|
int nNumLiteralValues[12] = { 1, 2, 3, 15, 30, 56, 96, 137, 178, 191, 255, 256 };
|
||||||
float fXorProbability;
|
float fXorProbability;
|
||||||
|
|
||||||
@ -504,8 +504,8 @@ static int do_self_test(const unsigned int nOptions, const int nMinMatchSize, in
|
|||||||
|
|
||||||
/* Try to decompress it, expected to succeed */
|
/* Try to decompress it, expected to succeed */
|
||||||
size_t nActualDecompressedSize;
|
size_t nActualDecompressedSize;
|
||||||
int nDecFormatVersion = 0;
|
int nDecFormatVersion = nFormatVersion;
|
||||||
nActualDecompressedSize = lzsa_decompress_inmem(pCompressedData, pTmpDecompressedData, nActualCompressedSize, nGeneratedDataSize, &nDecFormatVersion);
|
nActualDecompressedSize = lzsa_decompress_inmem(pCompressedData, pTmpDecompressedData, nActualCompressedSize, nGeneratedDataSize, nFlags, &nDecFormatVersion);
|
||||||
if (nActualDecompressedSize == -1) {
|
if (nActualDecompressedSize == -1) {
|
||||||
free(pTmpDecompressedData);
|
free(pTmpDecompressedData);
|
||||||
pTmpDecompressedData = NULL;
|
pTmpDecompressedData = NULL;
|
||||||
@ -538,7 +538,8 @@ static int do_self_test(const unsigned int nOptions, const int nMinMatchSize, in
|
|||||||
for (fXorProbability = 0.05f; fXorProbability <= 0.5f; fXorProbability += 0.05f) {
|
for (fXorProbability = 0.05f; fXorProbability <= 0.5f; fXorProbability += 0.05f) {
|
||||||
memcpy(pTmpCompressedData, pCompressedData, nActualCompressedSize);
|
memcpy(pTmpCompressedData, pCompressedData, nActualCompressedSize);
|
||||||
xor_data(pTmpCompressedData + lzsa_get_header_size() + lzsa_get_frame_size(), nActualCompressedSize - lzsa_get_header_size() - lzsa_get_frame_size() - lzsa_get_frame_size() /* footer */, nSeed, fXorProbability);
|
xor_data(pTmpCompressedData + lzsa_get_header_size() + lzsa_get_frame_size(), nActualCompressedSize - lzsa_get_header_size() - lzsa_get_frame_size() - lzsa_get_frame_size() /* footer */, nSeed, fXorProbability);
|
||||||
lzsa_decompress_inmem(pTmpCompressedData, pGeneratedData, nActualCompressedSize, nGeneratedDataSize, &nDecFormatVersion);
|
nDecFormatVersion = nFormatVersion;
|
||||||
|
lzsa_decompress_inmem(pTmpCompressedData, pGeneratedData, nActualCompressedSize, nGeneratedDataSize, nFlags, &nDecFormatVersion);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -710,8 +711,13 @@ static int do_dec_benchmark(const char *pszInFilename, const char *pszOutFilenam
|
|||||||
size_t nFileSize, nMaxDecompressedSize;
|
size_t nFileSize, nMaxDecompressedSize;
|
||||||
unsigned char *pFileData;
|
unsigned char *pFileData;
|
||||||
unsigned char *pDecompressedData;
|
unsigned char *pDecompressedData;
|
||||||
|
int nFlags;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
nFlags = 0;
|
||||||
|
if (nOptions & OPT_RAW)
|
||||||
|
nFlags |= LZSA_FLAG_RAW_BLOCK;
|
||||||
|
|
||||||
if (pszDictionaryFilename) {
|
if (pszDictionaryFilename) {
|
||||||
fprintf(stderr, "in-memory benchmarking does not support dictionaries\n");
|
fprintf(stderr, "in-memory benchmarking does not support dictionaries\n");
|
||||||
return 100;
|
return 100;
|
||||||
@ -771,10 +777,7 @@ static int do_dec_benchmark(const char *pszInFilename, const char *pszOutFilenam
|
|||||||
size_t nActualDecompressedSize = 0;
|
size_t nActualDecompressedSize = 0;
|
||||||
for (i = 0; i < 50; i++) {
|
for (i = 0; i < 50; i++) {
|
||||||
long long t0 = do_get_time();
|
long long t0 = do_get_time();
|
||||||
if (nOptions & OPT_RAW)
|
nActualDecompressedSize = lzsa_decompress_inmem(pFileData, pDecompressedData, nFileSize, nMaxDecompressedSize, nFlags, &nFormatVersion);
|
||||||
nActualDecompressedSize = lzsa_decompressor_expand_block(pFileData, (int)nFileSize - 4 /* EOD marker */, pDecompressedData, 0, (int)nMaxDecompressedSize, nFormatVersion);
|
|
||||||
else
|
|
||||||
nActualDecompressedSize = lzsa_decompress_inmem(pFileData, pDecompressedData, nFileSize, nMaxDecompressedSize, &nFormatVersion);
|
|
||||||
long long t1 = do_get_time();
|
long long t1 = do_get_time();
|
||||||
if (nActualDecompressedSize == -1) {
|
if (nActualDecompressedSize == -1) {
|
||||||
free(pDecompressedData);
|
free(pDecompressedData);
|
||||||
|
@ -102,11 +102,17 @@ size_t lzsa_compress_inmem(const unsigned char *pInputData, unsigned char *pOutB
|
|||||||
|
|
||||||
int nOutDataSize;
|
int nOutDataSize;
|
||||||
int nOutDataEnd = (int)(nMaxOutBufferSize - (lzsa_get_frame_size() + nCompressedSize + lzsa_get_frame_size() /* footer */));
|
int nOutDataEnd = (int)(nMaxOutBufferSize - (lzsa_get_frame_size() + nCompressedSize + lzsa_get_frame_size() /* footer */));
|
||||||
|
int nFrameSize = lzsa_get_frame_size();
|
||||||
|
|
||||||
|
if ((nFlags & LZSA_FLAG_RAW_BLOCK) != 0) {
|
||||||
|
nFrameSize = 0;
|
||||||
|
nOutDataEnd = (int)(nMaxOutBufferSize);
|
||||||
|
}
|
||||||
|
|
||||||
if (nOutDataEnd > BLOCK_SIZE)
|
if (nOutDataEnd > BLOCK_SIZE)
|
||||||
nOutDataEnd = BLOCK_SIZE;
|
nOutDataEnd = BLOCK_SIZE;
|
||||||
|
|
||||||
nOutDataSize = lzsa_compressor_shrink_block(&compressor, pInputData + nOriginalSize - nPreviousBlockSize, nPreviousBlockSize, nInDataSize, pOutBuffer + lzsa_get_frame_size() + nCompressedSize, nOutDataEnd);
|
nOutDataSize = lzsa_compressor_shrink_block(&compressor, pInputData + nOriginalSize - nPreviousBlockSize, nPreviousBlockSize, nInDataSize, pOutBuffer + nFrameSize + nCompressedSize, nOutDataEnd);
|
||||||
if (nOutDataSize >= 0) {
|
if (nOutDataSize >= 0) {
|
||||||
/* Write compressed block */
|
/* Write compressed block */
|
||||||
|
|
||||||
@ -116,11 +122,13 @@ size_t lzsa_compress_inmem(const unsigned char *pInputData, unsigned char *pOutB
|
|||||||
nError = LZSA_ERROR_COMPRESSION;
|
nError = LZSA_ERROR_COMPRESSION;
|
||||||
else {
|
else {
|
||||||
nCompressedSize += nBlockheaderSize;
|
nCompressedSize += nBlockheaderSize;
|
||||||
|
|
||||||
nOriginalSize += nInDataSize;
|
|
||||||
nCompressedSize += nOutDataSize;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!nError) {
|
||||||
|
nOriginalSize += nInDataSize;
|
||||||
|
nCompressedSize += nOutDataSize;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* Write uncompressible, literal block */
|
/* Write uncompressible, literal block */
|
||||||
|
Loading…
Reference in New Issue
Block a user