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); }
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); } } }
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; } }