From fe9d4605f75c15b0ce8bc7ab3f450c1f40dd7311 Mon Sep 17 00:00:00 2001 From: pabloFuente Date: Mon, 11 Feb 2019 16:43:55 +0100 Subject: [PATCH] openvidu-server: do not start automatic recording after manual stop if new only publisher --- .../java/io/openvidu/server/core/Session.java | 3 ++ .../kurento/core/KurentoSessionManager.java | 35 ++++++++++--------- .../server/rest/SessionRestController.java | 2 ++ 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/openvidu-server/src/main/java/io/openvidu/server/core/Session.java b/openvidu-server/src/main/java/io/openvidu/server/core/Session.java index b7897bb3..163e20e5 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/core/Session.java +++ b/openvidu-server/src/main/java/io/openvidu/server/core/Session.java @@ -21,6 +21,7 @@ import java.util.HashSet; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; @@ -52,6 +53,8 @@ public class Session implements SessionInterface { protected volatile boolean closed = false; protected AtomicInteger activePublishers = new AtomicInteger(0); + public final AtomicBoolean recordingManuallyStopped = new AtomicBoolean(false); + public Session(Session previousSession) { this.sessionId = previousSession.getSessionId(); this.startTime = previousSession.getStartTime(); diff --git a/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoSessionManager.java b/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoSessionManager.java index 2fa20b70..4b66a7cc 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoSessionManager.java +++ b/openvidu-server/src/main/java/io/openvidu/server/kurento/core/KurentoSessionManager.java @@ -250,7 +250,7 @@ public class KurentoSessionManager extends SessionManager { participant.getParticipantPublicId()); SdpType sdpType = kurentoOptions.isOffer ? SdpType.OFFER : SdpType.ANSWER; - KurentoSession session = kParticipant.getSession(); + KurentoSession kSession = kParticipant.getSession(); kParticipant.createPublishingEndpoint(mediaOptions); @@ -271,7 +271,7 @@ public class KurentoSessionManager extends SessionManager { log.error("PARTICIPANT {}: Error applying filter. The token has no permissions to apply filter {}", participant.getParticipantPublicId(), kurentoOptions.getFilter().getType(), e); sessionEventsHandler.onPublishMedia(participant, null, kParticipant.getPublisher().createdAt(), - session.getSessionId(), mediaOptions, sdpAnswer, participants, transactionId, e); + kSession.getSessionId(), mediaOptions, sdpAnswer, participants, transactionId, e); throw e; } } @@ -284,44 +284,45 @@ public class KurentoSessionManager extends SessionManager { "Error generating SDP response for publishing user " + participant.getParticipantPublicId()); log.error("PARTICIPANT {}: Error publishing media", participant.getParticipantPublicId(), e); sessionEventsHandler.onPublishMedia(participant, null, kParticipant.getPublisher().createdAt(), - session.getSessionId(), mediaOptions, sdpAnswer, participants, transactionId, e); + kSession.getSessionId(), mediaOptions, sdpAnswer, participants, transactionId, e); } if (this.openviduConfig.isRecordingModuleEnabled() - && MediaMode.ROUTED.equals(session.getSessionProperties().mediaMode()) - && session.getActivePublishers() == 0) { - if (RecordingMode.ALWAYS.equals(session.getSessionProperties().recordingMode()) - && !recordingManager.sessionIsBeingRecorded(session.getSessionId())) { + && MediaMode.ROUTED.equals(kSession.getSessionProperties().mediaMode()) + && kSession.getActivePublishers() == 0) { + if (RecordingMode.ALWAYS.equals(kSession.getSessionProperties().recordingMode()) + && !recordingManager.sessionIsBeingRecorded(kSession.getSessionId()) + && !kSession.recordingManuallyStopped.get()) { // Start automatic recording for sessions configured with RecordingMode.ALWAYS new Thread(() -> { - recordingManager.startRecording(session, + recordingManager.startRecording(kSession, new RecordingProperties.Builder().name("") - .outputMode(session.getSessionProperties().defaultOutputMode()) - .recordingLayout(session.getSessionProperties().defaultRecordingLayout()) - .customLayout(session.getSessionProperties().defaultCustomLayout()).build()); + .outputMode(kSession.getSessionProperties().defaultOutputMode()) + .recordingLayout(kSession.getSessionProperties().defaultRecordingLayout()) + .customLayout(kSession.getSessionProperties().defaultCustomLayout()).build()); }).start(); - } else if (RecordingMode.MANUAL.equals(session.getSessionProperties().recordingMode()) - && recordingManager.sessionIsBeingRecorded(session.getSessionId())) { + } else if (RecordingMode.MANUAL.equals(kSession.getSessionProperties().recordingMode()) + && recordingManager.sessionIsBeingRecorded(kSession.getSessionId())) { // Abort automatic recording stop (user published before timeout) log.info("Participant {} published before timeout finished. Aborting automatic recording stop", participant.getParticipantPublicId()); - boolean stopAborted = recordingManager.abortAutomaticRecordingStopThread(session); + boolean stopAborted = recordingManager.abortAutomaticRecordingStopThread(kSession); if (stopAborted) { log.info("Automatic recording stopped succesfully aborted"); } else { log.info("Automatic recording stopped couldn't be aborted. Recording of session {} has stopped", - session.getSessionId()); + kSession.getSessionId()); } } } - session.newPublisher(participant); + kSession.newPublisher(participant); participants = kParticipant.getSession().getParticipants(); if (sdpAnswer != null) { sessionEventsHandler.onPublishMedia(participant, participant.getPublisherStreamId(), - kParticipant.getPublisher().createdAt(), session.getSessionId(), mediaOptions, sdpAnswer, + kParticipant.getPublisher().createdAt(), kSession.getSessionId(), mediaOptions, sdpAnswer, participants, transactionId, null); } } diff --git a/openvidu-server/src/main/java/io/openvidu/server/rest/SessionRestController.java b/openvidu-server/src/main/java/io/openvidu/server/rest/SessionRestController.java index b3617ba4..caa17775 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/rest/SessionRestController.java +++ b/openvidu-server/src/main/java/io/openvidu/server/rest/SessionRestController.java @@ -514,6 +514,8 @@ public class SessionRestController { Recording stoppedRecording = this.recordingManager.stopRecording(session, recording.getId(), "recordingStoppedByServer"); + session.recordingManuallyStopped.set(true); + if (session != null && OutputMode.COMPOSED.equals(recording.getOutputMode()) && recording.hasVideo()) { sessionManager.evictParticipant( session.getParticipantByPublicId(ProtocolElements.RECORDER_PARTICIPANT_PUBLICID), null, null,