OLD | NEW |
1 <html> | 1 <html> |
2 <head> | 2 <head> |
3 <script type="text/javascript" src="webrtc_test_utilities.js"></script> | 3 <script type="text/javascript" src="webrtc_test_utilities.js"></script> |
4 <script type="text/javascript" src="webrtc_test_audio.js"></script> | 4 <script type="text/javascript" src="webrtc_test_audio.js"></script> |
5 <script type="text/javascript"> | 5 <script type="text/javascript"> |
6 $ = function(id) { | 6 $ = function(id) { |
7 return document.getElementById(id); | 7 return document.getElementById(id); |
8 }; | 8 }; |
9 | 9 |
10 var gFirstConnection = null; | 10 var gFirstConnection = null; |
11 var gSecondConnection = null; | 11 var gSecondConnection = null; |
12 var gTestWithoutMsid = false; | 12 var gTestWithoutMsid = false; |
13 var gLocalStream = null; | 13 var gLocalStream = null; |
14 var gSentTones = ''; | 14 var gSentTones = ''; |
| 15 var gForceIsac16K = false; |
15 | 16 |
16 var gRemoteStreams = {}; | 17 var gRemoteStreams = {}; |
17 | 18 |
18 // Default transform functions, overridden by some test cases. | 19 // Default transform functions, overridden by some test cases. |
19 var transformSdp = function(sdp) { return sdp; }; | 20 var transformSdp = function(sdp) { return gForceIsac16K ? forceIsac16k_(sdp) :
sdp; }; |
20 var transformRemoteSdp = function(sdp) { return sdp; }; | 21 var transformRemoteSdp = function(sdp) { return sdp; }; |
21 var transformCandidate = function(candidate) { return candidate; }; | 22 var transformCandidate = function(candidate) { return candidate; }; |
22 var onLocalDescriptionError = function(error) { }; | 23 var onLocalDescriptionError = function(error) { }; |
23 | 24 |
24 // When using external SDES, the crypto key is chosen by javascript. | 25 // When using external SDES, the crypto key is chosen by javascript. |
25 var EXTERNAL_SDES_LINES = { | 26 var EXTERNAL_SDES_LINES = { |
26 'audio': 'a=crypto:1 AES_CM_128_HMAC_SHA1_80 ' + | 27 'audio': 'a=crypto:1 AES_CM_128_HMAC_SHA1_80 ' + |
27 'inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR', | 28 'inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR', |
28 'video': 'a=crypto:1 AES_CM_128_HMAC_SHA1_80 ' + | 29 'video': 'a=crypto:1 AES_CM_128_HMAC_SHA1_80 ' + |
29 'inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj', | 30 'inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj', |
30 'data': 'a=crypto:1 AES_CM_128_HMAC_SHA1_80 ' + | 31 'data': 'a=crypto:1 AES_CM_128_HMAC_SHA1_80 ' + |
31 'inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj' | 32 'inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj' |
32 }; | 33 }; |
33 | 34 |
34 // When using GICE, the ICE credentials can be chosen by javascript. | 35 // When using GICE, the ICE credentials can be chosen by javascript. |
35 var EXTERNAL_GICE_UFRAG = '1234567890123456'; | 36 var EXTERNAL_GICE_UFRAG = '1234567890123456'; |
36 var EXTERNAL_GICE_PWD = '123456789012345678901234'; | 37 var EXTERNAL_GICE_PWD = '123456789012345678901234'; |
37 | 38 |
| 39 /** @private */ |
| 40 function forceIsac16k_(sdp) { |
| 41 // Remove all other codecs (not the video codecs though). |
| 42 sdp = sdp.replace(/m=audio (\d+) RTP\/SAVPF.*\r\n/g, |
| 43 'm=audio $1 RTP/SAVPF 103\r\n'); |
| 44 sdp = sdp.replace('a=fmtp:111 minptime=10', 'a=fmtp:103 minptime=10'); |
| 45 sdp = sdp.replace(/a=rtpmap:(?!103)\d{1,3} (?!VP8|red|ulpfec).*\r\n/g, ''); |
| 46 return sdp; |
| 47 } |
| 48 |
38 setAllEventsOccuredHandler(function() { | 49 setAllEventsOccuredHandler(function() { |
39 document.title = 'OK'; | 50 document.title = 'OK'; |
40 }); | 51 }); |
41 | 52 |
| 53 // Set gForceIsac16K. |
| 54 function setForceIsac16K(force_isac_16k) { |
| 55 gForceIsac16K = force_isac_16k; |
| 56 } |
| 57 |
42 // Test that we can setup call with an audio and video track. | 58 // Test that we can setup call with an audio and video track. |
43 function call(constraints) { | 59 function call(constraints) { |
44 createConnections(null); | 60 createConnections(null); |
45 navigator.webkitGetUserMedia(constraints, | 61 navigator.webkitGetUserMedia(constraints, |
46 addStreamToBothConnectionsAndNegotiate, printGetUserMediaError); | 62 addStreamToBothConnectionsAndNegotiate, printGetUserMediaError); |
47 waitForVideo('remote-view-1'); | 63 waitForVideo('remote-view-1'); |
48 waitForVideo('remote-view-2'); | 64 waitForVideo('remote-view-2'); |
49 } | 65 } |
50 | 66 |
51 // First calls without streams on any connections, and then adds a stream | 67 // First calls without streams on any connections, and then adds a stream |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
241 clearInterval(waitDtmf); | 257 clearInterval(waitDtmf); |
242 eventOccured(); | 258 eventOccured(); |
243 } | 259 } |
244 }, 100); | 260 }, 100); |
245 } | 261 } |
246 | 262 |
247 // Do the DTMF test after we have received video. | 263 // Do the DTMF test after we have received video. |
248 detectVideoPlaying('remote-view-2', onCallEstablished); | 264 detectVideoPlaying('remote-view-2', onCallEstablished); |
249 } | 265 } |
250 | 266 |
251 //TODO(phoglund): do this for all tests on android if this works on bots. | 267 function callAndEnsureAudioIsPlaying() { |
252 /** @private */ | |
253 function forceIsac16k_(sdp) { | |
254 // Remove all other codecs (not the video codecs though). | |
255 sdp = sdp.replace(/m=audio (\d+) RTP\/SAVPF.*\r\n/g, | |
256 'm=audio $1 RTP/SAVPF 103\r\n'); | |
257 sdp = sdp.replace('a=fmtp:111 minptime=10', 'a=fmtp:103 minptime=10'); | |
258 sdp = sdp.replace(/a=rtpmap:(?!103)\d{1,3} (?!VP8|red|ulpfec).*\r\n/g, ''); | |
259 return sdp; | |
260 } | |
261 | |
262 function callAndEnsureAudioIsPlaying(force_isac_16k) { | |
263 if (force_isac_16k) | |
264 transformSdp = forceIsac16k_; | |
265 createConnections(null); | 268 createConnections(null); |
266 navigator.webkitGetUserMedia({audio: true, video: true}, | 269 navigator.webkitGetUserMedia({audio: true, video: true}, |
267 addStreamToBothConnectionsAndNegotiate, printGetUserMediaError); | 270 addStreamToBothConnectionsAndNegotiate, printGetUserMediaError); |
268 | 271 |
269 // Wait until we have gathered samples and can conclude if audio is playing. | 272 // Wait until we have gathered samples and can conclude if audio is playing. |
270 addExpectedEvent(); | 273 addExpectedEvent(); |
271 var onCallEstablished = function() { | 274 var onCallEstablished = function() { |
272 gatherAudioLevelSamples(gSecondConnection, 300, 100, | 275 gatherAudioLevelSamples(gSecondConnection, 300, 100, |
273 function(samples) { | 276 function(samples) { |
274 verifyAudioIsPlaying(samples); | 277 verifyAudioIsPlaying(samples); |
275 eventOccured(); | 278 eventOccured(); |
276 }); | 279 }); |
277 }; | 280 }; |
278 | 281 |
279 detectVideoPlaying('remote-view-2', onCallEstablished); | 282 detectVideoPlaying('remote-view-2', onCallEstablished); |
280 } | 283 } |
281 | 284 |
282 function callAndEnsureAudioMutingWorks(force_isac_16k) { | 285 function callAndEnsureAudioMutingWorks() { |
283 callAndEnsureAudioIsPlaying(force_isac_16k); | 286 callAndEnsureAudioIsPlaying(); |
284 setAllEventsOccuredHandler(function() { | 287 setAllEventsOccuredHandler(function() { |
285 var audioTrack = | 288 var audioTrack = |
286 gSecondConnection.getRemoteStreams()[0].getAudioTracks()[0]; | 289 gSecondConnection.getRemoteStreams()[0].getAudioTracks()[0]; |
287 | 290 |
288 // Call is up, now mute the track and check everything goes silent (give | 291 // Call is up, now mute the track and check everything goes silent (give |
289 // it a small delay though, we don't expect it to happen instantly). | 292 // it a small delay though, we don't expect it to happen instantly). |
290 audioTrack.enabled = false; | 293 audioTrack.enabled = false; |
291 | 294 |
292 setTimeout(function() { | 295 setTimeout(function() { |
293 gatherAudioLevelSamples(gSecondConnection, 200, 100, function(samples) { | 296 gatherAudioLevelSamples(gSecondConnection, 200, 100, function(samples) { |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
627 offerSdp = offerSdp.replace(/a=msid-semantic.*\r\n/g, ''); | 630 offerSdp = offerSdp.replace(/a=msid-semantic.*\r\n/g, ''); |
628 offerSdp = offerSdp.replace('a=mid:audio\r\n', ''); | 631 offerSdp = offerSdp.replace('a=mid:audio\r\n', ''); |
629 offerSdp = offerSdp.replace('a=mid:video\r\n', ''); | 632 offerSdp = offerSdp.replace('a=mid:video\r\n', ''); |
630 offerSdp = offerSdp.replace(/a=ssrc.*\r\n/g, ''); | 633 offerSdp = offerSdp.replace(/a=ssrc.*\r\n/g, ''); |
631 return offerSdp; | 634 return offerSdp; |
632 } | 635 } |
633 | 636 |
634 function removeVideoCodec(offerSdp) { | 637 function removeVideoCodec(offerSdp) { |
635 offerSdp = offerSdp.replace('a=rtpmap:100 VP8/90000\r\n', | 638 offerSdp = offerSdp.replace('a=rtpmap:100 VP8/90000\r\n', |
636 'a=rtpmap:100 XVP8/90000\r\n'); | 639 'a=rtpmap:100 XVP8/90000\r\n'); |
637 return offerSdp; | 640 return gForceIsac16K ? forceIsac16k_(offerSdp) : offerSdp; |
638 } | 641 } |
639 | 642 |
640 function removeCrypto(offerSdp) { | 643 function removeCrypto(offerSdp) { |
641 offerSdp = offerSdp.replace(/a=crypto.*\r\n/g, 'a=Xcrypto\r\n'); | 644 offerSdp = offerSdp.replace(/a=crypto.*\r\n/g, 'a=Xcrypto\r\n'); |
642 offerSdp = offerSdp.replace(/a=fingerprint.*\r\n/g, ''); | 645 offerSdp = offerSdp.replace(/a=fingerprint.*\r\n/g, ''); |
643 return offerSdp; | 646 return gForceIsac16K ? forceIsac16k_(offerSdp) : offerSdp; |
644 } | 647 } |
645 | 648 |
646 function removeBundle(sdp) { | 649 function removeBundle(sdp) { |
647 return sdp.replace(/a=group:BUNDLE .*\r\n/g, ''); | 650 sdp = sdp.replace(/a=group:BUNDLE .*\r\n/g, ''); |
| 651 return gForceIsac16K ? forceIsac16k_(sdp) : sdp; |
648 } | 652 } |
649 | 653 |
650 function useGice(sdp) { | 654 function useGice(sdp) { |
651 sdp = sdp.replace(/t=.*\r\n/g, function(subString) { | 655 sdp = sdp.replace(/t=.*\r\n/g, function(subString) { |
652 return subString + 'a=ice-options:google-ice\r\n'; | 656 return subString + 'a=ice-options:google-ice\r\n'; |
653 }); | 657 }); |
654 sdp = sdp.replace(/a=ice-ufrag:.*\r\n/g, | 658 sdp = sdp.replace(/a=ice-ufrag:.*\r\n/g, |
655 'a=ice-ufrag:' + EXTERNAL_GICE_UFRAG + '\r\n'); | 659 'a=ice-ufrag:' + EXTERNAL_GICE_UFRAG + '\r\n'); |
656 sdp = sdp.replace(/a=ice-pwd:.*\r\n/g, | 660 sdp = sdp.replace(/a=ice-pwd:.*\r\n/g, |
657 'a=ice-pwd:' + EXTERNAL_GICE_PWD + '\r\n'); | 661 'a=ice-pwd:' + EXTERNAL_GICE_PWD + '\r\n'); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
742 <td><canvas width="320" height="240" id="remote-view-2-canvas" | 746 <td><canvas width="320" height="240" id="remote-view-2-canvas" |
743 style="display:none"></canvas></td> | 747 style="display:none"></canvas></td> |
744 <td><canvas width="320" height="240" id="remote-view-3-canvas" | 748 <td><canvas width="320" height="240" id="remote-view-3-canvas" |
745 style="display:none"></canvas></td> | 749 style="display:none"></canvas></td> |
746 <td><canvas width="320" height="240" id="remote-view-4-canvas" | 750 <td><canvas width="320" height="240" id="remote-view-4-canvas" |
747 style="display:none"></canvas></td> | 751 style="display:none"></canvas></td> |
748 </tr> | 752 </tr> |
749 </table> | 753 </table> |
750 </body> | 754 </body> |
751 </html> | 755 </html> |
OLD | NEW |