void AdaptiveMonitor_ChunkDownloaded(object sender, ChunkDownloadedEventArgs e) { AddLog(new ChunkDownloadLog(e.StreamType, e.ChunkId, e.StartTime, e.DownloadTimeMs)); if (Configuration.LatencyAlertThreshold.HasValue) { if (e.DownloadTimeMs > 75) { double dataSizeKB = e.ByteCount / 1024; double observedThroughput = dataSizeKB / ((e.DownloadTimeMs - 75) / 1000); double perceivedKBps = (double)e.PerceivedBandwidth / (1024 * 8); if (observedThroughput < (perceivedKBps / Configuration.LatencyAlertThreshold.Value)) { AddLog(new LatencyAlertLog(e.Bitrate, e.StreamType, e.ChunkId, e.StartTime, e.DownloadTimeMs)); } } } }
private void SSME_ChunkDownloadFailed(object sender, ChunkDownloadedEventArgs e) { Log.Warn("{0}({1}) {2}", new object[] { e.StatusCode, (int) e.StatusCode, e.CanonicalUri }); }
void MediaElement_ChunkDownloadFailed(object sender, ChunkDownloadedEventArgs e) { ChunkDownloadFailed.IfNotNull(i => i(this, new DataChunkDownloadedEventArgs(e))); }
public DataChunkDownloadedEventArgs(ChunkDownloadedEventArgs eventArgs) { _eventArgs = eventArgs; }
void OnStatusUpdated(AdaptiveSourceStatusUpdatedEventArgs args) { switch (args.UpdateType) { case AdaptiveSourceStatusUpdateType.NextChunkHttpInvalid: case AdaptiveSourceStatusUpdateType.ChunkConnectHttpInvalid: if (ChunkFailure != null) { var failureEventArgs = new ChunkFailureEventArgs(); failureEventArgs.HttpResponse = args.HttpResponse; failureEventArgs.ChunkId = args.AdditionalInfo; ChunkFailure(this, failureEventArgs); } break; case AdaptiveSourceStatusUpdateType.BitrateChanged: var videoStream = VideoStream; if (videoStream != null) { var bitrateInfo = args.AdditionalInfo.Split(';'); var bitrate = uint.Parse(bitrateInfo[0]); var timeStamp = long.Parse(bitrateInfo[1]); var selectedTrack = videoStream.SelectedTracks.FirstOrDefault(t => t.Bitrate == bitrate); if (selectedTrack != null) { lock (bitrateLog) // make this is thread safe since we'll be accessing it from the UI thread in .RefreshState { bitrateLog.Add(new BitrateLogEntry(timeStamp, selectedTrack)); } } } break; case AdaptiveSourceStatusUpdateType.ChunkDownloaded: var addtionalInfo = args.AdditionalInfo.Split(';'); var chunkIndex = int.Parse(addtionalInfo[0]); var url = addtionalInfo[1]; var mediaStreamType = (Microsoft.Media.AdaptiveStreaming.MediaStreamType) int.Parse(addtionalInfo[2]); var chunkStartTimeHns = ulong.Parse(addtionalInfo[3]); var chunkDurationns = ulong.Parse(addtionalInfo[4]); var chunkBitrate = uint.Parse(addtionalInfo[5]); var chunkByteCount = uint.Parse(addtionalInfo[6]); var downloadRequestTimeMs = uint.Parse(addtionalInfo[7]); var downloadCompletedTimeMs = uint.Parse(addtionalInfo[8]); var chunkPerceivedBandwidth = uint.Parse(addtionalInfo[9]); var avgPerceivedBandwidth = uint.Parse(addtionalInfo[10]); var bufferLevelAtRequested90kHz = uint.Parse(addtionalInfo[11]); var bufferLevelAtCompleted90kHz = uint.Parse(addtionalInfo[12]); var responseHeaders = addtionalInfo[13]; // update properties PerceivedBandwidth = avgPerceivedBandwidth; switch (mediaStreamType) { case MediaStreamType.Audio: AudioBufferSize = bufferLevelAtCompleted90kHz; break; case MediaStreamType.Video: VideoBufferSize = bufferLevelAtCompleted90kHz; break; } if (ChunkDownloaded != null) // notify that a new chunk has downloaded { var chunkInfo = new ChunkDownloadedEventArgs(); chunkInfo.ChunkId = chunkIndex; chunkInfo.DownloadTimeMs = downloadCompletedTimeMs - downloadRequestTimeMs; chunkInfo.StartTime = chunkStartTimeHns; chunkInfo.StreamType = mediaStreamType.ToString().ToLowerInvariant(); chunkInfo.PerceivedBandwidth = chunkPerceivedBandwidth; chunkInfo.Bitrate = chunkBitrate; chunkInfo.ByteCount = chunkByteCount; ChunkDownloaded(this, chunkInfo); } break; } }