Пример #1
0
        public void RTCPHeaderRoundTripTest()
        {
            Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name);

            RTCPPacket src = new RTCPPacket(12, 122, 561, 6756, 56434);

            byte[]     reports      = new byte[84];
            byte[]     packetBuffer = src.GetBytes(reports);
            RTCPPacket dst          = new RTCPPacket(packetBuffer);

            Console.WriteLine("SenderSyncSource: " + src.SenderSyncSource + ", " + dst.SenderSyncSource);
            Console.WriteLine("NTPTimestamp: " + src.NTPTimestamp + ", " + dst.NTPTimestamp);
            Console.WriteLine("RTPTimestamp: " + src.RTPTimestamp + ", " + dst.RTPTimestamp);
            Console.WriteLine("SenderPacketCount: " + src.SenderPacketCount + ", " + dst.SenderPacketCount);
            Console.WriteLine("SenderOctetCount: " + src.SenderOctetCount + ", " + dst.SenderOctetCount);
            Console.WriteLine("Reports Length: " + src.Reports.Length + ", " + dst.Reports.Length);

            //Console.WriteLine("Raw Header: " + System.Text.Encoding.ASCII.GetString(headerBuffer, 0, headerBuffer.Length));

            Assert.IsTrue(src.SenderSyncSource == dst.SenderSyncSource, "SenderSyncSource was mismatched.");
            Assert.IsTrue(src.NTPTimestamp == dst.NTPTimestamp, "NTPTimestamp was mismatched.");
            Assert.IsTrue(src.RTPTimestamp == dst.RTPTimestamp, "RTPTimestamp was mismatched.");
            Assert.IsTrue(src.SenderPacketCount == dst.SenderPacketCount, "SenderPacketCount was mismatched.");
            Assert.IsTrue(src.SenderOctetCount == dst.SenderOctetCount, "SenderOctetCount was mismatched.");
            Assert.IsTrue(src.Reports.Length == dst.Reports.Length, "Reports length was mismatched.");
        }
Пример #2
0
 /// <summary>
 /// 发送rtcp包
 /// </summary>
 /// <param name="ntpTimestamp"></param>
 /// <param name="rtpTimestamp"></param>
 private void SendRtcpSenderReport(ulong ntpTimestamp, uint rtpTimestamp)
 {
     try
     {
         RTCPPacket senderReport = new RTCPPacket(_rtcpSyncSource, ntpTimestamp, rtpTimestamp, _senderPacketCount, _senderOctetCount);
         var        bytes        = senderReport.GetBytes();
         _rtcpSocket.BeginSendTo(bytes, 0, bytes.Length, SocketFlags.None, _rtcpRemoteEndPoint, SendRtcpCallback, _rtcpSocket);
         _senderLastSentAt = DateTime.Now;
     }
     catch (Exception excp)
     {
         logger.Error("Exception SendRtcpSenderReport. " + excp);
     }
 }
Пример #3
0
        public void GetRTCPPacketTest()
        {
            Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name);

            RTCPPacket rtcpPacket = new RTCPPacket(1, 1, 1, 1, 1);

            byte[] reports      = new byte[84];
            byte[] packetBuffer = rtcpPacket.GetBytes(reports);

            int byteNum = 1;

            foreach (byte packetByte in packetBuffer)
            {
                Console.WriteLine(byteNum + ": " + packetByte.ToString("x"));
                byteNum++;
            }
        }
Пример #4
0
 /// <summary>
 /// Processes RTCP packets.
 /// </summary>
 /// <param name="packets">The packets to process.</param>
 public override void ProcessRTCP(RTCPPacket[] packets)
 {
     if (Encoder != null)
     {
         foreach (var packet in packets)
         {
             if (packet is RTCPPliPacket)
             {
                 Encoder.ForceKeyframe();
             }
             else if (packet is RTCPReportPacket)
             {
                 var report = (RTCPReportPacket)packet;
                 foreach (var block in report.ReportBlocks)
                 {
                     Log.DebugFormat("VP8 report: {0} packet loss ({1} cumulative packets lost)", block.PercentLost.ToString("P2"), block.CumulativeNumberOfPacketsLost.ToString());
                     if (block.PercentLost > 0)
                     {
                         LosslessCount = 0;
                         LossyCount++;
                         if (LossyCount > 5 && (Encoder.Quality > 0.0 || Encoder.Bitrate > 64 /* || Encoder.Scale > 0.2 */))
                         {
                             LossyCount = 0;
                             if (Encoder.Quality > 0.0)
                             {
                                 Encoder.Quality = MathAssistant.Max(0.0, Encoder.Quality - 0.1);
                                 Log.InfoFormat("Decreasing VP8 encoder quality to {0}.", Encoder.Quality.ToString("P2"));
                             }
                             if (Encoder.Bitrate > 64)
                             {
                                 Encoder.Bitrate = MathAssistant.Max(64, Encoder.Bitrate - 64);
                                 Log.InfoFormat("Decreasing VP8 encoder bitrate to {0}.", Encoder.Bitrate.ToString());
                             }
                             /*if (Encoder.Scale > 0.2)
                             {
                                 Encoder.Scale = MathAssistant.Max(0.2, Encoder.Scale - 0.2);
                                 Log.InfoFormat("Decreasing VP8 encoder scale to {0}.", Encoder.Scale.ToString("P2"));
                             }*/
                         }
                     }
                     else
                     {
                         LossyCount = 0;
                         LosslessCount++;
                         if (LosslessCount > 5 && (Encoder.Quality < 1.0 || Encoder.Bitrate < 640 /* || Encoder.Scale < 1.0 */))
                         {
                             LosslessCount = 0;
                             if (Encoder.Quality < 1.0)
                             {
                                 Encoder.Quality = MathAssistant.Min(1.0, Encoder.Quality + 0.1);
                                 Log.InfoFormat("Increasing VP8 encoder quality to {0}.", Encoder.Quality.ToString("P2"));
                             }
                             if (Encoder.Bitrate < 640)
                             {
                                 Encoder.Bitrate = MathAssistant.Min(640, Encoder.Bitrate + 64);
                                 Log.InfoFormat("Increasing VP8 encoder bitrate to {0}.", Encoder.Bitrate.ToString());
                             }
                             /*if (_Encoder.Scale < 1.0)
                             {
                                 Encoder.Scale = MathAssistant.Min(1.0, Encoder.Scale + 0.2);
                                 Log.InfoFormat("Increasing VP8 encoder scale to {0}.", Encoder.Scale.ToString("P2"));
                             }*/
                         }
                     }
                 }
             }
         }
     }
 }
Пример #5
0
        /// <summary>
        /// Processes RTCP packets.
        /// </summary>
        /// <param name="packets">The packets to process.</param>
        public override void ProcessRTCP(RTCPPacket[] packets)
        {
            if (_Encoder != null)
            {
                foreach (var packet in packets)
                {
                    if (packet is RTCPReportPacket)
                    {
                        _ReportsReceived++;

                        var report = (RTCPReportPacket)packet;
                        foreach (var block in report.ReportBlocks)
                        {
                            Log.DebugFormat("Opus report: {0} packet loss ({1} cumulative packets lost)", block.PercentLost.ToString("P2"), block.CumulativeNumberOfPacketsLost.ToString());
                            if (block.PercentLost > 0)
                            {
                                _LosslessCount = 0;
                                _LossyCount++;
                                if (_LossyCount > 5 && _Encoder.Quality > 0.0)
                                {
                                    _LossyCount = 0;
                                    _Encoder.Quality = MathAssistant.Max(0.0, _Encoder.Quality - 0.1);
                                    Log.InfoFormat("Decreasing Opus encoder quality to {0}.", _Encoder.Quality.ToString("P2"));
                                }
                            }
                            else
                            {
                                _LossyCount = 0;
                                _LosslessCount++;
                                if (_LosslessCount > 5 && _Encoder.Quality < 1.0)
                                {
                                    _LosslessCount = 0;
                                    _Encoder.Quality = MathAssistant.Min(1.0, _Encoder.Quality + 0.1);
                                    Log.InfoFormat("Increasing Opus encoder quality to {0}.", _Encoder.Quality.ToString("P2"));
                                }
                            }

                            if (!DisableFEC && !FecActive && _ReportsReceived > _MinimumReportsBeforeFEC)
                            {
                                if ((block.PercentLost * 100) > PercentLossToTriggerFEC)
                                {
                                    Log.InfoFormat("Activating FEC for Opus audio stream.");
                                    _Encoder.ActivateFEC(PercentLossToTriggerFEC);
                                    FecActive = true;
                                }
                            }
                        }
                    }
                }
            }
        }
Пример #6
0
 /// <summary>
 /// Processes RTCP packets.
 /// </summary>
 /// <param name="packets">The packets to process.</param>
 public override void ProcessRTCP(RTCPPacket[] packets)
 {
     for (var i = 0; i < packets.Length; i++)
     {
         var packet = packets[i];
         if (packet is RTCPPliPacket)
         {
             if (Encoder != null)
             {
                 Encoder.ForceKeyframe();
             }
         }
     }
 }
Пример #7
0
 public override void ProcessRTCP(RTCPPacket[] packets)
 {
     for (int i = 0; i < packets.Length; i++)
     {
         var packet = packets[i];
         if (packet is RTCPPliPacket)
         {
             if (_Encoder != null)
             {
                 _Encoder.ForceKeyframe();
             }
         }
         else if (packet is RTCPReportPacket)
         {
             var report = (RTCPReportPacket)packet;
             foreach (var block in report.ReportBlocks)
             {
                 Log.DebugFormat("VP8 report: {0}% packet loss ({1} cumulative packets lost)", ((int)(block.PercentLost * 100)).ToString(), block.CumulativeNumberOfPacketsLost.ToString());
             }
         }
     }
 }