| Index: webrtc/tools/loopback_test/loopback_test.js
|
| diff --git a/webrtc/tools/loopback_test/loopback_test.js b/webrtc/tools/loopback_test/loopback_test.js
|
| deleted file mode 100644
|
| index 5e596b7ff3708ff52265e24b7e4864567e226d58..0000000000000000000000000000000000000000
|
| --- a/webrtc/tools/loopback_test/loopback_test.js
|
| +++ /dev/null
|
| @@ -1,240 +0,0 @@
|
| -/**
|
| - * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
|
| - *
|
| - * Use of this source code is governed by a BSD-style license
|
| - * that can be found in the LICENSE file in the root of the source
|
| - * tree. An additional intellectual property rights grant can be found
|
| - * in the file PATENTS. All contributing project authors may
|
| - * be found in the AUTHORS file in the root of the source tree.
|
| - */
|
| -
|
| -// LoopbackTest establish a one way loopback call between 2 peer connections
|
| -// while continuously monitoring bandwidth stats. The idea is to use this as
|
| -// a base for other future tests and to keep track of more than just bandwidth
|
| -// stats.
|
| -//
|
| -// Usage:
|
| -// var test = new LoopbackTest(stream, callDurationMs,
|
| -// forceTurn, pcConstraints,
|
| -// maxVideoBitrateKbps);
|
| -// test.run(onDone);
|
| -// function onDone() {
|
| -// test.getResults(); // return stats recorded during the loopback test.
|
| -// }
|
| -//
|
| -function LoopbackTest(
|
| - stream,
|
| - callDurationMs,
|
| - forceTurn,
|
| - pcConstraints,
|
| - maxVideoBitrateKbps) {
|
| -
|
| - var pc1StatTracker;
|
| - var pc2StatTracker;
|
| -
|
| - // In order to study effect of network (e.g. wifi) on peer connection one can
|
| - // establish a loopback call and force it to go via a turn server. This way
|
| - // the call won't switch to local addresses. That is achieved by filtering out
|
| - // all non-relay ice candidades on both peers.
|
| - function constrainTurnCandidates(pc) {
|
| - var origAddIceCandidate = pc.addIceCandidate;
|
| - pc.addIceCandidate = function (candidate, successCallback,
|
| - failureCallback) {
|
| - if (forceTurn && candidate.candidate.indexOf("typ relay ") == -1) {
|
| - trace("Dropping non-turn candidate: " + candidate.candidate);
|
| - successCallback();
|
| - return;
|
| - } else {
|
| - origAddIceCandidate.call(this, candidate, successCallback,
|
| - failureCallback);
|
| - }
|
| - }
|
| - }
|
| -
|
| - // FEC makes it hard to study bwe estimation since there seems to be a spike
|
| - // when it is enabled and disabled. Disable it for now. FEC issue tracked on:
|
| - // https://code.google.com/p/webrtc/issues/detail?id=3050
|
| - function constrainOfferToRemoveFec(pc) {
|
| - var origCreateOffer = pc.createOffer;
|
| - pc.createOffer = function (successCallback, failureCallback, options) {
|
| - function filteredSuccessCallback(desc) {
|
| - desc.sdp = desc.sdp.replace(/(m=video 1 [^\r]+)(116 117)(\r\n)/g,
|
| - '$1\r\n');
|
| - desc.sdp = desc.sdp.replace(/a=rtpmap:116 red\/90000\r\n/g, '');
|
| - desc.sdp = desc.sdp.replace(/a=rtpmap:117 ulpfec\/90000\r\n/g, '');
|
| - successCallback(desc);
|
| - }
|
| - origCreateOffer.call(this, filteredSuccessCallback, failureCallback,
|
| - options);
|
| - }
|
| - }
|
| -
|
| - // Constraint max video bitrate by modifying the SDP when creating an answer.
|
| - function constrainBitrateAnswer(pc) {
|
| - var origCreateAnswer = pc.createAnswer;
|
| - pc.createAnswer = function (successCallback, failureCallback, options) {
|
| - function filteredSuccessCallback(desc) {
|
| - if (maxVideoBitrateKbps) {
|
| - desc.sdp = desc.sdp.replace(
|
| - /a=mid:video\r\n/g,
|
| - 'a=mid:video\r\nb=AS:' + maxVideoBitrateKbps + '\r\n');
|
| - }
|
| - successCallback(desc);
|
| - }
|
| - origCreateAnswer.call(this, filteredSuccessCallback, failureCallback,
|
| - options);
|
| - }
|
| - }
|
| -
|
| - // Run the actual LoopbackTest.
|
| - this.run = function(doneCallback) {
|
| - if (forceTurn) requestTurn(start, fail);
|
| - else start();
|
| -
|
| - function start(turnServer) {
|
| - var pcConfig = forceTurn ? { iceServers: [turnServer] } : null;
|
| - console.log(pcConfig);
|
| - var pc1 = new RTCPeerConnection(pcConfig, pcConstraints);
|
| - constrainTurnCandidates(pc1);
|
| - constrainOfferToRemoveFec(pc1);
|
| - pc1StatTracker = new StatTracker(pc1, 50);
|
| - pc1StatTracker.recordStat("EstimatedSendBitrate",
|
| - "bweforvideo", "googAvailableSendBandwidth");
|
| - pc1StatTracker.recordStat("TransmitBitrate",
|
| - "bweforvideo", "googTransmitBitrate");
|
| - pc1StatTracker.recordStat("TargetEncodeBitrate",
|
| - "bweforvideo", "googTargetEncBitrate");
|
| - pc1StatTracker.recordStat("ActualEncodedBitrate",
|
| - "bweforvideo", "googActualEncBitrate");
|
| -
|
| - var pc2 = new RTCPeerConnection(pcConfig, pcConstraints);
|
| - constrainTurnCandidates(pc2);
|
| - constrainBitrateAnswer(pc2);
|
| - pc2StatTracker = new StatTracker(pc2, 50);
|
| - pc2StatTracker.recordStat("REMB",
|
| - "bweforvideo", "googAvailableReceiveBandwidth");
|
| -
|
| - pc1.addStream(stream);
|
| - var call = new Call(pc1, pc2);
|
| -
|
| - call.start();
|
| - setTimeout(function () {
|
| - call.stop();
|
| - pc1StatTracker.stop();
|
| - pc2StatTracker.stop();
|
| - success();
|
| - }, callDurationMs);
|
| - }
|
| -
|
| - function success() {
|
| - trace("Success");
|
| - doneCallback();
|
| - }
|
| -
|
| - function fail(msg) {
|
| - trace("Fail: " + msg);
|
| - doneCallback();
|
| - }
|
| - }
|
| -
|
| - // Returns a google visualization datatable with the recorded samples during
|
| - // the loopback test.
|
| - this.getResults = function () {
|
| - return mergeDataTable(pc1StatTracker.dataTable(),
|
| - pc2StatTracker.dataTable());
|
| - }
|
| -
|
| - // Helper class to establish and manage a call between 2 peer connections.
|
| - // Usage:
|
| - // var c = new Call(pc1, pc2);
|
| - // c.start();
|
| - // c.stop();
|
| - //
|
| - function Call(pc1, pc2) {
|
| - pc1.onicecandidate = applyIceCandidate.bind(pc2);
|
| - pc2.onicecandidate = applyIceCandidate.bind(pc1);
|
| -
|
| - function applyIceCandidate(e) {
|
| - if (e.candidate) {
|
| - this.addIceCandidate(new RTCIceCandidate(e.candidate),
|
| - onAddIceCandidateSuccess,
|
| - onAddIceCandidateError);
|
| - }
|
| - }
|
| -
|
| - function onAddIceCandidateSuccess() {}
|
| - function onAddIceCandidateError(error) {
|
| - trace("Failed to add Ice Candidate: " + error.toString());
|
| - }
|
| -
|
| - this.start = function() {
|
| - pc1.createOffer(gotDescription1, onCreateSessionDescriptionError);
|
| -
|
| - function onCreateSessionDescriptionError(error) {
|
| - trace('Failed to create session description: ' + error.toString());
|
| - }
|
| -
|
| - function gotDescription1(desc){
|
| - trace("Offer: " + desc.sdp);
|
| - pc1.setLocalDescription(desc);
|
| - pc2.setRemoteDescription(desc);
|
| - // Since the "remote" side has no media stream we need
|
| - // to pass in the right constraints in order for it to
|
| - // accept the incoming offer of audio and video.
|
| - pc2.createAnswer(gotDescription2, onCreateSessionDescriptionError);
|
| - }
|
| -
|
| - function gotDescription2(desc){
|
| - trace("Answer: " + desc.sdp);
|
| - pc2.setLocalDescription(desc);
|
| - pc1.setRemoteDescription(desc);
|
| - }
|
| - }
|
| -
|
| - this.stop = function() {
|
| - pc1.close();
|
| - pc2.close();
|
| - }
|
| - }
|
| -
|
| - // Request a turn server. This uses the same servers as apprtc.
|
| - function requestTurn(successCallback, failureCallback) {
|
| - var currentDomain = document.domain;
|
| - if (currentDomain.search('localhost') === -1 &&
|
| - currentDomain.search('webrtc.googlecode.com') === -1) {
|
| - failureCallback("Domain not authorized for turn server: " +
|
| - currentDomain);
|
| - return;
|
| - }
|
| -
|
| - // Get a turn server from computeengineondemand.appspot.com.
|
| - var turnUrl = 'https://computeengineondemand.appspot.com/' +
|
| - 'turn?username=156547625762562&key=4080218913';
|
| - var xmlhttp = new XMLHttpRequest();
|
| - xmlhttp.onreadystatechange = onTurnResult;
|
| - xmlhttp.open('GET', turnUrl, true);
|
| - xmlhttp.send();
|
| -
|
| - function onTurnResult() {
|
| - if (this.readyState !== 4) {
|
| - return;
|
| - }
|
| -
|
| - if (this.status === 200) {
|
| - var turnServer = JSON.parse(xmlhttp.responseText);
|
| - // Create turnUris using the polyfill (adapter.js).
|
| - turnServer.uris = turnServer.uris.filter(
|
| - function (e) { return e.search('transport=udp') != -1; }
|
| - );
|
| - var iceServers = createIceServers(turnServer.uris,
|
| - turnServer.username,
|
| - turnServer.password);
|
| - if (iceServers !== null) {
|
| - successCallback(iceServers);
|
| - return;
|
| - }
|
| - }
|
| - failureCallback("Failed to get a turn server.");
|
| - }
|
| - }
|
| -}
|
|
|