private async void SendReport(object state) { try { foreach (var(senderSsrc, senderReport) in _senderReports) { if (!_receiverReports.TryGetValue(senderSsrc, out var receiverReport)) { continue; } var sourceDescriptionPacket = new RtcpSourceDescriptionPacket { Chunks = new List <RtcpSourceDescriptionChunk>(1) { new RtcpSourceDescriptionChunk { SynchronizationSource = receiverReport.SynchronizationSource, Items = new List <RtcpSourceDescriptionItem>(1) { new RtcpSourceDescriptionItem { Type = SourceDescriptionType.CName, Text = Environment.MachineName } } } } }; await _rtcpClient.SendAsync(senderReport.RemoteEndPoint, receiverReport, sourceDescriptionPacket); } _senderReports.Clear(); } catch (Exception e) { Debug.WriteLine($"Exception occurred {e}", nameof(RtcpReceptionReportScheduler)); } }
private static RtcpSourceDescriptionPacket ParseRtcpSourceDescriptionPacket(byte sourceCount, Span <byte> bytes, ref int idx) { var rtcpPacket = new RtcpSourceDescriptionPacket(); rtcpPacket.Chunks = new List <RtcpSourceDescriptionChunk>(sourceCount); for (var i = 0; i < sourceCount; i++) { var chunk = new RtcpSourceDescriptionChunk(); chunk.SynchronizationSource = BinaryPrimitives.ReadUInt32BigEndian(bytes); idx += 4; chunk.Items = new List <RtcpSourceDescriptionItem>(); var type = (SourceDescriptionType)bytes[idx]; idx += 1; while (type != SourceDescriptionType.End) { var item = new RtcpSourceDescriptionItem(); item.Type = type; var textLen = bytes[idx]; idx += 1; var textBytes = bytes.Slice(0, textLen).ToArray(); idx += textLen; item.Text = Encoding.UTF8.GetString(textBytes); chunk.Items.Add(item); type = (SourceDescriptionType)bytes[idx]; idx += 1; } rtcpPacket.Chunks.Add(chunk); } return(rtcpPacket); }