// META: global=window,dedicatedworker // META: script=/common/media.js // META: script=/webcodecs/utils.js // META: script=/webcodecs/video-encoder-utils.js const defaultConfig = { codec: 'vp8', width: 640, height: 480 }; promise_test(async t => { let output_chunks = []; let codecInit = getDefaultCodecInit(t); let decoderConfig = null; codecInit.output = (chunk, metadata) => { assert_not_equals(metadata, null); if (metadata.decoderConfig) decoderConfig = metadata.decoderConfig; output_chunks.push(chunk); } let encoder = new VideoEncoder(codecInit); let config = defaultConfig; encoder.configure(config); let frame = createFrame(640, 480, 0, {rotation: 90, flip: true}); encoder.encode(frame); frame.close(); await encoder.flush(); encoder.close(); assert_equals(output_chunks.length, 1); assert_equals(decoderConfig.rotation, 90); assert_equals(decoderConfig.flip, true); }, 'Encode video frame with orientation'); promise_test(async t => { let output_chunks = []; let codecInit = getDefaultCodecInit(t); let decoderConfig = null; codecInit.output = (chunk, metadata) => { assert_not_equals(metadata, null); if (metadata.decoderConfig) decoderConfig = metadata.decoderConfig; output_chunks.push(chunk); } let encoder = new VideoEncoder(codecInit); let config = defaultConfig; encoder.configure(config); let frame1 = createFrame(640, 480, 0, {rotation: 90, flip: true}); let frame2 = createFrame(640, 480, 33333, {rotation: 90, flip: false}); let frame3 = createFrame(640, 480, 66666, {rotation: 180, flip: true}); let frame4 = createFrame(640, 480, 99999, {rotation: 90, flip: true}); encoder.encode(frame1); assert_throws_dom('DataError', () => encoder.encode(frame2)); assert_throws_dom('DataError', () => encoder.encode(frame3)); encoder.encode(frame4); frame1.close(); frame2.close(); frame3.close(); frame4.close(); await encoder.flush(); encoder.close(); assert_equals(output_chunks.length, 2); assert_equals(decoderConfig.rotation, 90); assert_equals(decoderConfig.flip, true); }, 'Encode video frames with different orientation has non-fatal failures'); promise_test(async t => { let output_chunks = []; let codecInit = getDefaultCodecInit(t); let decoderConfig = null; codecInit.output = (chunk, metadata) => { assert_not_equals(metadata, null); if (metadata.decoderConfig) decoderConfig = metadata.decoderConfig; output_chunks.push(chunk); } let encoder = new VideoEncoder(codecInit); let config = defaultConfig; encoder.configure(config); let frame = createFrame(640, 480, 0, {rotation: 90, flip: true}); encoder.encode(frame); frame.close(); await encoder.flush(); assert_equals(output_chunks.length, 1); assert_equals(decoderConfig.rotation, 90); assert_equals(decoderConfig.flip, true); encoder.configure(config); frame = createFrame(640, 480, 0, {rotation: 270, flip: false}); encoder.encode(frame); frame.close(); await encoder.flush(); assert_equals(output_chunks.length, 2); assert_equals(decoderConfig.rotation, 270); assert_equals(decoderConfig.flip, false); encoder.close(); }, 'Encode video frames with different orientations after reconfigure');