| Index: tools/telemetry/telemetry/web_perf/metrics/webrtc_rendering_timeline.py
|
| diff --git a/tools/telemetry/telemetry/web_perf/metrics/webrtc_rendering_timeline.py b/tools/telemetry/telemetry/web_perf/metrics/webrtc_rendering_timeline.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ef7f8b265d5a4fc00e8f21e75d59bd77a24b55de
|
| --- /dev/null
|
| +++ b/tools/telemetry/telemetry/web_perf/metrics/webrtc_rendering_timeline.py
|
| @@ -0,0 +1,122 @@
|
| +# Copyright 2015 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +from telemetry.value import list_of_scalar_values
|
| +from telemetry.value import scalar
|
| +from telemetry.value import improvement_direction
|
| +from telemetry.web_perf.metrics import timeline_based_metric
|
| +from telemetry.web_perf.metrics import webrtc_rendering_stats as stats_helper
|
| +
|
| +WEB_MEDIA_PLAYER_MS_EVENT = 'WebMediaPlayerMS::UpdateCurrentFrame'
|
| +
|
| +
|
| +class WebRtcRenderingTimelineMetric(timeline_based_metric.TimelineBasedMetric):
|
| + """WebrtcRenderingTimelineMetric calculates metric for WebMediaPlayerMS.
|
| +
|
| + The following metrics are added to the results:
|
| + WebRTCRendering_drift_time us
|
| + WebRTCRendering_percent_badly_out_of_sync %
|
| + WebRTCRendering_percent_out_of_sync %
|
| + WebRTCRendering_fps FPS
|
| + WebRTCRendering_smoothness_score %
|
| + WebRTCRendering_freezing_score %
|
| + WebRTCRendering_rendering_length_error %
|
| + """
|
| +
|
| + def __init__(self):
|
| + super(WebRtcRenderingTimelineMetric, self).__init__()
|
| +
|
| + @staticmethod
|
| + def IsMediaPlayerMSEvent(event):
|
| + """Verify that the event is a webmediaplayerMS event."""
|
| + return event.name == WEB_MEDIA_PLAYER_MS_EVENT
|
| +
|
| + def AddResults(self, model, renderer_thread, interactions, results):
|
| + """Adding metrics to the results."""
|
| + assert interactions
|
| + found_events = []
|
| + for event in renderer_thread.parent.IterAllEvents(
|
| + event_predicate=self.IsMediaPlayerMSEvent):
|
| + if timeline_based_metric.IsEventInInteractions(event, interactions):
|
| + found_events.append(event)
|
| + stats_parser = stats_helper.WebMediaPlayerMsRenderingStats(found_events)
|
| + rendering_stats = stats_parser.GetTimeStats()
|
| + none_reason = None
|
| + if not rendering_stats:
|
| + # Create a TimeStats object whose members have None values.
|
| + rendering_stats = stats_helper.TimeStats()
|
| + none_reason = 'No WebMediaPlayerMS::UpdateCurrentFrame event found'
|
| + results.AddValue(list_of_scalar_values.ListOfScalarValues(
|
| + results.current_page,
|
| + 'WebRTCRendering_drift_time',
|
| + 'us',
|
| + rendering_stats.drift_time,
|
| + important=True,
|
| + description='Drift time for a rendered frame',
|
| + improvement_direction=improvement_direction.DOWN,
|
| + none_value_reason=none_reason))
|
| +
|
| + results.AddValue(scalar.ScalarValue(
|
| + results.current_page,
|
| + 'WebRTCRendering_percent_badly_out_of_sync',
|
| + '%',
|
| + rendering_stats.percent_badly_out_of_sync,
|
| + important=True,
|
| + description='Percentage of frame which drifted more than 2 VSYNC',
|
| + improvement_direction=improvement_direction.DOWN,
|
| + none_value_reason=none_reason))
|
| +
|
| + results.AddValue(scalar.ScalarValue(
|
| + results.current_page,
|
| + 'WebRTCRendering_percent_out_of_sync',
|
| + '%',
|
| + rendering_stats.percent_out_of_sync,
|
| + important=True,
|
| + description='Percentage of frame which drifted more than 1 VSYNC',
|
| + improvement_direction=improvement_direction.DOWN,
|
| + none_value_reason=none_reason))
|
| +
|
| + # I removed the frame distribution list from stats as it is not a metric,
|
| + # rather it is the underlying data. Also there is no sense of improvement
|
| + # direction for frame distribution.
|
| +
|
| + results.AddValue(scalar.ScalarValue(
|
| + results.current_page,
|
| + 'WebRTCRendering_fps',
|
| + 'fps',
|
| + rendering_stats.fps,
|
| + important=True,
|
| + description='Calculated Frame Rate of video rendering',
|
| + improvement_direction=improvement_direction.UP,
|
| + none_value_reason=none_reason))
|
| +
|
| + results.AddValue(scalar.ScalarValue(
|
| + results.current_page,
|
| + 'WebRTCRendering_smoothness_score',
|
| + '%',
|
| + rendering_stats.smoothness_score,
|
| + important=True,
|
| + description='Smoothness score of rendering',
|
| + improvement_direction=improvement_direction.UP,
|
| + none_value_reason=none_reason))
|
| +
|
| + results.AddValue(scalar.ScalarValue(
|
| + results.current_page,
|
| + 'WebRTCRendering_freezing_score',
|
| + '%',
|
| + rendering_stats.freezing_score,
|
| + important=True,
|
| + description='Freezing score of rendering',
|
| + improvement_direction=improvement_direction.UP,
|
| + none_value_reason=none_reason))
|
| +
|
| + results.AddValue(scalar.ScalarValue(
|
| + results.current_page,
|
| + 'WebRTCRendering_rendering_length_error',
|
| + '%',
|
| + rendering_stats.rendering_length_error,
|
| + important=True,
|
| + description='Rendering length error rate',
|
| + improvement_direction=improvement_direction.DOWN,
|
| + none_value_reason=none_reason))
|
|
|