diff --git a/index.html b/index.html index e00528258..2d77ae49b 100644 --- a/index.html +++ b/index.html @@ -45,9 +45,9 @@ - + - + diff --git a/rtp_sts.js b/rtp_sts.js index 46c75522c..b32c8b019 100644 --- a/rtp_sts.js +++ b/rtp_sts.js @@ -18,7 +18,7 @@ function PeerStats() this.ssrc2Loss = {}; this.ssrc2AudioLevel = {}; this.ssrc2bitrate = {}; - this.resolution = null; + this.ssrc2resolution = {}; } /** @@ -52,6 +52,22 @@ PeerStats.prototype.setSsrcLoss = function (ssrc, lossRate) this.ssrc2Loss[ssrc] = lossRate; }; +/** + * Sets resolution for given ssrc that belong to the peer + * represented by this instance. + * @param ssrc audio or video RTP stream SSRC. + * @param resolution new resolution value to be set. + */ +PeerStats.prototype.setSsrcResolution = function (ssrc, resolution) +{ + if(resolution == null && this.ssrc2resolution[ssrc]) + { + delete this.ssrc2resolution[ssrc]; + } + else if(resolution != null) + this.ssrc2resolution[ssrc] = resolution; +}; + /** * Sets the bit rate for given ssrc that blong to the peer * represented by this instance. @@ -318,22 +334,13 @@ StatsCollector.prototype.processStatsReport = function () { resolution.width = now.stat("googFrameWidthSent"); } - if(!jidStats.resolution) - jidStats.resolution = null; - if(resolution.height && resolution.width) { - if(!jidStats.resolution) - jidStats.resolution = { hq: resolution, lq: resolution}; - else if(jidStats.resolution.hq.width > resolution.width && - jidStats.resolution.hq.height > resolution.height) - { - jidStats.resolution.lq = resolution; - } - else - { - jidStats.resolution.hq = resolution; - } + jidStats.setSsrcResolution(ssrc, resolution); + } + else + { + jidStats.setSsrcResolution(ssrc, null); } @@ -365,8 +372,7 @@ StatsCollector.prototype.processStatsReport = function () { bitrateUpload += self.jid2stats[jid].ssrc2bitrate[ssrc].upload; } ); - resolution[jid] = self.jid2stats[jid].resolution; - delete self.jid2stats[jid].resolution; + resolution[jid] = self.jid2stats[jid].ssrc2resolution; } ); diff --git a/videolayout.js b/videolayout.js index 63013d5b2..1f89ea99c 100644 --- a/videolayout.js +++ b/videolayout.js @@ -8,6 +8,8 @@ var VideoLayout = (function (my) { }; my.connectionIndicators = {}; + var displayedSsrcs = {}; + my.changeLocalAudio = function(stream) { connection.jingle.localAudio = stream; @@ -33,7 +35,7 @@ var VideoLayout = (function (my) { if(!VideoLayout.connectionIndicators["localVideoContainer"]) { VideoLayout.connectionIndicators["localVideoContainer"] - = new ConnectionIndicator($("#localVideoContainer")[0]); + = new ConnectionIndicator($("#localVideoContainer")[0], null); } AudioLevels.updateAudioLevelCanvas(); @@ -181,38 +183,12 @@ var VideoLayout = (function (my) { if (largeVideoState.oldJid) { var oldResourceJid = Strophe.getResourceFromJid(largeVideoState.oldJid); VideoLayout.enableDominantSpeaker(oldResourceJid, false); - if(VideoLayout.connectionIndicators) { - var videoContainerId = null; - if (oldResourceJid == Strophe.getResourceFromJid(connection.emuc.myroomjid)) { - videoContainerId = 'localVideoContainer'; - } - else { - videoContainerId = 'participant_' + oldResourceJid; - } - if(VideoLayout.connectionIndicators[videoContainerId]) - VideoLayout.connectionIndicators[videoContainerId].setShowHQ(false); - } - } // Enable new dominant speaker in the remote videos section. if (largeVideoState.userJid) { var resourceJid = Strophe.getResourceFromJid(largeVideoState.userJid); VideoLayout.enableDominantSpeaker(resourceJid, true); - if(VideoLayout.connectionIndicators) - { - var videoContainerId = null; - if (resourceJid - === Strophe.getResourceFromJid(connection.emuc.myroomjid)) { - videoContainerId = 'localVideoContainer'; - } - else { - videoContainerId = 'participant_' + resourceJid; - } - if(VideoLayout.connectionIndicators[videoContainerId]) - VideoLayout.connectionIndicators[videoContainerId].setShowHQ(true); - } - } if (fade && largeVideoState.isVisible) { @@ -376,7 +352,7 @@ var VideoLayout = (function (my) { // Set default display name. setDisplayName(videoSpanId); - VideoLayout.connectionIndicators[videoSpanId] = new ConnectionIndicator(container); + VideoLayout.connectionIndicators[videoSpanId] = new ConnectionIndicator(container, peerJid); var nickfield = document.createElement('span'); nickfield.className = "nick"; @@ -1482,6 +1458,21 @@ var VideoLayout = (function (my) { if (updateFocusedVideoSrc) { focusedVideoSrc = electedStreamUrl; } + var ssrc = videoSrcToSsrc[selRemoteVideo.attr('src')]; + displayedSsrcs[ssrc2jid[ssrc]] = ssrc; + var jid = ssrc2jid[ssrc]; + var videoId; + if(jid == connection.emuc.myroomjid) + { + videoId = "localVideoContainer"; + } + else + { + videoId = "participant_" + Strophe.getResourceFromJid(jid); + } + var connectionIndicator = VideoLayout.connectionIndicators[videoId]; + if(connectionIndicator) + connectionIndicator.updatePopoverData(); } else { console.error('Could not find a stream or a session.', session, electedStream); @@ -1494,7 +1485,7 @@ var VideoLayout = (function (my) { * @param videoContainer the video container associated with the indicator. * @constructor */ - function ConnectionIndicator(videoContainer) + function ConnectionIndicator(videoContainer, jid) { this.videoContainer = videoContainer; this.bandwidth = null; @@ -1504,7 +1495,7 @@ var VideoLayout = (function (my) { this.resolution = null; this.transport = []; this.popover = null; - this.showHQ = false; + this.jid = jid; this.create(); } @@ -1521,16 +1512,6 @@ var VideoLayout = (function (my) { 0: "0px"//empty }; - /** - * Sets the value of the property that indicates whether the displayed resolution si the - * resolution of High Quality stream or Low Quality - * @param value boolean. - */ - ConnectionIndicator.prototype.setShowHQ = function (value) { - this.showHQ = value; - this.updatePopoverData(); - }; - ConnectionIndicator.getIP = function(value) { return value.substring(0, value.indexOf(":")); @@ -1583,17 +1564,38 @@ var VideoLayout = (function (my) { var resolutionValue = null; if(this.resolution) { - if(this.showHQ && this.resolution.hq) + var keys = Object.keys(this.resolution); + if(keys.length == 1) { - resolutionValue = this.resolution.hq; + for(var ssrc in this.resolution) + { + resolutionValue = this.resolution[ssrc]; + } } - else if(!this.showHQ && this.resolution.lq) + else if(keys.length > 1) { - resolutionValue = this.resolution.lq; + resolutionValue = this.resolution[displayedSsrcs[this.jid]]; } } - if(!resolutionValue || + if(this.jid==null) + { + resolution = ""; + for(var i in this.resolution) + { + resolutionValue = this.resolution[i]; + if(resolutionValue) + { + if(resolutionValue.height && + resolutionValue.width) + { + resolution += (resolution == ""? "" : ", ") + + resolutionValue.width + "x" + resolutionValue.height; + } + } + } + } + else if(!resolutionValue || !resolutionValue.height || !resolutionValue.width) {