Home | History | Annotate | Download | only in base
      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 function maybeFixConfiguration(pcConfig) {
     16   if (pcConfig == null) {
     17     return;
     18   }
     19   for (var i = 0; i < pcConfig.iceServers.length; i++) {
     20     if (pcConfig.iceServers[i].hasOwnProperty('urls')){
     21       pcConfig.iceServers[i]['url'] = pcConfig.iceServers[i]['urls'];
     22       delete pcConfig.iceServers[i]['urls'];
     23     }
     24   }
     25 }
     26 
     27 if (navigator.mozGetUserMedia) {
     28   console.log("This appears to be Firefox");
     29 
     30   webrtcDetectedBrowser = "firefox";
     31 
     32   webrtcDetectedVersion =
     33            parseInt(navigator.userAgent.match(/Firefox\/([0-9]+)\./)[1], 10);
     34 
     35   // The RTCPeerConnection object.
     36   var RTCPeerConnection = function(pcConfig, pcConstraints) {
     37     // .urls is not supported in FF yet.
     38     maybeFixConfiguration(pcConfig);
     39     return new mozRTCPeerConnection(pcConfig, pcConstraints);
     40   }
     41 
     42   // The RTCSessionDescription object.
     43   RTCSessionDescription = mozRTCSessionDescription;
     44 
     45   // The RTCIceCandidate object.
     46   RTCIceCandidate = mozRTCIceCandidate;
     47 
     48   // Get UserMedia (only difference is the prefix).
     49   // Code from Adam Barth.
     50   getUserMedia = navigator.mozGetUserMedia.bind(navigator);
     51   navigator.getUserMedia = getUserMedia;
     52 
     53   // Creates iceServer from the url for FF.
     54   createIceServer = function(url, username, password) {
     55     var iceServer = null;
     56     var url_parts = url.split(':');
     57     if (url_parts[0].indexOf('stun') === 0) {
     58       // Create iceServer with stun url.
     59       iceServer = { 'url': url };
     60     } else if (url_parts[0].indexOf('turn') === 0) {
     61       if (webrtcDetectedVersion < 27) {
     62         // Create iceServer with turn url.
     63         // Ignore the transport parameter from TURN url for FF version <=27.
     64         var turn_url_parts = url.split("?");
     65         // Return null for createIceServer if transport=tcp.
     66         if (turn_url_parts.length === 1 ||
     67             turn_url_parts[1].indexOf('transport=udp') === 0) {
     68           iceServer = {'url': turn_url_parts[0],
     69                        'credential': password,
     70                        'username': username};
     71         }
     72       } else {
     73         // FF 27 and above supports transport parameters in TURN url,
     74         // So passing in the full url to create iceServer.
     75         iceServer = {'url': url,
     76                      'credential': password,
     77                      'username': username};
     78       }
     79     }
     80     return iceServer;
     81   };
     82 
     83   createIceServers = function(urls, username, password) {
     84     var iceServers = [];
     85     // Use .url for FireFox.
     86     for (i = 0; i < urls.length; i++) {
     87       var iceServer = createIceServer(urls[i],
     88                                       username,
     89                                       password);
     90       if (iceServer !== null) {
     91         iceServers.push(iceServer);
     92       }
     93     }
     94     return iceServers;
     95   }
     96 
     97   // Attach a media stream to an element.
     98   attachMediaStream = function(element, stream) {
     99     console.log("Attaching media stream");
    100     element.mozSrcObject = stream;
    101     element.play();
    102   };
    103 
    104   reattachMediaStream = function(to, from) {
    105     console.log("Reattaching media stream");
    106     to.mozSrcObject = from.mozSrcObject;
    107     to.play();
    108   };
    109 
    110   // Fake get{Video,Audio}Tracks
    111   if (!MediaStream.prototype.getVideoTracks) {
    112     MediaStream.prototype.getVideoTracks = function() {
    113       return [];
    114     };
    115   }
    116 
    117   if (!MediaStream.prototype.getAudioTracks) {
    118     MediaStream.prototype.getAudioTracks = function() {
    119       return [];
    120     };
    121   }
    122 } else if (navigator.webkitGetUserMedia) {
    123   console.log("This appears to be Chrome");
    124 
    125   webrtcDetectedBrowser = "chrome";
    126   webrtcDetectedVersion =
    127          parseInt(navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)[2], 10);
    128 
    129   // Creates iceServer from the url for Chrome M33 and earlier.
    130   createIceServer = function(url, username, password) {
    131     var iceServer = null;
    132     var url_parts = url.split(':');
    133     if (url_parts[0].indexOf('stun') === 0) {
    134       // Create iceServer with stun url.
    135       iceServer = { 'url': url };
    136     } else if (url_parts[0].indexOf('turn') === 0) {
    137       // Chrome M28 & above uses below TURN format.
    138       iceServer = {'url': url,
    139                    'credential': password,
    140                    'username': username};
    141     }
    142     return iceServer;
    143   };
    144 
    145   // Creates iceServers from the urls for Chrome M34 and above.
    146   createIceServers = function(urls, username, password) {
    147     var iceServers = [];
    148     if (webrtcDetectedVersion >= 34) {
    149       // .urls is supported since Chrome M34.
    150       iceServers = {'urls': urls,
    151                     'credential': password,
    152                     'username': username };
    153     } else {
    154       for (i = 0; i < urls.length; i++) {
    155         var iceServer = createIceServer(urls[i],
    156                                         username,
    157                                         password);
    158         if (iceServer !== null) {
    159           iceServers.push(iceServer);
    160         }
    161       }
    162     }
    163     return iceServers;
    164   };
    165 
    166   // The RTCPeerConnection object.
    167   var RTCPeerConnection = function(pcConfig, pcConstraints) {
    168     // .urls is supported since Chrome M34.
    169     if (webrtcDetectedVersion < 34) {
    170       maybeFixConfiguration(pcConfig);
    171     }
    172     return new webkitRTCPeerConnection(pcConfig, pcConstraints);
    173   }
    174 
    175   // Get UserMedia (only difference is the prefix).
    176   // Code from Adam Barth.
    177   getUserMedia = navigator.webkitGetUserMedia.bind(navigator);
    178   navigator.getUserMedia = getUserMedia;
    179 
    180   // Attach a media stream to an element.
    181   attachMediaStream = function(element, stream) {
    182     if (typeof element.srcObject !== 'undefined') {
    183       element.srcObject = stream;
    184     } else if (typeof element.mozSrcObject !== 'undefined') {
    185       element.mozSrcObject = stream;
    186     } else if (typeof element.src !== 'undefined') {
    187       element.src = URL.createObjectURL(stream);
    188     } else {
    189       console.log('Error attaching stream to element.');
    190     }
    191   };
    192 
    193   reattachMediaStream = function(to, from) {
    194     to.src = from.src;
    195   };
    196 } else {
    197   console.log("Browser does not appear to be WebRTC-capable");
    198 }
    199