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]); }
public async Task WriteAsync_TestPayload_WritesWithValidHeader() { var testPayloadBytes = new byte[] { 1, 2, 3, 4, 5, 6 }; var ms = new MemoryStream(); var tpktStream = new TpktStream(ms); await tpktStream.WriteAsync(1, new ArraySegment <byte>(testPayloadBytes)); byte[] writtenBytes = ms.ToArray(); Assert.AreEqual((byte)TpktHeader.Id, writtenBytes[0]); Assert.AreEqual(1, writtenBytes[1]); Assert.AreEqual(testPayloadBytes.Length, writtenBytes[2] << 8 | writtenBytes[3]); Assert.IsTrue(testPayloadBytes.SequenceEqual(writtenBytes.Skip(4))); }