protected void RtcpPacketReceived(object sender, RtcpListener.RtcpPacketReceivedArgs e) { var locked = false; var level = 0; var quality = 0; if (e.Packet is RtcpAppPacket) { RtcpAppPacket apppacket = (RtcpAppPacket)e.Packet; var m = RegexDescribeResponseSignalInfo.Match(apppacket.Data); if (m.Success) { locked = m.Groups[2].Captures[0].Value.Equals("1"); level = int.Parse(m.Groups[1].Captures[0].Value) * 100 / 255; // level: 0..255 => 0..100 quality = int.Parse(m.Groups[3].Captures[0].Value) * 100 / 15; // quality: 0..15 => 0..100 } OnRecieptionInfoChanged(new RecieptionInfoArgs(locked, level, quality)); } else if (e.Packet is RtcpByePacket) { TearDown(); } }
private void RtcpListenerThread() { try { var receivedGoodBye = false; try { //_udpClient.Client.ReceiveTimeout = 400; var serverEndPoint = new IPEndPoint(IPAddress.Any, 0); while (!receivedGoodBye && !_rtcpListenerThreadStopEvent.WaitOne(1)) { var packets = _udpClient.Receive(ref serverEndPoint); if (packets == null) { continue; } var offset = 0; while (offset < packets.Length) { switch (packets[offset + 1]) { case 200: //sr var sr = new RtcpSenderReportPacket(); sr.Parse(packets, offset); offset += sr.Length; break; case 201: //rr var rr = new RtcpReceiverReportPacket(); rr.Parse(packets, offset); offset += rr.Length; break; case 202: //sd var sd = new RtcpSourceDescriptionPacket(); sd.Parse(packets, offset); offset += sd.Length; break; case 203: // bye var bye = new RtcpByePacket(); bye.Parse(packets, offset); receivedGoodBye = true; OnPacketReceived(new RtcpPacketReceivedArgs(bye)); offset += bye.Length; break; case 204: // app var app = new RtcpAppPacket(); app.Parse(packets, offset); OnPacketReceived(new RtcpPacketReceivedArgs(app)); offset += app.Length; break; } } } } finally { switch (_transmissionMode) { case TransmissionMode.Multicast: _udpClient.DropMulticastGroup(_multicastEndPoint.Address); _udpClient.Close(); break; case TransmissionMode.Unicast: _udpClient.Close(); break; } } } catch (ThreadAbortException) { } catch (Exception ex) { Logger.Error("SAT>IP : RTCP listener thread exception", ex); return; } Logger.Warn("SAT>IP : RTCP listener thread stopping"); }