| // 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'); |