fune/testing/web-platform/tests/webcodecs/video-encoder-config.https.any.js
Eugene Zemtsov e6f74575bd Bug 1797659 [wpt PR 36680] - webcodecs: Allow avc, hevc fields in VideoEncoder config for other codecs, a=testonly
Automatic update from web-platform-tests
webcodecs: Allow avc, hevc fields in VideoEncoder config for other codecs

Browsers that don't support HEVC and AVC would just ignore these fields
when configured for other codec formats. Chromium should do the same
for consistency.

Bug: 1375781
Change-Id: Iad6e3d54a904a949a29f5f9aa7871ea5d07893bd
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3984244
Reviewed-by: Dale Curtis <dalecurtis@chromium.org>
Commit-Queue: Eugene Zemtsov <eugene@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1064447}

--

wpt-commits: bc4e43a9bc8bdd769745bf9bf2c3fcd89ff954c4
wpt-pr: 36680
2022-11-11 12:32:30 +00:00

159 lines
3.9 KiB
JavaScript

// META: global=window,dedicatedworker
// META: script=/webcodecs/utils.js
const invalidConfigs = [
{
comment: 'Emtpy codec',
config: {
codec: '',
width: 640,
height: 480,
},
},
{
comment: 'Unrecognized codec',
config: {
codec: 'bogus',
width: 640,
height: 480,
},
},
{
comment: 'Width is too large',
config: {
codec: 'vp8',
width: 1000000,
height: 480,
},
},
{
comment: 'Height is too large',
config: {
codec: 'vp8',
width: 640,
height: 1000000,
},
},
{
comment: 'Invalid scalability mode',
config: {codec: 'vp8', width: 640, height: 480, scalabilityMode: 'ABC'}
}
];
invalidConfigs.forEach(entry => {
promise_test(t => {
return promise_rejects_js(t, TypeError, VideoEncoder.isConfigSupported(entry.config));
}, 'Test that VideoEncoder.isConfigSupported() rejects invalid config:' + entry.comment);
});
const validButUnsupportedConfigs = [
{
comment: 'Too strenuous accelerated encoding parameters',
config: {
codec: "vp8",
hardwareAcceleration: "prefer-hardware",
width: 7000,
height: 7000,
bitrate: 1,
framerate: 240,
}
},
{
comment: 'Odd sized frames for H264',
config: {
codec: "avc1.42001E",
width: 641,
height: 480,
bitrate: 1000000,
framerate: 24,
}
},
];
validButUnsupportedConfigs.forEach(entry => {
let config = entry.config;
promise_test(async t => {
let support = await VideoEncoder.isConfigSupported(config);
assert_false(support.supported);
let new_config = support.config;
assert_equals(new_config.codec, config.codec);
assert_equals(new_config.width, config.width);
assert_equals(new_config.height, config.height);
if (config.bitrate)
assert_equals(new_config.bitrate, config.bitrate);
if (config.framerate)
assert_equals(new_config.framerate, config.framerate);
}, "VideoEncoder.isConfigSupported() doesn't support config:" + entry.comment);
});
const validConfigs = [
{
codec: 'avc1.42001E',
hardwareAcceleration: 'no-preference',
width: 640,
height: 480,
bitrate: 5000000,
framerate: 24,
avc: {format: 'annexb'},
futureConfigFeature: 'foo',
},
{
codec: 'vp8',
hardwareAcceleration: 'no-preference',
width: 800,
height: 600,
bitrate: 7000000,
bitrateMode: 'variable',
framerate: 60,
scalabilityMode: 'L1T2',
futureConfigFeature: 'foo',
latencyMode: 'quality',
avc: {format: 'annexb'}
},
{
codec: 'vp09.00.10.08',
hardwareAcceleration: 'no-preference',
width: 1280,
height: 720,
bitrate: 7000000,
bitrateMode: 'constant',
framerate: 25,
futureConfigFeature: 'foo',
latencyMode: 'realtime',
alpha: 'discard'
}
];
validConfigs.forEach(config => {
promise_test(async t => {
let support = await VideoEncoder.isConfigSupported(config);
assert_implements_optional(support.supported);
let new_config = support.config;
assert_false(new_config.hasOwnProperty('futureConfigFeature'));
assert_equals(new_config.codec, config.codec);
assert_equals(new_config.width, config.width);
assert_equals(new_config.height, config.height);
if (config.bitrate)
assert_equals(new_config.bitrate, config.bitrate);
if (config.framerate)
assert_equals(new_config.framerate, config.framerate);
if (config.bitrateMode)
assert_equals(new_config.bitrateMode, config.bitrateMode);
if (config.latencyMode)
assert_equals(new_config.latencyMode, config.latencyMode);
if (config.alpha)
assert_equals(new_config.alpha, config.alpha);
if (config.codec.startsWith('avc')) {
if (config.avc) {
assert_equals(new_config.avc.format, config.avc.format);
}
} else {
assert_equals(new_config.avc, undefined);
}
}, "VideoEncoder.isConfigSupported() supports:" + JSON.stringify(config));
});