Source code

Revision control

Copy as Markdown

Other Tools

// This script is intended to be imported into a worker's script, and provides
// common preparation for multiple test cases. Errors encountered are either
// postMessaged with subject of messageSubject.ERROR, or in the case of failed
// mediaLoadPromise, result in promise rejection.
importScripts("mediasource-message-util.js");
if (!this.MediaSource)
postMessage({ subject: messageSubject.ERROR, info: "MediaSource API missing from Worker" });
let MEDIA_LIST = [
{
url: '../mp4/test.mp4',
type: 'video/mp4; codecs="mp4a.40.2,avc1.4d400d"',
},
{
url: '../webm/test.webm',
type: 'video/webm; codecs="vp8, vorbis"',
},
];
class MediaSourceWorkerUtil {
constructor() {
this.mediaSource = new MediaSource();
// Find supported test media, if any.
this.foundSupportedMedia = false;
for (let i = 0; i < MEDIA_LIST.length; ++i) {
this.mediaMetadata = MEDIA_LIST[i];
if (MediaSource.isTypeSupported(this.mediaMetadata.type)) {
this.foundSupportedMedia = true;
break;
}
}
// Begin asynchronous fetch of the test media.
if (this.foundSupportedMedia) {
this.mediaLoadPromise = MediaSourceWorkerUtil.loadBinaryAsync(this.mediaMetadata.url);
} else {
postMessage({ subject: messageSubject.ERROR, info: "No supported test media" });
}
}
static loadBinaryAsync(url) {
return new Promise((resolve, reject) => {
let request = new XMLHttpRequest();
request.open("GET", url, true);
request.responseType = "arraybuffer";
request.onerror = event => { reject(event); };
request.onload = () => {
if (request.status != 200) {
reject("Unexpected loadData_ status code : " + request.status);
}
let response = new Uint8Array(request.response);
resolve(response);
};
request.send();
});
}
}