public override ImageData Read(IBinaryStream file, ImageMetaData info) { var reader = new CgfDecoder(file, (CgfMetaData)info); var pixels = reader.Unpack(); return(ImageData.Create(info, reader.Format, null, pixels)); }
public override Stream OpenEntry(ArcFile arc, Entry entry) { if (!entry.Name.HasExtension(".snr") || !arc.File.View.AsciiEqual(entry.Offset, "SNR\x1A")) { return(base.OpenEntry(arc, entry)); } try { var data = arc.File.View.ReadBytes(entry.Offset + 12, entry.Size - 12); DecryptSnr(data); CgfDecoder.Decrypt(data, data.Length); // uint checksum = LittleEndian.ToUInt32 (data, 0); // uint crc = Crc32Normal.Compute (data, 4, data.Length-4); var input = new MemoryStream(data, 4, data.Length - 4); return(new ZLibStream(input, CompressionMode.Decompress)); } catch { return(base.OpenEntry(arc, entry)); } }
public override SoundInput TryOpen(IBinaryStream file) { var header = file.ReadHeader(0x23); int bits1_length = header.ToInt32(0x13); int bits2_length = header.ToInt32(0x17); var data = file.ReadBytes(bits1_length + bits2_length); CgfDecoder.Decrypt(data, bits1_length); int unpacked_length = header.ToInt32(5); uint sample_rate = header.ToUInt32(0xD); int sample_count = unpacked_length >> 1; var bits1 = new byte[(sample_count + 7) >> 3]; var bits2 = new byte[sample_count >> 1]; using (var mem = new MemoryStream(data, 4, bits1_length - 4)) using (var input = new ZLibStream(mem, CompressionMode.Decompress)) input.Read(bits1, 0, bits1.Length); using (var mem = new MemoryStream(data, bits1_length + 4, bits2_length - 4)) using (var input = new ZLibStream(mem, CompressionMode.Decompress)) input.Read(bits2, 0, bits2.Length); short init = header.ToInt16(0x11); var decoded = new short[sample_count]; DecodeAdp(bits2, decoded, sample_count, init); var output = new byte[unpacked_length]; byte bit = 0x80; int src = 0; int dst = 0; for (int i = 0; i < decoded.Length; ++i) { short sample = Math.Max(decoded[i], (short)0); if ((bit & bits1[src]) != 0) { sample = (short)-sample; } LittleEndian.Pack(sample, output, dst); dst += 2; bit >>= 1; if (0 == bit) { ++src; bit = 0x80; } } var format = new WaveFormat { FormatTag = 1, Channels = 1, SamplesPerSecond = sample_rate, BlockAlign = 2, BitsPerSample = 16, }; format.SetBPS(); var pcm = new MemoryStream(output); return(new RawPcmInput(pcm, format)); }