videoFrame-createImageBitmap.https.any.js (2280B)
1 // META: global=window,dedicatedworker 2 // META: script=/webcodecs/utils.js 3 4 function testCreateImageBitmapFromVideoFrameVP9Decoder() { 5 // Prefers hardware decoders by setting video size as large as 720p. 6 const width = 1280; 7 const height = 720; 8 9 let canvas = new OffscreenCanvas(width, height); 10 let ctx = canvas.getContext('2d'); 11 ctx.fillStyle = 'rgb(50, 100, 150)'; 12 ctx.fillRect(0, 0, width, height); 13 14 return createImageBitmap(canvas).then((fromImageBitmap) => { 15 let videoFrame = new VideoFrame(fromImageBitmap, { 16 timestamp: 0 17 }); 18 return new Promise((resolve, reject) => { 19 let processVideoFrame = (frame) => { 20 createImageBitmap(frame).then((toImageBitmap) => { 21 let myCanvas = new OffscreenCanvas(width, height); 22 let myCtx = myCanvas.getContext('2d'); 23 myCtx.drawImage(toImageBitmap, 0, 0); 24 let tolerance = 10; 25 try { 26 testCanvas(myCtx, width, height, kSRGBPixel, null, 27 (actual, expected) => { 28 assert_approx_equals(actual, expected, tolerance); 29 } 30 ); 31 } catch (error) { 32 reject(error); 33 } 34 resolve('Done.'); 35 }); 36 }; 37 38 const decoderInit = { 39 output: processVideoFrame, 40 error: (e) => { 41 reject(e); 42 } 43 }; 44 45 const encodedVideoConfig = { 46 codec: "vp09.00.10.08", 47 }; 48 49 let decoder = new VideoDecoder(decoderInit); 50 decoder.configure(encodedVideoConfig); 51 52 let processVideoChunk = (chunk) => { 53 decoder.decode(chunk); 54 decoder.flush(); 55 }; 56 57 const encoderInit = { 58 output: processVideoChunk, 59 error: (e) => { 60 reject(e); 61 } 62 }; 63 64 const videoEncoderConfig = { 65 codec: "vp09.00.10.08", 66 width: width, 67 height: height, 68 bitrate: 10e6, 69 framerate: 30 70 }; 71 72 let encoder = new VideoEncoder(encoderInit); 73 encoder.configure(videoEncoderConfig); 74 encoder.encode(videoFrame, { 75 keyFrame: true 76 }); 77 encoder.flush(); 78 }); 79 }); 80 } 81 82 promise_test(() => { 83 return testCreateImageBitmapFromVideoFrameVP9Decoder(); 84 }, 'Create ImageBitmap for a VideoFrame from VP9 decoder.');