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 |
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'}, |
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 |
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 |
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 |
| 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 |
| 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 |
| 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 |
| 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: 'FramesDropped', args: {count: 3}, |
| 167 pid: 52, ts: 123456, cat: 'media', tid: 53, ph: 'X'}, |
| 168 {name: 'FramesDropped', args: {count: 6}, |
| 169 pid: 52, ts: 234567, cat: 'media', tid: 53, ph: 'X'}, |
| 170 {name: 'FramesDropped', 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 |
| 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 |
| 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: 'FramesDropped', args: {count: 4}, |
| 238 pid: 52, ts: 123456, cat: 'media', tid: 53, ph: 'X'}, |
| 239 {name: 'FramesDropped', 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: 'FramesDropped', 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: 'FramesDropped', 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 |