Index: tracing/tracing/metrics/media_metric.html |
diff --git a/tracing/tracing/metrics/media_metric.html b/tracing/tracing/metrics/media_metric.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0b6e74061e8a05ce97144187611fffacd39244cf |
--- /dev/null |
+++ b/tracing/tracing/metrics/media_metric.html |
@@ -0,0 +1,91 @@ |
+<!DOCTYPE html> |
+<!-- |
+Copyright 2017 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. |
+--> |
+ |
+<link rel="import" href="/tracing/metrics/metric_registry.html"> |
+<link rel="import" href="/tracing/value/histogram.html"> |
+ |
+<script> |
+'use strict'; |
+ |
+tr.exportTo('tr.metrics', function() { |
+ function mediaMetric(histograms, model) { |
+ let playStart; |
+ let timeToPlay; |
+ let playEnd; |
+ let duration; |
+ |
+ const seekStarts = []; |
+ const seekEnds = []; |
+ const seekLabels = []; |
+ |
+ for (const event of model.getDescendantEvents()) { |
+ if (!event.title) { |
+ continue; |
+ } |
+ if (event.title.startsWith('seekLabel-')) { |
+ seekLabels.push(event); |
+ } else if (event.title.startsWith('duration-')) { |
+ duration = Number(event.title.substring(9)); |
+ } else if (event.title === 'EventDispatch') { |
+ const type = event.args.data.type; |
+ if (type === 'willPlay') { |
+ playStart = event.start; |
+ } else if (type === 'play' || type === 'loadedmetadata') { |
+ if (playStart === undefined) { |
+ playStart = event.start; |
+ } |
+ } else if (type === 'playing') { |
+ if (playStart !== undefined && timeToPlay === undefined) { |
+ timeToPlay = event.start - playStart; |
+ addTimeValue(histograms, 'time_to_play', timeToPlay); |
+ } |
+ } else if (type === 'ended') { |
+ playEnd = event.start; |
+ } else if (type === 'willSeek') { |
+ seekStarts.push(event.start); |
+ } else if (type === 'seeked') { |
+ seekEnds[seekStarts.length - 1] = event.start; |
+ } |
+ } |
+ } |
+ |
+ if (playStart !== undefined && timeToPlay !== undefined && |
+ playEnd !== undefined && duration !== undefined) { |
+ addTimeValue(histograms, 'buffering_time', |
+ playEnd - playStart - timeToPlay - 1000 * duration); |
+ } |
+ |
+ for (let i = 0; i < seekStarts.length; i++) { |
+ if (seekEnds[i] === undefined) { |
+ continue; |
+ } |
+ let name = 'seek'; |
+ for (const seekLabel of seekLabels) { |
+ const time = seekLabel.start; |
+ if (time >= seekStarts[i] && time <= seekEnds[i]) { |
+ name = seekLabel.title.substring(10); |
+ break; |
+ } |
+ } |
+ addTimeValue(histograms, name, seekEnds[i] - seekStarts[i]); |
+ } |
+ } |
+ |
+ function addTimeValue(histograms, name, value) { |
+ const hist = new tr.v.Histogram(name, |
+ tr.b.Unit.byName.timeDurationInMs_smallerIsBetter); |
+ hist.addSample(value); |
+ histograms.addHistogram(hist); |
+ } |
+ |
+ tr.metrics.MetricRegistry.register(mediaMetric); |
+ |
+ return { |
+ mediaMetric, |
+ }; |
+}); |
+</script> |