84 lines
2.5 KiB
JavaScript
84 lines
2.5 KiB
JavaScript
// 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.');
|