RTCRtpScriptTransform-encoded-transform.https.html (7784B)
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 <script src ="routines.js"></script> 12 </head> 13 <body> 14 <video id="video" autoplay controls playsinline></video> 15 <script> 16 promise_test(async (test) => { 17 const worker = new Worker('RTCRtpScriptTransform-encoded-transform-worker.js'); 18 let sender, receiver; 19 const senderTransform = new RTCRtpScriptTransform(worker, {name:'sender'}); 20 const receiverTransform = new RTCRtpScriptTransform(worker, {name:'receiver'}); 21 22 const pc = new RTCPeerConnection(); 23 const transceiver1 = pc.addTransceiver("audio"); 24 const transceiver2 = pc.addTransceiver("audio"); 25 26 transceiver1.sender.transform = senderTransform; 27 transceiver1.receiver.transform = receiverTransform; 28 29 transceiver1.sender.transform = senderTransform; 30 transceiver1.receiver.transform = receiverTransform; 31 32 assert_throws_dom("InvalidStateError", () => transceiver2.sender.transform = senderTransform, "set a used transform 1"); 33 assert_throws_dom("InvalidStateError", () => transceiver2.receiver.transform = receiverTransform, "set a used transform 2"); 34 35 transceiver1.sender.transform = null; 36 transceiver1.receiver.transform = null; 37 38 assert_throws_dom("InvalidStateError", () => transceiver2.sender.transform = senderTransform, "set a used transform 3"); 39 assert_throws_dom("InvalidStateError", () => transceiver2.receiver.transform = receiverTransform, "set a used transform 4"); 40 }, "Once a transform has been attached, it cannot be reused elsewhere."); 41 42 promise_test(async (test) => { 43 const worker = new Worker('RTCRtpScriptTransform-encoded-transform-worker.js'); 44 const data = await new Promise(resolve => worker.onmessage = (event) => resolve(event.data)); 45 assert_equals(data, "registered"); 46 47 await setMediaPermission("granted", ["camera"]); 48 const localStream = await navigator.mediaDevices.getUserMedia({video: true}); 49 50 let sender, receiver; 51 const senderTransform = new RTCRtpScriptTransform(worker, {name:'sender'}); 52 const receiverTransform = new RTCRtpScriptTransform(worker, {name:'receiver'}); 53 54 const stream = await new Promise((resolve, reject) => { 55 createConnections(test, (firstConnection) => { 56 sender = firstConnection.addTrack(localStream.getVideoTracks()[0], localStream); 57 sender.transform = senderTransform; 58 }, (secondConnection) => { 59 secondConnection.ontrack = (trackEvent) => { 60 receiver = trackEvent.receiver; 61 receiver.transform = receiverTransform; 62 resolve(trackEvent.streams[0]); 63 }; 64 }); 65 }); 66 67 video.srcObject = stream; 68 const playingPromise = new Promise(r => video.onplaying = r); 69 await video.play(); 70 71 const updatePromise = new Promise(resolve => worker.onmessage = (event) => resolve(event.data)); 72 assert_equals(await updatePromise, "got expected"); 73 74 await playingPromise; 75 76 }, "Receiver and sender read, modifiy and write video frames."); 77 78 promise_test(async (test) => { 79 const worker = new Worker('RTCRtpScriptTransform-encoded-transform-worker.js'); 80 const data = await new Promise(resolve => worker.onmessage = (event) => resolve(event.data)); 81 assert_equals(data, "registered"); 82 83 await setMediaPermission("granted", ["microphone"]); 84 const localStream = await navigator.mediaDevices.getUserMedia({audio: true}); 85 let sender, receiver; 86 const senderTransform = new RTCRtpScriptTransform(worker, {name:'sender'}); 87 const receiverTransform = new RTCRtpScriptTransform(worker, {name:'receiver'}); 88 89 const stream = await new Promise((resolve, reject) => { 90 createConnections(test, (firstConnection) => { 91 sender = firstConnection.addTrack(localStream.getAudioTracks()[0], localStream); 92 sender.transform = senderTransform; 93 }, (secondConnection) => { 94 secondConnection.ontrack = (trackEvent) => { 95 receiver = trackEvent.receiver; 96 receiver.transform = receiverTransform; 97 resolve(trackEvent.streams[0]); 98 }; 99 }); 100 }); 101 102 video.srcObject = stream; 103 const playingPromise = new Promise(r => video.onplaying = r); 104 await video.play(); 105 106 const updatePromise = new Promise(resolve => worker.onmessage = (event) => resolve(event.data)); 107 assert_equals(await updatePromise, "got expected"); 108 109 await playingPromise; 110 111 }, "Receiver and sender read, modifiy and write audio frames."); 112 113 promise_test(async (test) => { 114 const worker = new Worker('RTCRtpScriptTransform-encoded-transform-no-write-worker.js'); 115 const data = await new Promise(resolve => worker.onmessage = (event) => resolve(event.data)); 116 assert_equals(data, "registered"); 117 118 await setMediaPermission("granted", ["camera"]); 119 const localStream = await navigator.mediaDevices.getUserMedia({video: true}); 120 121 let sender, receiver; 122 const senderTransform = new RTCRtpScriptTransform(worker, {name:'sender'}); 123 const receiverTransform = new RTCRtpScriptTransform(worker, {name:'receiver'}); 124 125 const stream = await new Promise((resolve, reject) => { 126 createConnections(test, (firstConnection) => { 127 sender = firstConnection.addTrack(localStream.getVideoTracks()[0], localStream); 128 sender.transform = senderTransform; 129 }, (secondConnection) => { 130 secondConnection.ontrack = (trackEvent) => { 131 receiver = trackEvent.receiver; 132 receiver.transform = receiverTransform; 133 resolve(trackEvent.streams[0]); 134 }; 135 }); 136 }); 137 138 video.srcObject = stream; 139 140 // As the receiver doesn't get any frames, it won't post a success 141 // message back and it will cause an expected timeout. 142 return new Promise((resolve, reject) => { 143 worker.onmessage = (event) => {reject()}; 144 test.step_timeout(resolve, 500); 145 }); 146 147 }, "Sender reads frames but doesn't write them back. Receiver doesn't receive any frames."); 148 149 promise_test(async (test) => { 150 const worker = new Worker('RTCRtpScriptTransform-encoded-transform-drop-frames-worker.js'); 151 const data = await new Promise(resolve => worker.onmessage = (event) => resolve(event.data)); 152 assert_equals(data, "registered"); 153 154 await setMediaPermission("granted", ["camera"]); 155 const localStream = await navigator.mediaDevices.getUserMedia({video: true}); 156 157 let sender, receiver; 158 const senderTransform = new RTCRtpScriptTransform(worker, {name:'sender'}); 159 const receiverTransform = new RTCRtpScriptTransform(worker, {name:'receiver'}); 160 161 const stream = await new Promise((resolve, reject) => { 162 createConnections(test, (firstConnection) => { 163 sender = firstConnection.addTrack(localStream.getVideoTracks()[0], localStream); 164 sender.transform = senderTransform; 165 }, (secondConnection) => { 166 secondConnection.ontrack = (trackEvent) => { 167 receiver = trackEvent.receiver; 168 receiver.transform = receiverTransform; 169 resolve(trackEvent.streams[0]); 170 }; 171 }); 172 }); 173 174 video.srcObject = stream; 175 176 const updatePromise = new Promise(resolve => worker.onmessage = (event) => resolve(event.data)); 177 assert_equals(await updatePromise, "got expected"); 178 179 }, "Sender skips some frames and only writes one back. Receiver only receives that frame."); 180 181 </script> 182 </body> 183 </html>