blob: fdee306e10fde67f868967615e0ba496efddf445 [file] [edit]
// META: global=window,dedicatedworker
// META: script=/webcodecs/videoFrame-rgbx-utils.js
function readPixels(source) {
const ctx = new OffscreenCanvas(kRgbxWidth, kRgbxHeight).getContext('2d');
ctx.drawImage(source, 0, 0);
return ctx.getImageData(0, 0, kRgbxWidth, kRgbxHeight).data;
}
runRgbxTests('createImageBitmap()', async (frame, description) => {
const bitmap = await createImageBitmap(frame);
try {
assert_equals(bitmap.width, kRgbxWidth);
assert_equals(bitmap.height, kRgbxHeight);
verifyOpaqueRgbxPixels(readPixels(bitmap), description);
} finally {
bitmap.close();
}
});
// The bitmap is a snapshot: closing the frame must not change it.
promise_test(async t => {
const frame = makeRgbxFrame('RGBX', 0x00);
const bitmap = await createImageBitmap(frame);
t.add_cleanup(() => bitmap.close());
frame.close();
verifyOpaqueRgbxPixels(readPixels(bitmap), 'bitmap after closing the frame');
}, 'An ImageBitmap of an RGBX VideoFrame stays opaque after closing the frame');
// Cloned frames are also opaque.
promise_test(async t => {
const frame = makeRgbxFrame('BGRX', 0x00);
t.add_cleanup(() => frame.close());
const clone = frame.clone();
t.add_cleanup(() => clone.close());
const bitmap = await createImageBitmap(clone);
t.add_cleanup(() => bitmap.close());
verifyOpaqueRgbxPixels(readPixels(bitmap), 'bitmap of a cloned frame');
}, 'An ImageBitmap of a cloned BGRX VideoFrame is opaque');