int NextBitFromRangeCoder(CarrylessRangeCoder *self) { int bit=RangeCoderCurrentCount(self,2); if(bit==0) RemoveRangeCoderSubRange(self,0,1); else RemoveRangeCoderSubRange(self,1,2); return bit; }
int PPMdDecodeSymbol1(PPMdContext *self,PPMdCoreModel *model,BOOL greaterorequal) { model->scale=self->SummFreq; PPMdState *states=PPMdContextStates(self,model); int firstcount=states[0].Freq; int count=RangeCoderCurrentCount(&model->coder,model->scale); int adder=greaterorequal?1:0; if(count<firstcount) { RemoveRangeCoderSubRange(&model->coder,0,firstcount); if(2*firstcount+adder>model->scale) { model->PrevSuccess=1; model->RunLength++; } else model->PrevSuccess=0; model->FoundState=&states[0]; states[0].Freq=firstcount+4; self->SummFreq+=4; if(firstcount+4>MAX_FREQ) model->RescalePPMdContext(self,model); return -1; } int highcount=firstcount; model->PrevSuccess=0; for(int i=1;i<=self->LastStateIndex;i++) { highcount+=states[i].Freq; if(highcount>count) { RemoveRangeCoderSubRange(&model->coder,highcount-states[i].Freq,highcount); UpdatePPMdContext1(self,model,&states[i]); return -1; } } int lastsym=model->FoundState->Symbol; //if ( Suffix ) PrefetchData(Suffix); RemoveRangeCoderSubRange(&model->coder,highcount,model->scale); model->LastMaskIndex=self->LastStateIndex; model->FoundState=NULL; for(int i=0;i<=self->LastStateIndex;i++) model->CharMask[states[i].Symbol]=model->EscCount; return lastsym; }
int NextWeightedBitFromRangeCoder(CarrylessRangeCoder *self,int weight,int size) { int val=RangeCoderCurrentCount(self,size); int bit; if(val<weight) // <= ? { bit=0; RemoveRangeCoderSubRange(self,0,weight); } else { bit=1; RemoveRangeCoderSubRange(self,weight,size); } return bit; }
int NextSymbolFromRangeCoder(CarrylessRangeCoder *self,uint32_t *freqtable,int numfreq) { uint32_t totalfreq=0; uint32_t cumulativefreq=0; int n=0; uint32_t tmp; int i; for(i=0;i<numfreq;i++) totalfreq+=freqtable[i]; tmp=RangeCoderCurrentCount(self,totalfreq); while(n<numfreq-1&&cumulativefreq+freqtable[n]<=tmp) cumulativefreq+=freqtable[n++]; RemoveRangeCoderSubRange(self,cumulativefreq,cumulativefreq+freqtable[n]); return n; }
void PPMdDecodeSymbol2(PPMdContext *self,PPMdCoreModel *model,SEE2Context *see) { int n=self->LastStateIndex-model->LastMaskIndex; PPMdState *ps[256]; int total=0; PPMdState *state=PPMdContextStates(self,model); for(int i=0;i<n;i++) { while(model->CharMask[state->Symbol]==model->EscCount) state++; total+=state->Freq; ps[i]=state++; } model->scale+=total; int count=RangeCoderCurrentCount(&model->coder,model->scale); if(count<total) { int i=0,highcount=ps[0]->Freq; while(highcount<=count) highcount+=ps[++i]->Freq; RemoveRangeCoderSubRange(&model->coder,highcount-ps[i]->Freq,highcount); UpdateSEE2(see); UpdatePPMdContext2(self,model,ps[i]); } else { RemoveRangeCoderSubRange(&model->coder,total,model->scale); model->LastMaskIndex=self->LastStateIndex; see->Summ+=model->scale; for(int i=0;i<n;i++) model->CharMask[ps[i]->Symbol]=model->EscCount; } }