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/03/22 16:01:50 UTC

[openmeetings] branch master updated: [OPENMEETINGS-1854] play 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 396d627  [OPENMEETINGS-1854] play seems to work
396d627 is described below

commit 396d627ef0f927c16ca14d238ba1588e2d2051d9
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Thu Mar 22 23:01:42 2018 +0700

    [OPENMEETINGS-1854] play seems to work
---
 .../apache/openmeetings/core/remote/KTestUser.java | 107 ++++++++++++++++++---
 .../openmeetings/core/remote/KurentoHandler.java   |   7 +-
 .../mail/template/AbstractTemplatePanel.java       |   2 +-
 .../subject/RecordingExpiringTemplate.java         |   2 +-
 .../openmeetings/web/common/OmWebSocketPanel.java  |  20 +++-
 .../apache/openmeetings/web/pages/HashPage.java    |   4 +-
 .../apache/openmeetings/web/room/RoomPanel.java    |   2 +-
 .../apache/openmeetings/web/room/settings-base.js  |  58 ++++++++---
 .../openmeetings/web/room/sidebar/RoomSidebar.java |   2 +-
 .../apache/openmeetings/web/user/chat/Chat.java    |   2 +-
 .../openmeetings/web/user/chat/ChatForm.java       |   2 +-
 .../openmeetings/web/user/chat/ChatToolbar.java    |   2 +-
 12 files changed, 171 insertions(+), 39 deletions(-)

diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KTestUser.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KTestUser.java
index d273f44..d9d086d 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KTestUser.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KTestUser.java
@@ -32,12 +32,15 @@ import java.util.concurrent.TimeUnit;
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.entity.basic.IWsClient;
 import org.kurento.client.Continuation;
+import org.kurento.client.EndOfStreamEvent;
+import org.kurento.client.ErrorEvent;
 import org.kurento.client.EventListener;
 import org.kurento.client.IceCandidate;
 import org.kurento.client.IceCandidateFoundEvent;
 import org.kurento.client.MediaPipeline;
 import org.kurento.client.MediaProfileSpecType;
 import org.kurento.client.MediaType;
+import org.kurento.client.PlayerEndpoint;
 import org.kurento.client.RecorderEndpoint;
 import org.kurento.client.RecordingEvent;
 import org.kurento.client.StoppedEvent;
@@ -56,7 +59,8 @@ public class KTestUser {
 	private ScheduledFuture<?> recHandle;
 	private int recTime;
 
-	public KTestUser(IWsClient _c, JSONObject msg, KurentoHandler handler, MediaPipeline pipeline) {
+	public KTestUser(IWsClient _c, JSONObject msg, MediaPipeline pipeline) {
+		this.pipeline = pipeline;
 		webRtcEndpoint = new WebRtcEndpoint.Builder(pipeline).build();
 		webRtcEndpoint.connect(webRtcEndpoint);
 
@@ -84,6 +88,7 @@ public class KTestUser {
 			@Override
 			public void onEvent(StoppedEvent event) {
 				WebSocketHelper.sendClient(_c, newTestKurentoMsg().put("id", "recStopped"));
+				release();
 			}
 		});
 		switch (profile) {
@@ -107,18 +112,7 @@ public class KTestUser {
 		String sdpAnswer = webRtcEndpoint.processOffer(sdpOffer);
 
 		// 4. Gather ICE candidates
-		webRtcEndpoint.addIceCandidateFoundListener(new EventListener<IceCandidateFoundEvent>() {
-			@Override
-			public void onEvent(IceCandidateFoundEvent event) {
-				IceCandidate cand = event.getCandidate();
-				WebSocketHelper.sendClient(_c, newTestKurentoMsg()
-						.put("id", "iceCandidate")
-						.put("candidate", new JSONObject()
-								.put("candidate", cand.getCandidate())
-								.put("sdpMid", cand.getSdpMid())
-								.put("sdpMLineIndex", cand.getSdpMLineIndex())));
-			}
-		});
+		addIceListener(_c);
 
 		WebSocketHelper.sendClient(_c, newTestKurentoMsg()
 				.put("id", "startResponse")
@@ -137,8 +131,72 @@ public class KTestUser {
 		});
 	}
 
+	public void play(final IWsClient _c, JSONObject msg, MediaPipeline pipeline) {
+		// 1. Media logic
+		this.pipeline = pipeline;
+		webRtcEndpoint = new WebRtcEndpoint.Builder(pipeline).build();
+		PlayerEndpoint player = new PlayerEndpoint.Builder(pipeline, recPath).build();
+		player.connect(webRtcEndpoint);
+
+		// Player listeners
+		player.addErrorListener(new EventListener<ErrorEvent>() {
+			@Override
+			public void onEvent(ErrorEvent event) {
+				log.info("ErrorEvent for player with uid '{}': {}", _c.getUid(), event.getDescription());
+				sendPlayEnd(_c);
+			}
+		});
+		player.addEndOfStreamListener(new EventListener<EndOfStreamEvent>() {
+			@Override
+			public void onEvent(EndOfStreamEvent event) {
+				log.info("EndOfStreamEvent for player with uid '{}'", _c.getUid());
+				sendPlayEnd(_c);
+			}
+		});
+
+		// 3. SDP negotiation
+		String sdpOffer = msg.getString("sdpOffer");
+		String sdpAnswer = webRtcEndpoint.processOffer(sdpOffer);
+
+		// 4. Gather ICE candidates
+		addIceListener(_c);
+
+		// 5. Play recorded stream
+		player.play();
+
+		WebSocketHelper.sendClient(_c, newTestKurentoMsg()
+				.put("id", "playResponse")
+				.put("sdpAnswer", sdpAnswer));
+
+		webRtcEndpoint.gatherCandidates();
+	}
+
 	public void addCandidate(IceCandidate cand) {
-		webRtcEndpoint.addIceCandidate(cand);
+		if (webRtcEndpoint != null) {
+			webRtcEndpoint.addIceCandidate(cand);
+		}
+	}
+
+	private void addIceListener(IWsClient _c) {
+		// 4. Gather ICE candidates
+		webRtcEndpoint.addIceCandidateFoundListener(new EventListener<IceCandidateFoundEvent>() {
+			@Override
+			public void onEvent(IceCandidateFoundEvent event) {
+				IceCandidate cand = event.getCandidate();
+				WebSocketHelper.sendClient(_c, newTestKurentoMsg()
+						.put("id", "iceCandidate")
+						.put("candidate", new JSONObject()
+								.put("candidate", cand.getCandidate())
+								.put("sdpMid", cand.getSdpMid())
+								.put("sdpMLineIndex", cand.getSdpMLineIndex())));
+			}
+		});
+	}
+
+	private void sendPlayEnd(IWsClient _c) {
+		WebSocketHelper.sendClient(_c, newTestKurentoMsg()
+				.put("id", "playStopped"));
+		release();
 	}
 
 	private static MediaProfileSpecType getProfile(JSONObject msg) {
@@ -161,4 +219,25 @@ public class KTestUser {
 			log.error("Uexpected error while creating recording URI", e);
 		}
 	}
+
+	public void release() {
+		pipeline.release(new Continuation<Void>() {
+			@Override
+			public void onSuccess(Void result) throws Exception {
+				log.info("Pipeline released successfully");
+				cleanup();
+			}
+
+			@Override
+			public void onError(Throwable cause) throws Exception {
+				log.info("Error releasing pipeline ", cause);
+				cleanup();
+			}
+		});
+	}
+
+	private void cleanup() {
+		webRtcEndpoint = null;
+		pipeline = null;
+	}
 }
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
index 26d0292..52750e5 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
@@ -68,13 +68,13 @@ public class KurentoHandler {
 
 	public void onMessage(IWsClient _c, JSONObject msg) {
 		final String cmdId = msg.getString("id");
-		if ("test".equals(msg.getString("mode"))) {
+		if ("test".equals(msg.optString("mode"))) {
 			KTestUser user = getTestByUid(_c.getUid());
 			switch (cmdId) {
 				case "start":
 				{
 					//TODO FIXME assert null user ???
-					user = new KTestUser(_c, msg, this, client.createMediaPipeline());
+					user = new KTestUser(_c, msg, client.createMediaPipeline());
 					testsByUid.put(_c.getUid(), user);
 				}
 					break;
@@ -89,6 +89,9 @@ public class KurentoHandler {
 					}
 				}
 					break;
+				case "play":
+					user.play(_c, msg, client.createMediaPipeline());
+					break;
 			}
 		} else {
 			final Client c = (Client)_c;
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePanel.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePanel.java
index 54798a6..b556835 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePanel.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/AbstractTemplatePanel.java
@@ -38,7 +38,7 @@ public abstract class AbstractTemplatePanel extends Panel {
 	protected final Locale locale;
 
 	@SpringBean
-	protected transient IApplication app;
+	protected IApplication app;
 
 	protected AbstractTemplatePanel(Locale locale) {
 		super(COMP_ID);
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/RecordingExpiringTemplate.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/RecordingExpiringTemplate.java
index 866ce83..db696b7 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/RecordingExpiringTemplate.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/mail/template/subject/RecordingExpiringTemplate.java
@@ -38,7 +38,7 @@ public class RecordingExpiringTemplate extends SubjectEmailTemplate {
 	private final User u;
 
 	@SpringBean
-	protected transient RoomDao roomDao;
+	protected RoomDao roomDao;
 
 	private RecordingExpiringTemplate(User u, final Recording rec, long remainingDays) {
 		super(LocaleHelper.getLocale(u));
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmWebSocketPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmWebSocketPanel.java
index d41c652..3f6871c 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmWebSocketPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmWebSocketPanel.java
@@ -92,7 +92,7 @@ public abstract class OmWebSocketPanel extends Panel {
 						OmWebSocketPanel.this.onMessage(handler, m);
 					}
 				} catch (Exception e) {
-					//no-op
+					log.error("Error while processing incoming message", e);
 				}
 			}
 		}
@@ -116,7 +116,7 @@ public abstract class OmWebSocketPanel extends Panel {
 		}
 	};
 	@SpringBean
-	private transient KurentoHandler kHandler;
+	private KurentoHandler kHandler;
 
 	public OmWebSocketPanel(String id) {
 		super(id);
@@ -126,9 +126,19 @@ public abstract class OmWebSocketPanel extends Panel {
 
 	protected abstract IWsClient getWsClient();
 
+	/**
+	 * Override this method to add your own logic
+	 *
+	 * @param message - connected message
+	 */
 	protected void onConnect(ConnectedMessage message) {
 	}
 
+	/**
+	 * Override this method to add your own logic
+	 *
+	 * @param handler - handler to perform some updates
+	 */
 	protected void onConnect(WebSocketRequestHandler handler) {
 	}
 
@@ -136,6 +146,12 @@ public abstract class OmWebSocketPanel extends Panel {
 		log.debug("WebSocketBehavior::closeHandler {}", msg);
 	}
 
+	/**
+	 * Override this method to add your own logic
+	 *
+	 * @param handler - handler to perform some updates
+	 * @param m - incoming message as {@link JSONObject}
+	 */
 	protected void onMessage(WebSocketRequestHandler handler, JSONObject m) {
 	}
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java
index cbeaa73..e6da5d7 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/HashPage.java
@@ -78,9 +78,9 @@ public class HashPage extends BaseInitedPage implements IUpdatable {
 	private final PageParameters p;
 
 	@SpringBean
-	private transient RoomDao roomDao;
+	private RoomDao roomDao;
 	@SpringBean
-	private transient RecordingDao recDao;
+	private RecordingDao recDao;
 
 	public HashPage(PageParameters p) {
 		this.p = p;
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
index 3a56286..4b8a43a 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
@@ -223,7 +223,7 @@ public class RoomPanel extends BasePanel {
 	Component eventDetail = new WebMarkupContainer(EVENT_DETAILS_ID).setVisible(false);
 
 	@SpringBean
-	private transient ClientManager cm;
+	private ClientManager cm;
 
 	public RoomPanel(String id, Room r) {
 		super(id);
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings-base.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings-base.js
index e31441c..88319d1 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings-base.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings-base.js
@@ -97,6 +97,15 @@ var VideoSettings = (function() {
 		_clear();
 		Wicket.Event.unsubscribe("/websocket/message", _onWsMessage);
 	}
+	function _onIceCandidate(candidate) {
+		console.log('Local candidate' + JSON.stringify(candidate));
+		OmUtil.sendMessage({
+			id : 'iceCandidate'
+			, type: 'kurento'
+			, mode: 'test'
+			, candidate: candidate
+		});
+	}
 	function _init(options) {
 		o = JSON.parse(JSON.stringify(options));
 		errs = $('#jsNotifications').kendoNotification({
@@ -112,6 +121,7 @@ var VideoSettings = (function() {
 		vid = vidScroll.find('video');
 		recBtn = vs.find('.rec-start').click(function() {
 			recBtn.prop('disabled', true).button('refresh');
+			playBtn.prop('disabled', true).button('refresh');
 			cam.prop('disabled', true);
 			mic.prop('disabled', true);
 			res.prop('disabled', true);
@@ -126,18 +136,40 @@ var VideoSettings = (function() {
 				, video: cnts.video !== false
 				, audio: cnts.audio !== false
 			});
-			rtcPeer.on('icecandidate', function (candidate) {
-					console.log('Local candidate' + JSON.stringify(candidate));
-					OmUtil.sendMessage({
-						id : 'iceCandidate'
-						, type: 'kurento'
-						, mode: 'test'
-						, candidate: candidate
-					});
-				});
+			rtcPeer.on('icecandidate', _onIceCandidate);
 		});
 		playBtn = vs.find('.play').click(function() {
-			//FIXME TODO swf.play();
+			recBtn.prop('disabled', true).button('refresh');
+			playBtn.prop('disabled', true).button('refresh');
+			cam.prop('disabled', true);
+			mic.prop('disabled', true);
+			res.prop('disabled', true);
+			_clear();
+			rtcPeer = new kurentoUtils.WebRtcPeer.WebRtcPeerRecvonly(
+				{
+					remoteVideo: vid[0]
+					, mediaConstraints: {
+						audio: true
+						, video: true
+					}
+					, onicecandidate: _onIceCandidate
+				}
+				, function(error) {
+					if (error) {
+						return _error(error);
+					}
+					rtcPeer.generateOffer(function(error, offerSdp) {
+						if (error) {
+							return _error('Error generating the offer');
+						}
+						OmUtil.sendMessage({
+							id : 'play'
+							, type: 'kurento'
+							, mode: 'test'
+							, sdpOffer: offerSdp
+						});
+					});
+				});
 		});
 		vs.dialog({
 			classes: {
@@ -187,7 +219,7 @@ var VideoSettings = (function() {
 		_save(); // trigger settings update
 	}
 	function _updateRec() {
-		recBtn.prop('disabled', !recAllowed && (s.video.cam > -1 || s.video.mic > -1)).button('refresh');
+		recBtn.prop('disabled', !recAllowed || (s.video.cam < 0 && s.video.mic < 0)).button('refresh');
 	}
 	function _constraints() {
 		const cnts = {}
@@ -348,6 +380,7 @@ var VideoSettings = (function() {
 			if (m && 'kurento' === m.type && 'test' === m.mode) {
 				console.info('Received message: ', m);
 				switch (m.id) {
+					case 'playResponse':
 					case 'startResponse':
 						console.log('SDP answer received from server. Processing ...');
 
@@ -368,8 +401,9 @@ var VideoSettings = (function() {
 						timer.show().find('.time').text(m.time);
 						break;
 					case 'recStopped':
+					case 'playStopped':
 						timer.hide();
-						recBtn.prop('disabled', false).button('refresh');
+						_updateRec();
 						playBtn.prop('disabled', false).button('refresh');
 						cam.prop('disabled', false);
 						mic.prop('disabled', false);
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
index 51dc5ef..843e4ea 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
@@ -231,7 +231,7 @@ public class RoomSidebar extends Panel {
 	private final Label userCount = new Label("user-count", Model.of(""));
 
 	@SpringBean
-	private transient ClientManager cm;
+	private ClientManager cm;
 
 	public RoomSidebar(String id, final RoomPanel room) {
 		super(id);
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
index 528d151..4b1616b 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/Chat.java
@@ -104,7 +104,7 @@ public class Chat extends Panel {
 	};
 
 	@SpringBean
-	private transient ClientManager cm;
+	private ClientManager cm;
 
 	public Chat(String id) {
 		super(id);
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java
index 68e7f60..17ddc1f 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatForm.java
@@ -66,7 +66,7 @@ public class ChatForm extends Form<Void> {
 	private final HiddenField<String> activeTab = new HiddenField<>("activeTab", Model.of(""));
 
 	@SpringBean
-	private transient ClientManager cm;
+	private ClientManager cm;
 
 	public ChatForm(String id) {
 		super(id);
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
index 1933a49..eab74c5 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/ChatToolbar.java
@@ -140,7 +140,7 @@ public class ChatToolbar extends Panel implements IWysiwygToolbar {
 	});
 
 	@SpringBean
-	private transient ClientManager cm;
+	private ClientManager cm;
 
 	/**
 	 * Constructor

-- 
To stop receiving notification emails like this one, please contact
solomax@apache.org.