blob: 94afa70b298003516da858f83c5f610377274cf4 [file] [log] [blame] [edit]
<!DOCTYPE html>
<html>
<header>
<script src='/resources/testharness.js'></script>
<script src='/resources/testharnessreport.js'></script>
</header>
<body>
<script>
const WORKER_CODE = `self.onmessage = event => {
const frames = event.data;
frames.a.copyTo(new ArrayBuffer(1024 * 1024 * 4));
frames.b.copyTo(new ArrayBuffer(1024 * 1024 * 4));
frames.c.copyTo(new ArrayBuffer(1024 * 1024 * 4));
frames.d.copyTo(new ArrayBuffer(1024 * 1024 * 4));
frames.a.close();
frames.b.close();
frames.d.close();
frames.d.close();
};
self.postMessage('ready');
`
promise_test(async () => {
const encodedFrames = [];
let resolve, reject;
const encoderPromise = new Promise((res,rej) => {
resolve = res;
reject = rej;
});
for (const size of [2, 1024]) {
const encoder = new VideoEncoder({
output: chunk => {
encodedFrames.push(chunk);
if (encodedFrames.length === 2)
resolve();
},
error: e => reject(e),
});
setTimeout(() => {
reject("timed out waiting for encoded chunks");
}, 5000);
encoder.configure({
codec: 'vp8',
width: size,
height: size,
bitrate: 10e6,
framerate: 1,
});
const frame = new VideoFrame(new ArrayBuffer(size * size * 4), {format: 'RGBA', codedWidth: size, codedHeight: size, timestamp: 0});
encoder.encode(frame, {keyFrame: false});
frame.close();
}
await encoderPromise;
const decoderPromise = new Promise((res,rej) => {
resolve = res;
reject = rej;
});
const frames = [];
const decoder = new VideoDecoder({
output: frame => {
frames.push(frame);
if (frames.length === 8)
resolve();
},
error: e => reject(e),
});
setTimeout(() => {
reject("timed out waiting for decoded frames");
}, 5000);
decoder.configure({
codec: 'vp8',
codedWidth: 16,
codedHeight: 16,
});
for (let i = 0; i < 4; ++i) {
decoder.decode(encodedFrames[0]);
decoder.decode(encodedFrames[1]);
}
await decoderPromise;
const worker = new Worker(URL.createObjectURL(new Blob([WORKER_CODE])));
await new Promise(resolve => worker.onmessage = resolve);
worker.postMessage({a: frames[0], b: frames[1], c: frames[2], d: frames[3]}, [frames[0], frames[1], frames[2], frames[3]]);
frames[4].copyTo(new ArrayBuffer(1024 * 1024 * 4));
await new Promise(resolve => setTimeout(resolve, 0));
frames[5].copyTo(new ArrayBuffer(1024 * 1024 * 4));
await new Promise(resolve => setTimeout(resolve, 0));
frames[6].copyTo(new ArrayBuffer(1024 * 1024 * 4));
await new Promise(resolve => setTimeout(resolve, 0));
frames[7].copyTo(new ArrayBuffer(1024 * 1024 * 4));
await new Promise(resolve => setTimeout(resolve, 0));
frames[4].close();
frames[5].close();
frames[6].close();
frames[7].close();
}, "Test copyTo on different contexts");
</script>
</body>
</html>