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); } } } }
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]); }