Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1377)

Side by Side Diff: tracing/tracing/metrics/media_metric_test.html

Issue 3020433002: Finish migrating media metrics to TBMv2 (Closed)
Patch Set: Fix typo Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 <!DOCTYPE html> 1 <!DOCTYPE html>
2 <!-- 2 <!--
3 Copyright 2017 The Chromium Authors. All rights reserved. 3 Copyright 2017 The Chromium Authors. All rights reserved.
4 Use of this source code is governed by a BSD-style license that can be 4 Use of this source code is governed by a BSD-style license that can be
5 found in the LICENSE file. 5 found in the LICENSE file.
6 --> 6 -->
7 7
8 <link rel="import" href="/tracing/core/test_utils.html"> 8 <link rel="import" href="/tracing/core/test_utils.html">
9 <link rel="import" href="/tracing/extras/importer/trace_event_importer.html"> 9 <link rel="import" href="/tracing/extras/importer/trace_event_importer.html">
10 <link rel="import" href="/tracing/metrics/media_metric.html"> 10 <link rel="import" href="/tracing/metrics/media_metric.html">
11 <link rel="import" href="/tracing/value/histogram_set.html"> 11 <link rel="import" href="/tracing/value/histogram_set.html">
12 12
13 <script> 13 <script>
14 'use strict'; 14 'use strict';
15 15
16 tr.b.unittest.testSuite(function() { 16 tr.b.unittest.testSuite(function() {
17 function makeModel(events) { 17 function makeModel(events) {
18 return tr.c.TestUtils.newModelWithEvents([events]); 18 return tr.c.TestUtils.newModelWithEvents([events]);
19 } 19 }
20 20
21 // No media data
CalebRouleau 2017/09/22 17:44:21 This is not necessary since it is redundant with t
johnchen 2017/09/23 04:43:02 Done.
21 test('mediaMetric_noData', function() { 22 test('mediaMetric_noData', function() {
22 const histograms = new tr.v.HistogramSet(); 23 const histograms = new tr.v.HistogramSet();
23 const events = [ 24 const events = [
24 {name: 'a', args: {}, pid: 52, ts: 524, cat: 'foo', tid: 53, ph: 'B'}, 25 {name: 'a', args: {}, pid: 52, ts: 524, cat: 'foo', tid: 53, ph: 'B'},
CalebRouleau 2017/09/22 17:44:21 Are all of these fields needed by the test case? I
johnchen 2017/09/23 04:43:02 I've refactored the code to have functions to crea
25 {name: 'a', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'B'} 26 {name: 'a', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'B'}
26 ]; 27 ];
27 tr.metrics.mediaMetric(histograms, makeModel(events)); 28 tr.metrics.mediaMetric(histograms, makeModel(events));
28 assert.lengthOf(histograms, 0); 29 assert.lengthOf(histograms, 0);
29 }); 30 });
30 31
32 // Video time-to-play
CalebRouleau 2017/09/22 17:44:21 This comment isn't needed.
31 test('mediaMetric_videoTimeToPlay', function() { 33 test('mediaMetric_videoTimeToPlay', function() {
32 const histograms = new tr.v.HistogramSet(); 34 const histograms = new tr.v.HistogramSet();
33 const events = [ 35 const events = [
34 {name: 'WebMediaPlayerImpl::DoLoad', args: {}, 36 {name: 'WebMediaPlayerImpl::DoLoad', args: {},
35 pid: 52, ts: 524, cat: 'media', tid: 1, ph: 'X'}, 37 pid: 52, ts: 524, cat: 'media', tid: 1, ph: 'X'},
36 {name: 'VideoRendererImpl::Render', args: {}, 38 {name: 'VideoRendererImpl::Render', args: {},
37 pid: 52, ts: 560, cat: 'media', tid: 53, ph: 'X'}, 39 pid: 52, ts: 560, cat: 'media', tid: 53, ph: 'X'},
38 {name: 'VideoRendererImpl::Render', args: {}, 40 {name: 'VideoRendererImpl::Render', args: {},
39 pid: 52, ts: 580, cat: 'media', tid: 53, ph: 'X'}, 41 pid: 52, ts: 580, cat: 'media', tid: 53, ph: 'X'},
40 {name: 'thread_name', args: {name: 'CrRendererMain'}, 42 {name: 'thread_name', args: {name: 'CrRendererMain'},
41 pid: 52, ts: 0, cat: '__metadata', tid: 1, ph: 'M'}, 43 pid: 52, ts: 0, cat: '__metadata', tid: 1, ph: 'M'},
42 {name: 'thread_name', args: {name: 'Compositor'}, 44 {name: 'thread_name', args: {name: 'Compositor'},
43 pid: 52, ts: 0, cat: '__metadata', tid: 53, ph: 'M'}, 45 pid: 52, ts: 0, cat: '__metadata', tid: 53, ph: 'M'},
44 ]; 46 ];
45 tr.metrics.mediaMetric(histograms, makeModel(events)); 47 tr.metrics.mediaMetric(histograms, makeModel(events));
46 48
47 assert.isDefined(histograms.getHistogramNamed('time_to_video_play')); 49 assert.isDefined(histograms.getHistogramNamed('time_to_video_play'));
48 const ttpValue = histograms.getHistogramNamed('time_to_video_play'); 50 const ttpValue = histograms.getHistogramNamed('time_to_video_play');
49 const ttpStatistics = ttpValue.running; 51 const ttpStatistics = ttpValue.running;
50 assert.strictEqual(ttpStatistics.count, 1); 52 assert.strictEqual(ttpStatistics.count, 1);
51 assert.closeTo(ttpStatistics.mean, 0.036, 1e-5); 53 assert.closeTo(ttpStatistics.mean, 0.036, 1e-5);
52 assert.closeTo(ttpStatistics.max, 0.036, 1e-5); 54 assert.closeTo(ttpStatistics.max, 0.036, 1e-5);
53 }); 55 });
54 56
57 // Audio time-to-play
CalebRouleau 2017/09/22 17:44:21 Comment not needed
55 test('mediaMetric_audioTimeToPlay', function() { 58 test('mediaMetric_audioTimeToPlay', function() {
56 const histograms = new tr.v.HistogramSet(); 59 const histograms = new tr.v.HistogramSet();
57 const events = [ 60 const events = [
58 {name: 'thread_name', args: {name: 'CrRendererMain'}, 61 {name: 'thread_name', args: {name: 'CrRendererMain'},
59 pid: 52, ts: 0, cat: '__metadata', tid: 1, ph: 'M'}, 62 pid: 52, ts: 0, cat: '__metadata', tid: 1, ph: 'M'},
60 {name: 'thread_name', args: {name: 'AudioOutputDevice'}, 63 {name: 'thread_name', args: {name: 'AudioOutputDevice'},
61 pid: 52, ts: 0, cat: '__metadata', tid: 53, ph: 'M'}, 64 pid: 52, ts: 0, cat: '__metadata', tid: 53, ph: 'M'},
62 {name: 'WebMediaPlayerImpl::DoLoad', args: {}, 65 {name: 'WebMediaPlayerImpl::DoLoad', args: {},
63 pid: 52, ts: 1234, cat: 'media', tid: 1, ph: 'X'}, 66 pid: 52, ts: 1234, cat: 'media', tid: 1, ph: 'X'},
64 {name: 'AudioRendererImpl::Render', args: {}, 67 {name: 'AudioRendererImpl::Render', args: {},
65 pid: 52, ts: 4321, cat: 'media', tid: 53, ph: 'X'}, 68 pid: 52, ts: 4321, cat: 'media', tid: 53, ph: 'X'},
66 ]; 69 ];
67 tr.metrics.mediaMetric(histograms, makeModel(events)); 70 tr.metrics.mediaMetric(histograms, makeModel(events));
68 71
69 assert.isDefined(histograms.getHistogramNamed('time_to_audio_play')); 72 assert.isDefined(histograms.getHistogramNamed('time_to_audio_play'));
70 const ttpValue = histograms.getHistogramNamed('time_to_audio_play'); 73 const ttpValue = histograms.getHistogramNamed('time_to_audio_play');
71 const ttpStatistics = ttpValue.running; 74 const ttpStatistics = ttpValue.running;
72 assert.strictEqual(ttpStatistics.count, 1); 75 assert.strictEqual(ttpStatistics.count, 1);
73 assert.closeTo(ttpStatistics.mean, 3.087, 1e-5); 76 assert.closeTo(ttpStatistics.mean, 3.087, 1e-5);
74 assert.closeTo(ttpStatistics.max, 3.087, 1e-5); 77 assert.closeTo(ttpStatistics.max, 3.087, 1e-5);
75 }); 78 });
79
80 // Buffering time with video
CalebRouleau 2017/09/22 17:44:21 Comment not needed.
81 test('mediaMetric_bufferingTimeVideo', function() {
82 const histograms = new tr.v.HistogramSet();
83 const events = [
84 {name: 'WebMediaPlayerImpl::DoLoad', args: {},
85 pid: 52, ts: 1100, cat: 'media', tid: 1, ph: 'X'},
86 {name: 'VideoRendererImpl::Render', args: {},
87 pid: 52, ts: 1500, cat: 'media', tid: 53, ph: 'X'},
88 {name: 'VideoRendererImpl::Render', args: {},
89 pid: 52, ts: 1600, cat: 'media', tid: 53, ph: 'X'},
90 {name: 'WebMediaPlayerImpl::OnEnded', args: {duration: 10},
91 pid: 52, ts: 10066666, cat: 'media', tid: 1, ph: 'X'},
92 {name: 'thread_name', args: {name: 'CrRendererMain'},
93 pid: 52, ts: 0, cat: '__metadata', tid: 1, ph: 'M'},
94 {name: 'thread_name', args: {name: 'Compositor'},
95 pid: 52, ts: 0, cat: '__metadata', tid: 53, ph: 'M'},
96 ];
97 tr.metrics.mediaMetric(histograms, makeModel(events));
98
99 assert.isDefined(histograms.getHistogramNamed('buffering_time'));
100 const btValue = histograms.getHistogramNamed('buffering_time');
101 const btStatistics = btValue.running;
102 assert.strictEqual(btStatistics.count, 1);
103 assert.closeTo(btStatistics.mean, 65.166, 1e-5);
104 assert.closeTo(btStatistics.max, 65.166, 1e-5);
105 });
106
107 // Buffering time with audio
CalebRouleau 2017/09/22 17:44:21 Comment not needed.
108 test('mediaMetric_bufferingTimeAudio', function() {
109 const histograms = new tr.v.HistogramSet();
110 const events = [
111 {name: 'thread_name', args: {name: 'CrRendererMain'},
112 pid: 52, ts: 0, cat: '__metadata', tid: 1, ph: 'M'},
113 {name: 'thread_name', args: {name: 'AudioOutputDevice'},
114 pid: 52, ts: 0, cat: '__metadata', tid: 53, ph: 'M'},
115 {name: 'WebMediaPlayerImpl::DoLoad', args: {},
116 pid: 52, ts: 1234, cat: 'media', tid: 1, ph: 'X'},
117 {name: 'AudioRendererImpl::Render', args: {},
118 pid: 52, ts: 4321, cat: 'media', tid: 53, ph: 'X'},
119 {name: 'WebMediaPlayerImpl::OnEnded', args: {duration: 5},
120 pid: 52, ts: 5066666, cat: 'media', tid: 1, ph: 'X'},
121 ];
122 tr.metrics.mediaMetric(histograms, makeModel(events));
123
124 assert.isDefined(histograms.getHistogramNamed('buffering_time'));
125 const btValue = histograms.getHistogramNamed('buffering_time');
126 const btStatistics = btValue.running;
127 assert.strictEqual(btStatistics.count, 1);
128 assert.closeTo(btStatistics.mean, 62.345, 1e-5);
129 assert.closeTo(btStatistics.max, 62.345, 1e-5);
130 });
131
132 // With seek, no buffering time should be reported
CalebRouleau 2017/09/22 17:44:21 This comment contradicts the name of the test case
johnchen 2017/09/23 04:43:02 The test case name I chose was too confusing. I us
133 test('mediaMetric_bufferingTimeNegative', function() {
134 const histograms = new tr.v.HistogramSet();
135 const events = [
136 {name: 'WebMediaPlayerImpl::DoLoad', args: {},
137 pid: 52, ts: 1100, cat: 'media', tid: 1, ph: 'X'},
138 {name: 'VideoRendererImpl::Render', args: {},
139 pid: 52, ts: 1500, cat: 'media', tid: 53, ph: 'X'},
140 {name: 'VideoRendererImpl::Render', args: {},
141 pid: 52, ts: 1600, cat: 'media', tid: 53, ph: 'X'},
142 {name: 'WebMediaPlayerImpl::OnEnded', args: {duration: 10},
143 pid: 52, ts: 10066666, cat: 'media', tid: 1, ph: 'X'},
144 {name: 'WebMediaPlayerImpl::DoSeek', args: {target: 1.2},
145 pid: 52, ts: 525, cat: 'media', tid: 1, ph: 'X'},
146 {name: 'WebMediaPlayerImpl::OnPipelineSeeked', args: {target: 1.2},
147 pid: 52, ts: 719, cat: 'media', tid: 1, ph: 'X'},
148 {name: 'thread_name', args: {name: 'CrRendererMain'},
149 pid: 52, ts: 0, cat: '__metadata', tid: 1, ph: 'M'},
150 {name: 'thread_name', args: {name: 'Compositor'},
151 pid: 52, ts: 0, cat: '__metadata', tid: 53, ph: 'M'},
152 ];
153 tr.metrics.mediaMetric(histograms, makeModel(events));
154
155 assert.isUndefined(histograms.getHistogramNamed('buffering_time'));
156 });
157
158 // Dropped frame count with video
CalebRouleau 2017/09/22 17:44:21 Comment not needed.
159 test('mediaMetric_droppedFrameCount', function() {
160 const histograms = new tr.v.HistogramSet();
161 const events = [
162 {name: 'WebMediaPlayerImpl::DoLoad', args: {},
163 pid: 52, ts: 1100, cat: 'media', tid: 1, ph: 'X'},
164 {name: 'VideoRendererImpl::Render', args: {},
165 pid: 52, ts: 1500, cat: 'media', tid: 53, ph: 'X'},
166 {name: 'VideoFramesDropped', args: {count: 3},
167 pid: 52, ts: 123456, cat: 'media', tid: 53, ph: 'X'},
168 {name: 'VideoFramesDropped', args: {count: 6},
169 pid: 52, ts: 234567, cat: 'media', tid: 53, ph: 'X'},
170 {name: 'VideoFramesDropped', args: {count: 1},
171 pid: 52, ts: 345678, cat: 'media', tid: 53, ph: 'X'},
172 {name: 'thread_name', args: {name: 'CrRendererMain'},
173 pid: 52, ts: 0, cat: '__metadata', tid: 1, ph: 'M'},
174 {name: 'thread_name', args: {name: 'Compositor'},
175 pid: 52, ts: 0, cat: '__metadata', tid: 53, ph: 'M'},
176 ];
177 tr.metrics.mediaMetric(histograms, makeModel(events));
178
179 assert.isDefined(histograms.getHistogramNamed('dropped_frame_count'));
180 const dfcValue = histograms.getHistogramNamed('dropped_frame_count');
181 const dfcStatistics = dfcValue.running;
182 assert.strictEqual(dfcStatistics.count, 1);
183 assert.strictEqual(dfcStatistics.mean, 10);
184 assert.strictEqual(dfcStatistics.max, 10);
185 });
186
187 // Seek time
CalebRouleau 2017/09/22 17:44:21 Comment not needed.
188 test('mediaMetric_seekTime', function() {
189 const histograms = new tr.v.HistogramSet();
190 const events = [
191 {name: 'WebMediaPlayerImpl::DoLoad', args: {},
192 pid: 52, ts: 100, cat: 'media', tid: 1, ph: 'X'},
193 {name: 'VideoRendererImpl::Render', args: {},
194 pid: 52, ts: 200, cat: 'media', tid: 53, ph: 'X'},
195 {name: 'WebMediaPlayerImpl::DoSeek', args: {target: 1.2},
196 pid: 52, ts: 524, cat: 'media', tid: 1, ph: 'X'},
197 {name: 'WebMediaPlayerImpl::OnPipelineSeeked', args: {target: 1.2},
198 pid: 52, ts: 719, cat: 'media', tid: 1, ph: 'X'},
199 {name: 'WebMediaPlayerImpl::DoSeek', args: {target: 3.7},
200 pid: 52, ts: 14159, cat: 'media', tid: 1, ph: 'X'},
201 {name: 'WebMediaPlayerImpl::OnPipelineSeeked', args: {target: 3.7},
202 pid: 52, ts: 71828, cat: 'media', tid: 1, ph: 'X'},
203 {name: 'thread_name', args: {name: 'CrRendererMain'},
204 pid: 52, ts: 0, cat: '__metadata', tid: 1, ph: 'M'},
205 {name: 'thread_name', args: {name: 'Compositor'},
206 pid: 52, ts: 0, cat: '__metadata', tid: 53, ph: 'M'},
207 ];
208 tr.metrics.mediaMetric(histograms, makeModel(events));
209
210 assert.isDefined(histograms.getHistogramNamed('seek_time_1.2'));
211 const st1Value = histograms.getHistogramNamed('seek_time_1.2');
212 const st1Statistics = st1Value.running;
213 assert.strictEqual(st1Statistics.count, 1);
214 assert.closeTo(st1Statistics.mean, 0.195, 1e-5);
215 assert.closeTo(st1Statistics.max, 0.195, 1e-5);
216
217 assert.isDefined(histograms.getHistogramNamed('seek_time_3.7'));
218 const st2Value = histograms.getHistogramNamed('seek_time_3.7');
219 const st2Statistics = st2Value.running;
220 assert.strictEqual(st2Statistics.count, 1);
221 assert.closeTo(st2Statistics.mean, 57.669, 1e-5);
222 assert.closeTo(st2Statistics.max, 57.669, 1e-5);
223 });
224
225 // Scenario: Play mixed audio/video from start to finish
CalebRouleau 2017/09/22 17:44:21 This comment is better because it does add some cl
johnchen 2017/09/23 04:43:02 I would prefer to keep this one, but OK either way
226 test('mediaMetric_playVideoScenario', function() {
227 const histograms = new tr.v.HistogramSet();
228 const events = [
229 {name: 'WebMediaPlayerImpl::DoLoad', args: {},
230 pid: 52, ts: 1516, cat: 'media', tid: 1, ph: 'X'},
231 {name: 'VideoRendererImpl::Render', args: {},
232 pid: 52, ts: 3257, cat: 'media', tid: 53, ph: 'X'},
233 {name: 'AudioRendererImpl::Render', args: {},
234 pid: 52, ts: 3266, cat: 'media', tid: 57, ph: 'X'},
235 {name: 'VideoRendererImpl::Render', args: {},
236 pid: 52, ts: 3287, cat: 'media', tid: 53, ph: 'X'},
237 {name: 'VideoFramesDropped', args: {count: 4},
238 pid: 52, ts: 123456, cat: 'media', tid: 53, ph: 'X'},
239 {name: 'VideoFramesDropped', args: {count: 2},
240 pid: 52, ts: 234567, cat: 'media', tid: 53, ph: 'X'},
241 {name: 'WebMediaPlayerImpl::OnEnded', args: {duration: 10},
242 pid: 52, ts: 10012345, cat: 'media', tid: 1, ph: 'X'},
243 {name: 'thread_name', args: {name: 'CrRendererMain'},
244 pid: 52, ts: 0, cat: '__metadata', tid: 1, ph: 'M'},
245 {name: 'thread_name', args: {name: 'Compositor'},
246 pid: 52, ts: 0, cat: '__metadata', tid: 53, ph: 'M'},
247 {name: 'thread_name', args: {name: 'AudioOutputDevice'},
248 pid: 52, ts: 0, cat: '__metadata', tid: 57, ph: 'M'},
249 ];
250 tr.metrics.mediaMetric(histograms, makeModel(events));
251
252 assert.isDefined(histograms.getHistogramNamed('time_to_video_play'));
253 const ttpvValue = histograms.getHistogramNamed('time_to_video_play');
254 const ttpvStatistics = ttpvValue.running;
255 assert.strictEqual(ttpvStatistics.count, 1);
256 assert.closeTo(ttpvStatistics.mean, 1.741, 1e-5);
257
258 assert.isDefined(histograms.getHistogramNamed('time_to_audio_play'));
259 const ttpaValue = histograms.getHistogramNamed('time_to_audio_play');
260 const ttpaStatistics = ttpaValue.running;
261 assert.strictEqual(ttpaStatistics.count, 1);
262 assert.closeTo(ttpaStatistics.mean, 1.75, 1e-5);
263
264 assert.isDefined(histograms.getHistogramNamed('buffering_time'));
265 const btValue = histograms.getHistogramNamed('buffering_time');
266 const btStatistics = btValue.running;
267 assert.strictEqual(btStatistics.count, 1);
268 assert.closeTo(btStatistics.mean, 9.088, 1e-5);
269
270 assert.isDefined(histograms.getHistogramNamed('dropped_frame_count'));
271 const dfcValue = histograms.getHistogramNamed('dropped_frame_count');
272 const dfcStatistics = dfcValue.running;
273 assert.strictEqual(dfcStatistics.count, 1);
274 assert.strictEqual(dfcStatistics.mean, 6);
275 });
276
277 // Scenario: Play audio from start to finish
278 test('mediaMetric_playAudioScenario', function() {
279 const histograms = new tr.v.HistogramSet();
280 const events = [
281 {name: 'WebMediaPlayerImpl::DoLoad', args: {},
282 pid: 52, ts: 1516, cat: 'media', tid: 1, ph: 'X'},
283 {name: 'AudioRendererImpl::Render', args: {},
284 pid: 52, ts: 3266, cat: 'media', tid: 57, ph: 'X'},
285 {name: 'WebMediaPlayerImpl::OnEnded', args: {duration: 10},
286 pid: 52, ts: 10012345, cat: 'media', tid: 1, ph: 'X'},
287 {name: 'thread_name', args: {name: 'CrRendererMain'},
288 pid: 52, ts: 0, cat: '__metadata', tid: 1, ph: 'M'},
289 {name: 'thread_name', args: {name: 'AudioOutputDevice'},
290 pid: 52, ts: 0, cat: '__metadata', tid: 57, ph: 'M'},
291 ];
292 tr.metrics.mediaMetric(histograms, makeModel(events));
293
294 assert.isUndefined(histograms.getHistogramNamed('time_to_video_play'));
295
296 assert.isDefined(histograms.getHistogramNamed('time_to_audio_play'));
297 const ttpaValue = histograms.getHistogramNamed('time_to_audio_play');
298 const ttpaStatistics = ttpaValue.running;
299 assert.strictEqual(ttpaStatistics.count, 1);
300 assert.closeTo(ttpaStatistics.mean, 1.75, 1e-5);
301
302 assert.isDefined(histograms.getHistogramNamed('buffering_time'));
303 const btValue = histograms.getHistogramNamed('buffering_time');
304 const btStatistics = btValue.running;
305 assert.strictEqual(btStatistics.count, 1);
306 assert.closeTo(btStatistics.mean, 9.079, 1e-5);
307
308 assert.isUndefined(histograms.getHistogramNamed('dropped_frame_count'));
309 });
310
311 // Scenario: Play audio/video with two seeks
312 test('mediaMetric_seekScenario', function() {
313 const histograms = new tr.v.HistogramSet();
314 const events = [
315 {name: 'WebMediaPlayerImpl::DoLoad', args: {},
316 pid: 52, ts: 1516, cat: 'media', tid: 1, ph: 'X'},
317 {name: 'VideoRendererImpl::Render', args: {},
318 pid: 52, ts: 3257, cat: 'media', tid: 53, ph: 'X'},
319 {name: 'AudioRendererImpl::Render', args: {},
320 pid: 52, ts: 3266, cat: 'media', tid: 57, ph: 'X'},
321 {name: 'VideoRendererImpl::Render', args: {},
322 pid: 52, ts: 3287, cat: 'media', tid: 53, ph: 'X'},
323 {name: 'WebMediaPlayerImpl::DoSeek', args: {target: 0.5},
324 pid: 52, ts: 5123, cat: 'media', tid: 1, ph: 'X'},
325 {name: 'WebMediaPlayerImpl::OnPipelineSeeked', args: {target: 0.5},
326 pid: 52, ts: 5234, cat: 'media', tid: 1, ph: 'X'},
327 {name: 'VideoFramesDropped', args: {count: 4},
328 pid: 52, ts: 123456, cat: 'media', tid: 53, ph: 'X'},
329 {name: 'WebMediaPlayerImpl::DoSeek', args: {target: 9},
330 pid: 52, ts: 222222, cat: 'media', tid: 1, ph: 'X'},
331 {name: 'WebMediaPlayerImpl::OnPipelineSeeked', args: {target: 9},
332 pid: 52, ts: 222444, cat: 'media', tid: 1, ph: 'X'},
333 {name: 'VideoFramesDropped', args: {count: 2},
334 pid: 52, ts: 234567, cat: 'media', tid: 53, ph: 'X'},
335 {name: 'WebMediaPlayerImpl::OnEnded', args: {duration: 10},
336 pid: 52, ts: 1234567, cat: 'media', tid: 1, ph: 'X'},
337 {name: 'thread_name', args: {name: 'CrRendererMain'},
338 pid: 52, ts: 0, cat: '__metadata', tid: 1, ph: 'M'},
339 {name: 'thread_name', args: {name: 'Compositor'},
340 pid: 52, ts: 0, cat: '__metadata', tid: 53, ph: 'M'},
341 {name: 'thread_name', args: {name: 'AudioOutputDevice'},
342 pid: 52, ts: 0, cat: '__metadata', tid: 57, ph: 'M'},
343 ];
344 tr.metrics.mediaMetric(histograms, makeModel(events));
345
346 assert.isDefined(histograms.getHistogramNamed('time_to_video_play'));
347 const ttpvValue = histograms.getHistogramNamed('time_to_video_play');
348 const ttpvStatistics = ttpvValue.running;
349 assert.strictEqual(ttpvStatistics.count, 1);
350 assert.closeTo(ttpvStatistics.mean, 1.741, 1e-5);
351
352 assert.isDefined(histograms.getHistogramNamed('time_to_audio_play'));
353 const ttpaValue = histograms.getHistogramNamed('time_to_audio_play');
354 const ttpaStatistics = ttpaValue.running;
355 assert.strictEqual(ttpaStatistics.count, 1);
356 assert.closeTo(ttpaStatistics.mean, 1.75, 1e-5);
357
358 assert.isUndefined(histograms.getHistogramNamed('buffering_time'));
359
360 assert.isDefined(histograms.getHistogramNamed('dropped_frame_count'));
361 const dfcValue = histograms.getHistogramNamed('dropped_frame_count');
362 const dfcStatistics = dfcValue.running;
363 assert.strictEqual(dfcStatistics.count, 1);
364 assert.strictEqual(dfcStatistics.mean, 6);
365
366 assert.isDefined(histograms.getHistogramNamed('seek_time_0.5'));
367 const st1Value = histograms.getHistogramNamed('seek_time_0.5');
368 const st1Statistics = st1Value.running;
369 assert.strictEqual(st1Statistics.count, 1);
370 assert.closeTo(st1Statistics.mean, 0.111, 1e-5);
371
372 assert.isDefined(histograms.getHistogramNamed('seek_time_9'));
373 const st2Value = histograms.getHistogramNamed('seek_time_9');
374 const st2Statistics = st2Value.running;
375 assert.strictEqual(st2Statistics.count, 1);
376 assert.closeTo(st2Statistics.mean, 0.222, 1e-5);
377 });
76 }); 378 });
77 </script> 379 </script>
OLDNEW
« tracing/tracing/metrics/media_metric.html ('K') | « tracing/tracing/metrics/media_metric.html ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698