// META: global=window,dedicatedworker // META: script=/common/media.js // META: script=/webcodecs/utils.js // META: script=/webcodecs/video-encoder-utils.js // META: variant=?av1 // META: variant=?vp8 // META: variant=?h264_avc let CONFIG = null; promise_setup(async () => { const config = { '?av1': {codec: 'av01.0.04M.08'}, '?vp8': {codec: 'vp8'}, '?h264_avc': {codec: 'avc1.42001e', avc: {format: 'avc'}}, }[location.search]; config.width = 640; config.height = 480; config.displayWidth = 800; config.displayHeight = 600; CONFIG = config; }); promise_test(async t => { let codecInit = getDefaultCodecInit(t); let outputs = 0; let firstOutput = new Promise(resolve => { codecInit.output = (chunk, metadata) => { outputs++; assert_equals(outputs, 1, 'outputs'); encoder.reset(); resolve(); }; }); let encoder = new VideoEncoder(codecInit); encoder.configure(CONFIG); let frame1 = createFrame(640, 480, 0); let frame2 = createFrame(640, 480, 33333); t.add_cleanup(() => { frame1.close(); frame2.close(); }); encoder.encode(frame1); encoder.encode(frame2); const flushDone = encoder.flush(); // Wait for the first output, then reset. await firstOutput; // Flush should have been synchronously rejected. await promise_rejects_dom(t, 'AbortError', flushDone); assert_equals(outputs, 1, 'outputs'); }, 'Test reset during flush'); promise_test(async t => { let frame1 = createFrame(640, 480, 0); let frame2 = createFrame(640, 480, 33333); t.add_cleanup(() => { frame1.close(); frame2.close(); }); const callbacks = {}; const encoder = createVideoEncoder(t, callbacks); let flushInCallbackDone; let outputs = 0; let firstOutput = new Promise(resolve => { callbacks.output = (chunk, metadata) => { encoder.reset(); callbacks.output = (chunk, metadata) => { outputs++; }; encoder.configure(CONFIG); encoder.encode(frame2); flushInCallbackDone = encoder.flush(); resolve(); }; }); encoder.configure(CONFIG); encoder.encode(frame1); const flushDone = encoder.flush(); // Wait for the first output, then reset. await firstOutput; // Flush should have been synchronously rejected. await promise_rejects_dom(t, 'AbortError', flushDone); // Wait for the second flush and check the output count. await flushInCallbackDone; assert_equals(outputs, 1, 'outputs'); }, 'Test new flush after reset in a flush callback');