예제 #1
0
        private void DecodeSymbol2(PpmContext context)
        {
            See2Context see2Context = MakeEscapeFrequency(context);
            uint        currentSymbol;
            uint        count;
            uint        highCount  = 0;
            uint        index      = (uint)(context.NumberStatistics - _numberMasked);
            uint        stateIndex = 0;
            PpmState    state      = context.Statistics - 1;

            do
            {
                do
                {
                    currentSymbol = state[1].Symbol;
                    state++;
                }while (_characterMask[currentSymbol] == _escapeCount);
                highCount += state.Frequency;
                _decodeStates[stateIndex++] = state;

                // note that decodeStates is a static array that is re-used on each call to this method (for performance reasons)
            }while (--index != 0);

            _coder._scale += highCount;
            count          = _coder.RangeGetCurrentCount();
            stateIndex     = 0;
            state          = _decodeStates[stateIndex];
            if (count < highCount)
            {
                highCount = 0;
                while ((highCount += state.Frequency) <= count)
                {
                    state = _decodeStates[++stateIndex];
                }
                _coder._highCount = highCount;
                _coder._lowCount  = _coder._highCount - state.Frequency;
                see2Context.Update();
                Update2(state, context);
            }
            else
            {
                _coder._lowCount  = highCount;
                _coder._highCount = _coder._scale;
                index             = (uint)(context.NumberStatistics - _numberMasked);
                _numberMasked     = context.NumberStatistics;
                do
                {
                    _characterMask[_decodeStates[stateIndex].Symbol] = _escapeCount;
                    stateIndex++;
                }while (--index != 0);
                see2Context._summary += (ushort)_coder._scale;
            }
        }
예제 #2
0
        private void EncodeSymbol2(int symbol, PpmContext context)
        {
            See2Context see2Context = MakeEscapeFrequency(context);
            uint        currentSymbol;
            uint        lowCount = 0;
            uint        index    = (uint)(context.NumberStatistics - _numberMasked);
            PpmState    state    = context.Statistics - 1;

            do
            {
                do
                {
                    currentSymbol = state[1].Symbol;
                    state++;
                }while (_characterMask[currentSymbol] == _escapeCount);
                _characterMask[currentSymbol] = _escapeCount;
                if (currentSymbol == symbol)
                {
                    goto SymbolFound;
                }
                lowCount += state.Frequency;
            }while (--index != 0);

            _coder._lowCount      = lowCount;
            _coder._scale        += _coder._lowCount;
            _coder._highCount     = _coder._scale;
            see2Context._summary += (ushort)_coder._scale;
            _numberMasked         = context.NumberStatistics;
            return;

SymbolFound:
            _coder._lowCount  = lowCount;
            lowCount         += state.Frequency;
            _coder._highCount = lowCount;
            for (PpmState p1 = state; --index != 0;)
            {
                do
                {
                    currentSymbol = p1[1].Symbol;
                    p1++;
                }while (_characterMask[currentSymbol] == _escapeCount);
                lowCount += p1.Frequency;
            }
            _coder._scale += lowCount;
            see2Context.Update();
            Update2(state, context);
        }