forked from mirrors/gecko-dev
Automatic update from web-platform-tests
[WebCodecs] Add a wpt verifying the encoded profile for H264.
Checks baseline, main, high by seeing what profileIndication is
put inside the AVCC record.
R=sandersd
Bug: 1466392
Change-Id: I913e8fc4f8a46d02570f0570b7c005c871f0e143
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4803433
Reviewed-by: Dan Sanders <sandersd@chromium.org>
Commit-Queue: Dan Sanders <sandersd@chromium.org>
Auto-Submit: Dale Curtis <dalecurtis@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1187369}
--
wpt-commits: 08578d324a4c3a9b2147de1340623cde2e415cd9
wpt-pr: 41593
69 lines
2 KiB
JavaScript
69 lines
2 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
|
|
|
|
promise_test(async t => {
|
|
const codecString = {
|
|
'?baseline': 'avc1.42001e',
|
|
'?main': 'avc1.4d001e',
|
|
'?high': 'avc1.64001e',
|
|
}[location.search];
|
|
|
|
let encoderConfig = {
|
|
codec: codecString,
|
|
width: 640,
|
|
height: 480,
|
|
displayWidth: 800,
|
|
displayHeight: 600,
|
|
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(640, 480, 0);
|
|
let frame2 = createFrame(640, 480, 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.');
|