| <html> |
| <head><title>WebKit video playback statistics</title></head> |
| <body> |
| <!-- inspired by -- |
| -- http://people.mozilla.org/~cpearce/paint-stats-demo.html --> |
| <video src="http://movies.apple.com/movies/us/apple/ipoditunes/2007/touch/ads/apple_ipodtouch_touch_r640-9cie.mov" id="v" controls autoplay></video> |
| <div id="log"> |
| Audio bytes decoded: 0 average p/s: 0<br> |
| Video bytes decoded: 0 average p/s: 0<br> |
| Decoded frames: 0 average p/s: 0<br> |
| Dropped frames: 0 average p/s: 0<br> |
| </div> |
| <script> |
| |
| var decodedFrames = 0; |
| var decodedPerSec = 0; |
| var audioBytesDecoded = 0; |
| var audioBytesDecodedPerSec = 0; |
| var videoBytesDecoded = 0; |
| var videoBytesDecodedPerSec = 0; |
| var droppedFrames = 0; |
| var droppedFramesPerSec = 0; |
| |
| function Mean() { |
| this.count = 0; |
| this.sum = 0; |
| |
| this.record = function(val) { |
| this.count++; |
| this.sum += val; |
| }; |
| |
| this.mean = function() { |
| return this.count ? (this.sum / this.count).toFixed(3) : 0; |
| }; |
| } |
| |
| |
| var decodedMean = new Mean(); |
| var audioMean = new Mean(); |
| var videoMean = new Mean(); |
| var dropMean = new Mean(); |
| |
| function recalcRates() { |
| var v = document.getElementById("v"); |
| |
| if (v.readyState <= HTMLMediaElement.HAVE_CURRENT_DATA || v.paused) { |
| return; |
| } |
| |
| decodedPerSec = (v.webkitDecodedFrameCount - decodedFrames); |
| decodedFrames = v.webkitDecodedFrameCount; |
| |
| audioBytesDecodedPerSec = v.webkitAudioDecodedByteCount - audioBytesDecoded; |
| audioBytesDecoded = v.webkitAudioDecodedByteCount; |
| |
| videoBytesDecodedPerSec = v.webkitVideoDecodedByteCount - videoBytesDecoded; |
| videoBytesDecoded = v.webkitVideoDecodedByteCount; |
| |
| droppedFramesPerSec = v.webkitDroppedFrameCount - droppedFrames; |
| droppedFrames = v.webkitDroppedFrameCount; |
| |
| decodedMean.record(decodedPerSec); |
| audioMean.record(audioBytesDecodedPerSec); |
| videoMean.record(videoBytesDecodedPerSec); |
| dropMean.record(droppedFramesPerSec); |
| |
| var d = document.getElementById("log"); |
| d.innerHTML = |
| "Audio bytes decoded: " + v.webkitAudioDecodedByteCount + " average p/s: " + audioMean.mean() + "<br>" + |
| "Video bytes decoded: " + v.webkitVideoDecodedByteCount + " average p/s: " + videoMean.mean() + "<br>" + |
| "Decoded frames: " + v.webkitDecodedFrameCount + " average p/s: " + decodedMean.mean() + "<br>" + |
| "Dropped frames: " + v.webkitDroppedFrameCount + " average p/s: " + dropMean.mean() + "<br>"; |
| } |
| |
| setInterval(recalcRates, 1000); |
| </script> |
| </body> |
| </html> |