diff --git a/openvidu-java-client/src/main/java/io/openvidu/java/client/RecordingProperties.java b/openvidu-java-client/src/main/java/io/openvidu/java/client/RecordingProperties.java
index d8a47784..a264b7ed 100644
--- a/openvidu-java-client/src/main/java/io/openvidu/java/client/RecordingProperties.java
+++ b/openvidu-java-client/src/main/java/io/openvidu/java/client/RecordingProperties.java
@@ -32,6 +32,7 @@ public class RecordingProperties {
private String resolution;
private boolean hasAudio;
private boolean hasVideo;
+ private long shmSize; // For COMPOSED recording
/**
* Builder for {@link io.openvidu.java.client.RecordingProperties}
@@ -45,6 +46,7 @@ public class RecordingProperties {
private String resolution;
private boolean hasAudio = true;
private boolean hasVideo = true;
+ private long shmSize = 536870912L;
/**
* Builder for {@link io.openvidu.java.client.RecordingProperties}
@@ -58,7 +60,7 @@ public class RecordingProperties {
}
}
return new RecordingProperties(this.name, this.outputMode, this.recordingLayout, this.customLayout,
- this.resolution, this.hasAudio, this.hasVideo);
+ this.resolution, this.hasAudio, this.hasVideo, this.shmSize);
}
/**
@@ -145,10 +147,20 @@ public class RecordingProperties {
return this;
}
+ /**
+ * If COMPOSED recording, call this method to specify the amount of shared
+ * memory reserved for the recording process in bytes. Minimum 134217728 (128
+ * MB). Property ignored if INDIVIDUAL recording
+ */
+ public RecordingProperties.Builder shmSize(long shmSize) {
+ this.shmSize = shmSize;
+ return this;
+ }
+
}
protected RecordingProperties(String name, Recording.OutputMode outputMode, RecordingLayout layout,
- String customLayout, String resolution, boolean hasAudio, boolean hasVideo) {
+ String customLayout, String resolution, boolean hasAudio, boolean hasVideo, long shmSize) {
this.name = name;
this.outputMode = outputMode;
this.recordingLayout = layout;
@@ -156,6 +168,7 @@ public class RecordingProperties {
this.resolution = resolution;
this.hasAudio = hasAudio;
this.hasVideo = hasVideo;
+ this.shmSize = shmSize;
}
/**
@@ -242,4 +255,16 @@ public class RecordingProperties {
return this.hasVideo;
}
+ /**
+ * If COMPOSED recording, the amount of shared memory reserved for the recording
+ * process in bytes. Minimum 134217728 (128MB). Property ignored if INDIVIDUAL
+ * recording
+ *
+ *
+ * Default to 536870912 (512 MB)
+ */
+ public long shmSize() {
+ return this.shmSize;
+ }
+
}
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 4080d915..92125374 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
@@ -175,7 +175,7 @@ public class ComposedRecordingService extends RecordingService {
List binds = new ArrayList<>();
binds.add(bind1);
containerId = dockerManager.runContainer(container, containerName, null, volumes, binds, "host", envs, null,
- 536870912L, false, null);
+ properties.shmSize(), false, null);
containers.put(containerId, containerName);
} catch (Exception e) {
this.cleanRecordingMaps(recording);
diff --git a/openvidu-server/src/main/java/io/openvidu/server/recording/service/RecordingService.java b/openvidu-server/src/main/java/io/openvidu/server/recording/service/RecordingService.java
index acfaa1d0..10661536 100644
--- a/openvidu-server/src/main/java/io/openvidu/server/recording/service/RecordingService.java
+++ b/openvidu-server/src/main/java/io/openvidu/server/recording/service/RecordingService.java
@@ -149,6 +149,7 @@ public abstract class RecordingService {
if (RecordingLayout.CUSTOM.equals(properties.recordingLayout())) {
builder.customLayout(properties.customLayout());
}
+ builder.shmSize(properties.shmSize());
}
properties = builder.build();
}
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 98ecaad8..c25a142f 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
@@ -460,6 +460,7 @@ public class SessionRestController {
Boolean hasVideo;
String recordingLayoutString;
String customLayout;
+ Long shmSize;
try {
sessionId = (String) params.get("session");
name = (String) params.get("name");
@@ -469,7 +470,8 @@ public class SessionRestController {
hasVideo = (Boolean) params.get("hasVideo");
recordingLayoutString = (String) params.get("recordingLayout");
customLayout = (String) params.get("customLayout");
- } catch (ClassCastException e) {
+ shmSize = new Long(params.get("shmSize").toString());
+ } catch (ClassCastException | NumberFormatException e) {
return this.generateErrorResponse("Type error in some parameter", "/api/recordings/start",
HttpStatus.BAD_REQUEST);
}
@@ -480,7 +482,7 @@ public class SessionRestController {
HttpStatus.BAD_REQUEST);
}
- io.openvidu.java.client.Recording.OutputMode finalOutputMode = null;
+ io.openvidu.java.client.Recording.OutputMode finalOutputMode = OutputMode.COMPOSED;
RecordingLayout recordingLayout = null;
if (outputModeString != null && !outputModeString.isEmpty()) {
try {
@@ -551,6 +553,13 @@ public class SessionRestController {
builder.customLayout(
customLayout == null ? session.getSessionProperties().defaultCustomLayout() : customLayout);
}
+ if (shmSize != null) {
+ if (shmSize < 134217728L) {
+ return this.generateErrorResponse("Wrong \"shmSize\" parameter. Must be 134217728 (128 MB) minimum",
+ "/api/recordings/start", HttpStatus.UNPROCESSABLE_ENTITY);
+ }
+ builder.shmSize(shmSize);
+ }
}
builder.name(name).hasAudio(hasAudio != null ? hasAudio : true).hasVideo(hasVideo != null ? hasVideo : true);