mirror of
https://github.com/Xevion/easy7zip.git
synced 2026-02-01 08:24:14 -06:00
4.59 beta
This commit is contained in:
committed by
Kornel Lesiński
parent
3901bf0ab8
commit
173c07e166
@@ -14,9 +14,9 @@ struct CEncodeInfo: public CInfo
|
||||
|
||||
void EncodeBinSymbol(int symbol, NRangeCoder::CEncoder *rangeEncoder)
|
||||
{
|
||||
PPM_CONTEXT::STATE& rs = MinContext->oneState();
|
||||
PPM_CONTEXT::STATE& rs = MinContext->oneState();
|
||||
UInt16 &bs = GetBinSumm(rs, GetContextNoCheck(MinContext->Suffix)->NumStats);
|
||||
if (rs.Symbol == symbol)
|
||||
if (rs.Symbol == symbol)
|
||||
{
|
||||
FoundState = &rs;
|
||||
rs.Freq = (Byte)(rs.Freq + (rs.Freq < 128 ? 1: 0));
|
||||
@@ -24,15 +24,15 @@ struct CEncodeInfo: public CInfo
|
||||
bs = (UInt16)(bs + INTERVAL - GET_MEAN(bs, PERIOD_BITS, 2));
|
||||
PrevSuccess = 1;
|
||||
RunLength++;
|
||||
}
|
||||
else
|
||||
}
|
||||
else
|
||||
{
|
||||
rangeEncoder->EncodeBit(bs, TOT_BITS, 1);
|
||||
bs = (UInt16)(bs - GET_MEAN(bs, PERIOD_BITS, 2));
|
||||
InitEsc = ExpEscape[bs >> 10];
|
||||
NumMasked = 1;
|
||||
NumMasked = 1;
|
||||
CharMask[rs.Symbol] = EscCount;
|
||||
PrevSuccess = 0;
|
||||
PrevSuccess = 0;
|
||||
FoundState = NULL;
|
||||
}
|
||||
}
|
||||
@@ -40,27 +40,27 @@ struct CEncodeInfo: public CInfo
|
||||
void EncodeSymbol1(int symbol, NRangeCoder::CEncoder *rangeEncoder)
|
||||
{
|
||||
PPM_CONTEXT::STATE* p = GetStateNoCheck(MinContext->Stats);
|
||||
if (p->Symbol == symbol)
|
||||
if (p->Symbol == symbol)
|
||||
{
|
||||
PrevSuccess = (2 * (p->Freq) > MinContext->SummFreq);
|
||||
RunLength += PrevSuccess;
|
||||
rangeEncoder->Encode(0, p->Freq, MinContext->SummFreq);
|
||||
(FoundState = p)->Freq += 4;
|
||||
(FoundState = p)->Freq += 4;
|
||||
MinContext->SummFreq += 4;
|
||||
if (p->Freq > MAX_FREQ)
|
||||
if (p->Freq > MAX_FREQ)
|
||||
rescale();
|
||||
return;
|
||||
}
|
||||
PrevSuccess = 0;
|
||||
int LoCnt = p->Freq, i = MinContext->NumStats - 1;
|
||||
while ((++p)->Symbol != symbol)
|
||||
while ((++p)->Symbol != symbol)
|
||||
{
|
||||
LoCnt += p->Freq;
|
||||
if (--i == 0)
|
||||
if (--i == 0)
|
||||
{
|
||||
HiBitsFlag = HB2Flag[FoundState->Symbol];
|
||||
CharMask[p->Symbol] = EscCount;
|
||||
i=(NumMasked = MinContext->NumStats)-1;
|
||||
i=(NumMasked = MinContext->NumStats)-1;
|
||||
FoundState = NULL;
|
||||
do { CharMask[(--p)->Symbol] = EscCount; } while ( --i );
|
||||
rangeEncoder->Encode(LoCnt, MinContext->SummFreq - LoCnt, MinContext->SummFreq);
|
||||
@@ -76,16 +76,16 @@ struct CEncodeInfo: public CInfo
|
||||
int hiCnt, i = MinContext->NumStats - NumMasked;
|
||||
UInt32 scale;
|
||||
SEE2_CONTEXT* psee2c = makeEscFreq2(i, scale);
|
||||
PPM_CONTEXT::STATE* p = GetStateNoCheck(MinContext->Stats) - 1;
|
||||
PPM_CONTEXT::STATE* p = GetStateNoCheck(MinContext->Stats) - 1;
|
||||
hiCnt = 0;
|
||||
do
|
||||
do
|
||||
{
|
||||
do { p++; } while (CharMask[p->Symbol] == EscCount);
|
||||
hiCnt += p->Freq;
|
||||
if (p->Symbol == symbol)
|
||||
if (p->Symbol == symbol)
|
||||
goto SYMBOL_FOUND;
|
||||
CharMask[p->Symbol] = EscCount;
|
||||
}
|
||||
}
|
||||
while ( --i );
|
||||
|
||||
rangeEncoder->Encode(hiCnt, scale, hiCnt + scale);
|
||||
@@ -98,40 +98,40 @@ SYMBOL_FOUND:
|
||||
|
||||
UInt32 highCount = hiCnt;
|
||||
UInt32 lowCount = highCount - p->Freq;
|
||||
if ( --i )
|
||||
if ( --i )
|
||||
{
|
||||
PPM_CONTEXT::STATE* p1 = p;
|
||||
do
|
||||
do
|
||||
{
|
||||
do { p1++; } while (CharMask[p1->Symbol] == EscCount);
|
||||
hiCnt += p1->Freq;
|
||||
}
|
||||
}
|
||||
while ( --i );
|
||||
}
|
||||
// SubRange.scale += hiCnt;
|
||||
scale += hiCnt;
|
||||
rangeEncoder->Encode(lowCount, highCount - lowCount, scale);
|
||||
psee2c->update();
|
||||
psee2c->update();
|
||||
update2(p);
|
||||
}
|
||||
|
||||
void EncodeSymbol(int c, NRangeCoder::CEncoder *rangeEncoder)
|
||||
{
|
||||
if (MinContext->NumStats != 1)
|
||||
EncodeSymbol1(c, rangeEncoder);
|
||||
else
|
||||
EncodeBinSymbol(c, rangeEncoder);
|
||||
while ( !FoundState )
|
||||
if (MinContext->NumStats != 1)
|
||||
EncodeSymbol1(c, rangeEncoder);
|
||||
else
|
||||
EncodeBinSymbol(c, rangeEncoder);
|
||||
while ( !FoundState )
|
||||
{
|
||||
do
|
||||
do
|
||||
{
|
||||
OrderFall++;
|
||||
OrderFall++;
|
||||
MinContext = GetContext(MinContext->Suffix);
|
||||
if (MinContext == 0)
|
||||
if (MinContext == 0)
|
||||
return; // S_OK;
|
||||
}
|
||||
}
|
||||
while (MinContext->NumStats == NumMasked);
|
||||
EncodeSymbol2(c, rangeEncoder);
|
||||
EncodeSymbol2(c, rangeEncoder);
|
||||
}
|
||||
NextContext();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user