Home | History | Annotate | Download | only in metrics
      1 # Copyright 2015 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 from telemetry.value import list_of_scalar_values
      6 from telemetry.value import scalar
      7 from telemetry.value import improvement_direction
      8 from telemetry.web_perf.metrics import timeline_based_metric
      9 from telemetry.web_perf.metrics import webrtc_rendering_stats as stats_helper
     10 
     11 WEB_MEDIA_PLAYER_MS_EVENT = 'WebMediaPlayerMS::UpdateCurrentFrame'
     12 
     13 
     14 class WebRtcRenderingTimelineMetric(timeline_based_metric.TimelineBasedMetric):
     15   """WebrtcRenderingTimelineMetric calculates metric for WebMediaPlayerMS.
     16 
     17   The following metrics are added to the results:
     18     WebRTCRendering_drift_time us
     19     WebRTCRendering_percent_badly_out_of_sync %
     20     WebRTCRendering_percent_out_of_sync %
     21     WebRTCRendering_fps FPS
     22     WebRTCRendering_smoothness_score %
     23     WebRTCRendering_freezing_score %
     24     WebRTCRendering_rendering_length_error %
     25   """
     26 
     27   def __init__(self):
     28     super(WebRtcRenderingTimelineMetric, self).__init__()
     29 
     30   @staticmethod
     31   def IsMediaPlayerMSEvent(event):
     32     """Verify that the event is a webmediaplayerMS event."""
     33     return event.name == WEB_MEDIA_PLAYER_MS_EVENT
     34 
     35   def AddResults(self, model, renderer_thread, interactions, results):
     36     """Adding metrics to the results."""
     37     assert interactions
     38     found_events = []
     39     for event in renderer_thread.parent.IterAllEvents(
     40         event_predicate=self.IsMediaPlayerMSEvent):
     41       if timeline_based_metric.IsEventInInteractions(event, interactions):
     42         found_events.append(event)
     43     stats_parser = stats_helper.WebMediaPlayerMsRenderingStats(found_events)
     44     rendering_stats = stats_parser.GetTimeStats()
     45     none_reason = None
     46     if not rendering_stats:
     47       # Create a TimeStats object whose members have None values.
     48       rendering_stats = stats_helper.TimeStats()
     49       none_reason = 'No WebMediaPlayerMS::UpdateCurrentFrame event found'
     50     elif rendering_stats.invalid_data:
     51       # Throw away the data.
     52       rendering_stats = stats_helper.TimeStats()
     53       none_reason = 'WebMediaPlayerMS data is corrupted.'
     54     results.AddValue(list_of_scalar_values.ListOfScalarValues(
     55         results.current_page,
     56         'WebRTCRendering_drift_time',
     57         'us',
     58         rendering_stats.drift_time,
     59         important=True,
     60         description='Drift time for a rendered frame',
     61         tir_label=interactions[0].label,
     62         improvement_direction=improvement_direction.DOWN,
     63         none_value_reason=none_reason))
     64 
     65     results.AddValue(scalar.ScalarValue(
     66         results.current_page,
     67         'WebRTCRendering_percent_badly_out_of_sync',
     68         '%',
     69         rendering_stats.percent_badly_out_of_sync,
     70         important=True,
     71         description='Percentage of frame which drifted more than 2 VSYNC',
     72         tir_label=interactions[0].label,
     73         improvement_direction=improvement_direction.DOWN,
     74         none_value_reason=none_reason))
     75 
     76     results.AddValue(scalar.ScalarValue(
     77         results.current_page,
     78         'WebRTCRendering_percent_out_of_sync',
     79         '%',
     80         rendering_stats.percent_out_of_sync,
     81         important=True,
     82         description='Percentage of frame which drifted more than 1 VSYNC',
     83         tir_label=interactions[0].label,
     84         improvement_direction=improvement_direction.DOWN,
     85         none_value_reason=none_reason))
     86 
     87     # I removed the frame distribution list from stats as it is not a metric,
     88     # rather it is the underlying data. Also there is no sense of improvement
     89     # direction for frame distribution.
     90 
     91     results.AddValue(scalar.ScalarValue(
     92         results.current_page,
     93         'WebRTCRendering_fps',
     94         'fps',
     95         rendering_stats.fps,
     96         important=True,
     97         description='Calculated Frame Rate of video rendering',
     98         tir_label=interactions[0].label,
     99         improvement_direction=improvement_direction.UP,
    100         none_value_reason=none_reason))
    101 
    102     results.AddValue(scalar.ScalarValue(
    103         results.current_page,
    104         'WebRTCRendering_smoothness_score',
    105         '%',
    106         rendering_stats.smoothness_score,
    107         important=True,
    108         description='Smoothness score of rendering',
    109         tir_label=interactions[0].label,
    110         improvement_direction=improvement_direction.UP,
    111         none_value_reason=none_reason))
    112 
    113     results.AddValue(scalar.ScalarValue(
    114         results.current_page,
    115         'WebRTCRendering_freezing_score',
    116         '%',
    117         rendering_stats.freezing_score,
    118         important=True,
    119         description='Freezing score of rendering',
    120         tir_label=interactions[0].label,
    121         improvement_direction=improvement_direction.UP,
    122         none_value_reason=none_reason))
    123 
    124     results.AddValue(scalar.ScalarValue(
    125         results.current_page,
    126         'WebRTCRendering_rendering_length_error',
    127         '%',
    128         rendering_stats.rendering_length_error,
    129         important=True,
    130         description='Rendering length error rate',
    131         tir_label=interactions[0].label,
    132         improvement_direction=improvement_direction.DOWN,
    133         none_value_reason=none_reason))
    134