protected virtual QualityData GetAggregatedData()
        {
            bool        emptyConfig = (QualityConfig == null);
            QualityData qualityData = new QualityData();

            if (emptyConfig || QualityConfig.Bitrate || QualityConfig.BitrateChangeCount || QualityConfig.BitrateMax || QualityConfig.BitrateMaxDuration)
            {
                var agg = aggregators[EventType.BitrateChanged];
                if (emptyConfig || QualityConfig.Bitrate)
                {
                    qualityData.Bitrate = agg.GetAverageOverTime();
                }
                if (emptyConfig || QualityConfig.BitrateChangeCount)
                {
                    qualityData.BitrateChangeCount = agg.GetCount();
                }

                if (emptyConfig || QualityConfig.BitrateMax || QualityConfig.BitrateMaxDuration)
                {
                    double maxBitrate = agg.GetMax();
                    if (emptyConfig || QualityConfig.BitrateMax)
                    {
                        qualityData.BitrateMax = Convert.ToInt32(maxBitrate);
                    }
                    if (emptyConfig || QualityConfig.BitrateMaxDuration)
                    {
                        qualityData.BitrateMaxMilliseconds = agg.GetTotalTime(v => v == maxBitrate).TotalMilliseconds;
                    }
                }
            }
            if (emptyConfig || QualityConfig.Buffering)
            {
                qualityData.BufferingMilliseconds = aggregators[EventType.BufferingStateChanged].GetTotalTime(v => v > 0).TotalMilliseconds;
            }
            if (emptyConfig || QualityConfig.ProcessCpuLoad)
            {
                qualityData.ProcessCpuLoad = aggregators[EventType.ProcessCpuLoad].GetAverage();
            }
            if (emptyConfig || QualityConfig.SystemCpuLoad)
            {
                qualityData.SystemCpuLoad = aggregators[EventType.SystemCpuLoad].GetAverage();
            }
            if (emptyConfig || QualityConfig.DroppedFrames)
            {
                qualityData.DroppedFrames = aggregators[EventType.DroppedFramesPerSecond].GetAverage();
            }
            if (emptyConfig || QualityConfig.RenderedFrames)
            {
                qualityData.RenderedFrames = aggregators[EventType.RenderedFramesPerSecond].GetAverage();
            }
            if (emptyConfig || QualityConfig.PerceivedBandwidth)
            {
                qualityData.PerceivedBandwidth = Convert.ToInt64(aggregators[EventType.PerceivedBandwidth].GetAverageOverTime());
            }
            if (emptyConfig || QualityConfig.VideoBufferSize)
            {
                qualityData.VideoBufferSize = aggregators[EventType.VideoBufferSize].GetAverage();
            }
            if (emptyConfig || QualityConfig.AudioBufferSize)
            {
                qualityData.AudioBufferSize = aggregators[EventType.AudioBufferSize].GetAverage();
            }
            if (emptyConfig || QualityConfig.VideoDownloadLatency)
            {
                qualityData.VideoDownloadLatencyMilliseconds = aggregators[EventType.VideoChunkDownload].GetAverage();
            }
            if (emptyConfig || QualityConfig.AudioDownloadLatency)
            {
                qualityData.AudioDownloadLatencyMilliseconds = aggregators[EventType.AudioChunkDownload].GetAverage();
            }
            if (emptyConfig || QualityConfig.DvrOperationCount)
            {
                qualityData.DvrOperationCount = aggregators[EventType.DvrOperation].GetCount();
            }
            if (emptyConfig || QualityConfig.FullScreenChangeCount)
            {
                qualityData.FullScreenChangeCount = aggregators[EventType.FullScreenChanged].GetCount();
            }
            if (emptyConfig || QualityConfig.HttpErrorCount)
            {
                qualityData.HttpErrorCount = aggregators[EventType.HttpError].GetCount();
            }

            if (base.reportDataWhenDisabled)
            {
                qualityData.SampleSizeMilliseconds = Convert.ToInt32(SlidingWindowInterval.TotalMilliseconds);
            }
            else
            {
                qualityData.SampleSizeMilliseconds = Convert.ToInt32(base.sampleSizeAggregator.GetWindowSize().TotalMilliseconds);
            }

            return(qualityData);
        }
        private void PopulateQualityLog(QualityData data, VideoQualityBaseLog qualityLog)
        {
            PopulateVideoEventLog(qualityLog);
            qualityLog.VideoUrl = data.CurrentStreamUrl;
            qualityLog.EdgeIP = healthMonitor.EdgeServer;
            qualityLog.ClientIP = healthMonitor.ClientIP;
            qualityLog.MediaElementId = data.MediaElementId;
            qualityLog.SamplingFrequencySeconds = data.SampleSizeMilliseconds / 1000;
            qualityLog.IsLive = data.IsLive;
            qualityLog.TotalElapsedTime = healthMonitor.VideoSessionTotalTime.TotalSeconds;
            if (data.Bitrate.HasValue)
                qualityLog.BitRate = Convert.ToInt32(data.Bitrate.Value);
            if (data.BitrateChangeCount.HasValue)
                qualityLog.BitRateChangeCount = data.BitrateChangeCount.Value;
            if (data.BitrateMax.HasValue)
                qualityLog.MaxBitRate = data.BitrateMax.Value;
            if (data.BitrateMaxMilliseconds.HasValue)
                qualityLog.MaxBitRateMilliseconds = Convert.ToInt32(data.BitrateMaxMilliseconds.Value);
            if (data.BufferingMilliseconds.HasValue)
                qualityLog.BufferingMilliseconds = Convert.ToInt32(data.BufferingMilliseconds.Value);
            if (data.ProcessCpuLoad.HasValue)
                qualityLog.ProcessCPULoad = Convert.ToInt16(data.ProcessCpuLoad.Value);
            if (data.SystemCpuLoad.HasValue)
                qualityLog.SystemCPULoad = Convert.ToInt16(data.SystemCpuLoad.Value);
            if (data.DroppedFrames.HasValue)
                qualityLog.DroppedFrames = Convert.ToInt16(data.DroppedFrames.Value);
            if (data.RenderedFrames.HasValue)
                qualityLog.RenderedFrames = Convert.ToInt16(data.RenderedFrames.Value);
            if (data.HttpErrorCount.HasValue)
                qualityLog.HttpErrorCount = data.HttpErrorCount.Value;
            if (data.AudioBufferSize.HasValue)
                qualityLog.AudioBufferSize = Convert.ToInt32(data.AudioBufferSize.Value);
            if (data.VideoBufferSize.HasValue)
                qualityLog.VideoBufferSize = Convert.ToInt32(data.VideoBufferSize.Value);
            if (data.PerceivedBandwidth.HasValue)
                qualityLog.PerceivedBandwidth = Convert.ToInt64(data.PerceivedBandwidth.Value);
            if (data.DvrOperationCount.HasValue)
                qualityLog.DVRUseCount = Convert.ToInt32(data.DvrOperationCount.Value);
            if (data.FullScreenChangeCount.HasValue)
                qualityLog.FullScreenChangeCount = data.FullScreenChangeCount.Value;
            if (data.VideoDownloadLatencyMilliseconds.HasValue)
            {
                if (!Double.IsInfinity(data.VideoDownloadLatencyMilliseconds.Value))
                {
                    qualityLog.VideoDownloadLatencyMilliseconds = Convert.ToInt32(data.VideoDownloadLatencyMilliseconds.Value);
                }
            }
            if (data.AudioDownloadLatencyMilliseconds.HasValue)
            {
                if (!Double.IsInfinity(data.AudioDownloadLatencyMilliseconds.Value))
                {
                    qualityLog.AudioDownloadLatencyMilliseconds = Convert.ToInt32(data.AudioDownloadLatencyMilliseconds.Value);
                }
            }

            //qualityLog.Data[VideoLogAttributes.CDNBlocked] = healthMonitor.AnonymousProxy;
        }
        protected virtual QualityData GetAggregatedData()
        {
            bool emptyConfig = (QualityConfig == null);
            QualityData qualityData = new QualityData();
            if (emptyConfig || QualityConfig.Bitrate || QualityConfig.BitrateChangeCount || QualityConfig.BitrateMax || QualityConfig.BitrateMaxDuration)
            {
                var agg = aggregators[EventType.BitrateChanged];
                if (emptyConfig || QualityConfig.Bitrate)
                    qualityData.Bitrate = agg.GetAverageOverTime();
                if (emptyConfig || QualityConfig.BitrateChangeCount)
                    qualityData.BitrateChangeCount = agg.GetCount();

                if (emptyConfig || QualityConfig.BitrateMax || QualityConfig.BitrateMaxDuration)
                {
                    double maxBitrate = agg.GetMax();
                    if (emptyConfig || QualityConfig.BitrateMax)
                        qualityData.BitrateMax = Convert.ToInt32(maxBitrate);
                    if (emptyConfig || QualityConfig.BitrateMaxDuration)
                        qualityData.BitrateMaxMilliseconds = agg.GetTotalTime(v => v == maxBitrate).TotalMilliseconds;
                }
            }
            if (emptyConfig || QualityConfig.Buffering)
                qualityData.BufferingMilliseconds = aggregators[EventType.BufferingStateChanged].GetTotalTime(v => v > 0).TotalMilliseconds;
            if (emptyConfig || QualityConfig.ProcessCpuLoad)
                qualityData.ProcessCpuLoad = aggregators[EventType.ProcessCpuLoad].GetAverage();
            if (emptyConfig || QualityConfig.SystemCpuLoad)
                qualityData.SystemCpuLoad = aggregators[EventType.SystemCpuLoad].GetAverage();
            if (emptyConfig || QualityConfig.DroppedFrames)
                qualityData.DroppedFrames = aggregators[EventType.DroppedFramesPerSecond].GetAverage();
            if (emptyConfig || QualityConfig.RenderedFrames)
                qualityData.RenderedFrames = aggregators[EventType.RenderedFramesPerSecond].GetAverage();
            if (emptyConfig || QualityConfig.PerceivedBandwidth)
                qualityData.PerceivedBandwidth = Convert.ToInt64(aggregators[EventType.PerceivedBandwidth].GetAverageOverTime());
            if (emptyConfig || QualityConfig.VideoBufferSize)
                qualityData.VideoBufferSize = aggregators[EventType.VideoBufferSize].GetAverage();
            if (emptyConfig || QualityConfig.AudioBufferSize)
                qualityData.AudioBufferSize = aggregators[EventType.AudioBufferSize].GetAverage();
            if (emptyConfig || QualityConfig.VideoDownloadLatency)
                qualityData.VideoDownloadLatencyMilliseconds = aggregators[EventType.VideoChunkDownload].GetAverage();
            if (emptyConfig || QualityConfig.AudioDownloadLatency)
                qualityData.AudioDownloadLatencyMilliseconds = aggregators[EventType.AudioChunkDownload].GetAverage();
            if (emptyConfig || QualityConfig.DvrOperationCount)
                qualityData.DvrOperationCount = aggregators[EventType.DvrOperation].GetCount();
            if (emptyConfig || QualityConfig.FullScreenChangeCount)
                qualityData.FullScreenChangeCount = aggregators[EventType.FullScreenChanged].GetCount();
            if (emptyConfig || QualityConfig.HttpErrorCount)
                qualityData.HttpErrorCount = aggregators[EventType.HttpError].GetCount();

            if (base.reportDataWhenDisabled)
                qualityData.SampleSizeMilliseconds = Convert.ToInt32(SlidingWindowInterval.TotalMilliseconds);
            else
                qualityData.SampleSizeMilliseconds = Convert.ToInt32(base.sampleSizeAggregator.GetWindowSize().TotalMilliseconds);

            return qualityData;
        }
 void ReportSnapshotData(QualityData data)
 {
     VideoQualitySnapshotLog qualityLog = new VideoQualitySnapshotLog();
     PopulateQualityLog(data, qualityLog);
     SendLog(qualityLog);
 }