|
@@ -1480,6 +1480,7 @@ TraceablePeerConnection.prototype.containsTrack = function(track) {
|
1480
|
1480
|
/**
|
1481
|
1481
|
* Add {@link JitsiLocalTrack} to this TPC.
|
1482
|
1482
|
* @param {JitsiLocalTrack} track
|
|
1483
|
+ * @returns {Promise<void>} - resolved when done.
|
1483
|
1484
|
*/
|
1484
|
1485
|
TraceablePeerConnection.prototype.addTrack = function(track, isInitiator = false) {
|
1485
|
1486
|
const rtcId = track.rtcId;
|
|
@@ -1487,14 +1488,15 @@ TraceablePeerConnection.prototype.addTrack = function(track, isInitiator = false
|
1487
|
1488
|
logger.info(`add ${track} to: ${this}`);
|
1488
|
1489
|
|
1489
|
1490
|
if (this.localTracks.has(rtcId)) {
|
1490
|
|
- logger.error(`${track} is already in ${this}`);
|
1491
|
1491
|
|
1492
|
|
- return;
|
|
1492
|
+ return Promise.reject(new Error(`${track} is already in ${this}`));
|
1493
|
1493
|
}
|
1494
|
1494
|
|
1495
|
1495
|
this.localTracks.set(rtcId, track);
|
1496
|
1496
|
if (browser.usesUnifiedPlan() && isInitiator) {
|
1497
|
|
- return this.tpcUtils.addTrack(track, isInitiator);
|
|
1497
|
+ this.tpcUtils.addTrack(track, isInitiator);
|
|
1498
|
+
|
|
1499
|
+ return Promise.resolve();
|
1498
|
1500
|
}
|
1499
|
1501
|
|
1500
|
1502
|
const webrtcStream = track.getOriginalStream();
|
|
@@ -1506,7 +1508,7 @@ TraceablePeerConnection.prototype.addTrack = function(track, isInitiator = false
|
1506
|
1508
|
} else if (!browser.doesVideoMuteByStreamRemove()
|
1507
|
1509
|
|| track.isAudioTrack()
|
1508
|
1510
|
|| (track.isVideoTrack() && !track.isMuted())) {
|
1509
|
|
- logger.error(`${this} no WebRTC stream for: ${track}`);
|
|
1511
|
+ return Promise.reject(new Error(`${this} no WebRTC stream for: ${track}`));
|
1510
|
1512
|
}
|
1511
|
1513
|
|
1512
|
1514
|
// Muted video tracks do not have WebRTC stream
|
|
@@ -1538,14 +1540,18 @@ TraceablePeerConnection.prototype.addTrack = function(track, isInitiator = false
|
1538
|
1540
|
}
|
1539
|
1541
|
}
|
1540
|
1542
|
|
|
1543
|
+ let promiseChain = Promise.resolve();
|
|
1544
|
+
|
1541
|
1545
|
if (browser.usesUnifiedPlan() && !browser.usesSdpMungingForSimulcast()) {
|
1542
|
|
- this.tpcUtils.setEncodings(track);
|
|
1546
|
+ promiseChain = this.tpcUtils.setEncodings(track);
|
1543
|
1547
|
}
|
1544
|
1548
|
|
1545
|
1549
|
// Construct the simulcast stream constraints for the newly added track.
|
1546
|
1550
|
if (track.isVideoTrack() && track.videoType === VideoType.CAMERA && this.isSimulcastOn()) {
|
1547
|
1551
|
this.tpcUtils.setSimulcastStreamConstraints(track.getTrack());
|
1548
|
1552
|
}
|
|
1553
|
+
|
|
1554
|
+ return promiseChain;
|
1549
|
1555
|
};
|
1550
|
1556
|
|
1551
|
1557
|
/**
|
|
@@ -1705,16 +1711,20 @@ TraceablePeerConnection.prototype.findSenderForTrack = function(track) {
|
1705
|
1711
|
*/
|
1706
|
1712
|
TraceablePeerConnection.prototype.replaceTrack = function(oldTrack, newTrack) {
|
1707
|
1713
|
if (browser.usesUnifiedPlan()) {
|
1708
|
|
- return this.tpcUtils.replaceTrack(oldTrack, newTrack);
|
|
1714
|
+ return this.tpcUtils.replaceTrack(oldTrack, newTrack)
|
|
1715
|
+ .then(() => false);
|
1709
|
1716
|
}
|
|
1717
|
+
|
|
1718
|
+ let promiseChain = Promise.resolve();
|
|
1719
|
+
|
1710
|
1720
|
if (oldTrack) {
|
1711
|
1721
|
this.removeTrack(oldTrack);
|
1712
|
1722
|
}
|
1713
|
1723
|
if (newTrack) {
|
1714
|
|
- this.addTrack(newTrack);
|
|
1724
|
+ promiseChain = this.addTrack(newTrack);
|
1715
|
1725
|
}
|
1716
|
1726
|
|
1717
|
|
- return Promise.resolve(true);
|
|
1727
|
+ return promiseChain.then(() => true);
|
1718
|
1728
|
};
|
1719
|
1729
|
|
1720
|
1730
|
/**
|
|
@@ -1926,7 +1936,8 @@ TraceablePeerConnection.prototype.setLocalDescription = function(description) {
|
1926
|
1936
|
TraceablePeerConnection.prototype.setAudioTransferActive = function(active) {
|
1927
|
1937
|
logger.debug(`${this} audio transfer active: ${active}`);
|
1928
|
1938
|
if (browser.usesUnifiedPlan()) {
|
1929
|
|
- return this.tpcUtils.setAudioTransferActive(active);
|
|
1939
|
+ return this.tpcUtils.setAudioTransferActive(active)
|
|
1940
|
+ .then(() => false);
|
1930
|
1941
|
}
|
1931
|
1942
|
const changed = this.audioTransferActive !== active;
|
1932
|
1943
|
|
|
@@ -1940,24 +1951,24 @@ TraceablePeerConnection.prototype.setAudioTransferActive = function(active) {
|
1940
|
1951
|
* resolution or framerate will be preferred when bandwidth or cpu is constrained.
|
1941
|
1952
|
* Sets it to 'maintain-framerate' when a camera track is added to the pc, sets it
|
1942
|
1953
|
* to 'maintain-resolution' when a desktop track is being shared instead.
|
1943
|
|
- * @returns {void}
|
|
1954
|
+ * @returns {Promise<void>}
|
1944
|
1955
|
*/
|
1945
|
1956
|
TraceablePeerConnection.prototype.setSenderVideoDegradationPreference = function() {
|
1946
|
1957
|
if (!this.peerconnection.getSenders) {
|
1947
|
1958
|
logger.debug('Browser does not support RTCRtpSender');
|
1948
|
1959
|
|
1949
|
|
- return;
|
|
1960
|
+ return Promise.resolve();
|
1950
|
1961
|
}
|
1951
|
1962
|
const localVideoTrack = Array.from(this.localTracks.values()).find(t => t.isVideoTrack());
|
1952
|
1963
|
const videoSender = this.findSenderByKind(MediaType.VIDEO);
|
1953
|
1964
|
|
1954
|
1965
|
if (!videoSender) {
|
1955
|
|
- return;
|
|
1966
|
+ return Promise.resolve();
|
1956
|
1967
|
}
|
1957
|
1968
|
const parameters = videoSender.getParameters();
|
1958
|
1969
|
|
1959
|
1970
|
if (!parameters.encodings || !parameters.encodings.length) {
|
1960
|
|
- return;
|
|
1971
|
+ return Promise.resolve();
|
1961
|
1972
|
}
|
1962
|
1973
|
for (const encoding in parameters.encodings) {
|
1963
|
1974
|
if (parameters.encodings.hasOwnProperty(encoding)) {
|
|
@@ -1969,7 +1980,8 @@ TraceablePeerConnection.prototype.setSenderVideoDegradationPreference = function
|
1969
|
1980
|
parameters.encodings[encoding].degradationPreference = preference;
|
1970
|
1981
|
}
|
1971
|
1982
|
}
|
1972
|
|
- videoSender.setParameters(parameters);
|
|
1983
|
+
|
|
1984
|
+ return videoSender.setParameters(parameters);
|
1973
|
1985
|
};
|
1974
|
1986
|
|
1975
|
1987
|
/**
|
|
@@ -1979,6 +1991,7 @@ TraceablePeerConnection.prototype.setSenderVideoDegradationPreference = function
|
1979
|
1991
|
* simulcast is implemented.
|
1980
|
1992
|
* @param {JitsiLocalTrack} localTrack - the local track whose
|
1981
|
1993
|
* max bitrate is to be configured.
|
|
1994
|
+ * @returns {Promise<void>}
|
1982
|
1995
|
*/
|
1983
|
1996
|
TraceablePeerConnection.prototype.setMaxBitRate = function(localTrack = null) {
|
1984
|
1997
|
if (!localTrack) {
|
|
@@ -1986,7 +1999,7 @@ TraceablePeerConnection.prototype.setMaxBitRate = function(localTrack = null) {
|
1986
|
1999
|
localTrack = Array.from(this.localTracks.values()).find(t => t.isVideoTrack());
|
1987
|
2000
|
|
1988
|
2001
|
if (!localTrack) {
|
1989
|
|
- return;
|
|
2002
|
+ return Promise.resolve();
|
1990
|
2003
|
}
|
1991
|
2004
|
}
|
1992
|
2005
|
const trackId = localTrack.track.id;
|
|
@@ -1999,17 +2012,19 @@ TraceablePeerConnection.prototype.setMaxBitRate = function(localTrack = null) {
|
1999
|
2012
|
if (!((this.options.videoQuality && this.options.videoQuality.maxBitratesVideo)
|
2000
|
2013
|
|| (browser.usesPlanB() && this.options.capScreenshareBitrate && videoType === VideoType.DESKTOP))
|
2001
|
2014
|
|| browser.usesUnifiedPlan()) {
|
2002
|
|
- return;
|
|
2015
|
+ return Promise.resolve();
|
2003
|
2016
|
}
|
2004
|
2017
|
|
2005
|
2018
|
if (!this.peerconnection.getSenders) {
|
2006
|
2019
|
logger.debug('Browser doesn\'t support RTCRtpSender');
|
2007
|
2020
|
|
2008
|
|
- return;
|
|
2021
|
+ return Promise.resolve();
|
2009
|
2022
|
}
|
2010
|
2023
|
const presenterEnabled = localTrack._originalStream
|
2011
|
2024
|
&& localTrack._originalStream.id !== localTrack.getStreamId();
|
2012
|
2025
|
|
|
2026
|
+ const setSenderParamPromises = [];
|
|
2027
|
+
|
2013
|
2028
|
this.peerconnection.getSenders()
|
2014
|
2029
|
.filter(s => s.track && s.track.id === trackId)
|
2015
|
2030
|
.forEach(sender => {
|
|
@@ -2037,12 +2052,15 @@ TraceablePeerConnection.prototype.setMaxBitRate = function(localTrack = null) {
|
2037
|
2052
|
: HD_BITRATE;
|
2038
|
2053
|
}
|
2039
|
2054
|
}
|
2040
|
|
- sender.setParameters(parameters);
|
|
2055
|
+ setSenderParamPromises.push(sender.setParameters(parameters));
|
2041
|
2056
|
} catch (err) {
|
2042
|
2057
|
logger.error('Browser does not support getParameters/setParamters '
|
2043
|
2058
|
+ 'or setting max bitrate on the encodings: ', err);
|
2044
|
2059
|
}
|
2045
|
2060
|
});
|
|
2061
|
+
|
|
2062
|
+ return Promise.all(setSenderParamPromises)
|
|
2063
|
+ .then(() => Promise.resolve());
|
2046
|
2064
|
};
|
2047
|
2065
|
|
2048
|
2066
|
TraceablePeerConnection.prototype.setRemoteDescription = function(description) {
|
|
@@ -2196,7 +2214,8 @@ TraceablePeerConnection.prototype.setSenderVideoConstraint = function(frameHeigh
|
2196
|
2214
|
TraceablePeerConnection.prototype.setVideoTransferActive = function(active) {
|
2197
|
2215
|
logger.debug(`${this} video transfer active: ${active}`);
|
2198
|
2216
|
if (browser.usesUnifiedPlan()) {
|
2199
|
|
- return this.tpcUtils.setVideoTransferActive(active);
|
|
2217
|
+ return this.tpcUtils.setVideoTransferActive(active)
|
|
2218
|
+ .then(() => false);
|
2200
|
2219
|
}
|
2201
|
2220
|
const changed = this.videoTransferActive !== active;
|
2202
|
2221
|
|