public void Index() { var buffer = new BlockBuffer <byte>(100); var bytes = new byte[100]; buffer.Write(bytes); buffer.Read(50); buffer.ResetIndex(); Assert.AreEqual(buffer.WritePosition, 50); Assert.AreEqual(buffer.ReadPosition, 0); }
public void Read() { var buffer = new BlockBuffer <byte>(); var buffer2 = new BlockBuffer <int>(); var bytes = new byte[100]; buffer.Write(bytes); buffer.Read(50); Assert.AreEqual(buffer.WritePosition, 100); Assert.AreEqual(buffer.ReadPosition, 50); }
protected override void Unpack(BlockBuffer <byte> bytes, Action <byte[]> onUnpacked) { //Because header is int and cost 4 byte while (bytes.WritePosition > 4) { int length = BitConverter.ToInt32(bytes.Buffer, 0); //If receive body if (bytes.WritePosition >= 4 + length) { bytes.MoveReadPostion(4); var data = bytes.Read(length); //Notice unpack finished onUnpacked(data); bytes.ResetIndex(); } } }
/// <summary> /// Reads an E-AC-3 header from a bitstream. /// </summary> /// <remarks>Has to read a calculated number of bytes from the source stream.</remarks> /// <returns>A <see cref="BitExtractor"/> that continues at the beginning of the audio frame.</returns> public BitExtractor Decode(BlockBuffer <byte> reader) { BitExtractor extractor = new BitExtractor(reader.Read(mustDecode)); if (!extractor.Readable) { return(extractor); } if (extractor.Read(16) != syncWord) { throw new SyncException(); } StreamType = (StreamTypes)extractor.Read(2); SubstreamID = extractor.Read(3); WordsPerSyncframe = extractor.Read(11) + 1; SampleRateCode = extractor.Read(2); Blocks = numberOfBlocks[extractor.Read(2)]; ChannelMode = extractor.Read(3); LFE = extractor.ReadBit(); Decoder = ParseDecoder(extractor.Read(5)); if (Decoder != EnhancedAC3.Decoders.EAC3) { StreamType = StreamTypes.Repackaged; SubstreamID = 0; Blocks = 6; SampleRateCode = extractor[4] >> 6; frmsizecod = extractor[4] & 63; WordsPerSyncframe = frameSizes[frmsizecod >> 1]; if (SampleRateCode == 1) // 44.1 kHz { WordsPerSyncframe = WordsPerSyncframe * 1393 / 1280; if ((frmsizecod & 1) == 1) { ++WordsPerSyncframe; } } else if (SampleRateCode == 2) { WordsPerSyncframe = WordsPerSyncframe * 3 / 2; } bsmod = extractor.Read(3); ChannelMode = extractor.Read(3); } extractor.Expand(reader.Read(WordsPerSyncframe * 2 - mustDecode)); if (StreamType == StreamTypes.Dependent) { SubstreamID += 8; // There can be 8 dependent and independent substreams, both start at 0 } if (StreamType == StreamTypes.Reserved) { throw new ReservedValueException("strmtyp"); } if (SampleRateCode == 3) { throw new ReservedValueException("fscod"); } SampleRate = sampleRates[SampleRateCode]; channelMapping = null; switch (Decoder) { case EnhancedAC3.Decoders.AlternateAC3: case EnhancedAC3.Decoders.AC3: BitStreamInformation(extractor); break; case EnhancedAC3.Decoders.EAC3: BitStreamInformationEAC3(extractor); break; } return(extractor); }