video-encoder-flush.https.any.js (2529B)
1 // META: global=window,dedicatedworker 2 // META: script=/common/media.js 3 // META: script=/webcodecs/utils.js 4 // META: script=/webcodecs/video-encoder-utils.js 5 // META: variant=?av1 6 // META: variant=?vp8 7 // META: variant=?h264_avc 8 9 let CONFIG = null; 10 promise_setup(async () => { 11 const config = { 12 '?av1': {codec: 'av01.0.04M.08'}, 13 '?vp8': {codec: 'vp8'}, 14 '?h264_avc': {codec: 'avc1.42001e', avc: {format: 'avc'}}, 15 }[location.search]; 16 config.width = 640; 17 config.height = 480; 18 config.displayWidth = 800; 19 config.displayHeight = 600; 20 CONFIG = config; 21 }); 22 23 promise_test(async t => { 24 let codecInit = getDefaultCodecInit(t); 25 26 let outputs = 0; 27 let firstOutput = new Promise(resolve => { 28 codecInit.output = (chunk, metadata) => { 29 outputs++; 30 assert_equals(outputs, 1, 'outputs'); 31 encoder.reset(); 32 resolve(); 33 }; 34 }); 35 36 let encoder = new VideoEncoder(codecInit); 37 encoder.configure(CONFIG); 38 39 let frame1 = createFrame(640, 480, 0); 40 let frame2 = createFrame(640, 480, 33333); 41 t.add_cleanup(() => { 42 frame1.close(); 43 frame2.close(); 44 }); 45 46 encoder.encode(frame1); 47 encoder.encode(frame2); 48 const flushDone = encoder.flush(); 49 50 // Wait for the first output, then reset. 51 await firstOutput; 52 53 // Flush should have been synchronously rejected. 54 await promise_rejects_dom(t, 'AbortError', flushDone); 55 56 assert_equals(outputs, 1, 'outputs'); 57 }, 'Test reset during flush'); 58 59 promise_test(async t => { 60 let frame1 = createFrame(640, 480, 0); 61 let frame2 = createFrame(640, 480, 33333); 62 t.add_cleanup(() => { 63 frame1.close(); 64 frame2.close(); 65 }); 66 67 const callbacks = {}; 68 const encoder = createVideoEncoder(t, callbacks); 69 70 let flushInCallbackDone; 71 let outputs = 0; 72 let firstOutput = new Promise(resolve => { 73 callbacks.output = (chunk, metadata) => { 74 encoder.reset(); 75 76 callbacks.output = (chunk, metadata) => { 77 outputs++; 78 }; 79 80 encoder.configure(CONFIG); 81 encoder.encode(frame2); 82 flushInCallbackDone = encoder.flush(); 83 84 resolve(); 85 }; 86 }); 87 88 encoder.configure(CONFIG); 89 encoder.encode(frame1); 90 const flushDone = encoder.flush(); 91 92 // Wait for the first output, then reset. 93 await firstOutput; 94 95 // Flush should have been synchronously rejected. 96 await promise_rejects_dom(t, 'AbortError', flushDone); 97 98 // Wait for the second flush and check the output count. 99 await flushInCallbackDone; 100 101 assert_equals(outputs, 1, 'outputs'); 102 }, 'Test new flush after reset in a flush callback');