// 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');