script-metadata-transform.https.html (13638B)
1 <!doctype html> 2 <html> 3 <head> 4 <meta charset='utf-8'> 5 <meta name='timeout' content='long'> 6 <script src='/resources/testharness.js'></script> 7 <script src='/resources/testharnessreport.js'></script> 8 <script src=/resources/testdriver.js></script> 9 <script src=/resources/testdriver-vendor.js></script> 10 <script src='../mediacapture-streams/permission-helper.js'></script> 11 </head> 12 <body> 13 <video id='video1' autoplay></video> 14 <script src ='routines.js'></script> 15 <script> 16 async function waitForMessage(worker, data) 17 { 18 while (true) { 19 const received = await new Promise(resolve => worker.onmessage = (event) => resolve(event.data)); 20 if (data === received) 21 return; 22 } 23 } 24 25 async function gatherMetadata(test, kind) 26 { 27 worker = new Worker('script-metadata-transform-worker.js'); 28 const data = await new Promise(resolve => worker.onmessage = (event) => resolve(event.data)); 29 assert_equals(data, 'registered'); 30 31 // Both audio and vido are needed at one time or another 32 // so asking for both permissions 33 await setMediaPermission(); 34 const localStream = await navigator.mediaDevices.getUserMedia({[kind]: true}); 35 36 let sender, receiver; 37 const senderTransform = new RTCRtpScriptTransform(worker, {name:'sender'}); 38 const receiverTransform = new RTCRtpScriptTransform(worker, {name:'receiver'}); 39 40 await new Promise((resolve, reject) => { 41 createConnections(test, (firstConnection) => { 42 pc1 = firstConnection; 43 sender = firstConnection.addTrack(localStream.getTracks()[0], localStream); 44 sender.transform = senderTransform; 45 }, (secondConnection) => { 46 pc2 = secondConnection; 47 secondConnection.ontrack = (trackEvent) => { 48 receiver = trackEvent.receiver; 49 receiver.transform = receiverTransform; 50 resolve(trackEvent.streams[0]); 51 }; 52 }); 53 test.step_timeout(() => reject('Test timed out'), 5000); 54 }); 55 56 let senderBeforeWrite, senderAfterWrite, receiverBeforeWrite, receiverAfterWrite; 57 while (true) { 58 const {data} = await new Promise(r => worker.onmessage = r); 59 if (data.name == 'sender') { 60 senderBeforeWrite = data; 61 } else if (data.name == 'receiver') { 62 receiverBeforeWrite = data; 63 } else if (data.name == 'sender after write') { 64 senderAfterWrite = data; 65 } else if (data.name == 'receiver after write') { 66 receiverAfterWrite = data; 67 } 68 if (senderBeforeWrite && 69 senderAfterWrite && 70 receiverBeforeWrite && 71 receiverAfterWrite) { 72 return { 73 senderBeforeWrite, 74 senderAfterWrite, 75 receiverBeforeWrite, 76 receiverAfterWrite 77 }; 78 } 79 } 80 } 81 82 promise_test(async (test) => { 83 const data = await gatherMetadata(test, 'audio'); 84 85 assert_equals(typeof data.senderBeforeWrite.timestamp, 'number'); 86 assert_not_equals(data.senderBeforeWrite.timestamp, 0); 87 assert_equals(data.senderBeforeWrite.timestamp, 88 data.senderAfterWrite.timestamp, 89 'timestamp matches (for sender before and after write)'); 90 assert_equals(data.senderBeforeWrite.timestamp, 91 data.receiverBeforeWrite.timestamp, 92 'timestamp matches (for sender and receiver)'); 93 assert_equals(data.receiverBeforeWrite.timestamp, 94 data.receiverAfterWrite.timestamp, 95 'timestamp matches (for receiver before and after write)'); 96 }, 'audio metadata: timestamp'); 97 98 promise_test(async (test) => { 99 const data = await gatherMetadata(test, 'audio'); 100 101 assert_equals(typeof data.senderBeforeWrite.metadata.synchronizationSource, 'number'); 102 assert_not_equals(data.senderBeforeWrite.metadata.synchronizationSource, 0); 103 assert_equals(data.senderBeforeWrite.metadata.synchronizationSource, 104 data.senderAfterWrite.metadata.synchronizationSource, 105 'ssrc matches (for sender before and after write)'); 106 assert_equals(data.senderBeforeWrite.metadata.synchronizationSource, 107 data.receiverBeforeWrite.metadata.synchronizationSource, 108 'ssrc matches (for sender and receiver)'); 109 assert_equals(data.senderBeforeWrite.metadata.synchronizationSource, 110 data.receiverAfterWrite.metadata.synchronizationSource, 111 'ssrc matches (for receiver before and after write)'); 112 }, 'audio metadata: synchronizationSource'); 113 114 promise_test(async (test) => { 115 const data = await gatherMetadata(test, 'audio'); 116 117 assert_equals(typeof data.senderBeforeWrite.metadata.payloadType, 'number'); 118 assert_equals(data.senderBeforeWrite.metadata.payloadType, 119 data.senderAfterWrite.metadata.payloadType, 120 'payload type matches (for sender before and after write)'); 121 assert_equals(data.senderBeforeWrite.metadata.payloadType, 122 data.receiverBeforeWrite.metadata.payloadType, 123 'payload type matches (for sender and receiver)'); 124 assert_equals(data.senderBeforeWrite.metadata.payloadType, 125 data.receiverAfterWrite.metadata.payloadType, 126 'payload type matches (for receiver before and after write)'); 127 }, 'audio metadata: payloadType'); 128 129 promise_test(async (test) => { 130 const data = await gatherMetadata(test, 'audio'); 131 132 assert_array_equals(data.senderBeforeWrite.metadata.contributingSources, 133 data.senderAfterWrite.metadata.contributingSources, 134 'csrcs are arrays, and match (for sender before and after write)'); 135 assert_array_equals(data.senderBeforeWrite.metadata.contributingSources, 136 data.receiverBeforeWrite.metadata.contributingSources, 137 'csrcs are arrays, and match'); 138 assert_array_equals(data.senderBeforeWrite.metadata.contributingSources, 139 data.receiverAfterWrite.metadata.contributingSources, 140 'csrcs are arrays, and match (for receiver before and after write)'); 141 }, 'audio metadata: contributingSources'); 142 143 promise_test(async (test) => { 144 const data = await gatherMetadata(test, 'audio'); 145 146 assert_equals(typeof data.receiverBeforeWrite.metadata.sequenceNumber, 147 'number'); 148 assert_equals(data.receiverBeforeWrite.metadata.sequenceNumber, 149 data.receiverAfterWrite.metadata.sequenceNumber, 150 'sequenceNumber matches (for receiver before and after write)'); 151 // spec says sequenceNumber exists only for incoming audio frames 152 assert_equals(data.senderBeforeWrite.metadata.sequenceNumber, undefined); 153 assert_equals(data.senderAfterWrite.metadata.sequenceNumber, undefined); 154 }, 'audio metadata: sequenceNumber'); 155 156 promise_test(async (test) => { 157 const data = await gatherMetadata(test, 'video'); 158 159 assert_equals(typeof data.senderBeforeWrite.timestamp, 'number'); 160 assert_equals(data.senderBeforeWrite.timestamp, 161 data.senderAfterWrite.timestamp, 162 'timestamp matches (for sender before and after write)'); 163 assert_equals(data.senderBeforeWrite.timestamp, 164 data.receiverBeforeWrite.timestamp, 165 'timestamp matches (for sender and receiver)'); 166 assert_equals(data.senderBeforeWrite.timestamp, 167 data.receiverAfterWrite.timestamp, 168 'timestamp matches (for receiver before and after write)'); 169 }, 'video metadata: timestamp'); 170 171 promise_test(async (test) => { 172 const data = await gatherMetadata(test, 'video'); 173 174 assert_equals(typeof data.senderBeforeWrite.metadata.synchronizationSource, 175 'number'); 176 assert_equals(data.senderBeforeWrite.metadata.synchronizationSource, 177 data.senderAfterWrite.metadata.synchronizationSource, 178 'ssrc matches (for sender before and after write)'); 179 assert_equals(data.senderBeforeWrite.metadata.synchronizationSource, 180 data.receiverBeforeWrite.metadata.synchronizationSource, 181 'ssrc matches (for sender and receiver)'); 182 assert_equals(data.senderBeforeWrite.metadata.synchronizationSource, 183 data.receiverAfterWrite.metadata.synchronizationSource, 184 'ssrc matches (for receiver before and after write)'); 185 }, 'video metadata: ssrc'); 186 187 promise_test(async (test) => { 188 const data = await gatherMetadata(test, 'video'); 189 190 assert_array_equals(data.senderBeforeWrite.metadata.contributingSources, 191 data.senderAfterWrite.metadata.contributingSources, 192 'csrcs are arrays, and match (for sender before and after write)'); 193 assert_array_equals(data.senderBeforeWrite.metadata.contributingSources, 194 data.receiverBeforeWrite.metadata.contributingSources, 195 'csrcs are arrays, and match'); 196 assert_array_equals(data.senderBeforeWrite.metadata.contributingSources, 197 data.receiverAfterWrite.metadata.contributingSources, 198 'csrcs are arrays, and match (for receiver before and after write)'); 199 }, 'video metadata: csrcs'); 200 201 promise_test(async (test) => { 202 const data = await gatherMetadata(test, 'video'); 203 204 assert_equals(typeof data.senderBeforeWrite.metadata.height, 'number'); 205 assert_equals(data.senderBeforeWrite.metadata.height, 206 data.senderAfterWrite.metadata.height, 207 'height matches (for sender before and after write)'); 208 assert_equals(data.senderBeforeWrite.metadata.height, 209 data.receiverBeforeWrite.metadata.height, 210 'height matches (for sender and receiver)'); 211 assert_equals(data.senderBeforeWrite.metadata.height, 212 data.receiverAfterWrite.metadata.height, 213 'height matches (for receiver before and after write)'); 214 assert_equals(typeof data.senderBeforeWrite.metadata.width, 'number'); 215 assert_equals(data.senderBeforeWrite.metadata.width, 216 data.senderAfterWrite.metadata.width, 217 'width matches (for sender before and after write)'); 218 assert_equals(data.senderBeforeWrite.metadata.width, 219 data.receiverBeforeWrite.metadata.width, 220 'width matches (for sender and receiver)'); 221 assert_equals(data.senderBeforeWrite.metadata.width, 222 data.receiverAfterWrite.metadata.width, 223 'width matches (for receiver before and after write)'); 224 }, 'video metadata: width and height'); 225 226 promise_test(async (test) => { 227 const data = await gatherMetadata(test, 'video'); 228 229 assert_equals(typeof data.senderBeforeWrite.metadata.spatialIndex, 230 'number'); 231 assert_equals(data.senderBeforeWrite.metadata.spatialIndex, 232 data.senderAfterWrite.metadata.spatialIndex, 233 'spatialIndex matches (for sender before and after write)'); 234 assert_equals(data.senderBeforeWrite.metadata.spatialIndex, 235 data.receiverBeforeWrite.metadata.spatialIndex, 236 'spatialIndex matches (for sender and receiver)'); 237 assert_equals(data.senderBeforeWrite.metadata.spatialIndex, 238 data.receiverAfterWrite.metadata.spatialIndex, 239 'spatialIndex matches (for receiver before and after write)'); 240 assert_equals(typeof data.senderBeforeWrite.metadata.temporalIndex, 241 'number'); 242 assert_equals(data.senderBeforeWrite.metadata.temporalIndex, 243 data.senderAfterWrite.metadata.temporalIndex, 244 'temporalIndex matches (for sender before and after write)'); 245 assert_equals(data.senderBeforeWrite.metadata.temporalIndex, 246 data.receiverBeforeWrite.metadata.temporalIndex, 247 'temporalIndex matches (for sender and receiver)'); 248 assert_equals(data.senderBeforeWrite.metadata.temporalIndex, 249 data.receiverAfterWrite.metadata.temporalIndex, 250 'temporalIndex matches (for receiver before and after write)'); 251 }, 'video metadata: spatial and temporal index'); 252 253 promise_test(async (test) => { 254 const data = await gatherMetadata(test, 'video'); 255 256 assert_array_equals(data.senderBeforeWrite.metadata.dependencies, 257 data.senderAfterWrite.metadata.dependencies, 258 'dependencies are arrays, and match (for sender before and after write)'); 259 assert_array_equals(data.senderBeforeWrite.metadata.dependencies, 260 data.receiverBeforeWrite.metadata.dependencies, 261 'dependencies are arrays, and match (for sender and receiver)'); 262 assert_array_equals(data.senderBeforeWrite.metadata.dependencies, 263 data.receiverAfterWrite.metadata.dependencies, 264 'dependencies are arrays, and match (for receiver before and after write)'); 265 }, 'video metadata: dependencies'); 266 267 promise_test(async (test) => { 268 const data = await gatherMetadata(test, 'video'); 269 270 assert_equals(typeof data.senderBeforeWrite.metadata.frameId, 'number'); 271 assert_equals(data.senderBeforeWrite.metadata.frameId, 272 data.senderAfterWrite.metadata.frameId, 273 'frameId matches (for sender before and after write)'); 274 275 assert_true(data.senderBeforeWrite.metadata.frameId == data.receiverBeforeWrite.metadata.frameId || 276 data.receiverBeforeWrite.metadata.frameId == undefined, 277 'frameId matches (for sender and receiver)'); 278 assert_equals(data.receiverBeforeWrite.metadata.frameId, 279 data.receiverAfterWrite.metadata.frameId, 280 'frameId matches (for receiver before and after write)'); 281 }, 'video metadata: frameId'); 282 283 promise_test(async (test) => { 284 const data = await gatherMetadata(test, 'video'); 285 286 assert_equals(typeof data.senderBeforeWrite.type, 'string'); 287 assert_true(data.senderBeforeWrite.type == 'key' || data.senderBeforeWrite.type == 'delta'); 288 assert_equals(data.senderBeforeWrite.type, 289 data.senderAfterWrite.type, 290 'type matches (for sender before and after write)'); 291 assert_equals(data.senderBeforeWrite.type, 292 data.receiverBeforeWrite.type, 293 'type matches (for sender and receiver)'); 294 assert_equals(data.senderBeforeWrite.type, 295 data.receiverAfterWrite.type, 296 'type matches (for receiver before and after write)'); 297 }, 'video metadata: type'); 298 299 </script> 300 </body> 301 </html>