fune/testing/web-platform/tests/webcodecs/video-encoder-h264.https.any.js
Dale Curtis bb0dbe6ad5 Bug 1849783 [wpt PR 41593] - [WebCodecs] Add a wpt verifying the encoded profile for H264., a=testonly
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
2023-09-13 11:37:15 +00:00

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