<!-- Used by media_scrub_perf to record scrubbing perf metrics. -->
<!DOCTYPE html>
<html lang="en-US">
<head>
<title>Scrubbing Tests</title>
<script src="utils.js" type="text/javascript"></script>
</head>
<body>
<label for="src">Video src (direct link to media file):</label>
<input id="src" type="text" size="64">
<button onclick="startTest(document.querySelector('input').value);">
Start
</button>
<p>
<video controls></video><br>
Forward scrubbing time: <span id="forwardScrub"></span><br>
Backward scrubbing time: <span id="backwardScrub"></span><br>
Mixed scrubbing time: <span id="mixedScrub"></span><br>
<span id="logs"></span>
</p>
<script type="text/javascript">
// Number of seeks per scrub.
var SCRUBS = 100;
// The delta between 2 scrubs in secs.
var SCRUB_DELTA = 0.1;
// Used by pyauto tests to store the scrubbing times.
var forwardScrubTime = backwardScrubTime = mixedScrubTime = 0;
// Used for each scrub test based on buffered area.
var startTime = endTime = 0;
// Used by PyAuto to log any error message.
var errorMsg = '';
// Used by PyAuto to indicate when the test is done.
var testDone = false;
// Timer used to measure scrubbing performance.
var timer = new Timer();
// Indicates the current scrubbing direction performed.
var currentDirection = null;
// Indicates the expected time of video when each scrub ends. This is the
// final seek time each test performs.
// Make sure none of the scrubs overlap this time.
var EXPECTED_SCRUB_END_TIME = 0.01;
// Seek is not 100% accurate so we need delta in secs where currentTime of
// video can vary from its expected time.
var DELTA = 0.0001;
var Direction = {
FORWARD: 0,
BACKWARD: 1,
MIXED: 2,
NO_DIRECTION: 3
};
function log(text) {
logs.innerText += text + '\n';
}
function getAndClearElement(id) {
var elem = document.getElementById(id);
elem.innerText = '';
return elem;
}
function onCanplaythrough() {
startTime = video.buffered.start(0) + SCRUB_DELTA;
endTime = startTime + SCRUBS * SCRUB_DELTA;
log('Video duration: ' + video.duration + ' secs');
log('Scrubbing area: (' + startTime + ', ' + endTime + ')');
currentDirection = Direction.FORWARD;
startScrubTest();
}
function startScrubTest() {
timer.start();
switch (currentDirection) {
case Direction.FORWARD:
video.currentTime = startTime;
scrub(Direction.FORWARD, SCRUBS);
break;
case Direction.BACKWARD:
video.currentTime = endTime;
scrub(Direction.BACKWARD, SCRUBS);
break;
case Direction.MIXED:
video.currentTime = (startTime + endTime) / 2;
var shortScrubs = 6;
for (t = 0; t < shortScrubs; ++t) {
if (t % 2)
scrub(Direction.BACKWARD, SCRUBS / shortScrubs);
else
scrub(Direction.FORWARD, SCRUBS / shortScrubs);
}
break;
case Direction.NO_DIRECTION:
endTest();
video.removeEventListener('seeked', seeked, false);
return;
}
// After each scrub, seek to the expected end time.
video.currentTime = EXPECTED_SCRUB_END_TIME;
}
function scrub(direction, scrubs) {
for (var t = 0; t < scrubs; ++t) {
if (direction == Direction.BACKWARD)
video.currentTime -= SCRUB_DELTA;
else if (direction == Direction.FORWARD)
video.currentTime += SCRUB_DELTA;
}
}
function seeked() {
if (Math.abs(video.currentTime - EXPECTED_SCRUB_END_TIME) < DELTA) {
logScrubTime();
// Update to next scrubbing direction.
currentDirection++;
startScrubTest();
}
}
function logScrubTime() {
delta = Math.round(timer.stop(), 0);
var scrubElem = null;
if (currentDirection == Direction.FORWARD) {
scrubElem = getAndClearElement('forwardScrub');
forwardScrubTime = delta;
} else if (currentDirection == Direction.BACKWARD) {
scrubElem = getAndClearElement('backwardScrub');
backwardScrubTime = delta;
} else {
scrubElem = getAndClearElement('mixedScrub');
mixedScrubTime = delta;
}
scrubElem.innerText = delta + ' ms';
}
function end(msg) {
errorMsg = msg;
log(msg);
endTest();
}
function endTest() {
testDone = true;
}
// Called by the PyAuto controller to initiate testing.
function startTest(src) {
video = document.querySelector('video');
logs = getAndClearElement('logs');
errorMsg = '';
testDone = false;
forwardScrubTime = backwardScrubTime = mixedScrubTime = 0;
video.addEventListener('seeked', seeked);
video.addEventListener('canplaythrough', onCanplaythrough);
video.addEventListener('error', function() {
end('Error loading media: ' + video.error.code);
});
video.src = src;
if (window.domAutomationController)
window.domAutomationController.send(true);
}
</script>
</body>
</html>