예제 #1
0
        private int GetCoefficientLevelCode(int suffixLength)
        {
            int levelPrefix = _reader.GetLeadingZeroBits();             // level_prefix
            int levelCode   = (levelPrefix << suffixLength);

            if ((suffixLength == 0) && (levelPrefix < 14))
            {
                return(levelCode);                // level_suffix is (0)
            }

            int levelSuffixSize;

            if (levelPrefix >= 15)
            {
                // Escape-coded (high) coefficient level
                levelSuffixSize = (levelPrefix - 3);

                levelCode  = 15 << Math.Max(1, suffixLength);
                levelCode += (1 << levelSuffixSize) - 4096;
            }
            else if ((levelPrefix == 14) && (suffixLength == 0))
            {
                levelSuffixSize = 4;
            }
            else
            {
                levelSuffixSize = suffixLength;
            }

            var levelSuffix = (int)_reader.GetBits(levelSuffixSize);             // level_suffix

            return(levelCode + levelSuffix);
        }