internal void decodeBinSymbol(ModelPPM model) { State rs = tempState1.Initialize(model.Heap); rs.Address = oneState.Address; // State& model.HiBitsFlag = model.getHB2Flag()[model.FoundState.Symbol]; int off1 = rs.Freq - 1; int off2 = getArrayIndex(model, rs); int bs = model.BinSumm[off1][off2]; if (model.Coder.GetCurrentShiftCount(ModelPPM.TOT_BITS) < bs) { model.FoundState.Address = rs.Address; rs.IncrementFreq((rs.Freq < 128) ? 1 : 0); model.Coder.SubRange.LowCount = 0; model.Coder.SubRange.HighCount = bs; bs = ((bs + ModelPPM.INTERVAL - getMean(bs, ModelPPM.PERIOD_BITS, 2)) & 0xffff); model.BinSumm[off1][off2] = bs; model.PrevSuccess = 1; model.incRunLength(1); } else { model.Coder.SubRange.LowCount = bs; bs = (bs - getMean(bs, ModelPPM.PERIOD_BITS, 2)) & 0xFFFF; model.BinSumm[off1][off2] = bs; model.Coder.SubRange.HighCount = ModelPPM.BIN_SCALE; model.InitEsc = ExpEscape[Utility.URShift(bs, 10)]; model.NumMasked = 1; model.CharMask[rs.Symbol] = model.EscCount; model.PrevSuccess = 0; model.FoundState.Address = 0; } //int a = 0;//TODO just 4 debugging }
internal bool decodeSymbol2(ModelPPM model) { long count; int hiCnt, i = NumStats - model.NumMasked; SEE2Context psee2c = makeEscFreq2(model, i); RangeCoder coder = model.Coder; // STATE* ps[256], ** pps=ps, * p=U.Stats-1; State p = tempState1.Initialize(model.Heap); State temp = tempState2.Initialize(model.Heap); p.Address = freqData.GetStats() - State.Size; int pps = 0; hiCnt = 0; do { do { p.IncrementAddress(); // p++; }while (model.CharMask[p.Symbol] == model.EscCount); hiCnt += p.Freq; ps[pps++] = p.Address; }while (--i != 0); coder.SubRange.incScale(hiCnt); count = coder.CurrentCount; if (count >= coder.SubRange.Scale) { return(false); } pps = 0; p.Address = ps[pps]; if (count < hiCnt) { hiCnt = 0; while ((hiCnt += p.Freq) <= count) { p.Address = ps[++pps]; // p=*++pps; } coder.SubRange.HighCount = hiCnt; coder.SubRange.LowCount = hiCnt - p.Freq; psee2c.update(); update2(model, p.Address); } else { coder.SubRange.LowCount = hiCnt; coder.SubRange.HighCount = coder.SubRange.Scale; i = NumStats - model.NumMasked; // ->NumMasked; pps--; do { temp.Address = ps[++pps]; // (*++pps) model.CharMask[temp.Symbol] = model.EscCount; }while (--i != 0); psee2c.incSumm((int)coder.SubRange.Scale); model.NumMasked = NumStats; } return(true); }
internal void update2(ModelPPM model, int p) { State temp = tempState5.Initialize(model.Heap); temp.Address = p; model.FoundState.Address = p; model.FoundState.IncrementFreq(4); freqData.IncrementSummFreq(4); if (temp.Freq > ModelPPM.MAX_FREQ) { rescale(model); } model.incEscCount(1); model.RunLength = model.InitRL; }
// public static void ppmdSwap(ModelPPM model, StatePtr state1, StatePtr state2) // { // byte[] bytes = model.getSubAlloc().getHeap(); // int p1 = state1.Address; // int p2 = state2.Address; // // for (int i = 0; i < StatePtr.size; i++) { // byte temp = bytes[p1+i]; // bytes[p1+i] = bytes[p2+i]; // bytes[p2+i] = temp; // } // state1.Address=p1); // state2.Address=p2); // } internal void update1(ModelPPM model, int p) { model.FoundState.Address = p; model.FoundState.IncrementFreq(4); freqData.IncrementSummFreq(4); State p0 = tempState3.Initialize(model.Heap); State p1 = tempState4.Initialize(model.Heap); p0.Address = p; p1.Address = p - State.Size; if (p0.Freq > p1.Freq) { State.PPMDSwap(p0, p1); model.FoundState.Address = p1.Address; if (p1.Freq > ModelPPM.MAX_FREQ) { rescale(model); } } }
private void updateModel() { //System.out.println("ModelPPM.updateModel()"); // STATE fs = *FoundState, *p = NULL; StateRef fs = tempStateRef1; fs.Values = foundState; State p = tempState3.Initialize(Heap); State tempState = tempState4.Initialize(Heap); PPMContext pc = tempPPMContext3.Initialize(Heap); PPMContext successor = tempPPMContext4.Initialize(Heap); int ns1, ns, cf, sf, s0; pc.Address = minContext.getSuffix(); if (fs.Freq < MAX_FREQ / 4 && pc.Address != 0) { if (pc.NumStats != 1) { p.Address = pc.FreqData.GetStats(); if (p.Symbol != fs.Symbol) { do { p.IncrementAddress(); }while (p.Symbol != fs.Symbol); tempState.Address = p.Address - State.Size; if (p.Freq >= tempState.Freq) { State.PPMDSwap(p, tempState); p.DecrementAddress(); } } if (p.Freq < MAX_FREQ - 9) { p.IncrementFreq(2); pc.FreqData.IncrementSummFreq(2); } } else { p.Address = pc.getOneState().Address; if (p.Freq < 32) { p.IncrementFreq(1); } } } if (orderFall == 0) { foundState.SetSuccessor(createSuccessors(true, p)); minContext.Address = foundState.GetSuccessor(); maxContext.Address = foundState.GetSuccessor(); if (minContext.Address == 0) { updateModelRestart(); return; } return; } subAlloc.Heap[subAlloc.PText] = (byte)fs.Symbol; subAlloc.incPText(); successor.Address = subAlloc.PText; if (subAlloc.PText >= subAlloc.FakeUnitsStart) { updateModelRestart(); return; } // // Debug // subAlloc.dumpHeap(); if (fs.GetSuccessor() != 0) { if (fs.GetSuccessor() <= subAlloc.PText) { fs.SetSuccessor(createSuccessors(false, p)); if (fs.GetSuccessor() == 0) { updateModelRestart(); return; } } if (--orderFall == 0) { successor.Address = fs.GetSuccessor(); if (maxContext.Address != minContext.Address) { subAlloc.decPText(1); } } } else { foundState.SetSuccessor(successor.Address); fs.SetSuccessor(minContext); } // // Debug // subAlloc.dumpHeap(); ns = minContext.NumStats; s0 = minContext.FreqData.SummFreq - (ns) - (fs.Freq - 1); for (pc.Address = maxContext.Address; pc.Address != minContext.Address; pc.Address = pc.getSuffix()) { if ((ns1 = pc.NumStats) != 1) { if ((ns1 & 1) == 0) { //System.out.println(ns1); pc.FreqData.SetStats(subAlloc.expandUnits(pc.FreqData.GetStats(), Utility.URShift(ns1, 1))); if (pc.FreqData.GetStats() == 0) { updateModelRestart(); return; } } // bug fixed // int sum = ((2 * ns1 < ns) ? 1 : 0) + // 2 * ((4 * ((ns1 <= ns) ? 1 : 0)) & ((pc.getFreqData() // .getSummFreq() <= 8 * ns1) ? 1 : 0)); int sum = ((2 * ns1 < ns) ? 1 : 0) + 2 * (((4 * ns1 <= ns) ? 1 : 0) & ((pc.FreqData.SummFreq <= 8 * ns1) ? 1 : 0)); pc.FreqData.IncrementSummFreq(sum); } else { p.Address = subAlloc.allocUnits(1); if (p.Address == 0) { updateModelRestart(); return; } p.SetValues(pc.getOneState()); pc.FreqData.SetStats(p); if (p.Freq < MAX_FREQ / 4 - 1) { p.IncrementFreq(p.Freq); } else { p.Freq = MAX_FREQ - 4; } pc.FreqData.SummFreq = (p.Freq + initEsc + (ns > 3 ? 1 : 0)); } cf = 2 * fs.Freq * (pc.FreqData.SummFreq + 6); sf = s0 + pc.FreqData.SummFreq; if (cf < 6 * sf) { cf = 1 + (cf > sf ? 1 : 0) + (cf >= 4 * sf ? 1 : 0); pc.FreqData.IncrementSummFreq(3); } else { cf = 4 + (cf >= 9 * sf ? 1 : 0) + (cf >= 12 * sf ? 1 : 0) + (cf >= 15 * sf ? 1 : 0); pc.FreqData.IncrementSummFreq(cf); } p.Address = pc.FreqData.GetStats() + ns1 * State.Size; p.SetSuccessor(successor); p.Symbol = fs.Symbol; p.Freq = cf; pc.NumStats = ++ns1; } int address = fs.GetSuccessor(); maxContext.Address = address; minContext.Address = address; //TODO-----debug // int pos = minContext.getFreqData().getStats(); // State a = new State(getHeap()); // a.Address=pos); // pos+=State.size; // a.Address=pos); //--dbg end return; }
private int createSuccessors(bool Skip, State p1) { //State upState = tempState1.Initialize(null); StateRef upState = tempStateRef2; State tempState = tempState1.Initialize(Heap); // PPM_CONTEXT* pc=MinContext, * UpBranch=FoundState->Successor; PPMContext pc = tempPPMContext1.Initialize(Heap); pc.Address = minContext.Address; PPMContext upBranch = tempPPMContext2.Initialize(Heap); upBranch.Address = foundState.GetSuccessor(); // STATE * p, * ps[MAX_O], ** pps=ps; State p = tempState2.Initialize(Heap); int pps = 0; bool noLoop = false; if (!Skip) { ps[pps++] = foundState.Address; // *pps++ = FoundState; if (pc.getSuffix() == 0) { noLoop = true; } } if (!noLoop) { bool loopEntry = false; if (p1.Address != 0) { p.Address = p1.Address; pc.Address = pc.getSuffix(); // =pc->Suffix; loopEntry = true; } do { if (!loopEntry) { pc.Address = pc.getSuffix(); // pc=pc->Suffix; if (pc.NumStats != 1) { p.Address = pc.FreqData.GetStats(); // p=pc->U.Stats if (p.Symbol != foundState.Symbol) { do { p.IncrementAddress(); }while (p.Symbol != foundState.Symbol); } } else { p.Address = pc.getOneState().Address; // p=&(pc->OneState); } } // LOOP_ENTRY: loopEntry = false; if (p.GetSuccessor() != upBranch.Address) { pc.Address = p.GetSuccessor(); // =p->Successor; break; } ps[pps++] = p.Address; }while (pc.getSuffix() != 0); } // NO_LOOP: if (pps == 0) { return(pc.Address); } upState.Symbol = Heap[upBranch.Address]; // UpState.Symbol=*(byte*) // UpBranch; // UpState.Successor=(PPM_CONTEXT*) (((byte*) UpBranch)+1); upState.SetSuccessor(upBranch.Address + 1); //TODO check if +1 necessary if (pc.NumStats != 1) { if (pc.Address <= subAlloc.PText) { return(0); } p.Address = pc.FreqData.GetStats(); if (p.Symbol != upState.Symbol) { do { p.IncrementAddress(); }while (p.Symbol != upState.Symbol); } int cf = p.Freq - 1; int s0 = pc.FreqData.SummFreq - pc.NumStats - cf; // UpState.Freq=1+((2*cf <= s0)?(5*cf > s0):((2*cf+3*s0-1)/(2*s0))); upState.Freq = 1 + ((2 * cf <= s0) ? (5 * cf > s0 ? 1 : 0) : ((2 * cf + 3 * s0 - 1) / (2 * s0))); } else { upState.Freq = pc.getOneState().Freq; // UpState.Freq=pc->OneState.Freq; } do { // pc = pc->createChild(this,*--pps,UpState); tempState.Address = ps[--pps]; pc.Address = pc.createChild(this, tempState, upState); if (pc.Address == 0) { return(0); } }while (pps != 0); return(pc.Address); }
internal PPMContext Initialize(byte[] mem) { oneState.Initialize(mem); freqData.Initialize(mem); return(base.Initialize <PPMContext>(mem)); }