blob: 13f41743f475ab68a3cc4b9d1b9bb638170a0e1d [file] [log] [blame]
<html>
<head>
<title>Test media source config changes.</title>
</head>
<body onload="runTest();">
<video controls></video>
<script src="media_utils.js" type="text/javascript"></script>
<script src="media_source_utils.js" type="text/javascript"></script>
<script src="encrypted_media_utils.js" type="text/javascript"></script>
<script type="text/javascript">
var runEncrypted = QueryString.runencrypted == 1;
var video = document.querySelector('video');
var mediaType = 'video/webm; codecs="vorbis, vp8"';
var MEDIA_1 = 'bear-320x240.webm';
var MEDIA_2 = 'bear-640x360.webm';
if (runEncrypted) {
MEDIA_1 = 'bear-320x240-av-enc_av.webm';
MEDIA_2 = 'bear-640x360-av-enc_av.webm';
}
var MEDIA_1_WIDTH = 320;
var MEDIA_1_HEIGHT = 240;
var MEDIA_2_WIDTH = 640;
var MEDIA_2_HEIGHT = 360;
var MEDIA_2_LENGTH = 2.75;
// The time in secs to append the second media source.
var APPEND_TIME = 1;
// DELTA is the time after APPEND_TIME where the second video dimensions
// are guaranteed to take effect.
var DELTA = 0.1;
// Append MEDIA_2 source at APPEND_TIME, so expected total duration is:
var TOTAL_DURATION = APPEND_TIME + MEDIA_2_LENGTH;
function appendNextSource(mediaSource) {
console.log('Appending next media source at ' + APPEND_TIME + 'sec.');
var xhr = new XMLHttpRequest();
xhr.open("GET", MEDIA_2);
xhr.responseType = 'arraybuffer';
xhr.addEventListener('load', function(e) {
var onUpdateEnd = function(e) {
console.log('Second buffer append ended.');
srcBuffer.removeEventListener('updateend', onUpdateEnd);
mediaSource.endOfStream();
if (!mediaSource.duration ||
Math.abs(mediaSource.duration - TOTAL_DURATION) > DELTA) {
failTest('Unexpected mediaSource.duration = ' +
mediaSource.duration + ', expected duration = ' +
TOTAL_DURATION);
return;
}
video.play();
};
console.log('Appending next media source at ' + APPEND_TIME + 'sec.');
var srcBuffer = mediaSource.sourceBuffers[0];
srcBuffer.addEventListener('updateend', onUpdateEnd);
srcBuffer.timestampOffset = APPEND_TIME;
srcBuffer.appendBuffer(new Uint8Array(e.target.response));
});
xhr.send();
}
function onTimeUpdate() {
// crbug.com/246308
//checkVideoProperties();
// Seek to APPEND_TIME because after a seek a timeUpdate event is fired
// before video width and height properties get updated.
if (video.currentTime < APPEND_TIME - DELTA) {
// Seek to save test execution time (about 1 secs) and to test seek
// on the first buffer.
video.currentTime = APPEND_TIME - DELTA;
} else if (video.currentTime > APPEND_TIME + DELTA) {
// Check video duration here to guarantee that second segment has been
// appended and video total duration is updated.
// Video duration is a float value so we check it within a range.
if (!video.duration ||
Math.abs(video.duration - TOTAL_DURATION) > DELTA) {
failTest('Unexpected video.duration = ' + video.duration +
', expected duration = ' + TOTAL_DURATION);
return;
}
video.removeEventListener('timeupdate', onTimeUpdate);
video.removeEventListener('ended', failTest);
installTitleEventHandler(video, 'ended');
// Seek to save test execution time and to test seek on second buffer.
video.currentTime = APPEND_TIME + MEDIA_2_LENGTH * 0.9;
}
}
function checkVideoProperties() {
if (video.currentTime <= APPEND_TIME) {
if (video.videoWidth != MEDIA_1_WIDTH ||
video.videoHeight != MEDIA_1_HEIGHT) {
logVideoDimensions();
failTest('Unexpected dimensions for first video segment.');
return;
}
} else if (video.currentTime >= APPEND_TIME + DELTA) {
if (video.videoWidth != MEDIA_2_WIDTH ||
video.videoHeight != MEDIA_2_HEIGHT) {
logVideoDimensions();
failTest('Unexpected dimensions for second video segment.');
return;
}
}
}
function logVideoDimensions() {
console.log('video.currentTime = ' + video.currentTime +
', video dimensions = ' + video.videoWidth + 'x' +
video.videoHeight + '.');
}
function runTest() {
video.addEventListener('timeupdate', onTimeUpdate);
video.addEventListener('ended', failTest);
if (runEncrypted) {
loadEncryptedMedia(video, MEDIA_1, keySystem, KEY, true,
appendNextSource);
} else {
var mediaSource = loadMediaSource(MEDIA_1, mediaType,
appendNextSource);
video.src = window.URL.createObjectURL(mediaSource);
}
}
</script>
</body>
</html>