|
@@ -8145,11 +8145,11 @@ var isEnabled = !RTCBrowserType.isFirefox();
|
8145
|
8145
|
var localVideoSSRC;
|
8146
|
8146
|
|
8147
|
8147
|
/**
|
8148
|
|
- * SSRC, msid, mslabel, label used for recvonly video stream when we have no local camera.
|
|
8148
|
+ * SSRC used for recvonly video stream when we have no local camera.
|
8149
|
8149
|
* This is in order to tell Chrome what SSRC should be used in RTCP requests
|
8150
|
8150
|
* instead of 1.
|
8151
|
8151
|
*/
|
8152
|
|
-var localRecvOnlySSRC, localRecvOnlyMSID, localRecvOnlyMSLabel, localRecvOnlyLabel;
|
|
8152
|
+var localRecvOnlySSRC;
|
8153
|
8153
|
|
8154
|
8154
|
/**
|
8155
|
8155
|
* cname for <tt>localRecvOnlySSRC</tt>
|
|
@@ -8222,30 +8222,19 @@ var storeLocalVideoSSRC = function (jingleIq) {
|
8222
|
8222
|
};
|
8223
|
8223
|
|
8224
|
8224
|
/**
|
8225
|
|
- * Generates new label/mslabel attribute
|
8226
|
|
- * @returns {string} label/mslabel attribute
|
8227
|
|
- */
|
8228
|
|
-function generateLabel() {
|
8229
|
|
- return RandomUtil.randomHexString(8) + "-" + RandomUtil.randomHexString(4) +
|
8230
|
|
- "-" + RandomUtil.randomHexString(4) + "-" +
|
8231
|
|
- RandomUtil.randomHexString(4) + "-" + RandomUtil.randomHexString(12);
|
8232
|
|
-}
|
8233
|
|
-
|
8234
|
|
-/**
|
8235
|
|
- * Generates new SSRC, CNAME, mslabel, label and msid for local video recvonly stream.
|
|
8225
|
+ * Generates new SSRC for local video recvonly stream.
|
8236
|
8226
|
* FIXME what about eventual SSRC collision ?
|
8237
|
8227
|
*/
|
8238
|
8228
|
function generateRecvonlySSRC() {
|
|
8229
|
+
|
8239
|
8230
|
localRecvOnlySSRC =
|
8240
|
|
- Math.random().toString(10).substring(2, 11);
|
|
8231
|
+ localVideoSSRC ?
|
|
8232
|
+ localVideoSSRC : Math.random().toString(10).substring(2, 11);
|
|
8233
|
+
|
8241
|
8234
|
localRecvOnlyCName =
|
8242
|
8235
|
Math.random().toString(36).substring(2);
|
8243
|
|
- localRecvOnlyMSLabel = generateLabel();
|
8244
|
|
- localRecvOnlyLabel = generateLabel();
|
8245
|
|
- localRecvOnlyMSID = localRecvOnlyMSLabel + " " + localRecvOnlyLabel;
|
8246
|
|
-
|
8247
|
8236
|
|
8248
|
|
- logger.info(
|
|
8237
|
+ logger.info(
|
8249
|
8238
|
"Generated local recvonly SSRC: " + localRecvOnlySSRC +
|
8250
|
8239
|
", cname: " + localRecvOnlyCName);
|
8251
|
8240
|
}
|
|
@@ -8287,51 +8276,41 @@ var LocalSSRCReplacement = {
|
8287
|
8276
|
|
8288
|
8277
|
// IF we have local video SSRC stored make sure it is replaced
|
8289
|
8278
|
// with old SSRC
|
8290
|
|
- if (localVideoSSRC) {
|
8291
|
|
- var newSdp = new SDP(localDescription.sdp);
|
8292
|
|
- if (newSdp.media[1].indexOf("a=ssrc:") !== -1 &&
|
8293
|
|
- !newSdp.containsSSRC(localVideoSSRC)) {
|
8294
|
|
- // Get new video SSRC
|
8295
|
|
- var map = newSdp.getMediaSsrcMap();
|
8296
|
|
- var videoPart = map[1];
|
8297
|
|
- var videoSSRCs = videoPart.ssrcs;
|
8298
|
|
- var newSSRC = Object.keys(videoSSRCs)[0];
|
8299
|
|
-
|
8300
|
|
- logger.info(
|
8301
|
|
- "Replacing new video SSRC: " + newSSRC +
|
8302
|
|
- " with " + localVideoSSRC);
|
|
8279
|
+ var sdp = new SDP(localDescription.sdp);
|
|
8280
|
+ if (sdp.media.length < 2)
|
|
8281
|
+ return;
|
8303
|
8282
|
|
8304
|
|
- localDescription.sdp =
|
8305
|
|
- newSdp.raw.replace(
|
8306
|
|
- new RegExp('a=ssrc:' + newSSRC, 'g'),
|
8307
|
|
- 'a=ssrc:' + localVideoSSRC);
|
8308
|
|
- }
|
8309
|
|
- } else {
|
|
8283
|
+ if (localVideoSSRC && sdp.media[1].indexOf("a=ssrc:") !== -1 &&
|
|
8284
|
+ !sdp.containsSSRC(localVideoSSRC)) {
|
|
8285
|
+ // Get new video SSRC
|
|
8286
|
+ var map = sdp.getMediaSsrcMap();
|
|
8287
|
+ var videoPart = map[1];
|
|
8288
|
+ var videoSSRCs = videoPart.ssrcs;
|
|
8289
|
+ var newSSRC = Object.keys(videoSSRCs)[0];
|
|
8290
|
+
|
|
8291
|
+ logger.info(
|
|
8292
|
+ "Replacing new video SSRC: " + newSSRC +
|
|
8293
|
+ " with " + localVideoSSRC);
|
|
8294
|
+
|
|
8295
|
+ localDescription.sdp =
|
|
8296
|
+ sdp.raw.replace(
|
|
8297
|
+ new RegExp('a=ssrc:' + newSSRC, 'g'),
|
|
8298
|
+ 'a=ssrc:' + localVideoSSRC);
|
|
8299
|
+ }
|
|
8300
|
+ else if (sdp.media[1].indexOf('a=ssrc:') === -1 &&
|
|
8301
|
+ sdp.media[1].indexOf('a=recvonly') !== -1) {
|
8310
|
8302
|
// Make sure we have any SSRC for recvonly video stream
|
8311
|
|
- var sdp = new SDP(localDescription.sdp);
|
8312
|
|
-
|
8313
|
|
- if (sdp.media[1] && sdp.media[1].indexOf('a=ssrc:') === -1 &&
|
8314
|
|
- sdp.media[1].indexOf('a=recvonly') !== -1) {
|
8315
|
|
-
|
8316
|
|
- if (!localRecvOnlySSRC) {
|
8317
|
|
- generateRecvonlySSRC();
|
8318
|
|
- }
|
8319
|
|
- localVideoSSRC = localRecvOnlySSRC;
|
|
8303
|
+ if (!localRecvOnlySSRC) {
|
|
8304
|
+ generateRecvonlySSRC();
|
|
8305
|
+ }
|
8320
|
8306
|
|
8321
|
|
- logger.info('No SSRC in video recvonly stream' +
|
8322
|
|
- ' - adding SSRC: ' + localRecvOnlySSRC);
|
|
8307
|
+ logger.info('No SSRC in video recvonly stream' +
|
|
8308
|
+ ' - adding SSRC: ' + localRecvOnlySSRC);
|
8323
|
8309
|
|
8324
|
|
- sdp.media[1] += 'a=ssrc:' + localRecvOnlySSRC +
|
8325
|
|
- ' cname:' + localRecvOnlyCName + '\r\n' +
|
8326
|
|
- 'a=ssrc:' + localRecvOnlySSRC +
|
8327
|
|
- ' msid:' + localRecvOnlyMSID + '\r\n' +
|
8328
|
|
- 'a=ssrc:' + localRecvOnlySSRC +
|
8329
|
|
- ' mslabel:' + localRecvOnlyMSLabel + '\r\n' +
|
8330
|
|
- 'a=ssrc:' + localRecvOnlySSRC +
|
8331
|
|
- ' label:' + localRecvOnlyLabel + '\r\n';
|
|
8310
|
+ sdp.media[1] += 'a=ssrc:' + localRecvOnlySSRC +
|
|
8311
|
+ ' cname:' + localRecvOnlyCName + '\r\n';
|
8332
|
8312
|
|
8333
|
|
- localDescription.sdp = sdp.session + sdp.media.join('');
|
8334
|
|
- }
|
|
8313
|
+ localDescription.sdp = sdp.session + sdp.media.join('');
|
8335
|
8314
|
}
|
8336
|
8315
|
return localDescription;
|
8337
|
8316
|
},
|
|
@@ -8467,16 +8446,18 @@ SDP.prototype.getMediaSsrcMap = function() {
|
8467
|
8446
|
* @param ssrc the ssrc to check.
|
8468
|
8447
|
* @returns {boolean} <tt>true</tt> if this SDP contains given SSRC.
|
8469
|
8448
|
*/
|
8470
|
|
-SDP.prototype.containsSSRC = function(ssrc) {
|
|
8449
|
+SDP.prototype.containsSSRC = function (ssrc) {
|
|
8450
|
+ // FIXME this code is really strange - improve it if you can
|
8471
|
8451
|
var medias = this.getMediaSsrcMap();
|
8472
|
|
- Object.keys(medias).forEach(function(mediaindex){
|
8473
|
|
- var media = medias[mediaindex];
|
8474
|
|
- //logger.log("Check", channel, ssrc);
|
8475
|
|
- if(Object.keys(media.ssrcs).indexOf(ssrc) != -1){
|
8476
|
|
- return true;
|
|
8452
|
+ var result = false;
|
|
8453
|
+ Object.keys(medias).forEach(function (mediaindex) {
|
|
8454
|
+ if (result)
|
|
8455
|
+ return;
|
|
8456
|
+ if (medias[mediaindex].ssrcs[ssrc]) {
|
|
8457
|
+ result = true;
|
8477
|
8458
|
}
|
8478
|
8459
|
});
|
8479
|
|
- return false;
|
|
8460
|
+ return result;
|
8480
|
8461
|
};
|
8481
|
8462
|
|
8482
|
8463
|
// remove iSAC and CN from SDP
|