示例#1
0
        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");
        }