philn@webkit.org | 1a20702 | 2011-04-12 07:52:58 +0000 | [diff] [blame] | 1 | <html> |
| 2 | <head><title>WebKit video playback statistics</title></head> |
| 3 | <body> |
| 4 | <!-- inspired by -- |
| 5 | -- http://people.mozilla.org/~cpearce/paint-stats-demo.html --> |
| 6 | <video src="http://movies.apple.com/movies/us/apple/ipoditunes/2007/touch/ads/apple_ipodtouch_touch_r640-9cie.mov" id="v" controls autoplay></video> |
| 7 | <div id="log"> |
| 8 | Audio bytes decoded: 0 average p/s: 0<br> |
| 9 | Video bytes decoded: 0 average p/s: 0<br> |
| 10 | Decoded frames: 0 average p/s: 0<br> |
| 11 | Dropped frames: 0 average p/s: 0<br> |
| 12 | </div> |
| 13 | <script> |
| 14 | |
| 15 | var decodedFrames = 0; |
| 16 | var decodedPerSec = 0; |
| 17 | var audioBytesDecoded = 0; |
| 18 | var audioBytesDecodedPerSec = 0; |
| 19 | var videoBytesDecoded = 0; |
| 20 | var videoBytesDecodedPerSec = 0; |
| 21 | var droppedFrames = 0; |
| 22 | var droppedFramesPerSec = 0; |
| 23 | |
| 24 | function Mean() { |
| 25 | this.count = 0; |
| 26 | this.sum = 0; |
| 27 | |
| 28 | this.record = function(val) { |
| 29 | this.count++; |
| 30 | this.sum += val; |
| 31 | }; |
| 32 | |
| 33 | this.mean = function() { |
| 34 | return this.count ? (this.sum / this.count).toFixed(3) : 0; |
| 35 | }; |
| 36 | } |
| 37 | |
| 38 | |
| 39 | var decodedMean = new Mean(); |
| 40 | var audioMean = new Mean(); |
| 41 | var videoMean = new Mean(); |
| 42 | var dropMean = new Mean(); |
| 43 | |
| 44 | function recalcRates() { |
| 45 | var v = document.getElementById("v"); |
| 46 | |
| 47 | if (v.readyState <= HTMLMediaElement.HAVE_CURRENT_DATA || v.paused) { |
| 48 | return; |
| 49 | } |
| 50 | |
| 51 | decodedPerSec = (v.webkitDecodedFrameCount - decodedFrames); |
| 52 | decodedFrames = v.webkitDecodedFrameCount; |
| 53 | |
| 54 | audioBytesDecodedPerSec = v.webkitAudioDecodedByteCount - audioBytesDecoded; |
| 55 | audioBytesDecoded = v.webkitAudioDecodedByteCount; |
| 56 | |
| 57 | videoBytesDecodedPerSec = v.webkitVideoDecodedByteCount - videoBytesDecoded; |
| 58 | videoBytesDecoded = v.webkitVideoDecodedByteCount; |
| 59 | |
| 60 | droppedFramesPerSec = v.webkitDroppedFrameCount - droppedFrames; |
| 61 | droppedFrames = v.webkitDroppedFrameCount; |
| 62 | |
| 63 | decodedMean.record(decodedPerSec); |
| 64 | audioMean.record(audioBytesDecodedPerSec); |
| 65 | videoMean.record(videoBytesDecodedPerSec); |
| 66 | dropMean.record(droppedFramesPerSec); |
| 67 | |
| 68 | var d = document.getElementById("log"); |
| 69 | d.innerHTML = |
| 70 | "Audio bytes decoded: " + v.webkitAudioDecodedByteCount + " average p/s: " + audioMean.mean() + "<br>" + |
| 71 | "Video bytes decoded: " + v.webkitVideoDecodedByteCount + " average p/s: " + videoMean.mean() + "<br>" + |
| 72 | "Decoded frames: " + v.webkitDecodedFrameCount + " average p/s: " + decodedMean.mean() + "<br>" + |
| 73 | "Dropped frames: " + v.webkitDroppedFrameCount + " average p/s: " + dropMean.mean() + "<br>"; |
| 74 | } |
| 75 | |
| 76 | setInterval(recalcRates, 1000); |
| 77 | </script> |
| 78 | </body> |
| 79 | </html> |