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
|
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src=/resources/testdriver.js></script>
<script src=/resources/testdriver-vendor.js></script>
<script src='../mediacapture-streams/permission-helper.js'></script>
</head>
<body>
<video id="video1" autoplay></video>
<video id="video2" autoplay></video>
<script src ="routines.js"></script>
<script>
async function waitForMessage(worker, data)
{
while (true) {
const received = await new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
if (data === received)
return;
}
}
promise_test(async (test) => {
worker = new Worker('script-transform-worker.js');
const data = await new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
assert_equals(data, "registered");
const channel = new MessageChannel;
const transform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: channel.port2}, [channel.port2]);
transform.port = channel.port1;
const promise = new Promise(resolve => transform.port.onmessage = (event) => resolve(event.data));
transform.port.postMessage("test");
assert_equals(await promise, "test");
}, "transform messaging");
promise_test(async (test) => {
worker = new Worker('script-transform-worker.js');
const data = await new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
assert_equals(data, "registered");
const pc = new RTCPeerConnection();
const senderChannel = new MessageChannel;
const receiverChannel = new MessageChannel;
const senderTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: senderChannel.port2}, [senderChannel.port2]);
const receiverTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: receiverChannel.port2}, [receiverChannel.port2]);
senderTransform.port = senderChannel.port1;
receiverTransform.port = receiverChannel.port1;
const sender1 = pc.addTransceiver('audio').sender;
const sender2 = pc.addTransceiver('video').sender;
const receiver1 = pc.getReceivers()[0];
const receiver2 = pc.getReceivers()[1];
sender1.transform = senderTransform;
receiver1.transform = receiverTransform;
assert_throws_dom("InvalidStateError", () => sender2.transform = senderTransform);
assert_throws_dom("InvalidStateError", () => receiver2.transform = receiverTransform);
sender1.transform = senderTransform;
receiver1.transform = receiverTransform;
sender1.transform = null;
receiver1.transform = null;
}, "Cannot reuse attached transforms");
promise_test(async (test) => {
worker = new Worker('script-transform-worker.js');
const data = await new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
assert_equals(data, "registered");
// Video is needed in a later test, so we ask for both permissions
await setMediaPermission();
const localStream = await navigator.mediaDevices.getUserMedia({audio: true});
const senderChannel = new MessageChannel;
const receiverChannel = new MessageChannel;
let sender, receiver;
const senderTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: senderChannel.port2}, [senderChannel.port2]);
const receiverTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: receiverChannel.port2}, [receiverChannel.port2]);
senderTransform.port = senderChannel.port1;
receiverTransform.port = receiverChannel.port1;
const startedPromise = new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
const stream = await new Promise((resolve, reject) => {
createConnections(test, (firstConnection) => {
pc1 = firstConnection;
sender = firstConnection.addTrack(localStream.getAudioTracks()[0], localStream);
sender.transform = senderTransform;
}, (secondConnection) => {
pc2 = secondConnection;
secondConnection.ontrack = (trackEvent) => {
receiver = trackEvent.receiver;
receiver.transform = receiverTransform;
resolve(trackEvent.streams[0]);
};
});
test.step_timeout(() => reject("Test timed out"), 5000);
});
assert_equals(await startedPromise, "started");
await waitForMessage(worker, "audio chunk");
video1.srcObject = stream;
await video1.play();
}, "audio exchange with transform");
promise_test(async (test) => {
worker = new Worker('script-transform-worker.js');
const data = await new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
assert_equals(data, "registered");
const localStream = await navigator.mediaDevices.getUserMedia({video: true});
const senderChannel = new MessageChannel;
const receiverChannel = new MessageChannel;
let sender, receiver;
const senderTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: senderChannel.port2}, [senderChannel.port2]);
const receiverTransform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: receiverChannel.port2}, [receiverChannel.port2]);
senderTransform.port = senderChannel.port1;
receiverTransform.port = receiverChannel.port1;
const startedPromise = new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
const stream = await new Promise((resolve, reject) => {
createConnections(test, (firstConnection) => {
pc1 = firstConnection;
sender = firstConnection.addTrack(localStream.getVideoTracks()[0], localStream);
sender.transform = senderTransform;
}, (secondConnection) => {
pc2 = secondConnection;
secondConnection.ontrack = (trackEvent) => {
receiver = trackEvent.receiver;
receiver.transform = receiverTransform;
resolve(trackEvent.streams[0]);
};
});
test.step_timeout(() => reject("Test timed out"), 5000);
});
assert_equals(await startedPromise, "started");
await waitForMessage(worker, "video chunk");
video1.srcObject = stream;
await video1.play();
}, "video exchange with transform");
</script>
</body>
</html>
|