mirror of https://github.com/OpenVidu/openvidu.git
openvidu-server: RecordingProperties refactoring
parent
b774d2cefc
commit
6786b67c10
|
@ -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()) {
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue