mirror of
https://github.com/emmanuel-marty/lzsa.git
synced 2024-11-26 02:49:19 +00:00
Small LZSA2 token count reduction
This commit is contained in:
parent
03f841d04f
commit
b09dadb1c1
@ -413,7 +413,10 @@ static void lzsa_optimize_forward_v2(lzsa_compressor *pCompressor, const unsigne
|
|||||||
static int lzsa_optimize_command_count_v2(lzsa_compressor *pCompressor, const unsigned char *pInWindow, lzsa_match *pBestMatch, const int nStartOffset, const int nEndOffset) {
|
static int lzsa_optimize_command_count_v2(lzsa_compressor *pCompressor, const unsigned char *pInWindow, lzsa_match *pBestMatch, const int nStartOffset, const int nEndOffset) {
|
||||||
int i;
|
int i;
|
||||||
int nNumLiterals = 0;
|
int nNumLiterals = 0;
|
||||||
|
int nPrevRepMatchOffset = 0;
|
||||||
int nRepMatchOffset = 0;
|
int nRepMatchOffset = 0;
|
||||||
|
int nRepMatchLen = 0;
|
||||||
|
int nRepIndex = 0;
|
||||||
int nDidReduce = 0;
|
int nDidReduce = 0;
|
||||||
|
|
||||||
for (i = nStartOffset; i < nEndOffset; ) {
|
for (i = nStartOffset; i < nEndOffset; ) {
|
||||||
@ -502,6 +505,15 @@ static int lzsa_optimize_command_count_v2(lzsa_compressor *pCompressor, const un
|
|||||||
if (pBestMatch[nNextIndex].offset != nRepMatchOffset)
|
if (pBestMatch[nNextIndex].offset != nRepMatchOffset)
|
||||||
nReducedCommandSize += (pBestMatch[nNextIndex].offset <= 32) ? 4 : ((pBestMatch[nNextIndex].offset <= 512) ? 8 : ((pBestMatch[nNextIndex].offset <= (8192 + 512)) ? 12 : 16));
|
nReducedCommandSize += (pBestMatch[nNextIndex].offset <= 32) ? 4 : ((pBestMatch[nNextIndex].offset <= 512) ? 8 : ((pBestMatch[nNextIndex].offset <= (8192 + 512)) ? 12 : 16));
|
||||||
|
|
||||||
|
int nReplaceRepOffset = 0;
|
||||||
|
if (nRepMatchOffset && nRepMatchOffset != nPrevRepMatchOffset && nRepMatchLen >= MIN_MATCH_SIZE_V2 && nRepMatchOffset != pBestMatch[nNextIndex].offset && nRepIndex >= pBestMatch[nNextIndex].offset &&
|
||||||
|
(nRepIndex - pBestMatch[nNextIndex].offset + nRepMatchLen) <= (nEndOffset - LAST_LITERALS) &&
|
||||||
|
!memcmp(pInWindow + nRepIndex - nRepMatchOffset, pInWindow + nRepIndex - pBestMatch[nNextIndex].offset, nRepMatchLen)) {
|
||||||
|
/* Replacing this match command by literals would let us create a repmatch */
|
||||||
|
nReplaceRepOffset = 1;
|
||||||
|
nReducedCommandSize -= (nRepMatchOffset <= 32) ? 4 : ((nRepMatchOffset <= 512) ? 8 : ((nRepMatchOffset <= (8192 + 512)) ? 12 : 16));
|
||||||
|
}
|
||||||
|
|
||||||
if (nOriginalCombinedCommandSize >= nReducedCommandSize) {
|
if (nOriginalCombinedCommandSize >= nReducedCommandSize) {
|
||||||
/* Reduce */
|
/* Reduce */
|
||||||
int nMatchLen = pMatch->length;
|
int nMatchLen = pMatch->length;
|
||||||
@ -512,6 +524,11 @@ static int lzsa_optimize_command_count_v2(lzsa_compressor *pCompressor, const un
|
|||||||
}
|
}
|
||||||
|
|
||||||
nDidReduce = 1;
|
nDidReduce = 1;
|
||||||
|
|
||||||
|
if (nReplaceRepOffset) {
|
||||||
|
pBestMatch[nRepIndex].offset = pBestMatch[nNextIndex].offset;
|
||||||
|
nRepMatchOffset = pBestMatch[nNextIndex].offset;
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -532,7 +549,10 @@ static int lzsa_optimize_command_count_v2(lzsa_compressor *pCompressor, const un
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nPrevRepMatchOffset = nRepMatchOffset;
|
||||||
nRepMatchOffset = pMatch->offset;
|
nRepMatchOffset = pMatch->offset;
|
||||||
|
nRepMatchLen = pMatch->length;
|
||||||
|
nRepIndex = i;
|
||||||
|
|
||||||
i += pMatch->length;
|
i += pMatch->length;
|
||||||
nNumLiterals = 0;
|
nNumLiterals = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user