| <title>Test Encode VideoFrame from CanvasImageSource.</title> | |
| <img src="four-colors.png"/> | |
| <svg width="320" height="240" xmlns="http://www.w3.org/2000/svg"> | |
| <image href="four-colors.png" height="320" width="240"/> | |
| </svg> | |
| <canvas id=""></canvas> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src="/webcodecs/utils.js"></script> | |
| <script> | |
| promise_test(() => { | |
| return new Promise(resolve => onload = resolve); | |
| }, "Wait for onload event to get access to image data"); | |
| promise_test(async t => { | |
| const img = document.querySelector('img'); | |
| const frame = new VideoFrame(img, {timestamp: 0}); | |
| assert_equals(frame.codedWidth, img.width); | |
| assert_equals(frame.codedHeight, img.height); | |
| let outputs = 0; | |
| const codecInit = getDefaultCodecInit(t); | |
| codecInit.output = (chunk, metadata) => { | |
| outputs += 1; | |
| } | |
| const encoder = new VideoEncoder(codecInit); | |
| encoder.configure({ | |
| codec: 'vp8', | |
| width: frame.codedWidth, | |
| height: frame.codedHeight, | |
| }); | |
| encoder.encode(frame); | |
| frame.close(); | |
| await encoder.flush(); | |
| encoder.close(); | |
| assert_equals(outputs, 1, 'outputs'); | |
| }, 'Test encode ImageElement-constructed VideoFrame'); | |
| promise_test(async t => { | |
| const svg = document.querySelector('svg'); | |
| const svgImage = document.querySelector('image'); | |
| const frame = new VideoFrame(svgImage, {timestamp: 0}); | |
| assert_equals(frame.codedWidth, svg.width.baseVal.value); | |
| assert_equals(frame.codedHeight, svg.height.baseVal.value); | |
| let outputs = 0; | |
| const codecInit = getDefaultCodecInit(t); | |
| codecInit.output = (chunk, metadata) => { | |
| outputs += 1; | |
| } | |
| const encoder = new VideoEncoder(codecInit); | |
| encoder.configure({ | |
| codec: 'vp8', | |
| width: frame.codedWidth, | |
| height: frame.codedHeight, | |
| }); | |
| encoder.encode(frame); | |
| frame.close(); | |
| await encoder.flush(); | |
| encoder.close(); | |
| assert_equals(outputs, 1, 'outputs'); | |
| }, 'Test encode SVGImageElement-constructed VideoFrame'); | |
| function drawFourColors(canvas) { | |
| let ctx = canvas.getContext('2d'); | |
| ctx.fillStyle = '#FFFF00'; // yellow | |
| ctx.fillRect(0, 0, canvas.width / 2, canvas.height / 2); | |
| ctx.fillStyle = '#FF0000'; // red | |
| ctx.fillRect(canvas.width / 2, 0, canvas.width / 2, canvas.height / 2); | |
| ctx.fillStyle = '#0000FF'; // blue | |
| ctx.fillRect(0, canvas.height / 2, canvas.width / 2, canvas.height / 2); | |
| ctx.fillStyle = '#00FF00'; // green | |
| ctx.fillRect(canvas.width / 2, canvas.height / 2, canvas.width / 2, | |
| canvas.height / 2); | |
| } | |
| promise_test(async t => { | |
| const canvas = document.querySelector('canvas'); | |
| canvas.width = 320; | |
| canvas.height = 240; | |
| drawFourColors(canvas); | |
| const frame = new VideoFrame(canvas, {timestamp: 0}); | |
| assert_equals(frame.codedWidth, canvas.width); | |
| assert_equals(frame.codedHeight, canvas.height); | |
| let outputs = 0; | |
| const codecInit = getDefaultCodecInit(t); | |
| codecInit.output = (chunk, metadata) => { | |
| outputs += 1; | |
| } | |
| const encoder = new VideoEncoder(codecInit); | |
| encoder.configure({ | |
| codec: 'vp8', | |
| width: canvas.width, | |
| height: canvas.height, | |
| }); | |
| encoder.encode(frame); | |
| frame.close(); | |
| await encoder.flush(); | |
| encoder.close(); | |
| assert_equals(outputs, 1, 'outputs'); | |
| }, 'Test encode canvas-element-constructed VideoFrame'); | |
| </script> |