| <!DOCTYPE html> |
| <html> |
| <head> |
| <script src="media-source-loader.js"></script> |
| <script src="../resources/runner.js"></script> |
| <script> |
| var loader; |
| var video; |
| var longMediaSegment; |
| |
| function concatArrayBuffers() { |
| var byteLength = 0; |
| Array.prototype.forEach.call(arguments, arrayBuffer => { |
| if (!arrayBuffer.byteLength) |
| throw "Not an ArrayBuffer!"; |
| byteLength += arrayBuffer.byteLength; |
| }); |
| |
| |
| var view = new Uint8Array(byteLength); |
| var offset = 0; |
| Array.prototype.forEach.call(arguments, arrayBuffer => { |
| view.set(new Uint8Array(arrayBuffer), offset); |
| offset += arrayBuffer.byteLength; |
| }); |
| return view.buffer; |
| } |
| |
| function concatMediaData() { |
| return new Promise((resolve, reject) => { |
| var segments = new Array(100); |
| segments.fill(loader.everyMediaSegment); |
| longMediaSegment = concatArrayBuffers.apply(this, segments); |
| resolve(longMediaSegment); |
| }); |
| } |
| |
| window.addEventListener('load', () => { |
| PerfTestRunner.prepareToMeasureValuesAsync({ |
| unit: 'ms', |
| done: function () { |
| if (video) { |
| video.src = null; |
| video.load(); |
| } |
| } |
| }); |
| |
| loader = new MediaSourceLoader('test-fragmented-video.json'); |
| loader.loadMediaData().then(concatMediaData).then(runTest); |
| }); |
| |
| function remove30SecondsAtATimeTillEmpty(sourceBuffer) { |
| return new Promise(resolve => { |
| var removeNext30Seconds = () => { |
| var start = sourceBuffer.buffered.start(0); |
| sourceBuffer.remove(start, start + 30) |
| } |
| sourceBuffer.onupdate = () => { |
| if (sourceBuffer.buffered.length == 0 || sourceBuffer.buffered.start(0) - sourceBuffer.buffered.end(0) == 0) { |
| sourceBuffer.onupdate = null; |
| resolve(); |
| return; |
| } |
| |
| removeNext30Seconds(); |
| }; |
| removeNext30Seconds(); |
| }); |
| } |
| |
| function runTest() { |
| video = document.createElement('video'); |
| |
| loadMediaDataIntoVideo(video).then(sourceBuffer => { |
| startTime = PerfTestRunner.now(); |
| return remove30SecondsAtATimeTillEmpty(sourceBuffer); |
| }).then(() => { |
| if (PerfTestRunner.measureValueAsync(PerfTestRunner.now() - startTime)) |
| setTimeout(runTest, 0); |
| }); |
| } |
| |
| function loadMediaDataIntoVideo(video, segmentCount) { |
| return new Promise((resolve, reject) => { |
| var source = new MediaSource(); |
| source.onsourceopen = () => { |
| source.onsourceopen = null; |
| source.duration = loader.duration * 100; |
| var currentMediaSegment = 0; |
| var sourceBuffer = source.addSourceBuffer(loader.type); |
| sourceBuffer.mode = 'sequence'; |
| sourceBuffer.appendBuffer(loader.initSegment); |
| |
| var appendedMediaSegment = false; |
| sourceBuffer.onupdate = () => { |
| |
| if (appendedMediaSegment) { |
| if (source.readyState !== 'ended') { |
| source.endOfStream(); |
| sourceBuffer.onupdate = null; |
| sourceBuffer.onerror = null; |
| resolve(sourceBuffer); |
| } |
| return; |
| } |
| |
| sourceBuffer.appendBuffer(longMediaSegment); |
| appendedMediaSegment = true; |
| }; |
| sourceBuffer.onerror = error => { |
| reject(error); |
| }; |
| }; |
| video.src = URL.createObjectURL(source); |
| }); |
| } |
| </script> |
| </head> |
| <body> |
| </body> |
| </html> |