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 }
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); }
/// <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); }
public PatternPingPongDecompression(BlockyMetadata metadata) : base(metadata) { }
public PatternOffsetDecompression(BlockyMetadata metadata) : base(metadata) { }
public FloatSimmilarDecompression(BlockyMetadata metadata) : base(metadata) { }
public PatternSameDecompression(BlockyMetadata metadata) : base(metadata) { }
protected DecompressionMethod(BlockyMetadata metadata) { Metadata = metadata; }
/// <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) { }