private async Task ReceiveOverTcpAsync(Stream rtspStream, CancellationToken token)
        {
            _tpktStream = new TpktStream(rtspStream);

            int nextRtcpReportInterval  = GetNextRtcpReportIntervalMs();
            int lastTimeRtcpReportsSent = Environment.TickCount;
            var bufferStream            = new MemoryStream();

            while (!token.IsCancellationRequested)
            {
                TpktPayload payload = await _tpktStream.ReadAsync();

                if (_streamsMap.TryGetValue(payload.Channel, out ITransportStream stream))
                {
                    stream.Process(payload.PayloadSegment);
                }

                int ticksNow = Environment.TickCount;
                if (TimeUtils.IsTimeOver(ticksNow, lastTimeRtcpReportsSent, nextRtcpReportInterval))
                {
                    lastTimeRtcpReportsSent = ticksNow;
                    nextRtcpReportInterval  = GetNextRtcpReportIntervalMs();

                    foreach (KeyValuePair <int, RtcpReceiverReportsProvider> pair in _reportProvidersMap)
                    {
                        IEnumerable <RtcpPacket> packets     = pair.Value.GetReportPackets();
                        ArraySegment <byte>      byteSegment = SerializeRtcpPackets(packets, bufferStream);
                        int rtcpChannel = pair.Key + 1;

                        await _tpktStream.WriteAsync(rtcpChannel, byteSegment);
                    }
                }
            }
        }
Beispiel #2
0
        public async Task ReadAsync_DamagedStream_SkipsWrongBytes()
        {
            var streamBytes = new byte[] { 1, 2, 3, 4, 5, TpktHeader.Id, 1, 0, 1, 9 };
            var ms          = new MemoryStream(streamBytes);

            var         tpktStream = new TpktStream(ms);
            TpktPayload payload    = await tpktStream.ReadAsync();

            Assert.AreEqual(1, payload.Channel);
            Assert.AreEqual(1, payload.PayloadSegment.Count);
            Assert.AreEqual(9, payload.PayloadSegment[0]);
        }