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 2020/11/23 13:38:07 UTC

[openmeetings] branch master updated: [OPENMEETINGS-2523] refresh of audio/video seems to work

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 87fed22  [OPENMEETINGS-2523] refresh of audio/video seems to work
87fed22 is described below

commit 87fed22bbd2f8d900eb618affaa8cffe4afaefcb
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Mon Nov 23 20:37:52 2020 +0700

    [OPENMEETINGS-2523] refresh of audio/video seems to work
---
 .../apache/openmeetings/core/remote/KStream.java   | 25 ++++++++++++++++------
 .../openmeetings/core/remote/StreamProcessor.java  | 13 +++++++++++
 .../apache/openmeetings/web/room/raw-settings.js   |  4 ++--
 .../openmeetings/web/room/raw-video-manager.js     |  5 ++++-
 .../org/apache/openmeetings/web/room/raw-video.js  | 18 ++++++++++++----
 5 files changed, 52 insertions(+), 13 deletions(-)

diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KStream.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KStream.java
index 650ecbe..d744c18 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KStream.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KStream.java
@@ -53,6 +53,7 @@ import org.apache.openmeetings.db.util.ws.RoomMessage;
 import org.apache.openmeetings.db.util.ws.TextRoomMessage;
 import org.kurento.client.Continuation;
 import org.kurento.client.IceCandidate;
+import org.kurento.client.ListenerSubscription;
 import org.kurento.client.MediaFlowState;
 import org.kurento.client.MediaObject;
 import org.kurento.client.MediaPipeline;
@@ -82,6 +83,7 @@ public class KStream extends AbstractStream implements ISipCallbacks {
 	private Optional<SipStackProcessor> sipProcessor;
 	private final ConcurrentMap<String, WebRtcEndpoint> listeners = new ConcurrentHashMap<>();
 	private Optional<CompletableFuture<Object>> flowoutFuture = Optional.empty();
+	private ListenerSubscription flowoutSubscription;
 	private Long chunkId;
 	private Type type;
 	private String sdpOffer;
@@ -154,7 +156,7 @@ public class KStream extends AbstractStream implements ISipCallbacks {
 		this.sdpOffer = sdpOffer;
 		outgoingMedia = createEndpoint(sd.getSid(), sd.getUid());
 		outgoingMedia.addMediaSessionTerminatedListener(evt -> log.warn("Media stream terminated {}", sd));
-		outgoingMedia.addMediaFlowOutStateChangeListener(evt -> {
+		flowoutSubscription = outgoingMedia.addMediaFlowOutStateChangeListener(evt -> {
 			log.info("Media Flow STATE :: {}, type {}, evt {}", evt.getState(), evt.getType(), evt.getMediaType());
 			if (MediaFlowState.NOT_FLOWING == evt.getState()) {
 				log.warn("FlowOut Future is created");
@@ -167,11 +169,7 @@ public class KStream extends AbstractStream implements ISipCallbacks {
 					return null;
 				}, delayedExecutor(getFlowoutTimeout(), TimeUnit.SECONDS)));
 			} else {
-				flowoutFuture.ifPresent(f -> {
-					log.warn("FlowOut Future is canceled");
-					f.cancel(true);
-					flowoutFuture = Optional.empty();
-				});
+				dropFlowoutFuture();
 			}
 		});
 		outgoingMedia.addMediaFlowInStateChangeListener(evt -> log.warn("Media FlowIn :: {}", evt));
@@ -194,6 +192,21 @@ public class KStream extends AbstractStream implements ISipCallbacks {
 		}
 	}
 
+	public void broadcastRestarted() {
+		if (outgoingMedia != null && flowoutSubscription != null) {
+			outgoingMedia.removeMediaFlowOutStateChangeListener(flowoutSubscription);
+		}
+		dropFlowoutFuture();
+	}
+
+	private void dropFlowoutFuture() {
+		flowoutFuture.ifPresent(f -> {
+			log.warn("FlowOut Future is canceled");
+			f.cancel(true);
+			flowoutFuture = Optional.empty();
+		});
+	}
+
 	public void addListener(String sid, String uid, String sdpOffer) {
 		final boolean self = uid.equals(this.uid);
 		log.info("USER {}: have started {} in kRoom {}", uid, self ? "broadcasting" : "receiving", getRoomId());
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
index 60c0030..be483e0 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
@@ -109,6 +109,9 @@ public class StreamProcessor implements IStreamProcessor {
 			case "broadcastStarted":
 				handleBroadcastStarted(c, uid, msg);
 				break;
+			case "broadcastRestarted":
+				handleBroadcastRestarted(c, uid);
+				break;
 			case "onIceCandidate":
 				sender = getByUid(uid);
 				if (sender != null) {
@@ -173,6 +176,16 @@ public class StreamProcessor implements IStreamProcessor {
 		}
 	}
 
+	private void handleBroadcastRestarted(Client c, final String uid) {
+		if (!kHandler.isConnected()) {
+			return;
+		}
+		KStream sender = getByUid(uid);
+		if (sender != null) {
+			sender.broadcastRestarted();
+		}
+	}
+
 	private void handleBroadcastStarted(Client c, final String uid, JSONObject msg) {
 		if (!kHandler.isConnected()) {
 			return;
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 614e26b..c3b2be0 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
@@ -240,8 +240,8 @@ var VideoSettings = (function() {
 			});
 			cnts.video.width = width < 1281 ? width : 1280;
 		} else {
-			cnts.video.width = s.video.width;
-			cnts.video.height = s.video.height;
+			cnts.video.width = o.interview ? 320 : s.video.width;
+			cnts.video.height = o.interview ? 260 : s.video.height;
 		}
 	}
 	//each bool OR https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints
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 491d5d0..af5b889 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
@@ -36,7 +36,7 @@ var VideoManager = (function() {
 	}
 	function _onReceive(msg) {
 		const uid = msg.stream.uid;
-		$('#' + VideoUtil.getVid(uid)).remove();
+		_closeV($('#' + VideoUtil.getVid(uid)));
 		Video().init(msg);
 		OmUtil.log(uid + ' receiving video');
 	}
@@ -148,6 +148,9 @@ var VideoManager = (function() {
 		});
 	}
 	function _closeV(v) {
+		if (!v || v.length < 1) {
+			return;
+		}
 		if (v.dialog('instance') !== undefined) {
 			v.dialog('destroy');
 		}
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 f600b83..089306f 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
@@ -456,7 +456,16 @@ var Video = (function() {
 		}
 	}
 	function _refresh(_msg) {
-		const msg = _msg || {iceServers: iceServers};
+		const msg = _msg || {
+			iceServers: iceServers
+			, instanceUid: v.length > 0 ? v.data('instance-uid') : undefined
+		};
+		if (sd.self) {
+			VideoManager.sendMessage({
+				id : 'broadcastRestarted'
+				, uid: sd.uid
+			});
+		}
 		_cleanup();
 		const hasAudio = VideoUtil.hasMic(sd)
 			, state = {
@@ -567,9 +576,10 @@ var Video = (function() {
 	function _reattachStream() {
 		states.forEach(state => {
 			if (state.video && state.video.length > 0) {
-				const data = state.data;
-				if (data.rtcPeer) {
-					state.video[0].srcObject = sd.self ? data.rtcPeer.getLocalStream() : data.rtcPeer.getRemoteStream();
+				const data = state.data
+					, videoEl = state.video[0];
+				if (data.rtcPeer && (!videoEl.srcObject || !videoEl.srcObject.active)) {
+					videoEl.srcObject = sd.self ? data.rtcPeer.getLocalStream() : data.rtcPeer.getRemoteStream();
 				}
 			}
 		});