blob: 84210cc224c2a16edfc08bd3b3c8f8bc9273e91d [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<title>media-mp4-h264-partial-abort</title>
<script src="media-source-loader.js"></script>
<script src="../video-test.js"></script>
<script>
var loader;
var source;
var sourceBuffer;
var random;
function loaderPromise(loader) {
return new Promise((resolve, reject) => {
loader.onload = resolve;
loader.onerror = reject;
});
}
function randomNumber(min, max) {
return Math.floor(Math.random() * (max - min) + min);
}
window.addEventListener('load', async event => {
try {
findMediaElement();
loader = new MediaSourceLoader('content/test-fragmented-video-manifest.json');
await loaderPromise(loader);
source = new MediaSource();
run('video.src = URL.createObjectURL(source)');
await waitFor(source, 'sourceopen');
waitFor(video, 'error').then(failTest);
consoleWrite('Append the init segment in two chunks');
run('sourceBuffer = source.addSourceBuffer(loader.type())');
consoleWrite('Divide the init segment in two.');
run('random = randomNumber(1, 720)');
run('partial1 = loader.initSegment().slice(0, random)');
run('partial2 = loader.initSegment().slice(random)');
let firstSegment = true;
run('sourceBuffer.appendBuffer(partial1)');
waitFor(video, 'loadedmetadata').then(() => {
if (firstSegment)
failtest('loadedmetada can only be fired once the whole init segment has been appended');
});
await waitFor(sourceBuffer, 'update');
firstSegment = false;
run('sourceBuffer.appendBuffer(partial2)');
await waitFor(sourceBuffer, 'update');
consoleWrite('Append the two partial media segments in reverse order. Separated with an abort');
run('sourceBuffer.appendBuffer(loader.mediaSegment(3).slice(0, 45000))');
await waitFor(sourceBuffer, 'update');
run('sourceBuffer.abort()');
testExpected('sourceBuffer.buffered.length', '1');
testExpected('sourceBuffer.buffered.end(0)', '3.541', '>=');
run('sourceBuffer.appendBuffer(loader.mediaSegment(0).slice(0, 45000))');
await waitFor(sourceBuffer, 'update');
testExpected('sourceBuffer.buffered.length', '2');
testExpected('sourceBuffer.buffered.end(0)', '0.708', '>=');
testExpected('sourceBuffer.buffered.end(1)', '3.541', '>=');
consoleWrite('Clean sourcebuffer of all content.');
consoleWrite('Ensure an init segment is accepted right after an aborted partial media segment');
run('sourceBuffer.abort()');
run('sourceBuffer.remove(0, 100)');
await waitFor(sourceBuffer, 'update');
run('sourceBuffer.appendBuffer(loader.mediaSegment(3).slice(0, 45000))');
await waitFor(sourceBuffer, 'update');
run('sourceBuffer.abort()');
testExpected('sourceBuffer.buffered.length', '1');
testExpected('sourceBuffer.buffered.end(0)', '3.541', '>=');
run('sourceBuffer.appendBuffer(loader.initSegment())');
await waitFor(sourceBuffer, 'update');
run('sourceBuffer.appendBuffer(loader.mediaSegment(0).slice(0, 45000))');
await waitFor(sourceBuffer, 'update');
testExpected('sourceBuffer.buffered.length', '2');
testExpected('sourceBuffer.buffered.end(0)', '0.708', '>=');
testExpected('sourceBuffer.buffered.end(1)', '3.541', '>=');
consoleWrite('Same as above without waiting for the first append to complete. This is not a deterministic speced behaviour');
consoleWrite('Clean sourcebuffer of all content.');
run('sourceBuffer.abort()');
run('sourceBuffer.remove(0, 100)');
await waitFor(sourceBuffer, 'update');
run('sourceBuffer.appendBuffer(loader.mediaSegment(3).slice(0, 45000))');
run('sourceBuffer.abort()');
run('sourceBuffer.appendBuffer(loader.initSegment())');
await waitFor(sourceBuffer, 'update');
run('sourceBuffer.appendBuffer(loader.mediaSegment(0).slice(0, 45000))');
await waitFor(sourceBuffer, 'update');
testExpected('sourceBuffer.buffered.length', '1');
testExpected('sourceBuffer.buffered.end(0)', '0.708', '>=');
endTest();
} catch (e) {
failTest(`Caught exception: "${e}"`);
}
});
</script>
</head>
<body>
<video controls></video>
</body>
</html>