openvidu-server: RecordingProperties refactoring

pull/621/head
pabloFuente 2021-04-05 20:06:05 +02:00
parent b774d2cefc
commit 6786b67c10
11 changed files with 101 additions and 110 deletions

View File

@ -51,6 +51,7 @@ public class CDREventRecording extends CDREventEnd {
json.addProperty("outputMode", this.recording.getOutputMode().name()); json.addProperty("outputMode", this.recording.getOutputMode().name());
if (RecordingUtils.IS_COMPOSED(this.recording.getOutputMode()) && this.recording.hasVideo()) { if (RecordingUtils.IS_COMPOSED(this.recording.getOutputMode()) && this.recording.hasVideo()) {
json.addProperty("resolution", this.recording.getResolution()); json.addProperty("resolution", this.recording.getResolution());
json.addProperty("frameRate", this.recording.getFrameRate());
json.addProperty("recordingLayout", this.recording.getRecordingLayout().name()); json.addProperty("recordingLayout", this.recording.getRecordingLayout().name());
if (RecordingLayout.CUSTOM.equals(this.recording.getRecordingLayout()) if (RecordingLayout.CUSTOM.equals(this.recording.getRecordingLayout())
&& this.recording.getCustomLayout() != null && !this.recording.getCustomLayout().isEmpty()) { && this.recording.getCustomLayout() != null && !this.recording.getCustomLayout().isEmpty()) {

View File

@ -46,6 +46,7 @@ public class CDREventRecordingStatus extends CDREventEnd {
json.addProperty("outputMode", this.recording.getOutputMode().name()); json.addProperty("outputMode", this.recording.getOutputMode().name());
if (RecordingUtils.IS_COMPOSED(this.recording.getOutputMode()) && this.recording.hasVideo()) { if (RecordingUtils.IS_COMPOSED(this.recording.getOutputMode()) && this.recording.hasVideo()) {
json.addProperty("resolution", this.recording.getResolution()); json.addProperty("resolution", this.recording.getResolution());
json.addProperty("frameRate", this.recording.getFrameRate());
json.addProperty("recordingLayout", this.recording.getRecordingLayout().name()); json.addProperty("recordingLayout", this.recording.getRecordingLayout().name());
if (RecordingLayout.CUSTOM.equals(this.recording.getRecordingLayout()) if (RecordingLayout.CUSTOM.equals(this.recording.getRecordingLayout())
&& this.recording.getCustomLayout() != null && !this.recording.getCustomLayout().isEmpty()) { && this.recording.getCustomLayout() != null && !this.recording.getCustomLayout().isEmpty()) {

View File

@ -31,25 +31,18 @@ import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import io.openvidu.client.OpenViduException; import io.openvidu.client.OpenViduException;
import io.openvidu.client.OpenViduException.Code; import io.openvidu.client.OpenViduException.Code;
import io.openvidu.client.internal.ProtocolElements; import io.openvidu.client.internal.ProtocolElements;
import io.openvidu.java.client.RecordingLayout;
import io.openvidu.java.client.SessionProperties; import io.openvidu.java.client.SessionProperties;
import io.openvidu.server.config.OpenviduConfig; import io.openvidu.server.config.OpenviduConfig;
import io.openvidu.server.recording.service.RecordingManager; import io.openvidu.server.recording.service.RecordingManager;
import io.openvidu.server.utils.RecordingUtils;
public class Session implements SessionInterface { public class Session implements SessionInterface {
private static final Logger log = LoggerFactory.getLogger(Session.class);
protected OpenviduConfig openviduConfig; protected OpenviduConfig openviduConfig;
protected RecordingManager recordingManager; protected RecordingManager recordingManager;
@ -243,13 +236,7 @@ public class Session implements SessionInterface {
json.addProperty("createdAt", this.startTime); json.addProperty("createdAt", this.startTime);
json.addProperty("mediaMode", this.sessionProperties.mediaMode().name()); json.addProperty("mediaMode", this.sessionProperties.mediaMode().name());
json.addProperty("recordingMode", this.sessionProperties.recordingMode().name()); json.addProperty("recordingMode", this.sessionProperties.recordingMode().name());
json.addProperty("defaultOutputMode", this.sessionProperties.defaultOutputMode().name()); json.add("defaultRecordingProperties", this.sessionProperties.defaultRecordingProperties().toJson());
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());
}
}
if (this.sessionProperties.customSessionId() != null) { if (this.sessionProperties.customSessionId() != null) {
json.addProperty("customSessionId", this.sessionProperties.customSessionId()); json.addProperty("customSessionId", this.sessionProperties.customSessionId());
} }

View File

@ -90,7 +90,6 @@ public abstract class SessionManager {
@Autowired @Autowired
protected GeoLocationByIp geoLocationByIp; protected GeoLocationByIp geoLocationByIp;
public FormatChecker formatChecker = new FormatChecker(); public FormatChecker formatChecker = new FormatChecker();
private UpdatableTimerTask sessionGarbageCollectorTimer; private UpdatableTimerTask sessionGarbageCollectorTimer;
@ -594,7 +593,8 @@ public abstract class SessionManager {
log.error("Error stopping recording of session {}: {}", session.getSessionId(), e.getMessage()); 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 { try {
this.recordingManager.stopComposedQuickStartContainer(session, reason); this.recordingManager.stopComposedQuickStartContainer(session, reason);
} catch (OpenViduException e) { } catch (OpenViduException e) {

View File

@ -52,9 +52,7 @@ import io.openvidu.java.client.ConnectionProperties;
import io.openvidu.java.client.KurentoOptions; import io.openvidu.java.client.KurentoOptions;
import io.openvidu.java.client.MediaMode; import io.openvidu.java.client.MediaMode;
import io.openvidu.java.client.Recording; import io.openvidu.java.client.Recording;
import io.openvidu.java.client.RecordingLayout;
import io.openvidu.java.client.RecordingMode; import io.openvidu.java.client.RecordingMode;
import io.openvidu.java.client.RecordingProperties;
import io.openvidu.java.client.SessionProperties; import io.openvidu.java.client.SessionProperties;
import io.openvidu.java.client.VideoCodec; import io.openvidu.java.client.VideoCodec;
import io.openvidu.server.cdr.CallDetailRecord; import io.openvidu.server.cdr.CallDetailRecord;
@ -111,11 +109,9 @@ public class KurentoSessionManager extends SessionManager {
if (sessionNotActive == null && this.isInsecureParticipant(participant.getParticipantPrivateId())) { if (sessionNotActive == null && this.isInsecureParticipant(participant.getParticipantPrivateId())) {
// Insecure user directly call joinRoom RPC method, without REST API use // Insecure user directly call joinRoom RPC method, without REST API use
sessionNotActive = new Session(sessionId, sessionNotActive = new Session(sessionId, new SessionProperties.Builder()
new SessionProperties.Builder().mediaMode(MediaMode.ROUTED) .mediaMode(MediaMode.ROUTED).recordingMode(RecordingMode.ALWAYS).build(), openviduConfig,
.recordingMode(RecordingMode.ALWAYS) recordingManager);
.defaultRecordingLayout(RecordingLayout.BEST_FIT).build(),
openviduConfig, recordingManager);
} }
try { try {
@ -147,7 +143,8 @@ public class KurentoSessionManager extends SessionManager {
} }
// If Recording default layout is COMPOSED_QUICK_START // If Recording default layout is COMPOSED_QUICK_START
Recording.OutputMode defaultOutputMode = kSession.getSessionProperties().defaultOutputMode(); Recording.OutputMode defaultOutputMode = kSession.getSessionProperties().defaultRecordingProperties()
.outputMode();
if (openviduConfig.isRecordingModuleEnabled() if (openviduConfig.isRecordingModuleEnabled()
&& defaultOutputMode.equals(Recording.OutputMode.COMPOSED_QUICK_START)) { && defaultOutputMode.equals(Recording.OutputMode.COMPOSED_QUICK_START)) {
recordingManager.startComposedQuickStartContainer(kSession); recordingManager.startComposedQuickStartContainer(kSession);
@ -307,7 +304,7 @@ public class KurentoSessionManager extends SessionManager {
} else if (remainingParticipants.size() == 1 && openviduConfig.isRecordingModuleEnabled() } else if (remainingParticipants.size() == 1 && openviduConfig.isRecordingModuleEnabled()
&& MediaMode.ROUTED.equals(session.getSessionProperties().mediaMode()) && MediaMode.ROUTED.equals(session.getSessionProperties().mediaMode())
&& session.getSessionProperties().defaultOutputMode() && session.getSessionProperties().defaultRecordingProperties().outputMode()
.equals(Recording.OutputMode.COMPOSED_QUICK_START) .equals(Recording.OutputMode.COMPOSED_QUICK_START)
&& ProtocolElements.RECORDER_PARTICIPANT_PUBLICID && ProtocolElements.RECORDER_PARTICIPANT_PUBLICID
.equals(remainingParticipants.iterator().next().getParticipantPublicId())) { .equals(remainingParticipants.iterator().next().getParticipantPublicId())) {
@ -451,13 +448,8 @@ public class KurentoSessionManager extends SessionManager {
// Start automatic recording for sessions configured with RecordingMode.ALWAYS // Start automatic recording for sessions configured with RecordingMode.ALWAYS
// that have not been been manually stopped // that have not been been manually stopped
new Thread(() -> { new Thread(() -> {
recordingManager.startRecording(kSession, new RecordingProperties.Builder().name("") recordingManager.startRecording(kSession,
.outputMode(kSession.getSessionProperties().defaultOutputMode()) kSession.getSessionProperties().defaultRecordingProperties());
.recordingLayout(kSession.getSessionProperties().defaultRecordingLayout())
.customLayout(kSession.getSessionProperties().defaultCustomLayout())
.resolution(/*
* kSession.getSessionProperties().defaultRecordingResolution()
*/"1920x1080").mediaNode(kSession.getMediaNodeId()).build());
}).start(); }).start();
} else if (recordingManager.sessionIsBeingRecorded(kSession.getSessionId())) { } else if (recordingManager.sessionIsBeingRecorded(kSession.getSessionId())) {
// Abort automatic recording stop thread for any recorded session in which a // Abort automatic recording stop thread for any recorded session in which a

View File

@ -36,9 +36,6 @@ public class Recording {
private long size = 0; // bytes private long size = 0; // bytes
private double duration = 0; // seconds private double duration = 0; // seconds
private String url; private String url;
private String resolution;
private boolean hasAudio = true;
private boolean hasVideo = true;
private RecordingProperties recordingProperties; private RecordingProperties recordingProperties;
public AtomicBoolean recordingNotificationSent = new AtomicBoolean(false); public AtomicBoolean recordingNotificationSent = new AtomicBoolean(false);
@ -50,9 +47,6 @@ public class Recording {
this.id = id; this.id = id;
this.status = io.openvidu.java.client.Recording.Status.started; this.status = io.openvidu.java.client.Recording.Status.started;
this.recordingProperties = recordingProperties; this.recordingProperties = recordingProperties;
this.resolution = this.recordingProperties.resolution();
this.hasAudio = this.recordingProperties.hasAudio();
this.hasVideo = this.recordingProperties.hasVideo();
} }
public Recording(JsonObject json) { public Recording(JsonObject json) {
@ -73,17 +67,19 @@ public class Recording {
} else { } else {
this.url = json.get("url").getAsString(); 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()); 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 io.openvidu.java.client.Recording.OutputMode outputMode = io.openvidu.java.client.Recording.OutputMode
.valueOf(json.get("outputMode").getAsString()); .valueOf(json.get("outputMode").getAsString());
RecordingProperties.Builder builder = new RecordingProperties.Builder().name(json.get("name").getAsString()) RecordingProperties.Builder builder = new RecordingProperties.Builder().name(json.get("name").getAsString())
.outputMode(outputMode).hasAudio(this.hasAudio).hasVideo(this.hasVideo); .outputMode(outputMode).hasAudio(hasAudio).hasVideo(hasVideo);
if (RecordingUtils.IS_COMPOSED(outputMode) && this.hasVideo) { if (RecordingUtils.IS_COMPOSED(outputMode) && hasVideo) {
this.resolution = json.get("resolution").getAsString(); builder.resolution(json.get("resolution").getAsString());
builder.resolution(this.resolution); builder.frameRate(json.get("frameRate").getAsInt());
RecordingLayout recordingLayout = RecordingLayout.valueOf(json.get("recordingLayout").getAsString()); RecordingLayout recordingLayout = RecordingLayout.valueOf(json.get("recordingLayout").getAsString());
builder.recordingLayout(recordingLayout); builder.recordingLayout(recordingLayout);
if (RecordingLayout.CUSTOM.equals(recordingLayout)) { if (RecordingLayout.CUSTOM.equals(recordingLayout)) {
@ -170,27 +166,19 @@ public class Recording {
} }
public String getResolution() { public String getResolution() {
return resolution; return this.recordingProperties.resolution();
} }
public void setResolution(String resolution) { public int getFrameRate() {
this.resolution = resolution; return this.recordingProperties.frameRate();
} }
public boolean hasAudio() { public boolean hasAudio() {
return hasAudio; return this.recordingProperties.hasAudio();
}
public void setHasAudio(boolean hasAudio) {
this.hasAudio = hasAudio;
} }
public boolean hasVideo() { public boolean hasVideo() {
return hasVideo; return this.recordingProperties.hasVideo();
}
public void setHasVideo(boolean hasVideo) {
this.hasVideo = hasVideo;
} }
public JsonObject toJson(boolean withUniqueSessionId) { public JsonObject toJson(boolean withUniqueSessionId) {
@ -199,8 +187,8 @@ public class Recording {
json.addProperty("object", "recording"); json.addProperty("object", "recording");
json.addProperty("name", this.recordingProperties.name()); json.addProperty("name", this.recordingProperties.name());
json.addProperty("outputMode", this.getOutputMode().name()); json.addProperty("outputMode", this.getOutputMode().name());
if (RecordingUtils.IS_COMPOSED(this.recordingProperties.outputMode()) && this.hasVideo) { if (RecordingUtils.IS_COMPOSED(this.recordingProperties.outputMode()) && this.recordingProperties.hasVideo()) {
json.addProperty("resolution", this.resolution); json.addProperty("resolution", this.recordingProperties.resolution());
json.addProperty("recordingLayout", this.recordingProperties.recordingLayout().name()); json.addProperty("recordingLayout", this.recordingProperties.recordingLayout().name());
if (RecordingLayout.CUSTOM.equals(this.recordingProperties.recordingLayout())) { if (RecordingLayout.CUSTOM.equals(this.recordingProperties.recordingLayout())) {
json.addProperty("customLayout", this.recordingProperties.customLayout()); json.addProperty("customLayout", this.recordingProperties.customLayout());
@ -217,10 +205,28 @@ public class Recording {
json.addProperty("size", this.size); json.addProperty("size", this.size);
json.addProperty("duration", this.duration); json.addProperty("duration", this.duration);
json.addProperty("url", this.url); json.addProperty("url", this.url);
json.addProperty("hasAudio", this.hasAudio); json.addProperty("hasAudio", this.recordingProperties.hasAudio());
json.addProperty("hasVideo", this.hasVideo); json.addProperty("hasVideo", this.recordingProperties.hasVideo());
json.addProperty("status", this.status.toString()); json.addProperty("status", this.status.toString());
return json; 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();
}
} }

View File

@ -74,8 +74,8 @@ public class ComposedQuickStartRecordingService extends ComposedRecordingService
envs.add("DEBUG_MODE=" + openviduConfig.isOpenViduRecordingDebug()); envs.add("DEBUG_MODE=" + openviduConfig.isOpenViduRecordingDebug());
envs.add("RESOLUTION=" + properties.resolution()); envs.add("RESOLUTION=" + properties.resolution());
envs.add("FRAMERATE=" + properties.frameRate());
envs.add("ONLY_VIDEO=" + !properties.hasAudio()); envs.add("ONLY_VIDEO=" + !properties.hasAudio());
envs.add("FRAMERATE=30");
envs.add("VIDEO_ID=" + recording.getId()); envs.add("VIDEO_ID=" + recording.getId());
envs.add("VIDEO_NAME=" + properties.name()); envs.add("VIDEO_NAME=" + properties.name());
envs.add("VIDEO_FORMAT=mp4"); envs.add("VIDEO_FORMAT=mp4");
@ -164,7 +164,7 @@ public class ComposedQuickStartRecordingService extends ComposedRecordingService
// Start recording container if output mode=COMPOSED_QUICK_START // Start recording container if output mode=COMPOSED_QUICK_START
Session recorderSession = session; Session recorderSession = session;
io.openvidu.java.client.Recording.OutputMode defaultOutputMode = recorderSession.getSessionProperties() io.openvidu.java.client.Recording.OutputMode defaultOutputMode = recorderSession.getSessionProperties()
.defaultOutputMode(); .defaultRecordingProperties().outputMode();
if (io.openvidu.java.client.Recording.OutputMode.COMPOSED_QUICK_START.equals(defaultOutputMode) if (io.openvidu.java.client.Recording.OutputMode.COMPOSED_QUICK_START.equals(defaultOutputMode)
&& sessionsContainers.get(recorderSession.getSessionId()) == null) { && sessionsContainers.get(recorderSession.getSessionId()) == null) {
// Retry to run if container is launched for the same session quickly after // Retry to run if container is launched for the same session quickly after
@ -177,13 +177,7 @@ public class ComposedQuickStartRecordingService extends ComposedRecordingService
try { try {
log.info("Launching COMPOSED_QUICK_START recording container for session: {}", log.info("Launching COMPOSED_QUICK_START recording container for session: {}",
recorderSession.getSessionId()); recorderSession.getSessionId());
runContainer(recorderSession, new RecordingProperties.Builder().name("") runContainer(recorderSession, recorderSession.getSessionProperties().defaultRecordingProperties());
.outputMode(recorderSession.getSessionProperties().defaultOutputMode())
.recordingLayout(recorderSession.getSessionProperties().defaultRecordingLayout())
.customLayout(recorderSession.getSessionProperties().defaultCustomLayout())
.resolution(
/* recorderSession.getSessionProperties().defaultRecordingResolution() */"1920x1080")
.mediaNode(recorderSession.getMediaNodeId()).build());
log.info("COMPOSED_QUICK_START recording container launched for session: {}", log.info("COMPOSED_QUICK_START recording container launched for session: {}",
recorderSession.getSessionId()); recorderSession.getSessionId());
launched = true; launched = true;

View File

@ -153,7 +153,7 @@ public class ComposedRecordingService extends RecordingService {
envs.add("URL=" + layoutUrl); envs.add("URL=" + layoutUrl);
envs.add("ONLY_VIDEO=" + !properties.hasAudio()); envs.add("ONLY_VIDEO=" + !properties.hasAudio());
envs.add("RESOLUTION=" + properties.resolution()); envs.add("RESOLUTION=" + properties.resolution());
envs.add("FRAMERATE=30"); envs.add("FRAMERATE=" + properties.frameRate());
envs.add("VIDEO_ID=" + recording.getId()); envs.add("VIDEO_ID=" + recording.getId());
envs.add("VIDEO_NAME=" + properties.name()); envs.add("VIDEO_NAME=" + properties.name());
envs.add("VIDEO_FORMAT=mp4"); envs.add("VIDEO_FORMAT=mp4");
@ -420,6 +420,7 @@ public class ComposedRecordingService extends RecordingService {
recording.setDuration(infoUtils.getDurationInSeconds()); recording.setDuration(infoUtils.getDurationInSeconds());
recording.setSize(infoUtils.getSizeInBytes()); recording.setSize(infoUtils.getSizeInBytes());
recording.setResolution(infoUtils.videoWidth() + "x" + infoUtils.videoHeight()); recording.setResolution(infoUtils.videoWidth() + "x" + infoUtils.videoHeight());
recording.setFrameRate(infoUtils.getVideoFramerate());
recording.setHasAudio(infoUtils.hasAudio()); recording.setHasAudio(infoUtils.hasAudio());
recording.setHasVideo(infoUtils.hasVideo()); recording.setHasVideo(infoUtils.hasVideo());
} }
@ -435,6 +436,7 @@ public class ComposedRecordingService extends RecordingService {
final String VIDEO_FILE = this.openviduConfig.getOpenViduRecordingPath() + recording.getId() + "/" final String VIDEO_FILE = this.openviduConfig.getOpenViduRecordingPath() + recording.getId() + "/"
+ recording.getName() + RecordingService.COMPOSED_RECORDING_EXTENSION; + recording.getName() + RecordingService.COMPOSED_RECORDING_EXTENSION;
this.fileManager.waitForFileToExistAndNotEmpty(recording.getRecordingProperties().mediaNode(), VIDEO_FILE); 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, protected void failRecordingCompletion(Recording recording, String containerId, boolean removeContainer,

View File

@ -513,7 +513,10 @@ public class RecordingManager {
} }
public String getFreeRecordingId(String sessionId) { 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) { public HttpStatus deleteRecordingFromHost(String recordingId, boolean force) {

View File

@ -723,17 +723,11 @@ public class SessionRestController {
String mediaModeString; String mediaModeString;
String recordingModeString; String recordingModeString;
String defaultOutputModeString;
String defaultRecordingLayoutString;
String defaultCustomLayout;
String forcedVideoCodec; String forcedVideoCodec;
Boolean allowTranscoding; Boolean allowTranscoding;
try { try {
mediaModeString = (String) params.get("mediaMode"); mediaModeString = (String) params.get("mediaMode");
recordingModeString = (String) params.get("recordingMode"); 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"); customSessionId = (String) params.get("customSessionId");
forcedVideoCodec = (String) params.get("forcedVideoCodec"); forcedVideoCodec = (String) params.get("forcedVideoCodec");
allowTranscoding = (Boolean) params.get("allowTranscoding"); allowTranscoding = (Boolean) params.get("allowTranscoding");
@ -749,23 +743,6 @@ public class SessionRestController {
} else { } else {
builder = builder.recordingMode(RecordingMode.MANUAL); 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) { if (mediaModeString != null) {
MediaMode mediaMode = MediaMode.valueOf(mediaModeString); MediaMode mediaMode = MediaMode.valueOf(mediaModeString);
builder = builder.mediaMode(mediaMode); builder = builder.mediaMode(mediaMode);
@ -790,11 +767,30 @@ public class SessionRestController {
builder = builder.allowTranscoding(openviduConfig.isOpenviduAllowingTranscoding()); 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) { } catch (IllegalArgumentException e) {
throw new Exception("RecordingMode " + params.get("recordingMode") + " | " + "Default OutputMode " throw new Exception("Some parameter is not valid. " + e.getMessage());
+ params.get("defaultOutputMode") + " | " + "Default RecordingLayout "
+ params.get("defaultRecordingLayout") + " | " + "MediaMode " + params.get("mediaMode")
+ ". Some parameter is not defined");
} }
} }
return builder; return builder;
@ -850,7 +846,7 @@ public class SessionRestController {
JsonObject kurentoOptionsJson = null; JsonObject kurentoOptionsJson = null;
if (params.get("kurentoOptions") != null) { if (params.get("kurentoOptions") != null) {
try { try {
kurentoOptionsJson = JsonParser.parseString(params.get("kurentoOptions").toString()) kurentoOptionsJson = new Gson().toJsonTree(params.get("kurentoOptions"), Map.class)
.getAsJsonObject(); .getAsJsonObject();
} catch (Exception e) { } catch (Exception e) {
throw new Exception("Error in parameter 'kurentoOptions'. It is not a valid JSON object"); throw new Exception("Error in parameter 'kurentoOptions'. It is not a valid JSON object");
@ -925,6 +921,7 @@ public class SessionRestController {
String name; String name;
String outputModeString; String outputModeString;
String resolution; String resolution;
Integer frameRate;
Boolean hasAudio; Boolean hasAudio;
Boolean hasVideo; Boolean hasVideo;
String recordingLayoutString; String recordingLayoutString;
@ -935,6 +932,7 @@ public class SessionRestController {
name = (String) params.get("name"); name = (String) params.get("name");
outputModeString = (String) params.get("outputMode"); outputModeString = (String) params.get("outputMode");
resolution = (String) params.get("resolution"); resolution = (String) params.get("resolution");
frameRate = (Integer) params.get("frameRate");
hasAudio = (Boolean) params.get("hasAudio"); hasAudio = (Boolean) params.get("hasAudio");
hasVideo = (Boolean) params.get("hasVideo"); hasVideo = (Boolean) params.get("hasVideo");
recordingLayoutString = (String) params.get("recordingLayout"); recordingLayoutString = (String) params.get("recordingLayout");
@ -971,6 +969,9 @@ public class SessionRestController {
throw new RuntimeException( throw new RuntimeException(
"Wrong 'resolution' parameter. Acceptable values from 100 to 1999 for both width and height"); "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()) { if (recordingLayoutString != null && !recordingLayoutString.isEmpty()) {
try { try {
recordingLayout = RecordingLayout.valueOf(recordingLayoutString); 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"); 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, // If outputMode is COMPOSED when defaultOutputMode is COMPOSED_QUICK_START,
// change outputMode to COMPOSED_QUICK_START (and vice versa) // 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)) { if (OutputMode.COMPOSED_QUICK_START.equals(defaultOutputMode) && OutputMode.COMPOSED.equals(finalOutputMode)) {
finalOutputMode = OutputMode.COMPOSED_QUICK_START; finalOutputMode = OutputMode.COMPOSED_QUICK_START;
} else if (OutputMode.COMPOSED.equals(defaultOutputMode) } else if (OutputMode.COMPOSED.equals(defaultOutputMode)
@ -994,17 +997,14 @@ public class SessionRestController {
finalOutputMode = OutputMode.COMPOSED; finalOutputMode = OutputMode.COMPOSED;
} }
builder.outputMode( builder.outputMode(finalOutputMode == null ? defaultRecordingProperties.outputMode() : finalOutputMode);
finalOutputMode == null ? session.getSessionProperties().defaultOutputMode() : finalOutputMode);
if (RecordingUtils.IS_COMPOSED(finalOutputMode)) { if (RecordingUtils.IS_COMPOSED(finalOutputMode)) {
builder.resolution(resolution != null ? resolution : "1920x1080"); // resolution == null ? builder.resolution(resolution == null ? defaultRecordingProperties.resolution() : resolution);
// sessionProperties.defaultRecordingResolution) builder.frameRate(frameRate == null ? defaultRecordingProperties.frameRate() : frameRate);
// : resolution)); builder.recordingLayout(
builder.recordingLayout(recordingLayout == null ? session.getSessionProperties().defaultRecordingLayout() recordingLayout == null ? defaultRecordingProperties.recordingLayout() : recordingLayout);
: recordingLayout);
if (RecordingLayout.CUSTOM.equals(recordingLayout)) { if (RecordingLayout.CUSTOM.equals(recordingLayout)) {
builder.customLayout( builder.customLayout(customLayout == null ? defaultRecordingProperties.customLayout() : customLayout);
customLayout == null ? session.getSessionProperties().defaultCustomLayout() : customLayout);
} }
if (shmSize != null) { if (shmSize != null) {
if (shmSize < 134217728L) { if (shmSize < 134217728L) {

View File

@ -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}))$"); 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) { public boolean isServerMetadataFormatCorrect(String metadata) {
return true; return true;
} }