Make mDNS ICE Candidate an experimental flag again
[WebKit-https.git] / LayoutTests / webrtc / simulcast-h264.html
1 <!doctype html>
2 <html>
3 <head>
4 <script src="../resources/testharness.js"></script>
5 <script src="../resources/testharnessreport.js"></script>
6 </head>
7 <body>
8 <div>
9     <video id="low" playsinline autoplay width="320"></video>
10     <video id="mid" playsinline autoplay width="320"></video>
11     <video id="high" playsinline autoplay width="320"></video>
12 </div>
13 <script>
14 if (window.testRunner)
15     testRunner.setWebRTCUnifiedPlanEnabled(false);
16 var state;
17 var finished = false;
18 // This test is largely inspired from Chrome/Firefox/Simulcast playground tests.
19 promise_test(async (test) => {
20     if (window.testRunner && testRunner.timeout) {
21         setTimeout(() => {
22             if (!finished)
23                 throw "test stucked in state: " + state;
24         }, testRunner.timeout * 0.9);
25     }
26
27     state = "start";
28
29     const pc1 = new RTCPeerConnection();
30     const pc2 = new RTCPeerConnection();
31     pc1.onicecandidate = (e) => pc2.addIceCandidate(e.candidate);
32     pc2.onicecandidate = (e) => pc1.addIceCandidate(e.candidate);
33
34     let counter = 0;
35     pc2.ontrack = (e) => {
36         if (counter == 0)
37             low.srcObject = new MediaStream([e.track]);
38         else if (counter == 1)
39             mid.srcObject = new MediaStream([e.track]);
40         else
41             high.srcObject = new MediaStream([e.track]);
42         ++counter;
43     }
44
45     const localStream = await navigator.mediaDevices.getUserMedia({ video: { width: 640, height: 480 } });
46     pc1.addTrack(localStream.getVideoTracks()[0], localStream);
47     const offer = await pc1.createOffer();
48
49     state = "got offer";
50
51     match = offer.sdp.match(/a=ssrc:(\d+) cname:(.*)\r\n/);
52     msid = offer.sdp.match(/a=ssrc:(\d+) msid:(.*)\r\n/);
53     var lines = offer.sdp.trim().split('\r\n');
54     var removed = lines.splice(lines.length - 4, 4);
55     var videoSSRC1 = parseInt(match[1]);
56     rtxSSRC1 = offer.sdp.split('\r\n').filter((line) => { return line.startsWith('a=ssrc-group:FID ')})[0].split(' ')[2];
57     var videoSSRC2 = videoSSRC1 + 1;
58     var rtxSSRC2 = videoSSRC1 + 2;
59     var videoSSRC3 = videoSSRC1 + 3;
60     var rtxSSRC3 = videoSSRC1 + 4;
61     lines.push(removed[0]);
62     lines.push(removed[1]);
63     lines.push('a=ssrc:' + videoSSRC2 + ' cname:' + match[2]);
64     lines.push('a=ssrc:' + videoSSRC2 + ' msid:' + msid[2]);
65     lines.push('a=ssrc:' + rtxSSRC2 + ' cname:' + match[2]);
66     lines.push('a=ssrc:' + rtxSSRC2 + ' msid:' + msid[2]);
67
68     lines.push('a=ssrc:' + videoSSRC3 + ' cname:' + match[2]);
69     lines.push('a=ssrc:' + videoSSRC3 + ' msid:' + msid[2]);
70     lines.push('a=ssrc:' + rtxSSRC3 + ' cname:' + match[2]);
71     lines.push('a=ssrc:' + rtxSSRC3 + ' msid:' + msid[2]);
72
73     lines.push('a=ssrc-group:FID ' + videoSSRC2 + ' ' + rtxSSRC2);
74     lines.push('a=ssrc-group:FID ' + videoSSRC3 + ' ' + rtxSSRC3);
75     lines.push('a=ssrc-group:SIM ' + videoSSRC1 + ' ' + videoSSRC2 + ' ' + videoSSRC3);
76     offer.sdp = lines.join('\r\n') + '\r\n';
77
78     var offer2 = {
79         type: 'offer',
80         sdp: offer.sdp,
81     };
82     offer2.sdp = offer2.sdp.replace('a=ssrc-group:SIM ' + videoSSRC1 + ' ' + videoSSRC2 + ' ' + videoSSRC3 + '\r\n', '');
83
84     offer2.sdp = offer2.sdp.replace('a=ssrc:' + videoSSRC1 + ' msid:' + msid[2], 'a=ssrc:' + videoSSRC1 + ' msid:low low');
85     offer2.sdp = offer2.sdp.replace('a=ssrc:' + rtxSSRC1 + ' msid:' + msid[2], 'a=ssrc:' + rtxSSRC1 + ' msid:low low');
86
87     offer2.sdp = offer2.sdp.replace('a=ssrc:' + videoSSRC2 + ' msid:' + msid[2], 'a=ssrc:' + videoSSRC2 + ' msid:mid mid');
88     offer2.sdp = offer2.sdp.replace('a=ssrc:' + rtxSSRC2 + ' msid:' + msid[2], 'a=ssrc:' + rtxSSRC2 + ' msid:mid mid');
89
90     offer2.sdp = offer2.sdp.replace('a=ssrc:' + videoSSRC3 + ' msid:' + msid[2], 'a=ssrc:' + videoSSRC3 + ' msid:hi hi');
91     offer2.sdp = offer2.sdp.replace('a=ssrc:' + rtxSSRC3 + ' msid:' + msid[2], 'a=ssrc:' + rtxSSRC3 + ' msid:hi hi');
92     await Promise.all([
93         pc1.setLocalDescription(offer),
94         pc2.setRemoteDescription(offer2),
95     ]);
96
97     state = "set description";
98
99     const answer = await pc2.createAnswer();
100
101     state = "got answer";
102
103     await Promise.all([
104         pc2.setLocalDescription(answer),
105         pc1.setRemoteDescription(answer),
106     ]);
107
108     state = "set description 2";
109
110     await low.play();
111     state = "video low plays";
112
113     assert_equals(low.srcObject.getVideoTracks()[0].getSettings().height, 240);
114     assert_equals(low.srcObject.getVideoTracks()[0].getSettings().width, 320);
115
116     await mid.play();
117     state = "video mid plays";
118
119     assert_equals(mid.srcObject.getVideoTracks()[0].getSettings().height, 480);
120     assert_equals(mid.srcObject.getVideoTracks()[0].getSettings().width, 640);
121
122     finished = true;
123 }, "Testing simulcast");
124 </script>
125 </body>
126 </html>