예제 #1
0
        public override void PacketHandler(TsPesPacket packet)
        {
            base.PacketHandler(packet);

            if (null == packet)
            {
                _nextHandler(null);

                return;
            }

            // Reject garbage packet
            if (packet.Length < 1)
            {
                _pesPacketPool.FreePesPacket(packet);
                return;
            }

            if (!_foundframe)
            {
                _configurator.Configure();
                _foundframe = true;
            }

            _nextHandler(packet);
        }
예제 #2
0
        public virtual void PacketHandler(TsPesPacket packet)
        {
            return;

#pragma warning disable 162
            if (null == packet)
                Debug.WriteLine("PES {0}/{1} End-of-stream", StreamType.Contents, Pid);
            else
            {
#if DEBUG
                Debug.WriteLine("PES({0}) {1}/{2} PTS {3} Length {4}",
                    packet.PacketId,
                    StreamType.Contents, Pid,
                    packet.PresentationTimestamp, packet.Length);
#endif
            }
#pragma warning restore 162
        }
예제 #3
0
        public override TimeSpan? GetDuration(TsPesPacket packet)
        {
            if (packet.Duration.HasValue)
                return packet.Duration;

            var duration = TimeSpan.Zero;

            var length = packet.Length;
            var endOffset = packet.Index + length;
            int nextFrameOffset;
            var skipLength = 0;

            for (var i = packet.Index; i < endOffset; i += nextFrameOffset, length -= nextFrameOffset)
            {
                if (_frameHeader.Parse(packet.Buffer, i, length))
                {
                    duration += _frameHeader.Duration;

                    if (_frameHeader.HeaderOffset > 0)
                        Debug.WriteLine("AudioStreamHandler.GetDuration() skipping {0} bytes before frame", _frameHeader.HeaderOffset);

                    nextFrameOffset = _frameHeader.HeaderOffset + _frameHeader.FrameLength;
                    skipLength = 0;
                }
                else
                {
                    if (length > _frameHeader.HeaderOffset + _minimumPacketSize)
                    {
                        nextFrameOffset = _frameHeader.HeaderOffset + 1;
                        skipLength += nextFrameOffset;
                        continue;
                    }

                    Debug.WriteLine("AudioStreamHandler.GetDuration() unable to find frame, skipping {0} bytes", length + skipLength);
                    break;
                }
            }

            packet.Duration = duration;

            return duration;
        }
예제 #4
0
        public override void PacketHandler(TsPesPacket packet)
        {
            base.PacketHandler(packet);

            if (null == packet)
            {
                if (null != Parser)
                    Parser.FlushBuffers();

                if (null != NextHandler)
                    NextHandler(null);

                return;
            }

            if (null != Parser)
            {
                Parser.Position = packet.PresentationTimestamp;
                Parser.ProcessData(packet.Buffer, packet.Index, packet.Length);

                _pesPacketPool.FreePesPacket(packet);

                return;
            }

            //Reject garbage packet
            if (packet.Length < _minimumPacketSize)
            {
                _pesPacketPool.FreePesPacket(packet);
                return;
            }

            if (!_isConfigured)
            {
                if (_frameHeader.Parse(packet.Buffer, packet.Index, packet.Length, true))
                {
                    _isConfigured = true;
                    AudioConfigurator.Configure(_frameHeader);
                }
            }

            NextHandler(packet);
        }
예제 #5
0
 public void EnqueuePacket(TsPesPacket packet)
 {
     _packets.Add(packet);
 }
예제 #6
0
        public override void PacketHandler(TsPesPacket packet)
        {
            base.PacketHandler(packet);

            _nextHandler(packet);
        }
예제 #7
0
        protected virtual void SubmitFrame()
        {
            Debug.Assert(_index >= _startIndex, "_index less than _startIndex");

            var length = _index - _startIndex;

            if (length > 0)
            {
                TsPesPacket packet;

                if (_index + 128 >= _packet.Buffer.Length)
                {
                    packet = _packet;
                    _packet = null;

                    packet.Length = length;
                    packet.Index = _startIndex;
                }
                else
                    packet = _pesPacketPool.CopyPesPacket(_packet, _startIndex, length);

                if (!Position.HasValue)
                    Position = StartPosition;

                packet.PresentationTimestamp = Position.Value;
                packet.Duration = _frameHeader.Duration;

                Position += _frameHeader.Duration;

                _submitPacket(packet);

                _hasSeenValidFrames = true;
                _badBytes = 0;
            }

            _startIndex = _index;

            EnsureBufferSpace(128);
        }
예제 #8
0
        void FreeBuffer()
        {
            if (null != _packet)
            {
                var packet = _packet;

                _packet = null;

                packet.Length = 0;
                _pesPacketPool.FreePesPacket(packet);
            }

            _startIndex = 0;
            _index = 0;
        }
예제 #9
0
        protected void EnsureBufferSpace(int length)
        {
            if (null == _packet)
            {
                _index = 0;
                _startIndex = 0;
                _packet = null;
                _packet = CreatePacket(length);

                return;
            }

            if (_index + length <= _packet.Buffer.Length)
                return;

            var newPacket = CreatePacket(length);

            if (_index > _startIndex)
            {
                // Copy the partial frame to the new buffer.
                _index -= _startIndex;

                Array.Copy(_packet.Buffer, _startIndex, newPacket.Buffer, 0, _index);
            }
            else
                _index = 0;

            _startIndex = 0;

            _packet.Length = 0;
            _pesPacketPool.FreePesPacket(_packet);

            _packet = newPacket;
        }
예제 #10
0
        public override void PacketHandler(TsPesPacket packet)
        {
            if (null == packet)
            {
                if (null != _stream)
                    _stream.Close();

                _hash.TransformFinalBlock(FakeBuffer, 0, 0);

                _streamHash = _hash.Hash;

                Console.WriteLine("PID{0} {1}: {2}", Pid, StreamType.Contents, StreamType.Description);
                Console.WriteLine("Hash:");

                var count = 0;
                foreach (var b in _streamHash)
                {
                    Console.Write(b.ToString("x2"));
                    ++count;

                    if (0 == (count & 3))
                    {
                        if (0 == (count & 0x0f))
                            Console.WriteLine();
                        else
                            Console.Write(' ');
                    }
                }
            }
            else
            {
                Task t = null;

                if (null != _stream)
                    t = _stream.WriteAsync(packet.Buffer, packet.Index, packet.Length);

                _hash.TransformBlock(packet.Buffer, packet.Index, packet.Length, null, 0);

                if (packet.PresentationTimestamp < _timestamp)
                    Debug.WriteLine("Timestamp did not increase {0} -> {1}", _timestamp, packet.PresentationTimestamp);

                _timestamp = packet.PresentationTimestamp;

                if (null != t)
                    t.Wait();
            }

            var h = _nextHandler;

            if (null != h)
                h(packet);
        }
        public void ReportGetSampleCompleted(int streamType, IStreamSource streamSource, TsPesPacket packet)
        {
            if (null == packet)
            {
                Debug.WriteLine("SimulatedMediaElementManager.ReportGetSampleCompleted({0}) null packet", streamType);

                return;
            }

            Debug.WriteLine("SimulatedMediaElementManager.ReportGetSampleCompleted({0}) at {1}/{2}", streamType, packet.PresentationTimestamp, packet.DecodeTimestamp);

            var timestamp = packet.PresentationTimestamp;
            var oldestTimestamp = TimeSpan.MaxValue;
            var oldestIndex = -1;

            lock (_lock)
            {
                SampleState sampleState;

                if (!_streams.TryGetValue(streamType, out sampleState))
                {
                    sampleState = new SampleState
                    {
                        IsPending = false,
                        Timestamp = timestamp
                    };

                    _streams[streamType] = sampleState;
                }
                else
                {
                    sampleState.IsPending = false;
                    sampleState.Timestamp = timestamp;
                }

                foreach (var kv in _streams)
                {
                    var sampleTimestamp = kv.Value.Timestamp;

                    if (sampleTimestamp >= oldestTimestamp)
                        continue;

                    oldestTimestamp = sampleTimestamp;
                    oldestIndex = kv.Key;
                }

                if (oldestIndex >= 0)
                {
                    if (streamType != oldestIndex)
                        sampleState = _streams[oldestIndex];

                    if (sampleState.IsPending)
                        oldestIndex = -1;
                    else
                        sampleState.IsPending = true;
                }
            }

            if (oldestIndex >= 0)
            {
                var t = Task.Run(async () =>
                {
                    await Task.Delay((int)(10 * (1 + _random.GetRandomNumber()))).ConfigureAwait(false);

                    var mediaStreamSource = _mediaStreamConfigurator;

                    if (null != mediaStreamSource)
                        mediaStreamSource.GetSampleAsync(oldestIndex);
                });

                TaskCollector.Default.Add(t, "SimulatedMediaElementManager.ReportGetSampleCompleted");
            }
        }
예제 #12
0
        public override void PacketHandler(TsPesPacket packet)
        {
            base.PacketHandler(packet);

            if (null == packet)
            {
                _nextHandler(null);

                return;
            }

            // Reject garbage packet
            if (packet.Length < 1)
            {
                _pesPacketPool.FreePesPacket(packet);

                return;
            }

            if (!_isConfigured)
            {
                _parser.Reset();

                _parser.Parse(packet.Buffer, packet.Index, packet.Length);

                _isConfigured = _configurator.IsConfigured;
            }

            _nextHandler(packet);
        }
예제 #13
0
 public virtual TimeSpan? GetDuration(TsPesPacket packet)
 {
     return packet.Duration;
 }
예제 #14
0
 public void FreeSample(TsPesPacket packet)
 {
     _freePesPacket(packet);
 }