Beispiel #1
0
        public HeaderSizes(BlockyMetadata metadata)
        {
            GlobalIsAbsoluteNegative = metadata.IsAbsolute ? 1 : 0;
            BlockExponent            = metadata.MaxNeededBitsExponent;
            BlockIsAbsolute          = metadata.IsAbsolute ? 0 : 1;
            BlockIsAbsoluteNegative  = BlockIsAbsolute;
            BlockOverriddenNb        = metadata.MaxNeededBitsNeededBitsNumber;

            StandardSingleValue = IsBlock + GlobalNumberNb + (metadata.IsAbsolute ? 0 : Sign) + (metadata.NoExponent ? 0 : Sign + GlobalExponentNb);

            StandardBlockHeader          = IsBlock + BlockHasExponent + BlockHasPattern + BlockLength;
            StandardBlockFloatSimmilar   = StandardBlockHeader + Sign + BlockExponent + BlockOverrideGlobalNb + BlockIsAbsolute + BlockIsAbsoluteNegative;
            StandardBlockNumbersNoExp    = StandardBlockHeader + BlockOverrideGlobalNb + BlockIsAbsolute + BlockIsAbsoluteNegative;
            StandardBlockPatternOffset   = StandardBlockHeader + (StandardSingleValue - IsBlock) * 2 + BlockPatternType;
            StandardBlockPatternSame     = StandardBlockHeader + StandardSingleValue - IsBlock + BlockPatternType;
            StandardBlockPatternPingPong = StandardBlockPatternOffset + 8; // 8 = repeat count
        }
Beispiel #2
0
        public Blockfinding(List <OfcNumber> values, BlockyMetadata metadata)
        {
            Values     = values;
            ValueCount = Values.Count;
            Metadata   = metadata;

            Headers           = new HeaderSizes(Metadata);
            _patternPredictor = new PatternPredictor(Values);
#if DEBUG
            if (_debugSkip > 0)
            {
                _debugSkip--;
                _debugEnabled = false;
            }
            _debugCounter++;
#endif

            _initializedCompressionMethods[(int)Methods.PatternSame]     = new PatternSameCompression(this);
            _initializedCompressionMethods[(int)Methods.PatternPingPong] = new PatternPingPongCompression(this);
            _initializedCompressionMethods[(int)Methods.FloatSimmilar]   = new FloatSimmilarCompression(this);
            _initializedCompressionMethods[(int)Methods.NumbersNoExp]    = new NumbersNoExpCompression(this);
            _initializedCompressionMethods[(int)Methods.PatternOffset]   = new PatternOffsetCompression(this);
        }
Beispiel #3
0
        /// <summary>
        /// Exclusive IsBlock
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="metadata"></param>
        /// <returns></returns>
        public static Block ReadDefaultBlockHeader(StreamBitReader reader, BlockyMetadata metadata)
        {
            var block = new Block();

            // ReSharper disable once AssignmentInConditionalExpression
            if (block.HasExponent = reader.ReadByte(1) > 0)
            {
                var negative = reader.ReadByte(1) > 0;
                block.Exponent = (short)reader.Read(metadata.MaxNeededBitsExponent);
                if (negative)
                {
                    block.Exponent *= -1;
                }
            }

            // ReSharper disable once AssignmentInConditionalExpression
            if (block.HasPattern = reader.ReadByte(1) > 0)
            {
                block.Pattern = (Block.PatternType)reader.ReadByte(2);
            }

            block.Length = reader.ReadByte(8);
            return(block);
        }
Beispiel #4
0
 public PatternPingPongDecompression(BlockyMetadata metadata) : base(metadata)
 {
 }
 public PatternOffsetDecompression(BlockyMetadata metadata) : base(metadata)
 {
 }
Beispiel #6
0
 public FloatSimmilarDecompression(BlockyMetadata metadata) : base(metadata)
 {
 }
Beispiel #7
0
 public PatternSameDecompression(BlockyMetadata metadata) : base(metadata)
 {
 }
Beispiel #8
0
 protected DecompressionMethod(BlockyMetadata metadata)
 {
     Metadata = metadata;
 }
Beispiel #9
0
        /// <summary>
        /// Reads a Single Value from its binary representation without the control bit (isBlock)
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="metadata"></param>
        /// <returns></returns>
        public static OfcNumber ReadSingleValueWithoutControlBit(StreamBitReader reader, BlockyMetadata metadata)
        {
            var value = new OfcNumber();

            if (!metadata.IsAbsolute)
            {
                value.IsNegative = reader.ReadByte(1) > 0;
            }
            else
            {
                value.IsNegative = metadata.IsNegative;
            }
            value.Number = (long)reader.Read(metadata.MaxNeededBitsNumber);
            var isExpNegative = reader.ReadByte(1) > 0;

            value.Exponent = (short)reader.Read(metadata.MaxNeededBitsExponent); // Bug: Potentually reading exp even though NoExp is set. Same in writing method! (Ineffizient)
            if (isExpNegative)
            {
                value.Exponent *= -1;
            }
            return(value);
        }
 public NumbersNoExpDecompression(BlockyMetadata metadata) : base(metadata)
 {
 }