예제 #1
0
 private void HandleAudioPacket(IMediaPacket packet)
 {
     // The media server sets the ProcessorLoad field to be the max of all the processor loads noted in all the packets it's mixing.
     _mediaEnvironment.RemoteProcessorLoad = packet.ProcessorLoad;
     _audioJitter.WriteSamples(packet.Payload, 0, packet.PayloadLength, packet.SequenceNumber, packet.AudioCodecType, packet.IsSilent);
     Logger.LogAudioFrameReceived(packet);
 }
예제 #2
0
 private void HandleVideoPacket(IMediaPacket packet)
 {
     if (!IsRemoteVideoMuted)
     {
         VideoThreadData videoThreadData;
         if (RemoteSessions.TryGetValue(packet.SsrcId, out videoThreadData))
         {
             lock (videoThreadData.VideoChunkQueue)
             {
                 if (videoThreadData.VideoChunkQueue.Count > VideoConstants.MaxQueuedBlocksPerStream)
                 {
                     var outdatedChunk = videoThreadData.VideoChunkQueue.Dequeue();
                     _videoChunkPool.Recycle(outdatedChunk);
                 }
                 var chunk = _videoChunkPool.GetNext();
                 chunk.SsrcId = packet.SsrcId;
                 chunk.Payload.TryWriteBytes(packet.Payload, 0, packet.PayloadLength);
                 chunk.Payload.DataLength = packet.PayloadLength;
                 videoThreadData.VideoChunkQueue.Enqueue(chunk);
             }
             videoThreadData.ResetEvent.Set();                     // Tell the thread responsible for processing this queue to get going.
         }
         else
         {
             Logger.LogVideoThreadDataNotFound(packet.SsrcId);
         }
     }
 }
예제 #3
0
        internal void LogAudioFrameReceived(IMediaPacket packet)
        {
            if (packet.SequenceNumber == _lastSequenceNumber)
            {
                _recentPacketsDuplicated++;
                if (++_totalPacketsDuplicated % 10 == 0)
                {
                    ClientLogger.Debug("{0} packets duplicated. Bizarre.", _totalPacketsDuplicated);
                }
            }
            else if (packet.SequenceNumber < _lastSequenceNumber && _lastSequenceNumber < ushort.MaxValue)
            {
                _recentPacketsOutOfOrder++;
                if (++_totalPacketsOutOfOrder % 10 == 0)
                {
                    ClientLogger.Debug("{0} packets received out of order.", _totalPacketsOutOfOrder);
                }
            }
            _lastSequenceNumber = packet.SequenceNumber;

            if (++_totalFramesReceived % 200 == 0)
            {
                _duplicateSequenceNumbers.Update(_recentPacketsDuplicated);
                _recentPacketsDuplicated = 0;
                _recentPacketsOutOfOrder = 0;
            }
        }