diff options
Diffstat (limited to 'MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs')
| -rw-r--r-- | MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs | 47 |
1 files changed, 27 insertions, 20 deletions
diff --git a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs index df7351ad1..d076a5b6b 100644 --- a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs +++ b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs @@ -489,32 +489,37 @@ namespace MediaBrowser.MediaEncoding.Encoder await resourcePool.WaitAsync(cancellationToken).ConfigureAwait(false); var processWrapper = new ProcessWrapper(process, this); - - StartProcess(processWrapper); + bool ranToCompletion; var memoryStream = new MemoryStream(); + try + { + StartProcess(processWrapper); + #pragma warning disable 4014 - // Important - don't await the log task or we won't be able to kill ffmpeg when the user stops playback - process.StandardOutput.BaseStream.CopyToAsync(memoryStream); + // Important - don't await the log task or we won't be able to kill ffmpeg when the user stops playback + process.StandardOutput.BaseStream.CopyToAsync(memoryStream); #pragma warning restore 4014 - // MUST read both stdout and stderr asynchronously or a deadlock may occurr - process.BeginErrorReadLine(); + // MUST read both stdout and stderr asynchronously or a deadlock may occurr + process.BeginErrorReadLine(); + + ranToCompletion = process.WaitForExit(10000); - var ranToCompletion = process.WaitForExit(10000); + if (!ranToCompletion) + { + StopProcess(processWrapper, 1000, false); + } - if (!ranToCompletion) + } + finally { - StopProcess(processWrapper, 1000, false); + resourcePool.Release(); } - resourcePool.Release(); - var exitCode = ranToCompletion ? processWrapper.ExitCode ?? 0 : -1; - process.Dispose(); - if (exitCode == -1 || memoryStream.Length == 0) { memoryStream.Dispose(); @@ -594,7 +599,7 @@ namespace MediaBrowser.MediaEncoding.Encoder await resourcePool.WaitAsync(cancellationToken).ConfigureAwait(false); - bool ranToCompletion; + bool ranToCompletion = false; var processWrapper = new ProcessWrapper(process, this); @@ -609,19 +614,23 @@ namespace MediaBrowser.MediaEncoding.Encoder bool isResponsive = true; int lastCount = 0; - while (isResponsive && !process.WaitForExit(30000)) + while (isResponsive) { + if (process.WaitForExit(30000)) + { + ranToCompletion = true; + break; + } + cancellationToken.ThrowIfCancellationRequested(); - int jpegCount = Directory.GetFiles(targetDirectory) + var jpegCount = Directory.GetFiles(targetDirectory) .Count(i => string.Equals(Path.GetExtension(i), ".jpg", StringComparison.OrdinalIgnoreCase)); isResponsive = (jpegCount > lastCount); lastCount = jpegCount; } - ranToCompletion = process.HasExited; - if (!ranToCompletion) { StopProcess(processWrapper, 1000, false); @@ -634,8 +643,6 @@ namespace MediaBrowser.MediaEncoding.Encoder var exitCode = ranToCompletion ? processWrapper.ExitCode ?? 0 : -1; - process.Dispose(); - if (exitCode == -1) { var msg = string.Format("ffmpeg image extraction failed for {0}", inputArgument); |
