mirror of https://github.com/OpenVidu/openvidu.git
openvidu-server: fix recording started client event
parent
03503e586c
commit
3a61ce0f86
|
@ -22,7 +22,6 @@ import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.locks.ReentrantLock;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.kurento.client.GenericMediaEvent;
|
import org.kurento.client.GenericMediaEvent;
|
||||||
|
@ -62,9 +61,7 @@ public class SessionEventsHandler {
|
||||||
@Autowired
|
@Autowired
|
||||||
protected OpenviduConfig openviduConfig;
|
protected OpenviduConfig openviduConfig;
|
||||||
|
|
||||||
Map<String, Recording> recordingsStarted = new ConcurrentHashMap<>();
|
private Map<String, Recording> recordingsToSendClientEvents = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
ReentrantLock lock = new ReentrantLock();
|
|
||||||
|
|
||||||
public void onSessionCreated(Session session) {
|
public void onSessionCreated(Session session) {
|
||||||
CDR.recordSessionCreated(session);
|
CDR.recordSessionCreated(session);
|
||||||
|
@ -290,16 +287,10 @@ public class SessionEventsHandler {
|
||||||
rpcNotificationService.sendResponse(participant.getParticipantPrivateId(), transactionId, result);
|
rpcNotificationService.sendResponse(participant.getParticipantPrivateId(), transactionId, result);
|
||||||
|
|
||||||
if (ProtocolElements.RECORDER_PARTICIPANT_PUBLICID.equals(participant.getParticipantPublicId())) {
|
if (ProtocolElements.RECORDER_PARTICIPANT_PUBLICID.equals(participant.getParticipantPublicId())) {
|
||||||
lock.lock();
|
recordingsToSendClientEvents.computeIfPresent(session.getSessionId(), (key, value) -> {
|
||||||
try {
|
sendRecordingStartedNotification(session, value);
|
||||||
Recording recording = this.recordingsStarted.remove(session.getSessionId());
|
return null;
|
||||||
if (recording != null) {
|
});
|
||||||
// RECORDER participant is now receiving video from the first publisher
|
|
||||||
this.sendRecordingStartedNotification(session, recording);
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
lock.unlock();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -312,7 +303,8 @@ public class SessionEventsHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onNetworkQualityChanged(Participant participant, JsonObject params) {
|
public void onNetworkQualityChanged(Participant participant, JsonObject params) {
|
||||||
rpcNotificationService.sendNotification(participant.getParticipantPrivateId(), ProtocolElements.NETWORKQUALITYCHANGED_METHOD, params);
|
rpcNotificationService.sendNotification(participant.getParticipantPrivateId(),
|
||||||
|
ProtocolElements.NETWORKQUALITYCHANGED_METHOD, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onSendMessage(Participant participant, JsonObject message, Set<Participant> participants,
|
public void onSendMessage(Participant participant, JsonObject message, Set<Participant> participants,
|
||||||
|
@ -460,7 +452,7 @@ public class SessionEventsHandler {
|
||||||
public void sendRecordingStoppedNotification(Session session, Recording recording, EndReason reason) {
|
public void sendRecordingStoppedNotification(Session session, Recording recording, EndReason reason) {
|
||||||
|
|
||||||
// Be sure to clean this map (this should return null)
|
// Be sure to clean this map (this should return null)
|
||||||
this.recordingsStarted.remove(session.getSessionId());
|
recordingsToSendClientEvents.remove(session.getSessionId());
|
||||||
|
|
||||||
// Filter participants by roles according to "OPENVIDU_RECORDING_NOTIFICATION"
|
// Filter participants by roles according to "OPENVIDU_RECORDING_NOTIFICATION"
|
||||||
Set<Participant> existingParticipants;
|
Set<Participant> existingParticipants;
|
||||||
|
@ -570,8 +562,8 @@ public class SessionEventsHandler {
|
||||||
this.rpcNotificationService.closeRpcSession(participantPrivateId);
|
this.rpcNotificationService.closeRpcSession(participantPrivateId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRecordingStarted(String sessionId, Recording recording) {
|
public void storeRecordingToSendClientEvent(Recording recording) {
|
||||||
this.recordingsStarted.put(sessionId, recording);
|
recordingsToSendClientEvents.put(recording.getSessionId(), recording);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Set<Participant> filterParticipantsByRole(OpenViduRole[] roles, Set<Participant> participants) {
|
private Set<Participant> filterParticipantsByRole(OpenViduRole[] roles, Set<Participant> participants) {
|
||||||
|
|
|
@ -280,9 +280,12 @@ public class RecordingManager {
|
||||||
this.cdr.recordRecordingStatusChanged(recording, null, recording.getCreatedAt(),
|
this.cdr.recordRecordingStatusChanged(recording, null, recording.getCreatedAt(),
|
||||||
Status.started);
|
Status.started);
|
||||||
|
|
||||||
if (!(OutputMode.COMPOSED.equals(properties.outputMode()) && properties.hasVideo())) {
|
if (!((properties.outputMode().equals(OutputMode.COMPOSED)
|
||||||
|
|| properties.outputMode().equals(OutputMode.COMPOSED_QUICK_START))
|
||||||
|
&& properties.hasVideo())) {
|
||||||
// Directly send recording started notification for all cases except for
|
// Directly send recording started notification for all cases except for
|
||||||
// COMPOSED recordings with video (will be sent on first RECORDER subscriber)
|
// COMPOSED/COMPOSED_QUICK_START recordings with video (will be sent on first
|
||||||
|
// RECORDER subscriber)
|
||||||
this.sessionHandler.sendRecordingStartedNotification(session, recording);
|
this.sessionHandler.sendRecordingStartedNotification(session, recording);
|
||||||
}
|
}
|
||||||
if (session.getActivePublishers() == 0) {
|
if (session.getActivePublishers() == 0) {
|
||||||
|
@ -835,6 +838,8 @@ public class RecordingManager {
|
||||||
|| (sessionsRecordingsStarting.putIfAbsent(recording.getSessionId(), recording) != null)) {
|
|| (sessionsRecordingsStarting.putIfAbsent(recording.getSessionId(), recording) != null)) {
|
||||||
log.error("Concurrent session recording initialization. Aborting this thread");
|
log.error("Concurrent session recording initialization. Aborting this thread");
|
||||||
throw new RuntimeException("Concurrent initialization of recording " + recording.getId());
|
throw new RuntimeException("Concurrent initialization of recording " + recording.getId());
|
||||||
|
} else {
|
||||||
|
this.sessionHandler.storeRecordingToSendClientEvent(recording);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -843,7 +848,6 @@ public class RecordingManager {
|
||||||
* collection
|
* collection
|
||||||
*/
|
*/
|
||||||
private void recordingFromStartingToStarted(Recording recording) {
|
private void recordingFromStartingToStarted(Recording recording) {
|
||||||
this.sessionHandler.setRecordingStarted(recording.getSessionId(), recording);
|
|
||||||
this.sessionsRecordings.put(recording.getSessionId(), recording);
|
this.sessionsRecordings.put(recording.getSessionId(), recording);
|
||||||
this.startingRecordings.remove(recording.getId());
|
this.startingRecordings.remove(recording.getId());
|
||||||
this.sessionsRecordingsStarting.remove(recording.getSessionId());
|
this.sessionsRecordingsStarting.remove(recording.getSessionId());
|
||||||
|
|
Loading…
Reference in New Issue