| // META: global=window,dedicatedworker |
| // META: script=/common/media.js |
| // META: script=/webcodecs/utils.js |
| // META: script=/webcodecs/video-encoder-utils.js |
| // META: variant=?baseline |
| // META: variant=?main |
| // META: variant=?high |
| // META: variant=?high-6.2 |
| |
| promise_test(async t => { |
| const codecString = { |
| '?baseline': 'avc1.42001e', |
| '?main': 'avc1.4d001e', |
| '?high': 'avc1.64001e', |
| '?high-6.2': 'avc1.64003e', |
| }[location.search]; |
| |
| var encoderConfig; |
| if (location.search != "?high-6.2") { |
| encoderConfig = { |
| codec: codecString, |
| width: 640, |
| height: 480, |
| displayWidth: 800, |
| displayHeight: 600, |
| avc: {format: 'avc'}, // AVC makes it easy to check the profile. |
| }; |
| } else { |
| // high profile + level 6.2 |
| encoderConfig = { |
| codec: codecString, |
| width: 7680, |
| height: 4320, |
| displayWidth: 7680, |
| displayHeight: 4320, |
| avc: {format: 'avc'}, // AVC makes it easy to check the profile. |
| }; |
| } |
| |
| let supported = false; |
| try { |
| const support = await VideoEncoder.isConfigSupported(encoderConfig); |
| supported = support.supported; |
| } catch (e) { |
| } |
| assert_implements_optional( |
| supported, `H264 ${location.search.substring(1)} profile unsupported`); |
| |
| let description = null; |
| let codecInit = { |
| error: t.unreached_func('Unexpected encoding error'), |
| output: (_, metadata) => { |
| assert_not_equals(metadata, null); |
| if (metadata.decoderConfig) |
| description = metadata.decoderConfig.description; |
| }, |
| }; |
| |
| let encoder = new VideoEncoder(codecInit); |
| encoder.configure(encoderConfig); |
| |
| let frame1 = createFrame(encoderConfig.width, encoderConfig.height, 0); |
| let frame2 = createFrame(encoderConfig.width, encoderConfig.height, 33333); |
| t.add_cleanup(() => { |
| frame1.close(); |
| frame2.close(); |
| }); |
| |
| encoder.encode(frame1); |
| encoder.encode(frame2); |
| |
| await encoder.flush(); |
| |
| assert_not_equals(description, null); |
| assert_not_equals(description.length, 0); |
| |
| // Profile is a hex code at xx in a codec string of form "avc1.xxyyzz". |
| let expectedProfileIndication = parseInt(codecString.substring(5, 7), 16); |
| |
| // See AVCDecoderConfigurationRecord in ISO/IEC 14496-15 for details. |
| // https://www.w3.org/TR/webcodecs-avc-codec-registration/#dom-avcbitstreamformat-avc |
| let profileIndication = new Uint8Array(description)[1]; |
| assert_equals(profileIndication, expectedProfileIndication); |
| }, 'Test that encoding with a specific H264 profile actually produces that profile.'); |