diff --git a/modules/xmpp/LocalSSRCReplacement.js b/modules/xmpp/LocalSSRCReplacement.js
index 1102c7e99..802b154aa 100644
--- a/modules/xmpp/LocalSSRCReplacement.js
+++ b/modules/xmpp/LocalSSRCReplacement.js
@@ -51,11 +51,11 @@ var isEnabled = !RTCBrowserType.isFirefox();
var localVideoSSRC;
/**
- * SSRC, msid, mslabel, label used for recvonly video stream when we have no local camera.
+ * SSRC used for recvonly video stream when we have no local camera.
* This is in order to tell Chrome what SSRC should be used in RTCP requests
* instead of 1.
*/
-var localRecvOnlySSRC, localRecvOnlyMSID, localRecvOnlyMSLabel, localRecvOnlyLabel;
+var localRecvOnlySSRC;
/**
* cname for localRecvOnlySSRC
@@ -128,30 +128,19 @@ var storeLocalVideoSSRC = function (jingleIq) {
};
/**
- * Generates new label/mslabel attribute
- * @returns {string} label/mslabel attribute
- */
-function generateLabel() {
- return RandomUtil.randomHexString(8) + "-" + RandomUtil.randomHexString(4) +
- "-" + RandomUtil.randomHexString(4) + "-" +
- RandomUtil.randomHexString(4) + "-" + RandomUtil.randomHexString(12);
-}
-
-/**
- * Generates new SSRC, CNAME, mslabel, label and msid for local video recvonly stream.
+ * Generates new SSRC for local video recvonly stream.
* FIXME what about eventual SSRC collision ?
*/
function generateRecvonlySSRC() {
+
localRecvOnlySSRC =
- Math.random().toString(10).substring(2, 11);
+ localVideoSSRC ?
+ localVideoSSRC : Math.random().toString(10).substring(2, 11);
+
localRecvOnlyCName =
Math.random().toString(36).substring(2);
- localRecvOnlyMSLabel = generateLabel();
- localRecvOnlyLabel = generateLabel();
- localRecvOnlyMSID = localRecvOnlyMSLabel + " " + localRecvOnlyLabel;
-
- logger.info(
+ logger.info(
"Generated local recvonly SSRC: " + localRecvOnlySSRC +
", cname: " + localRecvOnlyCName);
}
@@ -193,51 +182,41 @@ var LocalSSRCReplacement = {
// IF we have local video SSRC stored make sure it is replaced
// with old SSRC
- if (localVideoSSRC) {
- var newSdp = new SDP(localDescription.sdp);
- if (newSdp.media[1].indexOf("a=ssrc:") !== -1 &&
- !newSdp.containsSSRC(localVideoSSRC)) {
- // Get new video SSRC
- var map = newSdp.getMediaSsrcMap();
- var videoPart = map[1];
- var videoSSRCs = videoPart.ssrcs;
- var newSSRC = Object.keys(videoSSRCs)[0];
+ var sdp = new SDP(localDescription.sdp);
+ if (sdp.media.length < 2)
+ return;
- logger.info(
- "Replacing new video SSRC: " + newSSRC +
- " with " + localVideoSSRC);
+ if (localVideoSSRC && sdp.media[1].indexOf("a=ssrc:") !== -1 &&
+ !sdp.containsSSRC(localVideoSSRC)) {
+ // Get new video SSRC
+ var map = sdp.getMediaSsrcMap();
+ var videoPart = map[1];
+ var videoSSRCs = videoPart.ssrcs;
+ var newSSRC = Object.keys(videoSSRCs)[0];
- localDescription.sdp =
- newSdp.raw.replace(
- new RegExp('a=ssrc:' + newSSRC, 'g'),
- 'a=ssrc:' + localVideoSSRC);
- }
- } else {
+ logger.info(
+ "Replacing new video SSRC: " + newSSRC +
+ " with " + localVideoSSRC);
+
+ localDescription.sdp =
+ sdp.raw.replace(
+ new RegExp('a=ssrc:' + newSSRC, 'g'),
+ 'a=ssrc:' + localVideoSSRC);
+ }
+ else if (sdp.media[1].indexOf('a=ssrc:') === -1 &&
+ sdp.media[1].indexOf('a=recvonly') !== -1) {
// Make sure we have any SSRC for recvonly video stream
- var sdp = new SDP(localDescription.sdp);
-
- if (sdp.media[1] && sdp.media[1].indexOf('a=ssrc:') === -1 &&
- sdp.media[1].indexOf('a=recvonly') !== -1) {
-
- if (!localRecvOnlySSRC) {
- generateRecvonlySSRC();
- }
- localVideoSSRC = localRecvOnlySSRC;
-
- logger.info('No SSRC in video recvonly stream' +
- ' - adding SSRC: ' + localRecvOnlySSRC);
-
- sdp.media[1] += 'a=ssrc:' + localRecvOnlySSRC +
- ' cname:' + localRecvOnlyCName + '\r\n' +
- 'a=ssrc:' + localRecvOnlySSRC +
- ' msid:' + localRecvOnlyMSID + '\r\n' +
- 'a=ssrc:' + localRecvOnlySSRC +
- ' mslabel:' + localRecvOnlyMSLabel + '\r\n' +
- 'a=ssrc:' + localRecvOnlySSRC +
- ' label:' + localRecvOnlyLabel + '\r\n';
-
- localDescription.sdp = sdp.session + sdp.media.join('');
+ if (!localRecvOnlySSRC) {
+ generateRecvonlySSRC();
}
+
+ logger.info('No SSRC in video recvonly stream' +
+ ' - adding SSRC: ' + localRecvOnlySSRC);
+
+ sdp.media[1] += 'a=ssrc:' + localRecvOnlySSRC +
+ ' cname:' + localRecvOnlyCName + '\r\n';
+
+ localDescription.sdp = sdp.session + sdp.media.join('');
}
return localDescription;
},
diff --git a/modules/xmpp/SDP.js b/modules/xmpp/SDP.js
index 7fcdedb38..b9c61e212 100644
--- a/modules/xmpp/SDP.js
+++ b/modules/xmpp/SDP.js
@@ -76,16 +76,18 @@ SDP.prototype.getMediaSsrcMap = function() {
* @param ssrc the ssrc to check.
* @returns {boolean} true if this SDP contains given SSRC.
*/
-SDP.prototype.containsSSRC = function(ssrc) {
+SDP.prototype.containsSSRC = function (ssrc) {
+ // FIXME this code is really strange - improve it if you can
var medias = this.getMediaSsrcMap();
- Object.keys(medias).forEach(function(mediaindex){
- var media = medias[mediaindex];
- //logger.log("Check", channel, ssrc);
- if(Object.keys(media.ssrcs).indexOf(ssrc) != -1){
- return true;
+ var result = false;
+ Object.keys(medias).forEach(function (mediaindex) {
+ if (result)
+ return;
+ if (medias[mediaindex].ssrcs[ssrc]) {
+ result = true;
}
});
- return false;
+ return result;
};
// remove iSAC and CN from SDP