diff options
Diffstat (limited to 'testing/web-platform/tests/webcodecs/audio-encoder-config.https.any.js')
-rw-r--r-- | testing/web-platform/tests/webcodecs/audio-encoder-config.https.any.js | 341 |
1 files changed, 341 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webcodecs/audio-encoder-config.https.any.js b/testing/web-platform/tests/webcodecs/audio-encoder-config.https.any.js new file mode 100644 index 0000000000..3be8eb3f6d --- /dev/null +++ b/testing/web-platform/tests/webcodecs/audio-encoder-config.https.any.js @@ -0,0 +1,341 @@ +// META: global=window,dedicatedworker +// META: script=/webcodecs/utils.js + +const invalidConfigs = [ + { + comment: 'Missing codec', + config: { + sampleRate: 48000, + numberOfChannels: 2, + }, + }, + { + comment: 'Empty codec', + config: { + codec: '', + sampleRate: 48000, + numberOfChannels: 2, + }, + }, + { + comment: 'Missing sampleRate', + config: { + codec: 'opus', + sampleRate: 48000, + }, + }, + { + comment: 'Missing numberOfChannels', + config: { + codec: 'opus', + sampleRate: 48000, + }, + }, + { + comment: 'Zero sampleRate', + config: { + codec: 'opus', + sampleRate: 0, + numberOfChannels: 2, + }, + }, + { + comment: 'Zero channels', + config: { + codec: 'opus', + sampleRate: 8000, + numberOfChannels: 0, + }, + }, + { + comment: 'Bit rate too big', + config: { + codec: 'opus', + sampleRate: 8000, + numberOfChannels: 2, + bitrate: 6e9, + }, + }, + { + comment: 'Opus complexity too big', + config: { + codec: 'opus', + sampleRate: 8000, + numberOfChannels: 2, + opus: { + complexity: 11, + }, + }, + }, + { + comment: 'Opus packetlossperc too big', + config: { + codec: 'opus', + sampleRate: 8000, + numberOfChannels: 2, + opus: { + packetlossperc: 101, + }, + }, + }, + { + comment: 'Opus frame duration too small', + config: { + codec: 'opus', + sampleRate: 8000, + numberOfChannels: 2, + opus: { + frameDuration: 0, + }, + }, + }, + { + comment: 'Opus frame duration too big', + config: { + codec: 'opus', + sampleRate: 8000, + numberOfChannels: 2, + opus: { + frameDuration: 120 * 1000 + 1, + }, + }, + }, + { + comment: 'Invalid Opus frameDuration', + config: { + codec: 'opus', + sampleRate: 8000, + numberOfChannels: 2, + opus: { + frameDuration: 2501, + }, + }, + }, +]; + +invalidConfigs.forEach(entry => { + promise_test( + t => { + return promise_rejects_js( + t, TypeError, AudioEncoder.isConfigSupported(entry.config)); + }, + 'Test that AudioEncoder.isConfigSupported() rejects invalid config: ' + + entry.comment); +}); + +invalidConfigs.forEach(entry => { + async_test( + t => { + let codec = new AudioEncoder(getDefaultCodecInit(t)); + assert_throws_js(TypeError, () => { + codec.configure(entry.config); + }); + t.done(); + }, + 'Test that AudioEncoder.configure() rejects invalid config: ' + + entry.comment); +}); + +const validButUnsupportedConfigs = [ + { + comment: 'Bitrate is too low', + config: { + codec: 'opus', + sampleRate: 48000, + numberOfChannels: 2, + bitrate: 1, + }, + }, + { + comment: 'Unrecognized codec', + config: { + codec: 'bogus', + sampleRate: 48000, + numberOfChannels: 2, + }, + }, + { + comment: 'Sample rate is too small', + config: { + codec: 'opus', + sampleRate: 1, + numberOfChannels: 2, + }, + }, + { + comment: 'Sample rate is too large', + config: { + codec: 'opus', + sampleRate: 10000000, + numberOfChannels: 2, + }, + }, + { + comment: 'Way too many channels', + config: { + codec: 'opus', + sampleRate: 8000, + numberOfChannels: 1024, + bitrate: 128000, + }, + }, + { + comment: 'Possible future opus codec string', + config: { + codec: 'opus.123', + sampleRate: 48000, + numberOfChannels: 2, + } + }, + { + comment: 'Possible future aac codec string', + config: { + codec: 'mp4a.FF.9', + sampleRate: 48000, + numberOfChannels: 2, + } + }, +]; + +validButUnsupportedConfigs.forEach(entry => { + promise_test( + async t => { + let support = await AudioEncoder.isConfigSupported(entry.config); + assert_false(support.supported); + + let config = support.config; + assert_equals(config.codec, entry.config.codec); + assert_equals(config.sampleRate, entry.config.sampleRate); + assert_equals(config.numberOfChannels, entry.config.numberOfChannels); + }, + 'Test that AudioEncoder.isConfigSupported() doesn\'t support config: ' + + entry.comment); +}); + +validButUnsupportedConfigs.forEach(entry => { + promise_test( + t => { + let isErrorCallbackCalled = false; + let codec = new AudioEncoder({ + output: t.unreached_func('unexpected output'), + error: t.step_func_done(e => { + isErrorCallbackCalled = true; + assert_true(e instanceof DOMException); + assert_equals(e.name, 'NotSupportedError'); + assert_equals(codec.state, 'closed', 'state'); + }) + }); + codec.configure(entry.config); + return codec.flush() + .then(t.unreached_func('flush succeeded unexpectedly')) + .catch(t.step_func(e => { + assert_true(isErrorCallbackCalled, "isErrorCallbackCalled"); + assert_true(e instanceof DOMException); + assert_equals(e.name, 'NotSupportedError'); + assert_equals(codec.state, 'closed', 'state'); + })); + }, + 'Test that AudioEncoder.configure() doesn\'t support config: ' + + entry.comment); +}); + +const validConfigs = [ + { + codec: 'opus', + sampleRate: 8000, + numberOfChannels: 1, + }, + { + codec: 'opus', + sampleRate: 48000, + numberOfChannels: 2, + }, + { + codec: 'opus', + sampleRate: 48000, + numberOfChannels: 2, + bitrate: 128000, + bitrateMode: "constant", + bogus: 123 + }, + { + codec: 'opus', + sampleRate: 48000, + numberOfChannels: 2, + bitrate: 128000, + bitrateMode: "variable", + bogus: 123 + }, + { + codec: 'opus', + sampleRate: 48000, + numberOfChannels: 2, + opus: { + complexity: 5, + frameDuration: 20000, + packetlossperc: 10, + useinbandfec: true, + }, + }, + { + codec: 'opus', + sampleRate: 48000, + numberOfChannels: 2, + opus: { + format: 'opus', + complexity: 10, + frameDuration: 60000, + packetlossperc: 20, // Irrelevant without useinbandfec, but still valid. + usedtx: true, + bogus: 456, + }, + }, + { + codec: 'opus', + sampleRate: 48000, + numberOfChannels: 2, + opus: {}, // Use default values. + }, +]; + +validConfigs.forEach(config => { + promise_test(async t => { + let support = await AudioEncoder.isConfigSupported(config); + assert_true(support.supported); + + let new_config = support.config; + assert_equals(new_config.codec, config.codec); + assert_equals(new_config.sampleRate, config.sampleRate); + assert_equals(new_config.numberOfChannels, config.numberOfChannels); + if (config.bitrate) + assert_equals(new_config.bitrate, config.bitrate); + + if (config.opus) { + let opus_config = config.opus; + let new_opus_config = new_config.opus; + + assert_equals(new_opus_config.format, opus_config.format ?? 'opus'); + assert_equals( + new_opus_config.frameDuration, opus_config.frameDuration ?? 20000); + assert_equals( + new_opus_config.packetlossperc, opus_config.packetlossperc ?? 0); + assert_equals( + new_opus_config.useinbandfec, opus_config.useinbandfec ?? false); + assert_equals(new_opus_config.usedtx, opus_config.usedtx ?? false); + assert_false(new_opus_config.hasOwnProperty('bogus')); + + if (opus_config.complexity) { + assert_equals(new_opus_config.complexity, opus_config.complexity); + } else { + // Default complexity is 5 for mobile/ARM platforms, and 9 otherwise. + assert_true( + new_opus_config.complexity == 5 || new_opus_config.complexity == 9); + } + + } else { + assert_false(new_config.hasOwnProperty('opus')); + } + + assert_false(new_config.hasOwnProperty('bogus')); + }, 'AudioEncoder.isConfigSupported() supports: ' + JSON.stringify(config)); +}); |