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