Browse Source

Added settings to control audio and video constraints. Some settings were added as experiments which are disabled per default).

pull/129/head
Simon Eisenmann 11 years ago
parent
commit
9c347454ae
  1. 31
      src/i18n/messages-de.po
  2. 29
      src/i18n/messages-ja.po
  3. 29
      src/i18n/messages-ko.po
  4. 29
      src/i18n/messages-zh-cn.po
  5. 29
      src/i18n/messages-zh-tw.po
  6. 29
      src/i18n/messages.pot
  7. 105
      static/js/controllers/mediastreamcontroller.js
  8. 31
      static/js/mediastream/peerscreenshare.js
  9. 15
      static/js/mediastream/webrtc.js
  10. 107
      static/partials/settings.html
  11. 2
      static/translation/messages-de.json
  12. 2
      static/translation/messages-ja.json
  13. 2
      static/translation/messages-ko.json
  14. 2
      static/translation/messages-zh-cn.json
  15. 2
      static/translation/messages-zh-tw.json

31
src/i18n/messages-de.po

@ -8,8 +8,8 @@ msgid "" @@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Spreed WebRTC 1.0\n"
"Report-Msgid-Bugs-To: simon@struktur.de\n"
"POT-Creation-Date: 2014-09-26 15:55+0200\n"
"PO-Revision-Date: 2014-09-26 15:56+0100\n"
"POT-Creation-Date: 2014-10-23 11:22+0200\n"
"PO-Revision-Date: 2014-10-23 11:28+0100\n"
"Last-Translator: Simon Eisenmann <simon@struktur.de>\n"
"Language-Team: struktur AG <opensource@struktur.de>\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
@ -350,12 +350,39 @@ msgstr "Erweiterte Einstellungen" @@ -350,12 +350,39 @@ msgstr "Erweiterte Einstellungen"
msgid "Stereo audio"
msgstr "Stereo-Audio"
msgid "Play audio on same device as selected microphone"
msgstr "Audioausgabe auf dem zum Mikrofon gehörenden Gerät"
msgid "Mirror audio channels"
msgstr "Audiokanäle spiegeln"
msgid "Experimental AEC"
msgstr "Experimentelle AEC"
msgid "Experimental AGC"
msgstr "Experimentelle AGC"
msgid "Experimental noise suppression"
msgstr "Experimentelle Geräuschunterdrückung"
msgid "Max video frame rate"
msgstr "Max. Bildwiederholrate"
msgid "auto"
msgstr "auto"
msgid "Optimize for high resolution video"
msgstr "Für hohe Auflösung optimieren"
msgid "Reduce video noise"
msgstr "Rauschen reduzieren"
msgid "Detect CPU over use"
msgstr "CPU-Überlast erkennen"
msgid "Enable experiments"
msgstr "Experimente aktivieren"
msgid "Show advanced settings"
msgstr "Erweiterte Einstellungen anzeigen"

29
src/i18n/messages-ja.po

@ -8,7 +8,7 @@ msgid "" @@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Spreed WebRTC 1.0\n"
"Report-Msgid-Bugs-To: simon@struktur.de\n"
"POT-Creation-Date: 2014-09-26 15:55+0200\n"
"POT-Creation-Date: 2014-10-23 11:22+0200\n"
"PO-Revision-Date: 2014-04-23 22:25+0100\n"
"Last-Translator: Curt Frisemo <curt.frisemo@spreed.com>\n"
"Language-Team: Curt Frisemo <curt.frisemo@spreed.com>\n"
@ -346,12 +346,39 @@ msgstr "詳細設定" @@ -346,12 +346,39 @@ msgstr "詳細設定"
msgid "Stereo audio"
msgstr "ステレオ・オーディオ"
msgid "Play audio on same device as selected microphone"
msgstr ""
msgid "Mirror audio channels"
msgstr ""
msgid "Experimental AEC"
msgstr ""
msgid "Experimental AGC"
msgstr ""
msgid "Experimental noise suppression"
msgstr ""
msgid "Max video frame rate"
msgstr "ビデオ最高フレームレート"
msgid "auto"
msgstr "自動"
msgid "Optimize for high resolution video"
msgstr ""
msgid "Reduce video noise"
msgstr ""
msgid "Detect CPU over use"
msgstr ""
msgid "Enable experiments"
msgstr ""
msgid "Show advanced settings"
msgstr "詳細設定を表示"

29
src/i18n/messages-ko.po

@ -8,7 +8,7 @@ msgid "" @@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Spreed WebRTC 1.0\n"
"Report-Msgid-Bugs-To: simon@struktur.de\n"
"POT-Creation-Date: 2014-09-26 15:55+0200\n"
"POT-Creation-Date: 2014-10-23 11:22+0200\n"
"PO-Revision-Date: 2014-04-13 20:30+0900\n"
"Last-Translator: Curt Frisemo <curt.frisemo@spreed.com>\n"
"Language-Team: Curt Frisemo <curt.frisemo@spreed.com>\n"
@ -346,12 +346,39 @@ msgstr "고급 설정" @@ -346,12 +346,39 @@ msgstr "고급 설정"
msgid "Stereo audio"
msgstr "스테레오 음성"
msgid "Play audio on same device as selected microphone"
msgstr ""
msgid "Mirror audio channels"
msgstr ""
msgid "Experimental AEC"
msgstr ""
msgid "Experimental AGC"
msgstr ""
msgid "Experimental noise suppression"
msgstr ""
msgid "Max video frame rate"
msgstr "비디오프레임 비율 최대화"
msgid "auto"
msgstr "자동"
msgid "Optimize for high resolution video"
msgstr ""
msgid "Reduce video noise"
msgstr ""
msgid "Detect CPU over use"
msgstr ""
msgid "Enable experiments"
msgstr ""
msgid "Show advanced settings"
msgstr "고급 설정 보기"

29
src/i18n/messages-zh-cn.po

@ -8,7 +8,7 @@ msgid "" @@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Spreed WebRTC 1.0\n"
"Report-Msgid-Bugs-To: simon@struktur.de\n"
"POT-Creation-Date: 2014-09-26 15:55+0200\n"
"POT-Creation-Date: 2014-10-23 11:22+0200\n"
"PO-Revision-Date: 2014-05-21 09:54+0800\n"
"Last-Translator: Michael P.\n"
"Language-Team: Curt Frisemo <curt.frisemo@spreed.com>\n"
@ -346,12 +346,39 @@ msgstr "高级设置" @@ -346,12 +346,39 @@ msgstr "高级设置"
msgid "Stereo audio"
msgstr "立体声"
msgid "Play audio on same device as selected microphone"
msgstr ""
msgid "Mirror audio channels"
msgstr ""
msgid "Experimental AEC"
msgstr ""
msgid "Experimental AGC"
msgstr ""
msgid "Experimental noise suppression"
msgstr ""
msgid "Max video frame rate"
msgstr "最大视频帧速率"
msgid "auto"
msgstr "自动"
msgid "Optimize for high resolution video"
msgstr ""
msgid "Reduce video noise"
msgstr ""
msgid "Detect CPU over use"
msgstr ""
msgid "Enable experiments"
msgstr ""
msgid "Show advanced settings"
msgstr "展开高级设置"

29
src/i18n/messages-zh-tw.po

@ -8,7 +8,7 @@ msgid "" @@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Spreed WebRTC 1.0\n"
"Report-Msgid-Bugs-To: simon@struktur.de\n"
"POT-Creation-Date: 2014-09-26 15:55+0200\n"
"POT-Creation-Date: 2014-10-23 11:22+0200\n"
"PO-Revision-Date: 2014-05-21 09:55+0800\n"
"Last-Translator: Michael P.\n"
"Language-Team: Curt Frisemo <curt.frisemo@spreed.com>\n"
@ -346,12 +346,39 @@ msgstr "高級設置" @@ -346,12 +346,39 @@ msgstr "高級設置"
msgid "Stereo audio"
msgstr "立體聲"
msgid "Play audio on same device as selected microphone"
msgstr ""
msgid "Mirror audio channels"
msgstr ""
msgid "Experimental AEC"
msgstr ""
msgid "Experimental AGC"
msgstr ""
msgid "Experimental noise suppression"
msgstr ""
msgid "Max video frame rate"
msgstr "最大視頻幀速率"
msgid "auto"
msgstr "自動"
msgid "Optimize for high resolution video"
msgstr ""
msgid "Reduce video noise"
msgstr ""
msgid "Detect CPU over use"
msgstr ""
msgid "Enable experiments"
msgstr ""
msgid "Show advanced settings"
msgstr "展開高級設置"

29
src/i18n/messages.pot

@ -9,7 +9,7 @@ msgid "" @@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Spreed WebRTC 1.0\n"
"Report-Msgid-Bugs-To: simon@struktur.de\n"
"POT-Creation-Date: 2014-09-26 15:55+0200\n"
"POT-Creation-Date: 2014-10-23 11:22+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -342,12 +342,39 @@ msgstr "" @@ -342,12 +342,39 @@ msgstr ""
msgid "Stereo audio"
msgstr ""
msgid "Play audio on same device as selected microphone"
msgstr ""
msgid "Mirror audio channels"
msgstr ""
msgid "Experimental AEC"
msgstr ""
msgid "Experimental AGC"
msgstr ""
msgid "Experimental noise suppression"
msgstr ""
msgid "Max video frame rate"
msgstr ""
msgid "auto"
msgstr ""
msgid "Optimize for high resolution video"
msgstr ""
msgid "Reduce video noise"
msgstr ""
msgid "Detect CPU over use"
msgstr ""
msgid "Enable experiments"
msgstr ""
msgid "Show advanced settings"
msgstr ""

105
static/js/controllers/mediastreamcontroller.js

@ -125,7 +125,8 @@ define(['underscore', 'bigscreen', 'moment', 'sjcl', 'modernizr', 'webrtc.adapte @@ -125,7 +125,8 @@ define(['underscore', 'bigscreen', 'moment', 'sjcl', 'modernizr', 'webrtc.adapte
// Add support status.
$scope.supported = {
screensharing: screensharing.supported
screensharing: screensharing.supported,
renderToAssociatedSink: $window.navigator.platform.indexOf("Win") === 0
}
// Default scope data.
@ -155,7 +156,19 @@ define(['underscore', 'bigscreen', 'moment', 'sjcl', 'modernizr', 'webrtc.adapte @@ -155,7 +156,19 @@ define(['underscore', 'bigscreen', 'moment', 'sjcl', 'modernizr', 'webrtc.adapte
stereo: true,
maxFrameRate: 20,
defaultRoom: "",
language: ""
language: "",
audioRenderToAssociatedSkin: true,
audioMirroring: false,
experimental: {
enabled: false,
audioEchoCancellation2: true,
audioAutoGainControl2: true,
audioNoiseSuppression2: true,
audioTypingNoiseDetection: true,
videoLeakyBucket: true,
videoNoiseReduction: false,
videoCpuOveruseDetection: true
}
}
};
$scope.master = angular.copy($scope.defaults);
@ -228,23 +241,102 @@ define(['underscore', 'bigscreen', 'moment', 'sjcl', 'modernizr', 'webrtc.adapte @@ -228,23 +241,102 @@ define(['underscore', 'bigscreen', 'moment', 'sjcl', 'modernizr', 'webrtc.adapte
var audioConstraints = [];
var videoConstraints = [];
var videoConstraintsMandatory = {};
var screensharingConstraints = [];
var pushmulti = function(arrays, data) {
_.each(arrays, function(a) {
a.push(data);
});
};
// Chrome only constraints.
if ($scope.isChrome) {
// Video.
videoConstraintsMandatory = $.extend(videoConstraintsMandatory, videoQualityMap[settings.videoQuality]);
// Not supported as of Firefox 27.
// Audio settings.
// For defaults in Chromium see https://code.google.com/p/webrtc/source/browse/trunk/talk/media/webrtc/webrtcvoiceengine.cc#225
// Experimental audio settings.
if (settings.experimental.enabled) {
audioConstraints.push({
googEchoCancellation: true // defaults to true
});
audioConstraints.push({
googEchoCancellation2: settings.experimental.audioEchoCancellation2 && true // defaults to false in Chrome
});
audioConstraints.push({
googAutoGainControl: true // defaults to true
});
audioConstraints.push({
googAutoGainControl2: settings.experimental.audioAutoGainControl2 && true // defaults to false in Chrome
});
audioConstraints.push({
googNoiseSuppression: true // defaults to true
});
audioConstraints.push({
googgNoiseSuppression2: settings.experimental.audioNoiseSuppression2 && true // defaults to false in Chrome
});
audioConstraints.push({
googHighpassFilter: true // defaults to true
});
audioConstraints.push({
googTypingNoiseDetection: settings.experimental.audioTypingNoiseDetection && true // defaults to true in Chrome
});
}
audioConstraints.push({
// Swaps the left and right channels for audio.
googAudioMirroring: settings.audioMirroring && true // defaults to false in Chrome
});
if ($scope.supported.renderToAssociatedSink) {
audioConstraints.push({
// When true uses the default communications device on Windows.
// https://codereview.chromium.org/155863003
googDucking: true // defaults to true on Windows.
});
audioConstraints.push({
// Chrome will start rendering mediastream output to an output device that's associated with
// the input stream that was opened via getUserMedia.
// https://chromiumcodereview.appspot.com/23558010
chromeRenderToAssociatedSink: settings.audioRenderToAssociatedSkin && true // defaults to false in Chrome
});
}
// Select microphone device by id.
if (settings.microphoneId) {
audioConstraints.push({
sourceId: settings.microphoneId
});
}
// Not supported as of Firefox 27.
// Select camera by device id.
if (settings.cameraId) {
videoConstraints.push({
sourceId: settings.cameraId
});
}
// Video settings.
if (settings.experimental.enabled) {
// Experimental video settings.
pushmulti([videoConstraints, screensharingConstraints], {
// Changes the way the video encoding adapts to the available bandwidth.
// https://code.google.com/p/webrtc/issues/detail?id=3351
googLeakyBucket: settings.experimental.videoLeakyBucket && true // defaults to false in Chrome
});
pushmulti([videoConstraints, screensharingConstraints], {
// Removes the noise in the captured video stream at the expense of CPU.
googNoiseReduction: settings.experimental.videoNoiseReduction && true // defaults to false in Chrome
});
pushmulti([videoConstraints, screensharingConstraints], {
googCpuOveruseDetection: settings.experimental.videoCpuOveruseDetection && true // defaults to true in Chrome
});
}
// Video.
videoConstraintsMandatory = $.extend(videoConstraintsMandatory, videoQualityMap[settings.videoQuality]);
// Not supported as of Firefox 27.
if (settings.maxFrameRate && settings.maxFrameRate != "auto") {
videoConstraintsMandatory.maxFrameRate = parseInt(settings.maxFrameRate, 10);
@ -259,6 +351,7 @@ define(['underscore', 'bigscreen', 'moment', 'sjcl', 'modernizr', 'webrtc.adapte @@ -259,6 +351,7 @@ define(['underscore', 'bigscreen', 'moment', 'sjcl', 'modernizr', 'webrtc.adapte
optional: audioConstraints
};
mediaStream.webrtc.settings.pcConfig.iceServers = iceServers;
mediaStream.webrtc.settings.screensharing.mediaConstraints.video.optional = screensharingConstraints;
// Inject optional stuff.
var optionalPcConstraints = mediaStream.webrtc.settings.pcConstraints.optional = [];

31
static/js/mediastream/peerscreenshare.js

@ -42,17 +42,15 @@ define(['jquery', 'underscore', 'mediastream/peercall', 'mediastream/tokens'], f @@ -42,17 +42,15 @@ define(['jquery', 'underscore', 'mediastream/peercall', 'mediastream/tokens'], f
// Set stuff.
this.token = token;
this.messageHandler = null;
// We only receive, and never send.
this.mediaConstraints = {
audio: false,
video: false
};
this.sdpConstraints = {
mandatory: {
OfferToReceiveAudio: false,
OfferToReceiveVideo: true
}
};
}
this.sdpConstraints.mandatory.OfferToReceiveAudio = false;
this.sdpConstraints.mandatory.OfferToReceiveVideo = true;
// SCTP is supported from Chrome M31.
// No need to pass DTLS constraint as it is on by default in Chrome M31.
// For SCTP, reliable and ordered is true by default.
@ -66,24 +64,23 @@ define(['jquery', 'underscore', 'mediastream/peercall', 'mediastream/tokens'], f @@ -66,24 +64,23 @@ define(['jquery', 'underscore', 'mediastream/peercall', 'mediastream/tokens'], f
};
PeerScreenshare.getMediaContraints = function(options) {
// Static function.
PeerScreenshare.getCaptureMediaConstraints = function(webrtc, options) {
var screenWidth = window.screen.width;
var screenHeight = window.screen.height;
// Constraints which define what actually gets shared need to
// be provided in options.
var mandatoryVideoConstraints = $.extend({
var mandatoryVideoConstraints = $.extend(true, {}, {
maxWidth: screenWidth,
maxHeight: screenHeight
}, options);
var mediaConstraints = {
audio: false,
video: {
mandatory: mandatoryVideoConstraints
}
}
console.log("Setting screen sharing media constraints", mandatoryVideoConstraints);
}, webrtc.settings.screensharing.mediaConstraints.video.mandatory, options);
var mediaConstraints = $.extend(true, {}, webrtc.settings.screensharing.mediaConstraints, {
audio: false
});
mediaConstraints.video.mandatory = mandatoryVideoConstraints;
console.log("Setting screen sharing media constraints", mediaConstraints);
return mediaConstraints;
};

15
static/js/mediastream/webrtc.js

@ -86,9 +86,22 @@ function($, _, PeerCall, PeerConference, PeerXfer, PeerScreenshare, UserMedia, u @@ -86,9 +86,22 @@ function($, _, PeerCall, PeerConference, PeerXfer, PeerScreenshare, UserMedia, u
offerConstraints: {
mandatory: {},
optional: []
},
screensharing: {
mediaConstraints: {
audio: false,
video: {
optional: [],
mandatory: {}
}
}
}
}
this.screensharingSettings = {
};
this.api.e.bind("received.offer received.candidate received.answer received.bye received.conference", _.bind(this.processReceived, this));
$(window).on("unload", _.bind(function() {
@ -483,7 +496,7 @@ function($, _, PeerCall, PeerConference, PeerXfer, PeerScreenshare, UserMedia, u @@ -483,7 +496,7 @@ function($, _, PeerCall, PeerConference, PeerXfer, PeerScreenshare, UserMedia, u
var usermedia = new UserMedia({
noaudio: true
});
var ok = usermedia.doGetUserMedia(null, PeerScreenshare.getMediaContraints(options));
var ok = usermedia.doGetUserMedia(null, PeerScreenshare.getCaptureMediaConstraints(this, options));
if (ok) {
this.e.one("done", function() {
usermedia.stop();

107
static/partials/settings.html

@ -149,6 +149,65 @@ @@ -149,6 +149,65 @@
</div>
</div>
<div class="form-group" ng-show="isChrome && supported.renderToAssociatedSink">
<label class="col-xs-4 control-label">{{_('Play audio on same device as selected microphone')}}</label>
<div class="col-xs-8">
<div class="checkbox">
<label>
<input type="checkbox" ng-model="user.settings.audioRenderToAssociatedSkin"/>&nbsp;
</label>
</div>
</div>
</div>
<div class="form-group" ng-show="isChrome">
<label class="col-xs-4 control-label">{{_('Mirror audio channels')}}</label>
<div class="col-xs-8">
<div class="checkbox">
<label>
<input type="checkbox" ng-model="user.settings.audioMirroring"/>&nbsp;
</label>
</div>
</div>
</div>
<div ng-show="user.settings.experimental.enabled">
<div class="form-group" ng-show="isChrome">
<label class="col-xs-4 control-label">{{_('Experimental AEC')}}</label>
<div class="col-xs-8">
<div class="checkbox">
<label>
<input type="checkbox" ng-model="user.settings.experimental.audioEchoCancellation2"/>&nbsp;
</label>
</div>
</div>
</div>
<div class="form-group" ng-show="isChrome">
<label class="col-xs-4 control-label">{{_('Experimental AGC')}}</label>
<div class="col-xs-8">
<div class="checkbox">
<label>
<input type="checkbox" ng-model="user.settings.experimental.audioAutoGainControl2"/>&nbsp;
</label>
</div>
</div>
</div>
<div class="form-group" ng-show="isChrome">
<label class="col-xs-4 control-label">{{_('Experimental noise suppression')}}</label>
<div class="col-xs-8">
<div class="checkbox">
<label>
<input type="checkbox" ng-model="user.settings.experimental.audioNoiseSuppression2"/>&nbsp;
</label>
</div>
</div>
</div>
</div>
<div class="form-group" ng-show="isChrome">
<label class="col-xs-4 control-label">{{_('Max video frame rate')}}</label>
<div class="col-xs-8">
@ -162,6 +221,54 @@ @@ -162,6 +221,54 @@
</div>
</div>
<div ng-show="user.settings.experimental.enabled">
<div class="form-group" ng-show="isChrome">
<label class="col-xs-4 control-label">{{_('Optimize for high resolution video')}}</label>
<div class="col-xs-8">
<div class="checkbox">
<label>
<input type="checkbox" ng-model="user.settings.experimental.videoLeakyBucket"/>&nbsp;
</label>
</div>
</div>
</div>
<div class="form-group" ng-show="isChrome">
<label class="col-xs-4 control-label">{{_('Reduce video noise')}}</label>
<div class="col-xs-8">
<div class="checkbox">
<label>
<input type="checkbox" ng-model="user.settings.experimental.videoNoiseReduction"/>&nbsp;
</label>
</div>
</div>
</div>
<div class="form-group" ng-show="isChrome">
<label class="col-xs-4 control-label">{{_('Detect CPU over use')}}</label>
<div class="col-xs-8">
<div class="checkbox">
<label>
<input type="checkbox" ng-model="user.settings.experimental.videoCpuOveruseDetection"/>&nbsp;
</label>
</div>
</div>
</div>
</div>
<div class="form-group" ng-show="isChrome">
<label class="col-xs-4 control-label">{{_('Enable experiments')}}</label>
<div class="col-xs-8">
<div class="checkbox">
<label>
<input type="checkbox" ng-model="user.settings.experimental.enabled"/>&nbsp;
</label>
</div>
</div>
</div>
</div>
<settings-advanced-extra settings-advanced-extra></settings-advanced-extra>

2
static/translation/messages-de.json

File diff suppressed because one or more lines are too long

2
static/translation/messages-ja.json

File diff suppressed because one or more lines are too long

2
static/translation/messages-ko.json

File diff suppressed because one or more lines are too long

2
static/translation/messages-zh-cn.json

File diff suppressed because one or more lines are too long

2
static/translation/messages-zh-tw.json

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save