Пример #1
0
        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));
                    }
                }
            }
        }
Пример #2
0
 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;
 }
Пример #5
0
        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;
            }
        }