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