| // META: global=window,dedicatedworker |
| // META: script=/webcodecs/video-encoder-utils.js |
| // META: variant=?av1 |
| // META: variant=?vp8 |
| // META: variant=?vp9_p0 |
| // META: variant=?h264_avc |
| // META: variant=?h264_annexb |
| |
| var CODEC = null; |
| promise_setup(async () => { |
| CODEC = { |
| '?av1': { codec: 'av01.0.04M.08' }, |
| '?vp8': { codec: 'vp8' }, |
| '?vp9_p0': { codec: 'vp09.00.10.08' }, |
| '?h264_avc': { codec: 'avc1.42001E', avc: { format: 'avc' } }, |
| '?h264_annexb': { codec: 'avc1.42001E', avc: { format: 'annexb' } }, |
| }[location.search]; |
| }); |
| |
| promise_test(async t => { |
| let encoderConfig = { |
| ...CODEC, |
| width: 320, |
| height: 240, |
| }; |
| |
| const encoderSupport = await VideoEncoder.isConfigSupported(encoderConfig); |
| assert_implements_optional(encoderSupport.supported, `${encoderConfig.codec} encoder is unsupported`); |
| |
| let encodedResult; |
| const encoder = new VideoEncoder({ |
| output: (chunk, metadata) => { |
| encodedResult = { chunk, metadata }; |
| }, |
| error: e => { |
| t.unreached_func('Unexpected encoding error: ' + e); |
| }, |
| }); |
| |
| encoderConfig.framerate = 30; |
| encoderConfig.bitrate = 3000000; |
| encoder.configure(encoderConfig); |
| |
| let frame = createFrame(encoderConfig.width, encoderConfig.height, 0); |
| encoder.encode(frame); |
| frame.close(); |
| |
| await encoder.flush(); |
| encoder.close(); |
| |
| let decoderConfig = encodedResult.metadata.decoderConfig; |
| delete decoderConfig.codedWidth; |
| delete decoderConfig.codedHeight; |
| delete decoderConfig.displayAspectWidth; |
| delete decoderConfig.displayAspectHeight; |
| |
| const decoderSupport = await VideoDecoder.isConfigSupported(decoderConfig); |
| assert_implements_optional(decoderSupport.supported, `${decoderConfig.codec} decoder is unsupported`); |
| |
| let decodedResult; |
| const decoder = new VideoDecoder({ |
| output: frame => { |
| decodedResult = frame; |
| }, |
| error: e => { |
| t.unreached_func('Unexpected decoding error: ' + e); |
| }, |
| }); |
| |
| |
| decoder.configure(decoderConfig); |
| decoder.decode(encodedResult.chunk); |
| await decoder.flush(); |
| |
| // Note: Coded size may vary based on decoder requirements. |
| assert_equals( |
| decodedResult.visibleRect.width, encoderConfig.width, |
| 'decoded frame width'); |
| assert_equals( |
| decodedResult.visibleRect.height, encoderConfig.height, |
| 'decoded frame height'); |
| }, 'Test configure() without setting width and height'); |