diff --git a/openvidu-server/src/main/java/io/openvidu/server/cdr/CDREventRecording.java b/openvidu-server/src/main/java/io/openvidu/server/cdr/CDREventRecording.java index 266f0d0a..0ffefc85 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/cdr/CDREventRecording.java +++ b/openvidu-server/src/main/java/io/openvidu/server/cdr/CDREventRecording.java @@ -51,6 +51,7 @@ public class CDREventRecording extends CDREventEnd { json.addProperty("outputMode", this.recording.getOutputMode().name()); if (RecordingUtils.IS_COMPOSED(this.recording.getOutputMode()) && this.recording.hasVideo()) { json.addProperty("resolution", this.recording.getResolution()); + json.addProperty("frameRate", this.recording.getFrameRate()); json.addProperty("recordingLayout", this.recording.getRecordingLayout().name()); if (RecordingLayout.CUSTOM.equals(this.recording.getRecordingLayout()) && this.recording.getCustomLayout() != null && !this.recording.getCustomLayout().isEmpty()) { diff --git a/openvidu-server/src/main/java/io/openvidu/server/cdr/CDREventRecordingStatus.java b/openvidu-server/src/main/java/io/openvidu/server/cdr/CDREventRecordingStatus.java index 8d3b682b..ac4e8fad 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/cdr/CDREventRecordingStatus.java +++ b/openvidu-server/src/main/java/io/openvidu/server/cdr/CDREventRecordingStatus.java @@ -46,6 +46,7 @@ public class CDREventRecordingStatus extends CDREventEnd { json.addProperty("outputMode", this.recording.getOutputMode().name()); if (RecordingUtils.IS_COMPOSED(this.recording.getOutputMode()) && this.recording.hasVideo()) { json.addProperty("resolution", this.recording.getResolution()); + json.addProperty("frameRate", this.recording.getFrameRate()); json.addProperty("recordingLayout", this.recording.getRecordingLayout().name()); if (RecordingLayout.CUSTOM.equals(this.recording.getRecordingLayout()) && this.recording.getCustomLayout() != null && !this.recording.getCustomLayout().isEmpty()) { 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 333bbfc4..b011a32a 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 @@ -31,25 +31,18 @@ import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.stream.Collectors; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.google.gson.JsonArray; import com.google.gson.JsonObject; import io.openvidu.client.OpenViduException; import io.openvidu.client.OpenViduException.Code; import io.openvidu.client.internal.ProtocolElements; -import io.openvidu.java.client.RecordingLayout; import io.openvidu.java.client.SessionProperties; import io.openvidu.server.config.OpenviduConfig; import io.openvidu.server.recording.service.RecordingManager; -import io.openvidu.server.utils.RecordingUtils; public class Session implements SessionInterface { - private static final Logger log = LoggerFactory.getLogger(Session.class); - protected OpenviduConfig openviduConfig; protected RecordingManager recordingManager; @@ -243,13 +236,7 @@ public class Session implements SessionInterface { json.addProperty("createdAt", this.startTime); json.addProperty("mediaMode", this.sessionProperties.mediaMode().name()); json.addProperty("recordingMode", this.sessionProperties.recordingMode().name()); - json.addProperty("defaultOutputMode", this.sessionProperties.defaultOutputMode().name()); - if (RecordingUtils.IS_COMPOSED(this.sessionProperties.defaultOutputMode())) { - json.addProperty("defaultRecordingLayout", this.sessionProperties.defaultRecordingLayout().name()); - if (RecordingLayout.CUSTOM.equals(this.sessionProperties.defaultRecordingLayout())) { - json.addProperty("defaultCustomLayout", this.sessionProperties.defaultCustomLayout()); - } - } + json.add("defaultRecordingProperties", this.sessionProperties.defaultRecordingProperties().toJson()); if (this.sessionProperties.customSessionId() != null) { json.addProperty("customSessionId", this.sessionProperties.customSessionId()); } diff --git a/openvidu-server/src/main/java/io/openvidu/server/core/SessionManager.java b/openvidu-server/src/main/java/io/openvidu/server/core/SessionManager.java index eba563b7..04646b9f 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/core/SessionManager.java +++ b/openvidu-server/src/main/java/io/openvidu/server/core/SessionManager.java @@ -90,7 +90,6 @@ public abstract class SessionManager { @Autowired protected GeoLocationByIp geoLocationByIp; - public FormatChecker formatChecker = new FormatChecker(); private UpdatableTimerTask sessionGarbageCollectorTimer; @@ -594,7 +593,8 @@ public abstract class SessionManager { log.error("Error stopping recording of session {}: {}", session.getSessionId(), e.getMessage()); } } - if (Recording.OutputMode.COMPOSED_QUICK_START.equals(session.getSessionProperties().defaultOutputMode())) { + if (Recording.OutputMode.COMPOSED_QUICK_START + .equals(session.getSessionProperties().defaultRecordingProperties().outputMode())) { try { this.recordingManager.stopComposedQuickStartContainer(session, reason); } catch (OpenViduException e) { 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 228ef0bb..8b7203c1 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 @@ -52,9 +52,7 @@ import io.openvidu.java.client.ConnectionProperties; import io.openvidu.java.client.KurentoOptions; import io.openvidu.java.client.MediaMode; import io.openvidu.java.client.Recording; -import io.openvidu.java.client.RecordingLayout; import io.openvidu.java.client.RecordingMode; -import io.openvidu.java.client.RecordingProperties; import io.openvidu.java.client.SessionProperties; import io.openvidu.java.client.VideoCodec; import io.openvidu.server.cdr.CallDetailRecord; @@ -111,11 +109,9 @@ public class KurentoSessionManager extends SessionManager { if (sessionNotActive == null && this.isInsecureParticipant(participant.getParticipantPrivateId())) { // Insecure user directly call joinRoom RPC method, without REST API use - sessionNotActive = new Session(sessionId, - new SessionProperties.Builder().mediaMode(MediaMode.ROUTED) - .recordingMode(RecordingMode.ALWAYS) - .defaultRecordingLayout(RecordingLayout.BEST_FIT).build(), - openviduConfig, recordingManager); + sessionNotActive = new Session(sessionId, new SessionProperties.Builder() + .mediaMode(MediaMode.ROUTED).recordingMode(RecordingMode.ALWAYS).build(), openviduConfig, + recordingManager); } try { @@ -147,7 +143,8 @@ public class KurentoSessionManager extends SessionManager { } // If Recording default layout is COMPOSED_QUICK_START - Recording.OutputMode defaultOutputMode = kSession.getSessionProperties().defaultOutputMode(); + Recording.OutputMode defaultOutputMode = kSession.getSessionProperties().defaultRecordingProperties() + .outputMode(); if (openviduConfig.isRecordingModuleEnabled() && defaultOutputMode.equals(Recording.OutputMode.COMPOSED_QUICK_START)) { recordingManager.startComposedQuickStartContainer(kSession); @@ -307,7 +304,7 @@ public class KurentoSessionManager extends SessionManager { } else if (remainingParticipants.size() == 1 && openviduConfig.isRecordingModuleEnabled() && MediaMode.ROUTED.equals(session.getSessionProperties().mediaMode()) - && session.getSessionProperties().defaultOutputMode() + && session.getSessionProperties().defaultRecordingProperties().outputMode() .equals(Recording.OutputMode.COMPOSED_QUICK_START) && ProtocolElements.RECORDER_PARTICIPANT_PUBLICID .equals(remainingParticipants.iterator().next().getParticipantPublicId())) { @@ -451,13 +448,8 @@ public class KurentoSessionManager extends SessionManager { // Start automatic recording for sessions configured with RecordingMode.ALWAYS // that have not been been manually stopped new Thread(() -> { - recordingManager.startRecording(kSession, new RecordingProperties.Builder().name("") - .outputMode(kSession.getSessionProperties().defaultOutputMode()) - .recordingLayout(kSession.getSessionProperties().defaultRecordingLayout()) - .customLayout(kSession.getSessionProperties().defaultCustomLayout()) - .resolution(/* - * kSession.getSessionProperties().defaultRecordingResolution() - */"1920x1080").mediaNode(kSession.getMediaNodeId()).build()); + recordingManager.startRecording(kSession, + kSession.getSessionProperties().defaultRecordingProperties()); }).start(); } else if (recordingManager.sessionIsBeingRecorded(kSession.getSessionId())) { // Abort automatic recording stop thread for any recorded session in which a diff --git a/openvidu-server/src/main/java/io/openvidu/server/recording/Recording.java b/openvidu-server/src/main/java/io/openvidu/server/recording/Recording.java index e7737d43..2a6bd8ce 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/recording/Recording.java +++ b/openvidu-server/src/main/java/io/openvidu/server/recording/Recording.java @@ -36,9 +36,6 @@ public class Recording { private long size = 0; // bytes private double duration = 0; // seconds private String url; - private String resolution; - private boolean hasAudio = true; - private boolean hasVideo = true; private RecordingProperties recordingProperties; public AtomicBoolean recordingNotificationSent = new AtomicBoolean(false); @@ -50,9 +47,6 @@ public class Recording { this.id = id; this.status = io.openvidu.java.client.Recording.Status.started; this.recordingProperties = recordingProperties; - this.resolution = this.recordingProperties.resolution(); - this.hasAudio = this.recordingProperties.hasAudio(); - this.hasVideo = this.recordingProperties.hasVideo(); } public Recording(JsonObject json) { @@ -73,17 +67,19 @@ public class Recording { } else { this.url = json.get("url").getAsString(); } - this.hasAudio = json.get("hasAudio").getAsBoolean(); - this.hasVideo = json.get("hasVideo").getAsBoolean(); + this.status = io.openvidu.java.client.Recording.Status.valueOf(json.get("status").getAsString()); + Boolean hasAudio = json.get("hasAudio").getAsBoolean(); + Boolean hasVideo = json.get("hasVideo").getAsBoolean(); + io.openvidu.java.client.Recording.OutputMode outputMode = io.openvidu.java.client.Recording.OutputMode .valueOf(json.get("outputMode").getAsString()); RecordingProperties.Builder builder = new RecordingProperties.Builder().name(json.get("name").getAsString()) - .outputMode(outputMode).hasAudio(this.hasAudio).hasVideo(this.hasVideo); - if (RecordingUtils.IS_COMPOSED(outputMode) && this.hasVideo) { - this.resolution = json.get("resolution").getAsString(); - builder.resolution(this.resolution); + .outputMode(outputMode).hasAudio(hasAudio).hasVideo(hasVideo); + if (RecordingUtils.IS_COMPOSED(outputMode) && hasVideo) { + builder.resolution(json.get("resolution").getAsString()); + builder.frameRate(json.get("frameRate").getAsInt()); RecordingLayout recordingLayout = RecordingLayout.valueOf(json.get("recordingLayout").getAsString()); builder.recordingLayout(recordingLayout); if (RecordingLayout.CUSTOM.equals(recordingLayout)) { @@ -170,27 +166,19 @@ public class Recording { } public String getResolution() { - return resolution; + return this.recordingProperties.resolution(); } - public void setResolution(String resolution) { - this.resolution = resolution; + public int getFrameRate() { + return this.recordingProperties.frameRate(); } public boolean hasAudio() { - return hasAudio; - } - - public void setHasAudio(boolean hasAudio) { - this.hasAudio = hasAudio; + return this.recordingProperties.hasAudio(); } public boolean hasVideo() { - return hasVideo; - } - - public void setHasVideo(boolean hasVideo) { - this.hasVideo = hasVideo; + return this.recordingProperties.hasVideo(); } public JsonObject toJson(boolean withUniqueSessionId) { @@ -199,8 +187,8 @@ public class Recording { json.addProperty("object", "recording"); json.addProperty("name", this.recordingProperties.name()); json.addProperty("outputMode", this.getOutputMode().name()); - if (RecordingUtils.IS_COMPOSED(this.recordingProperties.outputMode()) && this.hasVideo) { - json.addProperty("resolution", this.resolution); + if (RecordingUtils.IS_COMPOSED(this.recordingProperties.outputMode()) && this.recordingProperties.hasVideo()) { + json.addProperty("resolution", this.recordingProperties.resolution()); json.addProperty("recordingLayout", this.recordingProperties.recordingLayout().name()); if (RecordingLayout.CUSTOM.equals(this.recordingProperties.recordingLayout())) { json.addProperty("customLayout", this.recordingProperties.customLayout()); @@ -217,10 +205,28 @@ public class Recording { json.addProperty("size", this.size); json.addProperty("duration", this.duration); json.addProperty("url", this.url); - json.addProperty("hasAudio", this.hasAudio); - json.addProperty("hasVideo", this.hasVideo); + json.addProperty("hasAudio", this.recordingProperties.hasAudio()); + json.addProperty("hasVideo", this.recordingProperties.hasVideo()); json.addProperty("status", this.status.toString()); return json; } + public void setHasAudio(boolean hasAudio) { + this.recordingProperties = new RecordingProperties.Builder(this.recordingProperties).hasAudio(hasAudio).build(); + } + + public void setHasVideo(boolean hasVideo) { + this.recordingProperties = new RecordingProperties.Builder(this.recordingProperties).hasVideo(hasVideo).build(); + } + + public void setResolution(String resolution) { + this.recordingProperties = new RecordingProperties.Builder(this.recordingProperties).resolution(resolution) + .build(); + } + + public void setFrameRate(int frameRate) { + this.recordingProperties = new RecordingProperties.Builder(this.recordingProperties).frameRate(frameRate) + .build(); + } + } diff --git a/openvidu-server/src/main/java/io/openvidu/server/recording/service/ComposedQuickStartRecordingService.java b/openvidu-server/src/main/java/io/openvidu/server/recording/service/ComposedQuickStartRecordingService.java index 0c747c2a..a12fedee 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/recording/service/ComposedQuickStartRecordingService.java +++ b/openvidu-server/src/main/java/io/openvidu/server/recording/service/ComposedQuickStartRecordingService.java @@ -74,8 +74,8 @@ public class ComposedQuickStartRecordingService extends ComposedRecordingService envs.add("DEBUG_MODE=" + openviduConfig.isOpenViduRecordingDebug()); envs.add("RESOLUTION=" + properties.resolution()); + envs.add("FRAMERATE=" + properties.frameRate()); envs.add("ONLY_VIDEO=" + !properties.hasAudio()); - envs.add("FRAMERATE=30"); envs.add("VIDEO_ID=" + recording.getId()); envs.add("VIDEO_NAME=" + properties.name()); envs.add("VIDEO_FORMAT=mp4"); @@ -164,7 +164,7 @@ public class ComposedQuickStartRecordingService extends ComposedRecordingService // Start recording container if output mode=COMPOSED_QUICK_START Session recorderSession = session; io.openvidu.java.client.Recording.OutputMode defaultOutputMode = recorderSession.getSessionProperties() - .defaultOutputMode(); + .defaultRecordingProperties().outputMode(); if (io.openvidu.java.client.Recording.OutputMode.COMPOSED_QUICK_START.equals(defaultOutputMode) && sessionsContainers.get(recorderSession.getSessionId()) == null) { // Retry to run if container is launched for the same session quickly after @@ -177,13 +177,7 @@ public class ComposedQuickStartRecordingService extends ComposedRecordingService try { log.info("Launching COMPOSED_QUICK_START recording container for session: {}", recorderSession.getSessionId()); - runContainer(recorderSession, new RecordingProperties.Builder().name("") - .outputMode(recorderSession.getSessionProperties().defaultOutputMode()) - .recordingLayout(recorderSession.getSessionProperties().defaultRecordingLayout()) - .customLayout(recorderSession.getSessionProperties().defaultCustomLayout()) - .resolution( - /* recorderSession.getSessionProperties().defaultRecordingResolution() */"1920x1080") - .mediaNode(recorderSession.getMediaNodeId()).build()); + runContainer(recorderSession, recorderSession.getSessionProperties().defaultRecordingProperties()); log.info("COMPOSED_QUICK_START recording container launched for session: {}", recorderSession.getSessionId()); launched = true; diff --git a/openvidu-server/src/main/java/io/openvidu/server/recording/service/ComposedRecordingService.java b/openvidu-server/src/main/java/io/openvidu/server/recording/service/ComposedRecordingService.java index 441cb6d7..03dee0cf 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/recording/service/ComposedRecordingService.java +++ b/openvidu-server/src/main/java/io/openvidu/server/recording/service/ComposedRecordingService.java @@ -153,7 +153,7 @@ public class ComposedRecordingService extends RecordingService { envs.add("URL=" + layoutUrl); envs.add("ONLY_VIDEO=" + !properties.hasAudio()); envs.add("RESOLUTION=" + properties.resolution()); - envs.add("FRAMERATE=30"); + envs.add("FRAMERATE=" + properties.frameRate()); envs.add("VIDEO_ID=" + recording.getId()); envs.add("VIDEO_NAME=" + properties.name()); envs.add("VIDEO_FORMAT=mp4"); @@ -420,6 +420,7 @@ public class ComposedRecordingService extends RecordingService { recording.setDuration(infoUtils.getDurationInSeconds()); recording.setSize(infoUtils.getSizeInBytes()); recording.setResolution(infoUtils.videoWidth() + "x" + infoUtils.videoHeight()); + recording.setFrameRate(infoUtils.getVideoFramerate()); recording.setHasAudio(infoUtils.hasAudio()); recording.setHasVideo(infoUtils.hasVideo()); } @@ -435,6 +436,7 @@ public class ComposedRecordingService extends RecordingService { final String VIDEO_FILE = this.openviduConfig.getOpenViduRecordingPath() + recording.getId() + "/" + recording.getName() + RecordingService.COMPOSED_RECORDING_EXTENSION; this.fileManager.waitForFileToExistAndNotEmpty(recording.getRecordingProperties().mediaNode(), VIDEO_FILE); + log.info("File {} exists and is not empty", VIDEO_FILE); } protected void failRecordingCompletion(Recording recording, String containerId, boolean removeContainer, diff --git a/openvidu-server/src/main/java/io/openvidu/server/recording/service/RecordingManager.java b/openvidu-server/src/main/java/io/openvidu/server/recording/service/RecordingManager.java index 9b7cf59e..7d69428d 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/recording/service/RecordingManager.java +++ b/openvidu-server/src/main/java/io/openvidu/server/recording/service/RecordingManager.java @@ -513,7 +513,10 @@ public class RecordingManager { } public String getFreeRecordingId(String sessionId) { - return recordingManagerUtils.getFreeRecordingId(sessionId); + log.info("Getting free recording id for session {}", sessionId); + String recordingId = recordingManagerUtils.getFreeRecordingId(sessionId); + log.info("Free recording id got for session {}: {}", sessionId, recordingId); + return recordingId; } public HttpStatus deleteRecordingFromHost(String recordingId, boolean force) { 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 b814a788..c86f8b2c 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 @@ -723,17 +723,11 @@ public class SessionRestController { String mediaModeString; String recordingModeString; - String defaultOutputModeString; - String defaultRecordingLayoutString; - String defaultCustomLayout; String forcedVideoCodec; Boolean allowTranscoding; try { mediaModeString = (String) params.get("mediaMode"); recordingModeString = (String) params.get("recordingMode"); - defaultOutputModeString = (String) params.get("defaultOutputMode"); - defaultRecordingLayoutString = (String) params.get("defaultRecordingLayout"); - defaultCustomLayout = (String) params.get("defaultCustomLayout"); customSessionId = (String) params.get("customSessionId"); forcedVideoCodec = (String) params.get("forcedVideoCodec"); allowTranscoding = (Boolean) params.get("allowTranscoding"); @@ -749,23 +743,6 @@ public class SessionRestController { } else { builder = builder.recordingMode(RecordingMode.MANUAL); } - if (defaultOutputModeString != null) { - OutputMode defaultOutputMode = OutputMode.valueOf(defaultOutputModeString); - builder = builder.defaultOutputMode(defaultOutputMode); - } else { - builder.defaultOutputMode(OutputMode.COMPOSED); - } - if (defaultRecordingLayoutString != null) { - RecordingLayout defaultRecordingLayout = RecordingLayout.valueOf(defaultRecordingLayoutString); - builder = builder.defaultRecordingLayout(defaultRecordingLayout); - } else { - builder.defaultRecordingLayout(RecordingLayout.BEST_FIT); - } - if (defaultCustomLayout != null) { - builder.defaultCustomLayout(defaultCustomLayout); - } else { - builder.defaultCustomLayout(""); - } if (mediaModeString != null) { MediaMode mediaMode = MediaMode.valueOf(mediaModeString); builder = builder.mediaMode(mediaMode); @@ -790,11 +767,30 @@ public class SessionRestController { builder = builder.allowTranscoding(openviduConfig.isOpenviduAllowingTranscoding()); } + JsonObject defaultRecordingPropertiesJson = null; + if (params.get("defaultRecordingProperties") != null) { + try { + defaultRecordingPropertiesJson = new Gson() + .toJsonTree(params.get("defaultRecordingProperties"), Map.class).getAsJsonObject(); + } catch (Exception e) { + throw new Exception( + "Error in parameter 'defaultRecordingProperties'. It is not a valid JSON object"); + } + } + if (defaultRecordingPropertiesJson != null) { + try { + RecordingProperties defaultRecordingProperties = RecordingProperties + .fromJson(defaultRecordingPropertiesJson); + builder = builder.defaultRecordingProperties(defaultRecordingProperties); + } catch (Exception e) { + throw new Exception("Parameter 'defaultRecordingProperties' is not valid: " + e.getMessage()); + } + } else { + builder.defaultRecordingProperties(new RecordingProperties.Builder().build()); + } + } catch (IllegalArgumentException e) { - throw new Exception("RecordingMode " + params.get("recordingMode") + " | " + "Default OutputMode " - + params.get("defaultOutputMode") + " | " + "Default RecordingLayout " - + params.get("defaultRecordingLayout") + " | " + "MediaMode " + params.get("mediaMode") - + ". Some parameter is not defined"); + throw new Exception("Some parameter is not valid. " + e.getMessage()); } } return builder; @@ -850,7 +846,7 @@ public class SessionRestController { JsonObject kurentoOptionsJson = null; if (params.get("kurentoOptions") != null) { try { - kurentoOptionsJson = JsonParser.parseString(params.get("kurentoOptions").toString()) + kurentoOptionsJson = new Gson().toJsonTree(params.get("kurentoOptions"), Map.class) .getAsJsonObject(); } catch (Exception e) { throw new Exception("Error in parameter 'kurentoOptions'. It is not a valid JSON object"); @@ -925,6 +921,7 @@ public class SessionRestController { String name; String outputModeString; String resolution; + Integer frameRate; Boolean hasAudio; Boolean hasVideo; String recordingLayoutString; @@ -935,6 +932,7 @@ public class SessionRestController { name = (String) params.get("name"); outputModeString = (String) params.get("outputMode"); resolution = (String) params.get("resolution"); + frameRate = (Integer) params.get("frameRate"); hasAudio = (Boolean) params.get("hasAudio"); hasVideo = (Boolean) params.get("hasVideo"); recordingLayoutString = (String) params.get("recordingLayout"); @@ -971,6 +969,9 @@ public class SessionRestController { throw new RuntimeException( "Wrong 'resolution' parameter. Acceptable values from 100 to 1999 for both width and height"); } + if (frameRate != null && !sessionManager.formatChecker.isAcceptableRecordingFrameRate(frameRate)) { + throw new RuntimeException("Wrong 'frameRate' parameter. Must be a number between 1 and 120"); + } if (recordingLayoutString != null && !recordingLayoutString.isEmpty()) { try { recordingLayout = RecordingLayout.valueOf(recordingLayoutString); @@ -984,9 +985,11 @@ public class SessionRestController { throw new RuntimeException("Cannot start a recording with both \"hasAudio\" and \"hasVideo\" set to false"); } + RecordingProperties defaultRecordingProperties = session.getSessionProperties().defaultRecordingProperties(); + // If outputMode is COMPOSED when defaultOutputMode is COMPOSED_QUICK_START, // change outputMode to COMPOSED_QUICK_START (and vice versa) - OutputMode defaultOutputMode = session.getSessionProperties().defaultOutputMode(); + OutputMode defaultOutputMode = defaultRecordingProperties.outputMode(); if (OutputMode.COMPOSED_QUICK_START.equals(defaultOutputMode) && OutputMode.COMPOSED.equals(finalOutputMode)) { finalOutputMode = OutputMode.COMPOSED_QUICK_START; } else if (OutputMode.COMPOSED.equals(defaultOutputMode) @@ -994,17 +997,14 @@ public class SessionRestController { finalOutputMode = OutputMode.COMPOSED; } - builder.outputMode( - finalOutputMode == null ? session.getSessionProperties().defaultOutputMode() : finalOutputMode); + builder.outputMode(finalOutputMode == null ? defaultRecordingProperties.outputMode() : finalOutputMode); if (RecordingUtils.IS_COMPOSED(finalOutputMode)) { - builder.resolution(resolution != null ? resolution : "1920x1080"); // resolution == null ? - // sessionProperties.defaultRecordingResolution) - // : resolution)); - builder.recordingLayout(recordingLayout == null ? session.getSessionProperties().defaultRecordingLayout() - : recordingLayout); + builder.resolution(resolution == null ? defaultRecordingProperties.resolution() : resolution); + builder.frameRate(frameRate == null ? defaultRecordingProperties.frameRate() : frameRate); + builder.recordingLayout( + recordingLayout == null ? defaultRecordingProperties.recordingLayout() : recordingLayout); if (RecordingLayout.CUSTOM.equals(recordingLayout)) { - builder.customLayout( - customLayout == null ? session.getSessionProperties().defaultCustomLayout() : customLayout); + builder.customLayout(customLayout == null ? defaultRecordingProperties.customLayout() : customLayout); } if (shmSize != null) { if (shmSize < 134217728L) { diff --git a/openvidu-server/src/main/java/io/openvidu/server/utils/FormatChecker.java b/openvidu-server/src/main/java/io/openvidu/server/utils/FormatChecker.java index 267d8f9f..e1076aaf 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/utils/FormatChecker.java +++ b/openvidu-server/src/main/java/io/openvidu/server/utils/FormatChecker.java @@ -25,6 +25,11 @@ public class FormatChecker { return stringResolution.matches("^(?!(0))(([0-9]{3})|1([0-9]{3}))x(?!0)(([0-9]{3})|1([0-9]{3}))$"); } + public boolean isAcceptableRecordingFrameRate(Integer frameRate) { + // Integer greater than 0 and below 120 + return (frameRate > 0 && frameRate <= 120); + } + public boolean isServerMetadataFormatCorrect(String metadata) { return true; }