public TrackStatsData GetTrackStatsData(string trackId, bool outgoing = true) { TrackStatsData ret = null; try { if (!string.IsNullOrEmpty(trackId)) { if (TrackStatsDictionary.ContainsKey(trackId)) { ret = TrackStatsDictionary[trackId]; } else { lock (_thisLock) { if (TrackStatsDictionary.ContainsKey(trackId)) { ret = TrackStatsDictionary[trackId]; } else { ret = new TrackStatsData(trackId) { Outgoing = outgoing }; TrackStatsDictionary.Add(trackId, ret); } } } } } catch (Exception e) { Debug.Write(e); } return(ret); }
private void ParseStats(IRTCStats stats, StatsData statsData) { try { switch (stats.StatsType) { case RTCStatsType.InboundRtp: //Debug.WriteLine("RTCStatsType.InboundRtp:" + statId); var inboundRtpStreamStats = RTCInboundRtpStreamStats.Cast(stats); if (inboundRtpStreamStats != null) { TrackStatsData tsd = statsData.GetTrackStatsData(inboundRtpStreamStats.MediaTrackId, false); if (tsd != null) { if (statsData.TimeToSetupCall.Milliseconds == 0 && inboundRtpStreamStats.PacketsReceived > 0) { statsData.TimeToSetupCall = DateTime.Now - statsData.StarTime; } //if (!tsd.IsAudio) // TestReceivedBytes.Add(inboundRtpStreamStats.BytesReceived); tsd.AddAverage(RtcStatsValueName.StatsValueNameBytesReceived, inboundRtpStreamStats.BytesReceived); //if (!tsd.IsAudio) //TestReceivedPackets.Add(inboundRtpStreamStats.PacketsReceived); tsd.AddAverage(RtcStatsValueName.StatsValueNamePacketsReceived, inboundRtpStreamStats.PacketsReceived); tsd.AddAverage(RtcStatsValueName.StatsValueNamePacketsLost, inboundRtpStreamStats.PacketsLost); tsd.AddData(RtcStatsValueName.StatsValueNameCurrentEndToEndDelayMs, inboundRtpStreamStats.EndToEndDelay.TotalMilliseconds); } } break; case RTCStatsType.OutboundRtp: var outboundRtpStreamStats = RTCOutboundRtpStreamStats.Cast(stats); if (outboundRtpStreamStats != null) { TrackStatsData tsd = statsData.GetTrackStatsData(outboundRtpStreamStats.MediaTrackId); if (tsd != null) { tsd.AddAverage(RtcStatsValueName.StatsValueNameBytesSent, outboundRtpStreamStats.BytesSent); tsd.AddAverage(RtcStatsValueName.StatsValueNamePacketsSent, outboundRtpStreamStats.PacketsSent); } } break; case RTCStatsType.Track: var mediaStreamTrackStats = RTCMediaStreamTrackStats.Cast(stats); if (mediaStreamTrackStats != null) { try { TrackStatsData tsd = statsData.GetTrackStatsData(mediaStreamTrackStats.TrackId, !mediaStreamTrackStats.RemoteSource); if (tsd != null && !tsd.IsAudio) { if (mediaStreamTrackStats.RemoteSource) { tsd.AddData(RtcStatsValueName.StatsValueNameFrameRateReceived, mediaStreamTrackStats.FramesPerSecond); tsd.AddData(RtcStatsValueName.StatsValueNameFrameWidthReceived, mediaStreamTrackStats.FrameWidth); tsd.AddData(RtcStatsValueName.StatsValueNameFrameHeightReceived, mediaStreamTrackStats.FrameHeight); FramesPerSecondChanged?.Invoke("PEER", mediaStreamTrackStats.FramesPerSecond.ToString("0.#")); ResolutionChanged?.Invoke("PEER", mediaStreamTrackStats.FrameWidth, mediaStreamTrackStats.FrameHeight); } else { tsd.AddData(RtcStatsValueName.StatsValueNameFrameRateSent, mediaStreamTrackStats.FramesPerSecond); tsd.AddData(RtcStatsValueName.StatsValueNameFrameWidthSent, mediaStreamTrackStats.FrameWidth); tsd.AddData(RtcStatsValueName.StatsValueNameFrameHeightSent, mediaStreamTrackStats.FrameHeight); FramesPerSecondChanged?.Invoke("SELF", mediaStreamTrackStats.FramesPerSecond.ToString("0.#")); ResolutionChanged?.Invoke("SELF", mediaStreamTrackStats.FrameWidth, mediaStreamTrackStats.FrameHeight); } } } catch (Exception e) { Debug.Write(e); } } break; } } catch (Exception e) { Debug.Write(e); } }