Fix self-tests, in-memory benchmarks in raw mode

This commit is contained in:
Emmanuel Marty 2019-06-08 18:05:00 +02:00 committed by GitHub
parent 659f6c14a9
commit 2e48e926a1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 35 additions and 19 deletions

View File

@ -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);
} }

View File

@ -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
} }

View File

@ -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);

View File

@ -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 */