Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

// META: global=window,dedicatedworker
// META: script=/webcodecs/utils.js
const testData = {
src: 'h264.mp4',
config: {
codec: 'avc1.64000b',
description: {offset: 9490, size: 45},
codedWidth: 320,
codedHeight: 240,
displayAspectWidth: 320,
displayAspectHeight: 240,
}
};
// Create a view of an ArrayBuffer.
function view(buffer, {offset, size}) {
return new Uint8Array(buffer, offset, size);
}
function testSharedArrayBufferDescription(t, useView) {
const data = testData;
// Don't run test if the codec is not supported.
assert_equals("function", typeof VideoDecoder.isConfigSupported);
let supported = false;
return VideoDecoder.isConfigSupported({codec: data.config.codec})
.catch(_ => {
assert_implements_optional(false, data.config.codec + ' unsupported');
})
.then(support => {
supported = support.supported;
assert_implements_optional(
supported, data.config.codec + ' unsupported');
return fetch(data.src);
})
.then(response => {
return response.arrayBuffer();
})
.then(buf => {
config = {...data.config};
if (data.config.description) {
let desc = new SharedArrayBuffer(data.config.description.size);
let descView = new Uint8Array(desc);
descView.set(view(buf, data.config.description));
config.description = useView ? descView : desc;
}
// Support was verified above, so the description shouldn't change
// that.
return VideoDecoder.isConfigSupported(config);
})
.then(support => {
assert_true(support.supported);
const decoder = new VideoDecoder(getDefaultCodecInit(t));
decoder.configure(config);
assert_equals(decoder.state, 'configured', 'state');
});
}
promise_test(t => {
return testSharedArrayBufferDescription(t, /*useView=*/ false);
}, 'Test isConfigSupported() and configure() using a SharedArrayBuffer');
promise_test(t => {
return testSharedArrayBufferDescription(t, /*useView=*/ true);
}, 'Test isConfigSupported() and configure() using a Uint8Array(SharedArrayBuffer)');