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.