Makes sure that we keep local video SSRC as a "recvonly" when muted.

This commit is contained in:
paweldomas 2015-12-09 23:30:24 -06:00
parent 75a822be66
commit e0e0baf87e
2 changed files with 46 additions and 42 deletions

View File

@ -130,7 +130,9 @@ var storeLocalVideoSSRC = function (jingleIq) {
function generateRecvonlySSRC() { function generateRecvonlySSRC() {
// //
localRecvOnlySSRC = localRecvOnlySSRC =
Math.random().toString(10).substring(2, 11); localVideoSSRC ?
localVideoSSRC : Math.random().toString(10).substring(2, 11);
localRecvOnlyCName = localRecvOnlyCName =
Math.random().toString(36).substring(2); Math.random().toString(36).substring(2);
console.info( console.info(
@ -175,12 +177,17 @@ var LocalSSRCReplacement = {
// IF we have local video SSRC stored make sure it is replaced // IF we have local video SSRC stored make sure it is replaced
// with old SSRC // with old SSRC
if (localVideoSSRC) { var sdp = new SDP(localDescription.sdp);
var newSdp = new SDP(localDescription.sdp); if (sdp.media.length < 2)
if (newSdp.media[1].indexOf("a=ssrc:") !== -1 && return;
!newSdp.containsSSRC(localVideoSSRC)) {
if (localVideoSSRC && sdp.media[1].indexOf("a=ssrc:") !== -1 &&
!sdp.containsSSRC(localVideoSSRC)) {
console.info("Does not contain: " + localVideoSSRC + "---" + sdp.media[1]);
// Get new video SSRC // Get new video SSRC
var map = newSdp.getMediaSsrcMap(); var map = sdp.getMediaSsrcMap();
var videoPart = map[1]; var videoPart = map[1];
var videoSSRCs = videoPart.ssrcs; var videoSSRCs = videoPart.ssrcs;
var newSSRC = Object.keys(videoSSRCs)[0]; var newSSRC = Object.keys(videoSSRCs)[0];
@ -190,17 +197,13 @@ var LocalSSRCReplacement = {
" with " + localVideoSSRC); " with " + localVideoSSRC);
localDescription.sdp = localDescription.sdp =
newSdp.raw.replace( sdp.raw.replace(
new RegExp('a=ssrc:' + newSSRC, 'g'), new RegExp('a=ssrc:' + newSSRC, 'g'),
'a=ssrc:' + localVideoSSRC); 'a=ssrc:' + localVideoSSRC);
} }
} else { else if (sdp.media[1].indexOf('a=ssrc:') === -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) { sdp.media[1].indexOf('a=recvonly') !== -1) {
// Make sure we have any SSRC for recvonly video stream
if (!localRecvOnlySSRC) { if (!localRecvOnlySSRC) {
generateRecvonlySSRC(); generateRecvonlySSRC();
} }
@ -213,7 +216,6 @@ var LocalSSRCReplacement = {
localDescription.sdp = sdp.session + sdp.media.join(''); localDescription.sdp = sdp.session + sdp.media.join('');
} }
}
return localDescription; return localDescription;
}, },
/** /**

View File

@ -75,16 +75,18 @@ SDP.prototype.getMediaSsrcMap = function() {
* @param ssrc the ssrc to check. * @param ssrc the ssrc to check.
* @returns {boolean} <tt>true</tt> if this SDP contains given SSRC. * @returns {boolean} <tt>true</tt> 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(); var medias = this.getMediaSsrcMap();
Object.keys(medias).forEach(function(mediaindex){ var result = false;
var media = medias[mediaindex]; Object.keys(medias).forEach(function (mediaindex) {
//console.log("Check", channel, ssrc); if (result)
if(Object.keys(media.ssrcs).indexOf(ssrc) != -1){ return;
return true; if (medias[mediaindex].ssrcs[ssrc]) {
result = true;
} }
}); });
return false; return result;
}; };
// remove iSAC and CN from SDP // remove iSAC and CN from SDP