コード例 #1
0
ファイル: CarrylessRangeCoder.c プロジェクト: chusik/ppmd
int NextBitFromRangeCoder(CarrylessRangeCoder *self)
{
	int bit=RangeCoderCurrentCount(self,2);

	if(bit==0) RemoveRangeCoderSubRange(self,0,1);
	else RemoveRangeCoderSubRange(self,1,2);

	return bit;
}
コード例 #2
0
ファイル: PPMdContext.c プロジェクト: BSzili/aros-stuff
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;
}
コード例 #3
0
ファイル: CarrylessRangeCoder.c プロジェクト: chusik/ppmd
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;
}
コード例 #4
0
ファイル: PPMdContext.c プロジェクト: BSzili/aros-stuff
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;
	}
}
コード例 #5
0
ファイル: CarrylessRangeCoder.c プロジェクト: chusik/ppmd
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;
}