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