|
@@ -551,82 +551,8 @@ ColibriFocus.prototype.createdConference = function (result) {
|
551
|
551
|
console.log('setLocalDescription succeeded.');
|
552
|
552
|
// make sure our presence is updated
|
553
|
553
|
$(document).trigger('setLocalDescription.jingle', [self.sid]);
|
554
|
|
- var elem = $iq({to: self.bridgejid, type: 'get'});
|
555
|
|
- elem.c('conference', {xmlns: 'http://jitsi.org/protocol/colibri', id: self.confid});
|
556
|
554
|
var localSDP = new SDP(self.peerconnection.localDescription.sdp);
|
557
|
|
- localSDP.media.forEach(function (media, channel) {
|
558
|
|
- var name = SDPUtil.parse_mid(SDPUtil.find_line(media, 'a=mid:'));
|
559
|
|
- elem.c('content', {name: name});
|
560
|
|
- var mline = SDPUtil.parse_mline(media.split('\r\n')[0]);
|
561
|
|
- if (name !== 'data')
|
562
|
|
- {
|
563
|
|
- elem.c('channel', {
|
564
|
|
- initiator: 'true',
|
565
|
|
- expire: self.channelExpire,
|
566
|
|
- id: self.mychannel[channel].attr('id'),
|
567
|
|
- endpoint: self.myMucResource
|
568
|
|
- });
|
569
|
|
-
|
570
|
|
- // signal (through COLIBRI) to the bridge
|
571
|
|
- // the SSRC groups of the participant
|
572
|
|
- // that plays the role of the focus
|
573
|
|
- var ssrc_group_lines = SDPUtil.find_lines(media, 'a=ssrc-group:');
|
574
|
|
- var idx = 0;
|
575
|
|
- ssrc_group_lines.forEach(function(line) {
|
576
|
|
- idx = line.indexOf(' ');
|
577
|
|
- var semantics = line.substr(0, idx).substr(13);
|
578
|
|
- var ssrcs = line.substr(14 + semantics.length).split(' ');
|
579
|
|
- if (ssrcs.length != 0) {
|
580
|
|
- elem.c('ssrc-group', { semantics: semantics, xmlns: 'urn:xmpp:jingle:apps:rtp:ssma:0' });
|
581
|
|
- ssrcs.forEach(function(ssrc) {
|
582
|
|
- elem.c('source', { ssrc: ssrc })
|
583
|
|
- .up();
|
584
|
|
- });
|
585
|
|
- elem.up();
|
586
|
|
- }
|
587
|
|
- });
|
588
|
|
- // FIXME: should reuse code from .toJingle
|
589
|
|
- for (var j = 0; j < mline.fmt.length; j++)
|
590
|
|
- {
|
591
|
|
- var rtpmap = SDPUtil.find_line(media, 'a=rtpmap:' + mline.fmt[j]);
|
592
|
|
- if (rtpmap)
|
593
|
|
- {
|
594
|
|
- elem.c('payload-type', SDPUtil.parse_rtpmap(rtpmap));
|
595
|
|
- elem.up();
|
596
|
|
- }
|
597
|
|
- }
|
598
|
|
- }
|
599
|
|
- else
|
600
|
|
- {
|
601
|
|
- var sctpmap = SDPUtil.find_line(media, 'a=sctpmap:' + mline.fmt[0]);
|
602
|
|
- var sctpPort = SDPUtil.parse_sctpmap(sctpmap)[0];
|
603
|
|
- elem.c("sctpconnection",
|
604
|
|
- {
|
605
|
|
- initiator: 'true',
|
606
|
|
- expire: self.channelExpire,
|
607
|
|
- id: self.mychannel[channel].attr('id'),
|
608
|
|
- endpoint: self.myMucResource,
|
609
|
|
- port: sctpPort
|
610
|
|
- }
|
611
|
|
- );
|
612
|
|
- }
|
613
|
|
-
|
614
|
|
- localSDP.TransportToJingle(channel, elem);
|
615
|
|
-
|
616
|
|
- elem.up(); // end of channel
|
617
|
|
- elem.up(); // end of content
|
618
|
|
- });
|
619
|
|
-
|
620
|
|
- self.connection.sendIQ(elem,
|
621
|
|
- function (result) {
|
622
|
|
- // ...
|
623
|
|
- },
|
624
|
|
- function (error) {
|
625
|
|
- console.error(
|
626
|
|
- "ERROR sending colibri message",
|
627
|
|
- error, elem);
|
628
|
|
- }
|
629
|
|
- );
|
|
555
|
+ self.updateLocalChannel(localSDP);
|
630
|
556
|
|
631
|
557
|
// now initiate sessions
|
632
|
558
|
for (var i = 0; i < numparticipants; i++) {
|
|
@@ -659,6 +585,96 @@ ColibriFocus.prototype.createdConference = function (result) {
|
659
|
585
|
|
660
|
586
|
};
|
661
|
587
|
|
|
588
|
+ColibriFocus.prototype.updateLocalChannel = function(localSDP, parts) {
|
|
589
|
+ var self = this;
|
|
590
|
+ var elem = $iq({to: self.bridgejid, type: 'get'});
|
|
591
|
+ elem.c('conference', {xmlns: 'http://jitsi.org/protocol/colibri', id: self.confid});
|
|
592
|
+ localSDP.media.forEach(function (media, channel) {
|
|
593
|
+ var name = SDPUtil.parse_mid(SDPUtil.find_line(media, 'a=mid:'));
|
|
594
|
+ elem.c('content', {name: name});
|
|
595
|
+ var mline = SDPUtil.parse_mline(media.split('\r\n')[0]);
|
|
596
|
+ if (name !== 'data') {
|
|
597
|
+ elem.c('channel', {
|
|
598
|
+ initiator: 'true',
|
|
599
|
+ expire: self.channelExpire,
|
|
600
|
+ id: self.mychannel[channel].attr('id'),
|
|
601
|
+ endpoint: self.myMucResource
|
|
602
|
+ });
|
|
603
|
+
|
|
604
|
+ if (!parts || parts.indexOf('sources') !== -1) {
|
|
605
|
+ // signal (through COLIBRI) to the bridge
|
|
606
|
+ // the SSRC groups of the participant
|
|
607
|
+ // that plays the role of the focus
|
|
608
|
+ var ssrc_group_lines = SDPUtil.find_lines(media, 'a=ssrc-group:');
|
|
609
|
+ var idx = 0;
|
|
610
|
+ var hasSIM = false;
|
|
611
|
+ ssrc_group_lines.forEach(function (line) {
|
|
612
|
+ idx = line.indexOf(' ');
|
|
613
|
+ var semantics = line.substr(0, idx).substr(13);
|
|
614
|
+ var ssrcs = line.substr(14 + semantics.length).split(' ');
|
|
615
|
+ if (ssrcs.length != 0) {
|
|
616
|
+ elem.c('ssrc-group', { semantics: semantics, xmlns: 'urn:xmpp:jingle:apps:rtp:ssma:0' });
|
|
617
|
+ ssrcs.forEach(function (ssrc) {
|
|
618
|
+ elem.c('source', { ssrc: ssrc })
|
|
619
|
+ .up();
|
|
620
|
+ });
|
|
621
|
+ elem.up();
|
|
622
|
+ }
|
|
623
|
+ });
|
|
624
|
+
|
|
625
|
+ if (!hasSIM && name == 'video') {
|
|
626
|
+ // disable simulcast with an empty ssrc-group element.
|
|
627
|
+ elem.c('ssrc-group', { semantics: 'SIM', xmlns: 'urn:xmpp:jingle:apps:rtp:ssma:0' });
|
|
628
|
+ elem.up();
|
|
629
|
+ }
|
|
630
|
+ }
|
|
631
|
+
|
|
632
|
+ if (!parts || parts.indexOf('payload-type') !== -1) {
|
|
633
|
+ // FIXME: should reuse code from .toJingle
|
|
634
|
+ for (var j = 0; j < mline.fmt.length; j++) {
|
|
635
|
+ var rtpmap = SDPUtil.find_line(media, 'a=rtpmap:' + mline.fmt[j]);
|
|
636
|
+ if (rtpmap) {
|
|
637
|
+ elem.c('payload-type', SDPUtil.parse_rtpmap(rtpmap));
|
|
638
|
+ elem.up();
|
|
639
|
+ }
|
|
640
|
+ }
|
|
641
|
+ }
|
|
642
|
+ }
|
|
643
|
+ else
|
|
644
|
+ {
|
|
645
|
+ var sctpmap = SDPUtil.find_line(media, 'a=sctpmap:' + mline.fmt[0]);
|
|
646
|
+ var sctpPort = SDPUtil.parse_sctpmap(sctpmap)[0];
|
|
647
|
+ elem.c("sctpconnection",
|
|
648
|
+ {
|
|
649
|
+ initiator: 'true',
|
|
650
|
+ expire: self.channelExpire,
|
|
651
|
+ id: self.mychannel[channel].attr('id'),
|
|
652
|
+ endpoint: self.myMucResource,
|
|
653
|
+ port: sctpPort
|
|
654
|
+ }
|
|
655
|
+ );
|
|
656
|
+ }
|
|
657
|
+
|
|
658
|
+ if (!parts || parts.indexOf('transport') !== -1) {
|
|
659
|
+ localSDP.TransportToJingle(channel, elem);
|
|
660
|
+ }
|
|
661
|
+
|
|
662
|
+ elem.up(); // end of channel
|
|
663
|
+ elem.up(); // end of content
|
|
664
|
+ });
|
|
665
|
+
|
|
666
|
+ self.connection.sendIQ(elem,
|
|
667
|
+ function (result) {
|
|
668
|
+ // ...
|
|
669
|
+ },
|
|
670
|
+ function (error) {
|
|
671
|
+ console.error(
|
|
672
|
+ "ERROR sending colibri message",
|
|
673
|
+ error, elem);
|
|
674
|
+ }
|
|
675
|
+ );
|
|
676
|
+};
|
|
677
|
+
|
662
|
678
|
// send a session-initiate to a new participant
|
663
|
679
|
ColibriFocus.prototype.initiate = function (peer, isInitiator) {
|
664
|
680
|
var participant = this.peers.indexOf(peer);
|
|
@@ -894,61 +910,73 @@ ColibriFocus.prototype.addNewParticipant = function (peer) {
|
894
|
910
|
};
|
895
|
911
|
|
896
|
912
|
// update the channel description (payload-types + dtls fp) for a participant
|
897
|
|
-ColibriFocus.prototype.updateChannel = function (remoteSDP, participant) {
|
|
913
|
+ColibriFocus.prototype.updateRemoteChannel = function (remoteSDP, participant, parts) {
|
898
|
914
|
console.log('change allocation for', this.confid);
|
899
|
915
|
var self = this;
|
900
|
916
|
var change = $iq({to: this.bridgejid, type: 'set'});
|
901
|
917
|
change.c('conference', {xmlns: 'http://jitsi.org/protocol/colibri', id: this.confid});
|
902
|
|
- for (channel = 0; channel < this.channels[participant].length; channel++)
|
903
|
|
- {
|
|
918
|
+ for (channel = 0; channel < this.channels[participant].length; channel++) {
|
904
|
919
|
if (!remoteSDP.media[channel])
|
905
|
920
|
continue;
|
906
|
921
|
|
907
|
922
|
var name = SDPUtil.parse_mid(SDPUtil.find_line(remoteSDP.media[channel], 'a=mid:'));
|
908
|
923
|
change.c('content', {name: name});
|
909
|
|
- if (name !== 'data')
|
910
|
|
- {
|
|
924
|
+ if (name !== 'data') {
|
911
|
925
|
change.c('channel', {
|
912
|
926
|
id: $(this.channels[participant][channel]).attr('id'),
|
913
|
927
|
endpoint: $(this.channels[participant][channel]).attr('endpoint'),
|
914
|
928
|
expire: self.channelExpire
|
915
|
929
|
});
|
916
|
930
|
|
917
|
|
- // signal (throught COLIBRI) to the bridge the SSRC groups of this
|
918
|
|
- // participant
|
919
|
|
- var ssrc_group_lines = SDPUtil.find_lines(remoteSDP.media[channel], 'a=ssrc-group:');
|
920
|
|
- var idx = 0;
|
921
|
|
- ssrc_group_lines.forEach(function(line) {
|
922
|
|
- idx = line.indexOf(' ');
|
923
|
|
- var semantics = line.substr(0, idx).substr(13);
|
924
|
|
- var ssrcs = line.substr(14 + semantics.length).split(' ');
|
925
|
|
- if (ssrcs.length != 0) {
|
926
|
|
- change.c('ssrc-group', { semantics: semantics, xmlns: 'urn:xmpp:jingle:apps:rtp:ssma:0' });
|
927
|
|
- ssrcs.forEach(function(ssrc) {
|
928
|
|
- change.c('source', { ssrc: ssrc })
|
929
|
|
- .up();
|
930
|
|
- });
|
|
931
|
+ if (!parts || parts.indexOf('sources') !== -1) {
|
|
932
|
+ // signal (throught COLIBRI) to the bridge the SSRC groups of this
|
|
933
|
+ // participant
|
|
934
|
+ var ssrc_group_lines = SDPUtil.find_lines(remoteSDP.media[channel], 'a=ssrc-group:');
|
|
935
|
+ var idx = 0;
|
|
936
|
+ var hasSIM = false;
|
|
937
|
+ ssrc_group_lines.forEach(function (line) {
|
|
938
|
+ idx = line.indexOf(' ');
|
|
939
|
+ var semantics = line.substr(0, idx).substr(13);
|
|
940
|
+ if (semantics == 'SIM') {
|
|
941
|
+ hasSIM = true;
|
|
942
|
+ }
|
|
943
|
+ var ssrcs = line.substr(14 + semantics.length).split(' ');
|
|
944
|
+ if (ssrcs.length != 0) {
|
|
945
|
+ change.c('ssrc-group', { semantics: semantics, xmlns: 'urn:xmpp:jingle:apps:rtp:ssma:0' });
|
|
946
|
+ ssrcs.forEach(function (ssrc) {
|
|
947
|
+ change.c('source', { ssrc: ssrc })
|
|
948
|
+ .up();
|
|
949
|
+ });
|
|
950
|
+ change.up();
|
|
951
|
+ }
|
|
952
|
+ });
|
|
953
|
+
|
|
954
|
+ if (!hasSIM && name == 'video') {
|
|
955
|
+ // disable simulcast with an empty ssrc-group element.
|
|
956
|
+ change.c('ssrc-group', { semantics: 'SIM', xmlns: 'urn:xmpp:jingle:apps:rtp:ssma:0' });
|
931
|
957
|
change.up();
|
932
|
958
|
}
|
933
|
|
- });
|
|
959
|
+ }
|
934
|
960
|
|
935
|
|
- var rtpmap = SDPUtil.find_lines(remoteSDP.media[channel], 'a=rtpmap:');
|
936
|
|
- rtpmap.forEach(function (val) {
|
937
|
|
- // TODO: too much copy-paste
|
938
|
|
- var rtpmap = SDPUtil.parse_rtpmap(val);
|
939
|
|
- change.c('payload-type', rtpmap);
|
940
|
|
- //
|
941
|
|
- // put any 'a=fmtp:' + mline.fmt[j] lines into <param name=foo value=bar/>
|
942
|
|
- /*
|
943
|
|
- if (SDPUtil.find_line(remoteSDP.media[channel], 'a=fmtp:' + rtpmap.id)) {
|
944
|
|
- tmp = SDPUtil.parse_fmtp(SDPUtil.find_line(remoteSDP.media[channel], 'a=fmtp:' + rtpmap.id));
|
945
|
|
- for (var k = 0; k < tmp.length; k++) {
|
946
|
|
- change.c('parameter', tmp[k]).up();
|
947
|
|
- }
|
948
|
|
- }
|
949
|
|
- */
|
950
|
|
- change.up();
|
951
|
|
- });
|
|
961
|
+ if (!parts || parts.indexOf('payload-type') !== -1) {
|
|
962
|
+ var rtpmap = SDPUtil.find_lines(remoteSDP.media[channel], 'a=rtpmap:');
|
|
963
|
+ rtpmap.forEach(function (val) {
|
|
964
|
+ // TODO: too much copy-paste
|
|
965
|
+ var rtpmap = SDPUtil.parse_rtpmap(val);
|
|
966
|
+ change.c('payload-type', rtpmap);
|
|
967
|
+ //
|
|
968
|
+ // put any 'a=fmtp:' + mline.fmt[j] lines into <param name=foo value=bar/>
|
|
969
|
+ /*
|
|
970
|
+ if (SDPUtil.find_line(remoteSDP.media[channel], 'a=fmtp:' + rtpmap.id)) {
|
|
971
|
+ tmp = SDPUtil.parse_fmtp(SDPUtil.find_line(remoteSDP.media[channel], 'a=fmtp:' + rtpmap.id));
|
|
972
|
+ for (var k = 0; k < tmp.length; k++) {
|
|
973
|
+ change.c('parameter', tmp[k]).up();
|
|
974
|
+ }
|
|
975
|
+ }
|
|
976
|
+ */
|
|
977
|
+ change.up();
|
|
978
|
+ });
|
|
979
|
+ }
|
952
|
980
|
}
|
953
|
981
|
else
|
954
|
982
|
{
|
|
@@ -960,8 +988,11 @@ ColibriFocus.prototype.updateChannel = function (remoteSDP, participant) {
|
960
|
988
|
port: SDPUtil.parse_sctpmap(sctpmap)[0]
|
961
|
989
|
});
|
962
|
990
|
}
|
963
|
|
- // now add transport
|
964
|
|
- remoteSDP.TransportToJingle(channel, change);
|
|
991
|
+
|
|
992
|
+ if (!parts || parts.indexOf('transport') !== -1) {
|
|
993
|
+ // now add transport
|
|
994
|
+ remoteSDP.TransportToJingle(channel, change);
|
|
995
|
+ }
|
965
|
996
|
|
966
|
997
|
change.up(); // end of channel/sctpconnection
|
967
|
998
|
change.up(); // end of content
|
|
@@ -976,6 +1007,57 @@ ColibriFocus.prototype.updateChannel = function (remoteSDP, participant) {
|
976
|
1007
|
);
|
977
|
1008
|
};
|
978
|
1009
|
|
|
1010
|
+/**
|
|
1011
|
+ * Switches video streams.
|
|
1012
|
+ * @param new_stream new stream that will be used as video of this session.
|
|
1013
|
+ * @param oldStream old video stream of this session.
|
|
1014
|
+ * @param success_callback callback executed after successful stream switch.
|
|
1015
|
+ */
|
|
1016
|
+ColibriFocus.prototype.switchStreams = function (new_stream, oldStream, success_callback) {
|
|
1017
|
+
|
|
1018
|
+ var self = this;
|
|
1019
|
+
|
|
1020
|
+ // Stop the stream to trigger onended event for old stream
|
|
1021
|
+ oldStream.stop();
|
|
1022
|
+
|
|
1023
|
+ // Remember SDP to figure out added/removed SSRCs
|
|
1024
|
+ var oldSdp = null;
|
|
1025
|
+ if(self.peerconnection) {
|
|
1026
|
+ if(self.peerconnection.localDescription) {
|
|
1027
|
+ oldSdp = new SDP(self.peerconnection.localDescription.sdp);
|
|
1028
|
+ }
|
|
1029
|
+ self.peerconnection.removeStream(oldStream);
|
|
1030
|
+ self.peerconnection.addStream(new_stream);
|
|
1031
|
+ }
|
|
1032
|
+
|
|
1033
|
+ self.connection.jingle.localVideo = new_stream;
|
|
1034
|
+
|
|
1035
|
+ self.connection.jingle.localStreams = [];
|
|
1036
|
+ self.connection.jingle.localStreams.push(self.connection.jingle.localAudio);
|
|
1037
|
+ self.connection.jingle.localStreams.push(self.connection.jingle.localVideo);
|
|
1038
|
+
|
|
1039
|
+ // Conference is not active
|
|
1040
|
+ if(!oldSdp || !self.peerconnection) {
|
|
1041
|
+ success_callback();
|
|
1042
|
+ return;
|
|
1043
|
+ }
|
|
1044
|
+
|
|
1045
|
+ self.peerconnection.switchstreams = true;
|
|
1046
|
+ self.modifySources(function() {
|
|
1047
|
+ console.log('modify sources done');
|
|
1048
|
+
|
|
1049
|
+ var newSdp = new SDP(self.peerconnection.localDescription.sdp);
|
|
1050
|
+
|
|
1051
|
+ // change allocation on bridge
|
|
1052
|
+ self.updateLocalChannel(newSdp, ['sources']);
|
|
1053
|
+
|
|
1054
|
+ console.log("SDPs", oldSdp, newSdp);
|
|
1055
|
+ self.notifyMySSRCUpdate(oldSdp, newSdp);
|
|
1056
|
+
|
|
1057
|
+ success_callback();
|
|
1058
|
+ });
|
|
1059
|
+};
|
|
1060
|
+
|
979
|
1061
|
// tell everyone about a new participants a=ssrc lines (isadd is true)
|
980
|
1062
|
// or a leaving participants a=ssrc lines
|
981
|
1063
|
ColibriFocus.prototype.sendSSRCUpdate = function (sdpMediaSsrcs, fromJid, isadd) {
|
|
@@ -1010,7 +1092,7 @@ ColibriFocus.prototype.addSource = function (elem, fromJid) {
|
1010
|
1092
|
// FIXME: dirty waiting
|
1011
|
1093
|
if (!this.peerconnection.localDescription)
|
1012
|
1094
|
{
|
1013
|
|
- console.warn("addSource - localDescription not ready yet")
|
|
1095
|
+ console.warn("addSource - localDescription not ready yet");
|
1014
|
1096
|
setTimeout(function() { self.addSource(elem, fromJid); }, 200);
|
1015
|
1097
|
return;
|
1016
|
1098
|
}
|
|
@@ -1031,11 +1113,21 @@ ColibriFocus.prototype.addSource = function (elem, fromJid) {
|
1031
|
1113
|
});
|
1032
|
1114
|
|
1033
|
1115
|
var oldRemoteSdp = new SDP(this.peerconnection.remoteDescription.sdp);
|
1034
|
|
- this.modifySources(function(){
|
|
1116
|
+ this.modifySources(function() {
|
1035
|
1117
|
// Notify other participants about added ssrc
|
1036
|
1118
|
var remoteSDP = new SDP(self.peerconnection.remoteDescription.sdp);
|
1037
|
1119
|
var newSSRCs = oldRemoteSdp.getNewMedia(remoteSDP);
|
1038
|
1120
|
self.sendSSRCUpdate(newSSRCs, fromJid, true);
|
|
1121
|
+ // change allocation on bridge
|
|
1122
|
+ if (peerSsrc[1] /* video */) {
|
|
1123
|
+ // If the remote peer has changed its video sources, then we need to
|
|
1124
|
+ // update the bridge with this information, in order for the
|
|
1125
|
+ // simulcast manager of the remote peer to update its layers, and
|
|
1126
|
+ // any associated receivers to adjust to the change.
|
|
1127
|
+ var videoSDP = new SDP(['v=0', 'm=audio', 'a=mid:audio', peerSsrc[0]].join('\r\n') + ['m=video', 'a=mid:video', peerSsrc[1]].join('\r\n'));
|
|
1128
|
+ var participant = self.peers.indexOf(fromJid);
|
|
1129
|
+ self.updateRemoteChannel(videoSDP, participant, ['sources']);
|
|
1130
|
+ }
|
1039
|
1131
|
});
|
1040
|
1132
|
};
|
1041
|
1133
|
|
|
@@ -1073,6 +1165,16 @@ ColibriFocus.prototype.removeSource = function (elem, fromJid) {
|
1073
|
1165
|
var remoteSDP = new SDP(self.peerconnection.remoteDescription.sdp);
|
1074
|
1166
|
var removedSSRCs = remoteSDP.getNewMedia(oldSDP);
|
1075
|
1167
|
self.sendSSRCUpdate(removedSSRCs, fromJid, false);
|
|
1168
|
+ // change allocation on bridge
|
|
1169
|
+ if (peerSsrc[1] /* video */) {
|
|
1170
|
+ // If the remote peer has changed its video sources, then we need to
|
|
1171
|
+ // update the bridge with this information, in order for the
|
|
1172
|
+ // simulcast manager of the remote peer to update its layers, and
|
|
1173
|
+ // any associated receivers to adjust to the change.
|
|
1174
|
+ var videoSDP = new SDP(['v=0', 'm=audio', 'a=mid:audio', peerSsrc[0]].join('\r\n') + ['m=video', 'a=mid:video', peerSsrc[1]].join('\r\n'));
|
|
1175
|
+ var participant = self.peers.indexOf(fromJid);
|
|
1176
|
+ self.updateRemoteChannel(videoSDP, participant, ['sources']);
|
|
1177
|
+ }
|
1076
|
1178
|
});
|
1077
|
1179
|
};
|
1078
|
1180
|
|
|
@@ -1084,7 +1186,7 @@ ColibriFocus.prototype.setRemoteDescription = function (session, elem, desctype)
|
1084
|
1186
|
remoteSDP.fromJingle(elem);
|
1085
|
1187
|
|
1086
|
1188
|
// ACT 1: change allocation on bridge
|
1087
|
|
- this.updateChannel(remoteSDP, participant);
|
|
1189
|
+ this.updateRemoteChannel(remoteSDP, participant);
|
1088
|
1190
|
|
1089
|
1191
|
// ACT 2: tell anyone else about the new SSRCs
|
1090
|
1192
|
this.sendSSRCUpdate(remoteSDP.getMediaSsrcMap(), session.peerjid, true);
|