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 <[email protected]>
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
[email protected].

Reply via email to