1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
|
// META: global=window,dedicatedworker
// META: script=/webcodecs/utils.js
const detachedArrayBuffer = new ArrayBuffer(4);
var b = detachedArrayBuffer.transferToFixedLength();
const invalidConfigs = [
{
comment: 'Missing codec',
config: {},
},
{
comment: 'Empty codec',
config: {codec: ''},
},
{
comment: 'Valid codec, detached description',
config: {codec: 'vp8', description: detachedArrayBuffer},
},
]; // invalidConfigs
invalidConfigs.forEach(entry => {
promise_test(
t => {
return promise_rejects_js(
t, TypeError, VideoDecoder.isConfigSupported(entry.config));
},
'Test that VideoDecoder.isConfigSupported() rejects invalid config:' +
entry.comment);
});
invalidConfigs.forEach(entry => {
async_test(
t => {
let codec = new VideoDecoder(getDefaultCodecInit(t));
assert_throws_js(TypeError, () => {
codec.configure(entry.config);
});
t.done();
},
'Test that VideoDecoder.configure() rejects invalid config:' +
entry.comment);
});
const arrayBuffer = new ArrayBuffer(12583);
const arrayBufferView = new DataView(arrayBuffer);
const validButUnsupportedConfigs = [
{
comment: 'Unrecognized codec',
config: {codec: 'bogus'},
},
{
comment: 'Unrecognized codec with dataview description',
config: {
codec: '7ﷺ۹.9',
description: arrayBufferView,
},
},
{
comment: 'Audio codec',
config: {codec: 'vorbis'},
},
{
comment: 'Ambiguous codec',
config: {codec: 'vp9'},
},
{
comment: 'Codec with bad casing',
config: {codec: 'Vp09.00.10.08'},
},
{
comment: 'Codec with MIME type',
config: {codec: 'video/webm; codecs="vp8"'},
},
{
comment: 'Possible future H264 codec string',
config: {codec: 'avc1.FF000b'},
},
{
comment: 'Possible future H264 codec string (level 2.9)',
config: {codec: 'avc1.4D401D'},
},
{
comment: 'Possible future HEVC codec string',
config: {codec: 'hvc1.C99.6FFFFFF.L93'},
},
{
comment: 'Possible future VP9 codec string',
config: {codec: 'vp09.99.99.08'},
},
{
comment: 'Possible future AV1 codec string',
config: {codec: 'av01.9.99M.08'},
},
{
comment: 'codec with spaces',
config: {codec: ' vp09.00.10.08 '},
},
]; // validButUnsupportedConfigs
validButUnsupportedConfigs.forEach(entry => {
promise_test(
t => {
return VideoDecoder.isConfigSupported(entry.config).then(support => {
assert_false(support.supported);
});
},
'Test that VideoDecoder.isConfigSupported() doesn\'t support config: ' +
entry.comment);
});
validButUnsupportedConfigs.forEach(entry => {
promise_test(
t => {
let isErrorCallbackCalled = false;
let codec = new VideoDecoder({
output: t.unreached_func('unexpected output'),
error: t.step_func(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 VideoDecoder.configure() doesn\'t support config: ' +
entry.comment);
});
promise_test(t => {
// VideoDecoderInit lacks required fields.
assert_throws_js(TypeError, () => {
new VideoDecoder({});
});
// VideoDecoderInit has required fields.
let decoder = new VideoDecoder(getDefaultCodecInit(t));
assert_equals(decoder.state, 'unconfigured');
decoder.close();
return endAfterEventLoopTurn();
}, 'Test VideoDecoder construction');
const validConfigs = [
{
comment: 'variant 1 of h264 codec string',
config: {codec: 'avc3.42001E'},
},
{
comment: 'variant 2 of h264 codec string',
config: {codec: 'avc1.42001E'},
},
]; // validConfigs
validConfigs.forEach(entry => {
promise_test(async t => {
try {
await VideoDecoder.isConfigSupported(entry.config);
var decoder = new VideoDecoder(getDefaultCodecInit(t));
// Something that works with all codecs:
entry.config.width = 1280;
entry.config.height = 720;
decoder.configure(entry.config);
return decoder
.flush()
.then(
t.step_func(e => {
assert_equals(decoder.state, 'configured', 'codec is configured');
})
)
.catch(t.unreached_func('flush succeeded unexpectedly'));
} catch (e) {
assert_true(false, entry.comment + ' should not throw');
}
}, 'Test that VideoDecoder.isConfigSupported() accepts config:' + entry.comment);
});
|