blob: a881ffb6422e3ef813a931a4f3c5bfbefcba1618 [file] [edit]
// META: global=window,dedicatedworker
const width = 4;
const height = 2;
const formats = [
{format: 'I420', planes: [{stride: 4, rows: 2}, {stride: 2, rows: 1}, {stride: 2, rows: 1}]},
{format: 'I422', planes: [{stride: 4, rows: 2}, {stride: 2, rows: 2}, {stride: 2, rows: 2}]},
{format: 'I444', planes: [{stride: 4, rows: 2}, {stride: 4, rows: 2}, {stride: 4, rows: 2}]},
];
function planesSize(planes) {
return planes.reduce((total, plane) => total + plane.stride * plane.rows, 0);
}
function makeFrame(format, planes) {
return new VideoFrame(new Uint8Array(planesSize(planes)), {
format,
timestamp: 0,
codedWidth: width,
codedHeight: height,
});
}
for (const {format, planes} of formats) {
test(t => {
const frame = makeFrame(format, planes);
t.add_cleanup(() => frame.close());
assert_equals(frame.allocationSize(), planesSize(planes));
}, `Test ${format} allocationSize()`);
promise_test(async t => {
const frame = makeFrame(format, planes);
t.add_cleanup(() => frame.close());
const buffer = new Uint8Array(frame.allocationSize());
const layout = await frame.copyTo(buffer);
assert_equals(layout.length, planes.length);
let offset = 0;
for (let i = 0; i < planes.length; ++i) {
assert_equals(layout[i].offset, offset, `plane ${i} offset`);
assert_equals(layout[i].stride, planes[i].stride, `plane ${i} stride`);
offset += planes[i].stride * planes[i].rows;
}
}, `Test ${format} copyTo() layout`);
}
test(t => {
const frame = makeFrame('I422', formats[1].planes);
t.add_cleanup(() => frame.close());
assert_equals(frame.allocationSize({rect: {x: 0, y: 1, width: 4, height: 1}}), 4 + 2 + 2);
assert_throws_js(TypeError, () => frame.allocationSize({rect: {x: 1, y: 0, width: 2, height: 2}}));
}, 'Test I422 allows an odd rect.y and rejects an odd rect.x');
test(t => {
const frame = makeFrame('I444', formats[2].planes);
t.add_cleanup(() => frame.close());
assert_equals(frame.allocationSize({rect: {x: 1, y: 1, width: 3, height: 1}}), 3 * 3);
}, 'Test I444 allows an odd rect offset');