internal void decodeBinSymbol(ModelPPM model) { SharpCompress.Compressor.PPMd.H.State rs = this.tempState1.Initialize(model.Heap); rs.Address = this.oneState.Address; model.HiBitsFlag = model.getHB2Flag()[model.FoundState.Symbol]; int index = rs.Freq - 1; int num2 = this.getArrayIndex(model, rs); int summ = model.BinSumm[index][num2]; if (model.Coder.GetCurrentShiftCount(ModelPPM.TOT_BITS) < summ) { model.FoundState.Address = rs.Address; rs.IncrementFreq((rs.Freq < 0x80) ? 1 : 0); model.Coder.SubRange.LowCount = 0L; model.Coder.SubRange.HighCount = summ; summ = ((summ + ModelPPM.INTERVAL) - this.getMean(summ, 7, 2)) & 0xffff; model.BinSumm[index][num2] = summ; model.PrevSuccess = 1; model.incRunLength(1); } else { model.Coder.SubRange.LowCount = summ; summ = (summ - this.getMean(summ, 7, 2)) & 0xffff; model.BinSumm[index][num2] = summ; model.Coder.SubRange.HighCount = ModelPPM.BIN_SCALE; model.InitEsc = ExpEscape[Utility.URShift(summ, 10)]; model.NumMasked = 1; model.CharMask[rs.Symbol] = model.EscCount; model.PrevSuccess = 0; model.FoundState.Address = 0; } }
internal bool decodeInit(Stream stream, int maxOrder, int maxMemory) { if (stream != null) { this.coder = new RangeCoder(stream); } if (maxOrder == 1) { this.subAlloc.stopSubAllocator(); return(false); } this.subAlloc.startSubAllocator(maxMemory); this.minContext = new PPMContext(this.Heap); this.maxContext = new PPMContext(this.Heap); this.foundState = new SharpCompress.Compressor.PPMd.H.State(this.Heap); this.dummySEE2Cont = new SEE2Context(); for (int i = 0; i < 0x19; i++) { for (int j = 0; j < 0x10; j++) { this.SEE2Cont[i][j] = new SEE2Context(); } } this.startModelRare(maxOrder); return(this.minContext.Address != 0); }
internal bool decodeSymbol2(ModelPPM model) { int diff = this.NumStats - model.NumMasked; SEE2Context context = this.makeEscFreq2(model, diff); RangeCoder coder = model.Coder; SharpCompress.Compressor.PPMd.H.State state = this.tempState1.Initialize(model.Heap); SharpCompress.Compressor.PPMd.H.State state2 = this.tempState2.Initialize(model.Heap); state.Address = this.freqData.GetStats() - 6; int index = 0; int dScale = 0; do { do { state.IncrementAddress(); }while (model.CharMask[state.Symbol] == model.EscCount); dScale += state.Freq; this.ps[index++] = state.Address; }while (--diff != 0); coder.SubRange.incScale(dScale); long currentCount = coder.CurrentCount; if (currentCount >= coder.SubRange.Scale) { return(false); } index = 0; state.Address = this.ps[index]; if (currentCount < dScale) { dScale = 0; while ((dScale += state.Freq) <= currentCount) { state.Address = this.ps[++index]; } coder.SubRange.HighCount = dScale; coder.SubRange.LowCount = dScale - state.Freq; context.update(); this.update2(model, state.Address); } else { coder.SubRange.LowCount = dScale; coder.SubRange.HighCount = coder.SubRange.Scale; diff = this.NumStats - model.NumMasked; index--; do { state2.Address = this.ps[++index]; model.CharMask[state2.Symbol] = model.EscCount; }while (--diff != 0); context.incSumm((int)coder.SubRange.Scale); model.NumMasked = this.NumStats; } return(true); }
internal int getArrayIndex(ModelPPM Model, SharpCompress.Compressor.PPMd.H.State rs) { PPMContext context = this.getTempPPMContext(Model.SubAlloc.Heap); context.Address = this.getSuffix(); int num = 0; num += Model.PrevSuccess; num += Model.getNS2BSIndx()[context.NumStats - 1]; num += Model.HiBitsFlag + (2 * Model.getHB2Flag()[rs.Symbol]); return(num + (Utility.URShift(Model.RunLength, 0x1a) & 0x20)); }
public PPMContext(byte[] Memory) : base(Memory) { this.tempState1 = new SharpCompress.Compressor.PPMd.H.State(null); this.tempState2 = new SharpCompress.Compressor.PPMd.H.State(null); this.tempState3 = new SharpCompress.Compressor.PPMd.H.State(null); this.tempState4 = new SharpCompress.Compressor.PPMd.H.State(null); this.tempState5 = new SharpCompress.Compressor.PPMd.H.State(null); this.tempPPMContext = null; this.ps = new int[0x100]; this.oneState = new SharpCompress.Compressor.PPMd.H.State(Memory); this.freqData = new SharpCompress.Compressor.PPMd.H.FreqData(Memory); }
internal void update2(ModelPPM model, int p) { SharpCompress.Compressor.PPMd.H.State state = this.tempState5.Initialize(model.Heap); state.Address = p; model.FoundState.Address = p; model.FoundState.IncrementFreq(4); this.freqData.IncrementSummFreq(4); if (state.Freq > 0x7c) { this.rescale(model); } model.incEscCount(1); model.RunLength = model.InitRL; }
internal int createChild(ModelPPM model, SharpCompress.Compressor.PPMd.H.State pStats, StateRef firstState) { PPMContext successor = this.getTempPPMContext(model.SubAlloc.Heap); successor.Address = model.SubAlloc.allocContext(); if (successor != null) { successor.NumStats = 1; successor.setOneState(firstState); successor.setSuffix(this); pStats.SetSuccessor(successor); } return(successor.Address); }
private void restartModelRare() { int num2; int num3; Utility.Fill <int>(this.charMask, 0); this.subAlloc.initSubAllocator(); this.initRL = -((this.maxOrder < 12) ? this.maxOrder : 12) - 1; int stats = this.subAlloc.allocContext(); this.minContext.Address = stats; this.maxContext.Address = stats; this.minContext.setSuffix(0); this.orderFall = this.maxOrder; this.minContext.NumStats = 0x100; this.minContext.FreqData.SummFreq = this.minContext.NumStats + 1; stats = this.subAlloc.allocUnits(0x80); this.foundState.Address = stats; this.minContext.FreqData.SetStats(stats); SharpCompress.Compressor.PPMd.H.State state = new SharpCompress.Compressor.PPMd.H.State(this.subAlloc.Heap); stats = this.minContext.FreqData.GetStats(); this.runLength = this.initRL; this.prevSuccess = 0; for (num2 = 0; num2 < 0x100; num2++) { state.Address = stats + (num2 * 6); state.Symbol = num2; state.Freq = 1; state.SetSuccessor(0); } for (num2 = 0; num2 < 0x80; num2++) { num3 = 0; while (num3 < 8) { for (int i = 0; i < 0x40; i += 8) { this.binSumm[num2][num3 + i] = BIN_SCALE - (InitBinEsc[num3] / (num2 + 2)); } num3++; } } for (num2 = 0; num2 < 0x19; num2++) { for (num3 = 0; num3 < 0x10; num3++) { this.SEE2Cont[num2][num3].Initialize((5 * num2) + 10); } } }
internal bool decodeInit(Unpack unpackRead, int escChar) { int maxOrder = unpackRead.Char & 0xff; bool flag = (maxOrder & 0x20) != 0; int num2 = 0; if (flag) { num2 = unpackRead.Char; } else if (this.subAlloc.GetAllocatedMemory() == 0) { return(false); } if ((maxOrder & 0x40) != 0) { escChar = unpackRead.Char; unpackRead.PpmEscChar = escChar; } this.coder = new RangeCoder(unpackRead); if (flag) { maxOrder = (maxOrder & 0x1f) + 1; if (maxOrder > 0x10) { maxOrder = 0x10 + ((maxOrder - 0x10) * 3); } if (maxOrder == 1) { this.subAlloc.stopSubAllocator(); return(false); } this.subAlloc.startSubAllocator((num2 + 1) << 20); this.minContext = new PPMContext(this.Heap); this.maxContext = new PPMContext(this.Heap); this.foundState = new SharpCompress.Compressor.PPMd.H.State(this.Heap); this.dummySEE2Cont = new SEE2Context(); for (int i = 0; i < 0x19; i++) { for (int j = 0; j < 0x10; j++) { this.SEE2Cont[i][j] = new SEE2Context(); } } this.startModelRare(maxOrder); } return(this.minContext.Address != 0); }
internal static void PPMDSwap(SharpCompress.Compressor.PPMd.H.State ptr1, SharpCompress.Compressor.PPMd.H.State ptr2) { byte[] memory = ptr1.Memory; byte[] buffer2 = ptr2.Memory; int num = 0; int address = ptr1.Address; for (int i = ptr2.Address; num < 6; i++) { byte num4 = memory[address]; memory[address] = buffer2[i]; buffer2[i] = num4; num++; address++; } }
internal void update1(ModelPPM model, int p) { model.FoundState.Address = p; model.FoundState.IncrementFreq(4); this.freqData.IncrementSummFreq(4); SharpCompress.Compressor.PPMd.H.State state = this.tempState3.Initialize(model.Heap); SharpCompress.Compressor.PPMd.H.State state2 = this.tempState4.Initialize(model.Heap); state.Address = p; state2.Address = p - 6; if (state.Freq > state2.Freq) { SharpCompress.Compressor.PPMd.H.State.PPMDSwap(state, state2); model.FoundState.Address = state2.Address; if (state2.Freq > 0x7c) { this.rescale(model); } } }
internal void rescale(ModelPPM model) { StateRef ref2; int numStats = this.NumStats; int num2 = this.NumStats - 1; SharpCompress.Compressor.PPMd.H.State state = new SharpCompress.Compressor.PPMd.H.State(model.Heap); SharpCompress.Compressor.PPMd.H.State state2 = new SharpCompress.Compressor.PPMd.H.State(model.Heap); SharpCompress.Compressor.PPMd.H.State state3 = new SharpCompress.Compressor.PPMd.H.State(model.Heap); state2.Address = model.FoundState.Address; while (state2.Address != this.freqData.GetStats()) { state3.Address = state2.Address - 6; SharpCompress.Compressor.PPMd.H.State.PPMDSwap(state2, state3); state2.DecrementAddress(); } state3.Address = this.freqData.GetStats(); state3.IncrementFreq(4); this.freqData.IncrementSummFreq(4); int number = this.freqData.SummFreq - state2.Freq; int num3 = (model.OrderFall != 0) ? 1 : 0; state2.Freq = Utility.URShift((int) (state2.Freq + num3), 1); this.freqData.SummFreq = state2.Freq; do { state2.IncrementAddress(); number -= state2.Freq; state2.Freq = Utility.URShift((int) (state2.Freq + num3), 1); this.freqData.IncrementSummFreq(state2.Freq); state3.Address = state2.Address - 6; if (state2.Freq > state3.Freq) { state.Address = state2.Address; ref2 = new StateRef(); ref2.Values = state; SharpCompress.Compressor.PPMd.H.State ptr = new SharpCompress.Compressor.PPMd.H.State(model.Heap); SharpCompress.Compressor.PPMd.H.State state5 = new SharpCompress.Compressor.PPMd.H.State(model.Heap); do { ptr.Address = state.Address - 6; state.SetValues(ptr); state.DecrementAddress(); state5.Address = state.Address - 6; } while ((state.Address != this.freqData.GetStats()) && (ref2.Freq > state5.Freq)); state.SetValues(ref2); } } while (--num2 != 0); if (state2.Freq == 0) { do { num2++; state2.DecrementAddress(); } while (state2.Freq == 0); number += num2; this.NumStats -= num2; if (this.NumStats == 1) { ref2 = new StateRef(); state3.Address = this.freqData.GetStats(); ref2.Values = state3; do { ref2.DecrementFreq(Utility.URShift(ref2.Freq, 1)); number = Utility.URShift(number, 1); } while (number > 1); model.SubAlloc.freeUnits(this.freqData.GetStats(), Utility.URShift((int) (numStats + 1), 1)); this.oneState.SetValues(ref2); model.FoundState.Address = this.oneState.Address; return; } } number -= Utility.URShift(number, 1); this.freqData.IncrementSummFreq(number); int oldNU = Utility.URShift((int) (numStats + 1), 1); int newNU = Utility.URShift((int) (this.NumStats + 1), 1); if (oldNU != newNU) { this.freqData.SetStats(model.SubAlloc.shrinkUnits(this.freqData.GetStats(), oldNU, newNU)); } model.FoundState.Address = this.freqData.GetStats(); }
internal void rescale(ModelPPM model) { StateRef ref2; int numStats = this.NumStats; int num2 = this.NumStats - 1; SharpCompress.Compressor.PPMd.H.State state = new SharpCompress.Compressor.PPMd.H.State(model.Heap); SharpCompress.Compressor.PPMd.H.State state2 = new SharpCompress.Compressor.PPMd.H.State(model.Heap); SharpCompress.Compressor.PPMd.H.State state3 = new SharpCompress.Compressor.PPMd.H.State(model.Heap); state2.Address = model.FoundState.Address; while (state2.Address != this.freqData.GetStats()) { state3.Address = state2.Address - 6; SharpCompress.Compressor.PPMd.H.State.PPMDSwap(state2, state3); state2.DecrementAddress(); } state3.Address = this.freqData.GetStats(); state3.IncrementFreq(4); this.freqData.IncrementSummFreq(4); int number = this.freqData.SummFreq - state2.Freq; int num3 = (model.OrderFall != 0) ? 1 : 0; state2.Freq = Utility.URShift((int)(state2.Freq + num3), 1); this.freqData.SummFreq = state2.Freq; do { state2.IncrementAddress(); number -= state2.Freq; state2.Freq = Utility.URShift((int)(state2.Freq + num3), 1); this.freqData.IncrementSummFreq(state2.Freq); state3.Address = state2.Address - 6; if (state2.Freq > state3.Freq) { state.Address = state2.Address; ref2 = new StateRef(); ref2.Values = state; SharpCompress.Compressor.PPMd.H.State ptr = new SharpCompress.Compressor.PPMd.H.State(model.Heap); SharpCompress.Compressor.PPMd.H.State state5 = new SharpCompress.Compressor.PPMd.H.State(model.Heap); do { ptr.Address = state.Address - 6; state.SetValues(ptr); state.DecrementAddress(); state5.Address = state.Address - 6; }while ((state.Address != this.freqData.GetStats()) && (ref2.Freq > state5.Freq)); state.SetValues(ref2); } }while (--num2 != 0); if (state2.Freq == 0) { do { num2++; state2.DecrementAddress(); }while (state2.Freq == 0); number += num2; this.NumStats -= num2; if (this.NumStats == 1) { ref2 = new StateRef(); state3.Address = this.freqData.GetStats(); ref2.Values = state3; do { ref2.DecrementFreq(Utility.URShift(ref2.Freq, 1)); number = Utility.URShift(number, 1); }while (number > 1); model.SubAlloc.freeUnits(this.freqData.GetStats(), Utility.URShift((int)(numStats + 1), 1)); this.oneState.SetValues(ref2); model.FoundState.Address = this.oneState.Address; return; } } number -= Utility.URShift(number, 1); this.freqData.IncrementSummFreq(number); int oldNU = Utility.URShift((int)(numStats + 1), 1); int newNU = Utility.URShift((int)(this.NumStats + 1), 1); if (oldNU != newNU) { this.freqData.SetStats(model.SubAlloc.shrinkUnits(this.freqData.GetStats(), oldNU, newNU)); } model.FoundState.Address = this.freqData.GetStats(); }
public int decodeChar(SharpCompress.Compressor.LZMA.RangeCoder.Decoder decoder) { SharpCompress.Compressor.PPMd.H.State state; int num; int threshold; int num3; byte symbol; if (this.minContext.NumStats != 1) { state = this.tempState1.Initialize(this.Heap); state.Address = this.minContext.FreqData.GetStats(); if ((threshold = (int)decoder.GetThreshold((uint)this.minContext.FreqData.SummFreq)) < (num3 = state.Freq)) { decoder.Decode(0, (uint)state.Freq); symbol = (byte)state.Symbol; this.minContext.update1_0(this, state.Address); this.nextContext(); return(symbol); } this.prevSuccess = 0; num = this.minContext.NumStats - 1; do { state.IncrementAddress(); if ((num3 += state.Freq) > threshold) { decoder.Decode((uint)(num3 - state.Freq), (uint)state.Freq); symbol = (byte)state.Symbol; this.minContext.update1(this, state.Address); this.nextContext(); return(symbol); } }while (--num > 0); if (threshold >= this.minContext.FreqData.SummFreq) { return(-2); } this.hiBitsFlag = this.HB2Flag[this.foundState.Symbol]; decoder.Decode((uint)num3, (uint)(this.minContext.FreqData.SummFreq - num3)); for (num = 0; num < 0x100; num++) { this.charMask[num] = -1; } this.charMask[state.Symbol] = 0; num = this.minContext.NumStats - 1; do { state.DecrementAddress(); this.charMask[state.Symbol] = 0; }while (--num > 0); } else { SharpCompress.Compressor.PPMd.H.State rs = this.tempState1.Initialize(this.Heap); rs.Address = this.minContext.getOneState().Address; this.hiBitsFlag = this.getHB2Flag()[this.foundState.Symbol]; int index = rs.Freq - 1; int num6 = this.minContext.getArrayIndex(this, rs); int summ = this.binSumm[index][num6]; if (decoder.DecodeBit((uint)summ, 14) == 0) { this.binSumm[index][num6] = ((summ + INTERVAL) - this.minContext.getMean(summ, 7, 2)) & 0xffff; this.foundState.Address = rs.Address; symbol = (byte)rs.Symbol; rs.IncrementFreq((rs.Freq < 0x80) ? 1 : 0); this.prevSuccess = 1; this.incRunLength(1); this.nextContext(); return(symbol); } summ = (summ - this.minContext.getMean(summ, 7, 2)) & 0xffff; this.binSumm[index][num6] = summ; this.initEsc = PPMContext.ExpEscape[Utility.URShift(summ, 10)]; for (num = 0; num < 0x100; num++) { this.charMask[num] = -1; } this.charMask[rs.Symbol] = 0; this.prevSuccess = 0; } while (true) { int num8; state = this.tempState1.Initialize(this.Heap); int numStats = this.minContext.NumStats; do { this.orderFall++; this.minContext.Address = this.minContext.getSuffix(); if ((this.minContext.Address <= this.subAlloc.PText) || (this.minContext.Address > this.subAlloc.HeapEnd)) { return(-1); } }while (this.minContext.NumStats == numStats); num3 = 0; state.Address = this.minContext.FreqData.GetStats(); num = 0; int num9 = this.minContext.NumStats - numStats; do { int num11 = this.charMask[state.Symbol]; num3 += state.Freq & num11; this.minContext.ps[num] = state.Address; state.IncrementAddress(); num -= num11; }while (num != num9); SEE2Context context = this.minContext.makeEscFreq(this, numStats, out num8); num8 += num3; threshold = (int)decoder.GetThreshold((uint)num8); if (threshold < num3) { SharpCompress.Compressor.PPMd.H.State state3 = this.tempState2.Initialize(this.Heap); num3 = 0; num = 0; state3.Address = this.minContext.ps[num]; while ((num3 += state3.Freq) <= threshold) { num++; state3.Address = this.minContext.ps[num]; } state.Address = state3.Address; decoder.Decode((uint)(num3 - state.Freq), (uint)state.Freq); context.update(); symbol = (byte)state.Symbol; this.minContext.update2(this, state.Address); this.updateModel(); return(symbol); } if (threshold >= num8) { return(-2); } decoder.Decode((uint)num3, (uint)(num8 - num3)); context.Summ += num8; do { state.Address = this.minContext.ps[--num]; this.charMask[state.Symbol] = 0; }while (num != 0); } }
internal void SetValues(SharpCompress.Compressor.PPMd.H.State ptr) { Array.Copy(ptr.Memory, ptr.Address, base.Memory, this.Address, 6); }
internal virtual void SetStats(SharpCompress.Compressor.PPMd.H.State state) { this.SetStats(state.Address); }
private void restartModelRare() { int num2; int num3; Utility.Fill<int>(this.charMask, 0); this.subAlloc.initSubAllocator(); this.initRL = -((this.maxOrder < 12) ? this.maxOrder : 12) - 1; int stats = this.subAlloc.allocContext(); this.minContext.Address = stats; this.maxContext.Address = stats; this.minContext.setSuffix(0); this.orderFall = this.maxOrder; this.minContext.NumStats = 0x100; this.minContext.FreqData.SummFreq = this.minContext.NumStats + 1; stats = this.subAlloc.allocUnits(0x80); this.foundState.Address = stats; this.minContext.FreqData.SetStats(stats); SharpCompress.Compressor.PPMd.H.State state = new SharpCompress.Compressor.PPMd.H.State(this.subAlloc.Heap); stats = this.minContext.FreqData.GetStats(); this.runLength = this.initRL; this.prevSuccess = 0; for (num2 = 0; num2 < 0x100; num2++) { state.Address = stats + (num2 * 6); state.Symbol = num2; state.Freq = 1; state.SetSuccessor(0); } for (num2 = 0; num2 < 0x80; num2++) { num3 = 0; while (num3 < 8) { for (int i = 0; i < 0x40; i += 8) { this.binSumm[num2][num3 + i] = BIN_SCALE - (InitBinEsc[num3] / (num2 + 2)); } num3++; } } for (num2 = 0; num2 < 0x19; num2++) { for (num3 = 0; num3 < 0x10; num3++) { this.SEE2Cont[num2][num3].Initialize((5 * num2) + 10); } } }
internal bool decodeInit(Stream stream, int maxOrder, int maxMemory) { if (stream != null) { this.coder = new RangeCoder(stream); } if (maxOrder == 1) { this.subAlloc.stopSubAllocator(); return false; } this.subAlloc.startSubAllocator(maxMemory); this.minContext = new PPMContext(this.Heap); this.maxContext = new PPMContext(this.Heap); this.foundState = new SharpCompress.Compressor.PPMd.H.State(this.Heap); this.dummySEE2Cont = new SEE2Context(); for (int i = 0; i < 0x19; i++) { for (int j = 0; j < 0x10; j++) { this.SEE2Cont[i][j] = new SEE2Context(); } } this.startModelRare(maxOrder); return (this.minContext.Address != 0); }
private void updateModel() { StateRef ref2 = this.tempStateRef1; ref2.Values = this.foundState; SharpCompress.Compressor.PPMd.H.State state = this.tempState3.Initialize(this.Heap); SharpCompress.Compressor.PPMd.H.State state2 = this.tempState4.Initialize(this.Heap); PPMContext context = this.tempPPMContext3.Initialize(this.Heap); PPMContext successor = this.tempPPMContext4.Initialize(this.Heap); context.Address = this.minContext.getSuffix(); if ((ref2.Freq < 0x1f) && (context.Address != 0)) { if (context.NumStats != 1) { state.Address = context.FreqData.GetStats(); if (state.Symbol != ref2.Symbol) { do { state.IncrementAddress(); }while (state.Symbol != ref2.Symbol); state2.Address = state.Address - 6; if (state.Freq >= state2.Freq) { SharpCompress.Compressor.PPMd.H.State.PPMDSwap(state, state2); state.DecrementAddress(); } } if (state.Freq < 0x73) { state.IncrementFreq(2); context.FreqData.IncrementSummFreq(2); } } else { state.Address = context.getOneState().Address; if (state.Freq < 0x20) { state.IncrementFreq(1); } } } if (this.orderFall == 0) { this.foundState.SetSuccessor(this.createSuccessors(true, state)); this.minContext.Address = this.foundState.GetSuccessor(); this.maxContext.Address = this.foundState.GetSuccessor(); if (this.minContext.Address == 0) { this.updateModelRestart(); } } else { this.subAlloc.Heap[this.subAlloc.PText] = (byte)ref2.Symbol; this.subAlloc.incPText(); successor.Address = this.subAlloc.PText; if (this.subAlloc.PText >= this.subAlloc.FakeUnitsStart) { this.updateModelRestart(); } else { if (ref2.GetSuccessor() != 0) { if (ref2.GetSuccessor() <= this.subAlloc.PText) { ref2.SetSuccessor(this.createSuccessors(false, state)); if (ref2.GetSuccessor() == 0) { this.updateModelRestart(); return; } } if (--this.orderFall == 0) { successor.Address = ref2.GetSuccessor(); if (this.maxContext.Address != this.minContext.Address) { this.subAlloc.decPText(1); } } } else { this.foundState.SetSuccessor(successor.Address); ref2.SetSuccessor(this.minContext); } int numStats = this.minContext.NumStats; int num5 = (this.minContext.FreqData.SummFreq - numStats) - (ref2.Freq - 1); context.Address = this.maxContext.Address; while (context.Address != this.minContext.Address) { int number = context.NumStats; if (number != 1) { if ((number & 1) == 0) { context.FreqData.SetStats(this.subAlloc.expandUnits(context.FreqData.GetStats(), Utility.URShift(number, 1))); if (context.FreqData.GetStats() == 0) { this.updateModelRestart(); return; } } int num6 = (((2 * number) < numStats) ? 1 : 0) + (2 * ((((4 * number) <= numStats) ? 1 : 0) & ((context.FreqData.SummFreq <= (8 * number)) ? 1 : 0))); context.FreqData.IncrementSummFreq(num6); } else { state.Address = this.subAlloc.allocUnits(1); if (state.Address == 0) { this.updateModelRestart(); return; } state.SetValues(context.getOneState()); context.FreqData.SetStats(state); if (state.Freq < 30) { state.IncrementFreq(state.Freq); } else { state.Freq = 120; } context.FreqData.SummFreq = (state.Freq + this.initEsc) + ((numStats > 3) ? 1 : 0); } int dSummFreq = (2 * ref2.Freq) * (context.FreqData.SummFreq + 6); int num4 = num5 + context.FreqData.SummFreq; if (dSummFreq < (6 * num4)) { dSummFreq = (1 + ((dSummFreq > num4) ? 1 : 0)) + ((dSummFreq >= (4 * num4)) ? 1 : 0); context.FreqData.IncrementSummFreq(3); } else { dSummFreq = ((4 + ((dSummFreq >= (9 * num4)) ? 1 : 0)) + ((dSummFreq >= (12 * num4)) ? 1 : 0)) + ((dSummFreq >= (15 * num4)) ? 1 : 0); context.FreqData.IncrementSummFreq(dSummFreq); } state.Address = context.FreqData.GetStats() + (number * 6); state.SetSuccessor(successor); state.Symbol = ref2.Symbol; state.Freq = dSummFreq; context.NumStats = ++number; context.Address = context.getSuffix(); } int num7 = ref2.GetSuccessor(); this.maxContext.Address = num7; this.minContext.Address = num7; } } }
internal bool decodeSymbol1(ModelPPM model) { int num2; RangeCoder coder = model.Coder; coder.SubRange.Scale = this.freqData.SummFreq; SharpCompress.Compressor.PPMd.H.State state = new SharpCompress.Compressor.PPMd.H.State(model.Heap); state.Address = this.freqData.GetStats(); long currentCount = coder.CurrentCount; if (currentCount >= coder.SubRange.Scale) { return(false); } if (currentCount < (num2 = state.Freq)) { coder.SubRange.HighCount = num2; model.PrevSuccess = ((2 * num2) > coder.SubRange.Scale) ? 1 : 0; model.incRunLength(model.PrevSuccess); num2 += 4; model.FoundState.Address = state.Address; model.FoundState.Freq = num2; this.freqData.IncrementSummFreq(4); if (num2 > 0x7c) { this.rescale(model); } coder.SubRange.LowCount = 0L; return(true); } if (model.FoundState.Address == 0) { return(false); } model.PrevSuccess = 0; int numStats = this.NumStats; int num = numStats - 1; while ((num2 += state.IncrementAddress().Freq) <= currentCount) { if (--num == 0) { model.HiBitsFlag = model.getHB2Flag()[model.FoundState.Symbol]; coder.SubRange.LowCount = num2; model.CharMask[state.Symbol] = model.EscCount; model.NumMasked = numStats; num = numStats - 1; model.FoundState.Address = 0; do { model.CharMask[state.DecrementAddress().Symbol] = model.EscCount; }while (--num != 0); coder.SubRange.HighCount = coder.SubRange.Scale; return(true); } } coder.SubRange.LowCount = num2 - state.Freq; coder.SubRange.HighCount = num2; this.update1(model, state.Address); return(true); }
internal bool decodeSymbol1(ModelPPM model) { int num2; RangeCoder coder = model.Coder; coder.SubRange.Scale = this.freqData.SummFreq; SharpCompress.Compressor.PPMd.H.State state = new SharpCompress.Compressor.PPMd.H.State(model.Heap); state.Address = this.freqData.GetStats(); long currentCount = coder.CurrentCount; if (currentCount >= coder.SubRange.Scale) { return false; } if (currentCount < (num2 = state.Freq)) { coder.SubRange.HighCount = num2; model.PrevSuccess = ((2 * num2) > coder.SubRange.Scale) ? 1 : 0; model.incRunLength(model.PrevSuccess); num2 += 4; model.FoundState.Address = state.Address; model.FoundState.Freq = num2; this.freqData.IncrementSummFreq(4); if (num2 > 0x7c) { this.rescale(model); } coder.SubRange.LowCount = 0L; return true; } if (model.FoundState.Address == 0) { return false; } model.PrevSuccess = 0; int numStats = this.NumStats; int num = numStats - 1; while ((num2 += state.IncrementAddress().Freq) <= currentCount) { if (--num == 0) { model.HiBitsFlag = model.getHB2Flag()[model.FoundState.Symbol]; coder.SubRange.LowCount = num2; model.CharMask[state.Symbol] = model.EscCount; model.NumMasked = numStats; num = numStats - 1; model.FoundState.Address = 0; do { model.CharMask[state.DecrementAddress().Symbol] = model.EscCount; } while (--num != 0); coder.SubRange.HighCount = coder.SubRange.Scale; return true; } } coder.SubRange.LowCount = num2 - state.Freq; coder.SubRange.HighCount = num2; this.update1(model, state.Address); return true; }
private int createSuccessors(bool Skip, SharpCompress.Compressor.PPMd.H.State p1) { StateRef firstState = this.tempStateRef2; SharpCompress.Compressor.PPMd.H.State pStats = this.tempState1.Initialize(this.Heap); PPMContext context = this.tempPPMContext1.Initialize(this.Heap); context.Address = this.minContext.Address; PPMContext context2 = this.tempPPMContext2.Initialize(this.Heap); context2.Address = this.foundState.GetSuccessor(); SharpCompress.Compressor.PPMd.H.State state2 = this.tempState2.Initialize(this.Heap); int num = 0; bool flag = false; if (!Skip) { this.ps[num++] = this.foundState.Address; if (context.getSuffix() == 0) { flag = true; } } if (flag) { goto Label_01E0; } bool flag2 = false; if (p1.Address != 0) { state2.Address = p1.Address; context.Address = context.getSuffix(); flag2 = true; } Label_00F2: if (!flag2) { context.Address = context.getSuffix(); if (context.NumStats != 1) { state2.Address = context.FreqData.GetStats(); if (state2.Symbol != this.foundState.Symbol) { do { state2.IncrementAddress(); }while (state2.Symbol != this.foundState.Symbol); } } else { state2.Address = context.getOneState().Address; } } flag2 = false; if (state2.GetSuccessor() != context2.Address) { context.Address = state2.GetSuccessor(); } else { this.ps[num++] = state2.Address; if (context.getSuffix() != 0) { goto Label_00F2; } } Label_01E0: if (num != 0) { firstState.Symbol = this.Heap[context2.Address]; firstState.SetSuccessor((int)(context2.Address + 1)); if (context.NumStats != 1) { if (context.Address <= this.subAlloc.PText) { return(0); } state2.Address = context.FreqData.GetStats(); if (state2.Symbol != firstState.Symbol) { do { state2.IncrementAddress(); }while (state2.Symbol != firstState.Symbol); } int num2 = state2.Freq - 1; int num3 = (context.FreqData.SummFreq - context.NumStats) - num2; firstState.Freq = 1 + (((2 * num2) <= num3) ? (((5 * num2) > num3) ? 1 : 0) : ((((2 * num2) + (3 * num3)) - 1) / (2 * num3))); } else { firstState.Freq = context.getOneState().Freq; } do { pStats.Address = this.ps[--num]; context.Address = context.createChild(this, pStats, firstState); if (context.Address == 0) { return(0); } }while (num != 0); } return(context.Address); }
internal bool decodeInit(Unpack unpackRead, int escChar) { int maxOrder = unpackRead.Char & 0xff; bool flag = (maxOrder & 0x20) != 0; int num2 = 0; if (flag) { num2 = unpackRead.Char; } else if (this.subAlloc.GetAllocatedMemory() == 0) { return false; } if ((maxOrder & 0x40) != 0) { escChar = unpackRead.Char; unpackRead.PpmEscChar = escChar; } this.coder = new RangeCoder(unpackRead); if (flag) { maxOrder = (maxOrder & 0x1f) + 1; if (maxOrder > 0x10) { maxOrder = 0x10 + ((maxOrder - 0x10) * 3); } if (maxOrder == 1) { this.subAlloc.stopSubAllocator(); return false; } this.subAlloc.startSubAllocator((num2 + 1) << 20); this.minContext = new PPMContext(this.Heap); this.maxContext = new PPMContext(this.Heap); this.foundState = new SharpCompress.Compressor.PPMd.H.State(this.Heap); this.dummySEE2Cont = new SEE2Context(); for (int i = 0; i < 0x19; i++) { for (int j = 0; j < 0x10; j++) { this.SEE2Cont[i][j] = new SEE2Context(); } } this.startModelRare(maxOrder); } return (this.minContext.Address != 0); }