Index: tools/perf/perf_tools/media_metrics.py |
diff --git a/tools/perf/perf_tools/media_metrics.py b/tools/perf/perf_tools/media_metrics.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d8b4d09030ee15522e1bb9bf07687c5037307abb |
--- /dev/null |
+++ b/tools/perf/perf_tools/media_metrics.py |
@@ -0,0 +1,63 @@ |
+# Copyright (c) 2013 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. |
+ |
+"""Media Metrics class injects and calls JS responsible for recording metrics. |
+ |
+Default media metrics are collected for every media element in the page, such as |
+decoded_frame_count, dropped_frame_count, decoded_video_bytes, and |
+decoded_audio_bytes. |
+""" |
+ |
+import logging |
+import os |
+ |
+ |
+class MediaMetrics(object): |
+ def __init__(self, tab): |
+ with open( |
+ os.path.join(os.path.dirname(__file__), 'media_metrics.js')) as f: |
+ js = f.read() |
+ tab.ExecuteJavaScript(js) |
+ self.tab = tab |
+ |
+ def Start(self): |
+ """Create the media metrics for all media elements in the document.""" |
+ self.tab.ExecuteJavaScript('window.__createMediaMetricsForDocument()') |
+ |
+ def StopAndGetResults(self, results): |
+ """Reports all recorded metrics as Telemetry perf results.""" |
+ media_metrics = self.tab.EvaluateJavaScript('window.__getAllMetrics()') |
+ for media_metric in media_metrics: |
+ self.AddResultForMediaElement(media_metric, results) |
+ |
+ def AddResultForMediaElement(self, media_metric, results): |
+ """Reports metrics for one media element. |
+ |
+ Media metrics contain an ID identifying the media element and values: |
+ media_metric = { |
+ 'id': 'video_1', |
+ 'metrics': { |
+ 'time_to_play': 120, |
+ 'decoded_bytes': 13233, |
+ ... |
+ } |
+ } |
+ """ |
+ def AddResult(metric, unit): |
+ metrics = media_metric['metrics'] |
+ if metric in metrics: |
+ results.Add(trace, unit, str(metrics[metric]), chart_name=metric, |
+ data_type='default') |
+ |
+ trace = media_metric['id'] |
+ if not trace: |
+ logging.error('Metrics ID is missing in results.') |
+ return |
+ |
+ AddResult('time_to_play', 'sec') |
+ AddResult('playback_time', 'sec') |
+ AddResult('decoded_audio_bytes', 'bytes') |
+ AddResult('decoded_video_bytes', 'bytes') |
+ AddResult('decoded_frame_count', 'frames') |
+ AddResult('dropped_frame_count', 'frames') |