예제 #1
0
        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);
        }
예제 #2
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);
        }
예제 #3
0
 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();
         }
     }
 }
예제 #4
0
        /// <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);
        }