servo/tests/wpt/web-platform-tests/webcodecs/video-encoder-config.https.any.js

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));
});