diff --git a/src/main/java/com/github/kokorin/jaffree/ffmpeg/FFmpeg.java b/src/main/java/com/github/kokorin/jaffree/ffmpeg/FFmpeg.java index 0a3f8177..9e2907ba 100644 --- a/src/main/java/com/github/kokorin/jaffree/ffmpeg/FFmpeg.java +++ b/src/main/java/com/github/kokorin/jaffree/ffmpeg/FFmpeg.java @@ -59,6 +59,7 @@ public class FFmpeg { private LogLevel logLevel = LogLevel.INFO; private String contextName = null; + private Integer executorTimeoutMillis = null; private final Path executable; @@ -387,6 +388,23 @@ public FFmpeg setContextName(final String contextName) { return this; } + /** + * Overrides the default {@link com.github.kokorin.jaffree.process.Executor} timeout. + *
+ * Most normal use cases will easily complete within the default timeout. It is not recommended + * to set an explicit timeout value unless you have actually experienced unwanted timeouts. + * + * @param executorTimeoutMillis the custom executor timeout in milliseconds + * @return this + */ + public FFmpeg setExecutorTimeoutMillis(final int executorTimeoutMillis) { + if (executorTimeoutMillis < 0) { + throw new IllegalArgumentException("Executor timeout cannot be negative"); + } + this.executorTimeoutMillis = executorTimeoutMillis; + return this; + } + /** * Starts synchronous ffmpeg execution. *
@@ -484,7 +502,8 @@ protected ProcessHandler
+ * A null value is interpreted as "use default timeout".
+ *
+ * @param executorTimeoutMillis the new Executor timeout in milliseconds
+ * @return this
+ */
+ public ProcessHandler
@@ -180,7 +199,9 @@ protected T interactWithProcess(final Process process) {
status = process.waitFor();
LOGGER.info("Process has finished with status: {}", status);
- waitForExecutorToStop(executor, EXECUTOR_TIMEOUT_MILLIS);
+ if (executorTimeoutMillis > 0) {
+ waitForExecutorToStop(executor, executorTimeoutMillis);
+ }
} catch (InterruptedException e) {
LOGGER.warn("Process has been interrupted");
if (stopper != null) {