| OLD | NEW |
| (Empty) |
| 1 var RTCPeerConnection = null; | |
| 2 var getUserMedia = null; | |
| 3 var attachMediaStream = null; | |
| 4 var reattachMediaStream = null; | |
| 5 var webrtcDetectedBrowser = null; | |
| 6 var webrtcDetectedVersion = null; | |
| 7 | |
| 8 function trace(text) { | |
| 9 // This function is used for logging. | |
| 10 if (text[text.length - 1] == '\n') { | |
| 11 text = text.substring(0, text.length - 1); | |
| 12 } | |
| 13 console.log((performance.now() / 1000).toFixed(3) + ": " + text); | |
| 14 } | |
| 15 | |
| 16 if (navigator.mozGetUserMedia) { | |
| 17 console.log("This appears to be Firefox"); | |
| 18 | |
| 19 webrtcDetectedBrowser = "firefox"; | |
| 20 | |
| 21 webrtcDetectedVersion = | |
| 22 parseInt(navigator.userAgent.match(/Firefox\/([0-9]+)\./)[1]); | |
| 23 | |
| 24 // The RTCPeerConnection object. | |
| 25 RTCPeerConnection = mozRTCPeerConnection; | |
| 26 | |
| 27 // The RTCSessionDescription object. | |
| 28 RTCSessionDescription = mozRTCSessionDescription; | |
| 29 | |
| 30 // The RTCIceCandidate object. | |
| 31 RTCIceCandidate = mozRTCIceCandidate; | |
| 32 | |
| 33 // Get UserMedia (only difference is the prefix). | |
| 34 // Code from Adam Barth. | |
| 35 getUserMedia = navigator.mozGetUserMedia.bind(navigator); | |
| 36 | |
| 37 // Creates iceServer from the url for FF. | |
| 38 createIceServer = function(url, username, password) { | |
| 39 var iceServer = null; | |
| 40 var url_parts = url.split(':'); | |
| 41 if (url_parts[0].indexOf('stun') === 0) { | |
| 42 // Create iceServer with stun url. | |
| 43 iceServer = { 'url': url }; | |
| 44 } else if (url_parts[0].indexOf('turn') === 0 && | |
| 45 (url.indexOf('transport=udp') !== -1 || | |
| 46 url.indexOf('?transport') === -1)) { | |
| 47 // Create iceServer with turn url. | |
| 48 // Ignore the transport parameter from TURN url. | |
| 49 var turn_url_parts = url.split("?"); | |
| 50 iceServer = { 'url': turn_url_parts[0], | |
| 51 'credential': password, | |
| 52 'username': username }; | |
| 53 } | |
| 54 return iceServer; | |
| 55 }; | |
| 56 | |
| 57 // Attach a media stream to an element. | |
| 58 attachMediaStream = function(element, stream) { | |
| 59 console.log("Attaching media stream"); | |
| 60 element.mozSrcObject = stream; | |
| 61 element.play(); | |
| 62 }; | |
| 63 | |
| 64 reattachMediaStream = function(to, from) { | |
| 65 console.log("Reattaching media stream"); | |
| 66 to.mozSrcObject = from.mozSrcObject; | |
| 67 to.play(); | |
| 68 }; | |
| 69 | |
| 70 // Fake get{Video,Audio}Tracks | |
| 71 MediaStream.prototype.getVideoTracks = function() { | |
| 72 return []; | |
| 73 }; | |
| 74 | |
| 75 MediaStream.prototype.getAudioTracks = function() { | |
| 76 return []; | |
| 77 }; | |
| 78 } else if (navigator.webkitGetUserMedia) { | |
| 79 console.log("This appears to be Chrome"); | |
| 80 | |
| 81 webrtcDetectedBrowser = "chrome"; | |
| 82 webrtcDetectedVersion = | |
| 83 parseInt(navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)[2]); | |
| 84 | |
| 85 // Creates iceServer from the url for Chrome. | |
| 86 createIceServer = function(url, username, password) { | |
| 87 var iceServer = null; | |
| 88 var url_parts = url.split(':'); | |
| 89 if (url_parts[0].indexOf('stun') === 0) { | |
| 90 // Create iceServer with stun url. | |
| 91 iceServer = { 'url': url }; | |
| 92 } else if (url_parts[0].indexOf('turn') === 0) { | |
| 93 if (webrtcDetectedVersion < 28) { | |
| 94 // For pre-M28 chrome versions use old TURN format. | |
| 95 var url_turn_parts = url.split("turn:"); | |
| 96 iceServer = { 'url': 'turn:' + username + '@' + url_turn_parts[1], | |
| 97 'credential': password }; | |
| 98 } else { | |
| 99 // For Chrome M28 & above use new TURN format. | |
| 100 iceServer = { 'url': url, | |
| 101 'credential': password, | |
| 102 'username': username }; | |
| 103 } | |
| 104 } | |
| 105 return iceServer; | |
| 106 }; | |
| 107 | |
| 108 // The RTCPeerConnection object. | |
| 109 RTCPeerConnection = webkitRTCPeerConnection; | |
| 110 | |
| 111 // Get UserMedia (only difference is the prefix). | |
| 112 // Code from Adam Barth. | |
| 113 getUserMedia = navigator.webkitGetUserMedia.bind(navigator); | |
| 114 | |
| 115 // Attach a media stream to an element. | |
| 116 attachMediaStream = function(element, stream) { | |
| 117 if (typeof element.srcObject !== 'undefined') { | |
| 118 element.srcObject = stream; | |
| 119 } else if (typeof element.mozSrcObject !== 'undefined') { | |
| 120 element.mozSrcObject = stream; | |
| 121 } else if (typeof element.src !== 'undefined') { | |
| 122 element.src = URL.createObjectURL(stream); | |
| 123 } else { | |
| 124 console.log('Error attaching stream to element.'); | |
| 125 } | |
| 126 }; | |
| 127 | |
| 128 reattachMediaStream = function(to, from) { | |
| 129 to.src = from.src; | |
| 130 }; | |
| 131 | |
| 132 // The representation of tracks in a stream is changed in M26. | |
| 133 // Unify them for earlier Chrome versions in the coexisting period. | |
| 134 if (!webkitMediaStream.prototype.getVideoTracks) { | |
| 135 webkitMediaStream.prototype.getVideoTracks = function() { | |
| 136 return this.videoTracks; | |
| 137 }; | |
| 138 webkitMediaStream.prototype.getAudioTracks = function() { | |
| 139 return this.audioTracks; | |
| 140 }; | |
| 141 } | |
| 142 | |
| 143 // New syntax of getXXXStreams method in M26. | |
| 144 if (!webkitRTCPeerConnection.prototype.getLocalStreams) { | |
| 145 webkitRTCPeerConnection.prototype.getLocalStreams = function() { | |
| 146 return this.localStreams; | |
| 147 }; | |
| 148 webkitRTCPeerConnection.prototype.getRemoteStreams = function() { | |
| 149 return this.remoteStreams; | |
| 150 }; | |
| 151 } | |
| 152 } else { | |
| 153 console.log("Browser does not appear to be WebRTC-capable"); | |
| 154 } | |
| OLD | NEW |