You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2018/09/30 07:52:35 UTC

[openmeetings] branch master updated: [OPENMEETINGS-1649] media clean-up enhanced

This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/master by this push:
     new 5cabff2  [OPENMEETINGS-1649] media clean-up enhanced
5cabff2 is described below

commit 5cabff2f40dac2f76cc4843cafccf224130d0c5f
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Sun Sep 30 14:52:23 2018 +0700

    [OPENMEETINGS-1649] media clean-up enhanced
---
 .../apache/openmeetings/web/room/raw-settings.js   | 15 +---
 .../openmeetings/web/room/raw-video-manager.js     | 40 +---------
 .../apache/openmeetings/web/room/raw-video-util.js | 21 +++++
 .../org/apache/openmeetings/web/room/raw-video.js  | 89 ++++++++++++++++------
 4 files changed, 91 insertions(+), 74 deletions(-)

diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-settings.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-settings.js
index a74eb9a..1790fff 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-settings.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-settings.js
@@ -93,18 +93,11 @@ var VideoSettings = (function() {
 	}
 	function _clear(_ms) {
 		const ms = _ms || (vid.length === 1 ? vid[0].srcObject : null);
-		if (ms !== null && 'function' === typeof(ms.getTracks)) {
-			ms.getTracks().forEach(function(track) {
-				track.stop();
-			});
-			if (vid.length === 1) {
-				vid[0].srcObject = null;
-			}
-		}
-		if (!!rtcPeer) {
-			rtcPeer.dispose();
-			rtcPeer = null;
+		VideoUtil.cleanStream(ms);
+		if (vid.length === 1) {
+			vid[0].srcObject = null;
 		}
+		VideoUtil.cleanPeer(rtcPeer);
 		if (!!level) {
 			level.dispose();
 			level = null;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-manager.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-manager.js
index 28086c1..c132cf8 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-manager.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-manager.js
@@ -17,46 +17,8 @@ var VideoManager = (function() {
 	function _onBroadcast(msg) {
 		const uid = msg.uid;
 		$('#' + VideoUtil.getVid(uid)).remove();
-		const o = VideoSettings.load()
-			, w = Video().init(msg.client, VideoUtil.getPos(VideoUtil.getRects(VID_SEL), msg.stream.width, msg.stream.height + 25))
-			, v = w.data()
-			, cl = v.client();
+		Video().init(msg.client, VideoUtil.getPos(VideoUtil.getRects(VID_SEL), msg.stream.width, msg.stream.height + 25));
 		OmUtil.log(uid + ' registered in room');
-		//each bool OR https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints
-		const constraints = {
-			audio : VideoUtil.hasAudio(cl)
-			, video : VideoUtil.hasVideo(cl)
-		}
-		if (constraints.video) {
-			constraints.video = {
-				mandatory : {
-					maxWidth : cl.width,
-					maxFrameRate : cl.height,
-				}
-			};
-		}
-		v.setPeer(new kurentoUtils.WebRtcPeer.WebRtcPeerSendonly(
-			{
-				localVideo: v.video()
-				, mediaConstraints: constraints
-				, onicecandidate: v.onIceCandidate
-			}
-			, function (error) {
-				if (error) {
-					return OmUtil.error(error);
-				}
-				v.initGain();
-				this.generateOffer(function(error, offerSdp, wp) {
-					if (error) {
-						return OmUtil.error('Sender sdp offer error');
-					}
-					OmUtil.log('Invoking Sender SDP offer callback function');
-					VideoManager.sendMessage({
-						id : 'broadcastStarted'
-						, sdpOffer: offerSdp
-					});
-				});
-			}));
 	}
 
 	function _onReceive(c) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-util.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-util.js
index ff8f103..865c896 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-util.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-util.js
@@ -104,6 +104,25 @@ var VideoUtil = (function() {
 			list.push(_getRect(v));
 		}
 	}
+	function _cleanStream(stream) {
+		if (!!stream) {
+			stream.getTracks().forEach(function(track) {
+				track.stop();
+			});
+		}
+	}
+	function _cleanPeer(peer) {
+		if (!!peer) {
+			const pc = peer.peerConnection;
+			if (!!pc) {
+				pc.getLocalStreams().forEach(function(stream) {
+					_cleanStream(stream);
+				});
+			}
+			peer.dispose();
+			peer = null;
+		}
+	}
 
 	self.getVid = _getVid;
 	self.isSharing = _isSharing;
@@ -114,5 +133,7 @@ var VideoUtil = (function() {
 	self.getPos = _getPos;
 	self.container = _container;
 	self.arrange = _arrange;
+	self.cleanStream = _cleanStream;
+	self.cleanPeer = _cleanPeer;
 	return self;
 })();
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video.js
index 3d52bbd..e6cc905 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video.js
@@ -2,7 +2,7 @@
 var Video = (function() {
 	const self = {};
 	let c, v, vc, t, f, size, vol, slider, handle, video, rtcPeer
-		, lastVolume = 50, aCtx, gainNode;
+		, lastVolume = 50, aCtx, aSrc, aDest, gainNode;
 
 	function _getName() {
 		return c.user.firstName + ' ' + c.user.lastName;
@@ -32,26 +32,59 @@ var Video = (function() {
 		vc.width(w).height(h);
 		video.width(w).height(h);
 	}
-	function _initGain() {
-		if (!rtcPeer) {
-			return;
+	function _createGainableStream() {
+		//each bool OR https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints
+		const constraints = {
+			audio : VideoUtil.hasAudio(c)
+			, video : VideoUtil.hasVideo(c)
 		}
-		const stream = rtcPeer.getLocalStream();
-		if (!stream || stream.getAudioTracks().length === 0) {
-			return;
+		if (constraints.video) {
+			constraints.video = {
+				mandatory : {
+					maxWidth : c.width,
+					maxFrameRate : c.height,
+				}
+			};
 		}
-		vol.show();
-		aCtx = new AudioContext();
-		gainNode = aCtx.createGain();
-		const aSrc = aCtx.createMediaStreamSource(stream)
-			, aDest = aCtx.createMediaStreamDestination();
-		aSrc.connect(gainNode);
-		gainNode.connect(aDest);
-
-		//update stream
-		const pc = rtcPeer.peerConnection;
-		pc.getSenders().forEach(sender => pc.removeTrack(sender));
-		aDest.stream.getTracks().forEach(track => pc.addTrack(track, aDest.stream));
+		navigator.mediaDevices.getUserMedia(constraints)
+			.then(function(stream) {
+				let _stream = stream;
+				if (stream.getAudioTracks().length !== 0) {
+					vol.show();
+					aCtx = new AudioContext();
+					gainNode = aCtx.createGain();
+					aSrc = aCtx.createMediaStreamSource(stream);
+					aDest = aCtx.createMediaStreamDestination();
+					aSrc.connect(gainNode);
+					gainNode.connect(aDest);
+					_stream = aDest.stream;
+				}
+				rtcPeer = new kurentoUtils.WebRtcPeer.WebRtcPeerSendonly(
+						{
+							localVideo: video[0]
+							, videoStream: _stream
+							, mediaConstraints: constraints
+							, onicecandidate: self.onIceCandidate
+						}
+						, function (error) {
+							if (error) {
+								return OmUtil.error(error);
+							}
+							this.generateOffer(function(error, offerSdp, wp) {
+								if (error) {
+									return OmUtil.error('Sender sdp offer error');
+								}
+								OmUtil.log('Invoking Sender SDP offer callback function');
+								VideoManager.sendMessage({
+									id : 'broadcastStarted'
+									, sdpOffer: offerSdp
+								});
+							});
+						});
+			})
+			.catch(function(err) {
+				OmUtil.error(err);
+			});
 	}
 	function _handleMicStatus(state) {
 		if (!f.is(':visible')) {
@@ -260,7 +293,9 @@ var Video = (function() {
 		} else {
 			vc.addClass('audio-only').css('background-image', 'url(' + imgUrl + ')');
 		}
-		if (!c.self) { //FIXME TODO multi-stream
+		if (c.self) { //FIXME TODO multi-stream
+			_createGainableStream();
+		} else {
 			_handleVolume(lastVolume);
 		}
 
@@ -295,9 +330,16 @@ var Video = (function() {
 	}
 	function _cleanup() {
 		OmUtil.log('Disposing participant ' + c.uid);
-		if (!!rtcPeer) {
-			rtcPeer.dispose();
-			rtcPeer = null;
+		VideoUtil.cleanPeer(rtcPeer);
+		if (!!gainNode) {
+			gainNode.disconnect();
+		}
+		if (!!aSrc) {
+			VideoUtil.cleanStream(aSrc.mediaStream);
+			aSrc.disconnect();
+		}
+		if (!!aDest) {
+			aDest.disconnect();
 		}
 		if (!!aCtx) {
 			aCtx.close();
@@ -310,7 +352,6 @@ var Video = (function() {
 	self.mute = _mute;
 	self.isMuted = function() { return 0 === slider.slider('option', 'value'); };
 	self.init = _init;
-	self.initGain = _initGain;
 	self.client = function() { return c; };
 	self.setRights = _setRights;
 	self.video = function() { return video[0]; };