OLD | NEW |
---|---|
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> |
OLD | NEW |