From 893646a52c0824e55a8f3a9ff3d4da5e4d50cf9a Mon Sep 17 00:00:00 2001 From: Tobias Faller Date: Fri, 5 Jan 2024 17:38:47 +0100 Subject: [PATCH] Clean-up code handling pipes in Engine class; Fixes #69 --- src/FFmpeg.NET/Engine.cs | 70 +++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 30 deletions(-) mode change 100644 => 100755 src/FFmpeg.NET/Engine.cs diff --git a/src/FFmpeg.NET/Engine.cs b/src/FFmpeg.NET/Engine.cs old mode 100644 new mode 100755 index 6b7bffa..a3fea1a --- a/src/FFmpeg.NET/Engine.cs +++ b/src/FFmpeg.NET/Engine.cs @@ -87,28 +87,35 @@ public async Task ConvertAsync(IInputArgument input, ConversionOptions o public async Task ConvertAsync(IInputArgument input, Stream output, ConversionOptions options, CancellationToken cancellationToken) { - var pipeName = $"{_pipePrefix}{Guid.NewGuid()}"; + var outputPipeName = $"{_pipePrefix}{Guid.NewGuid()}"; + var outputArgument = new OutputPipe(GetPipePath(outputPipeName)); + var pipe = new NamedPipeServerStream(outputPipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous); + var parameters = new FFmpegParameters { Task = FFmpegTask.Convert, Input = input, - Output = new OutputPipe(GetPipePath(pipeName)), + Output = outputArgument, ConversionOptions = options }; - var process = CreateProcess(parameters); - var pipe = new NamedPipeServerStream(pipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous); - - await pipe.WaitForConnectionAsync(cancellationToken); - await Task.WhenAll( - pipe.CopyToAsync(output, cancellationToken), - process.ExecuteAsync(cancellationToken).ContinueWith(x => - { - pipe.Disconnect(); - pipe.Dispose(); - }, cancellationToken) - ).ConfigureAwait(false); - Cleanup(process); + var ffmpegProcess = CreateProcess(parameters); + try + { + var executeProcess = ffmpegProcess.ExecuteAsync(cancellationToken); + var copyData = pipe.WaitForConnectionAsync(cancellationToken) + .ContinueWith(async x => + { + await pipe.CopyToAsync(output, cancellationToken); + }, cancellationToken).Unwrap(); + await Task.WhenAll(executeProcess, copyData).ConfigureAwait(false); + pipe.Disconnect(); + } + finally + { + pipe.Dispose(); + Cleanup(ffmpegProcess); + } } public async Task ConvertAsync(IArgument argument, Stream output, CancellationToken cancellationToken) @@ -119,21 +126,24 @@ public async Task ConvertAsync(IArgument argument, Stream output, CancellationTo var arguments = argument.Argument + $" {outputArgument.Argument}"; var parameters = new FFmpegParameters { CustomArguments = arguments }; - var process = CreateProcess(parameters); - - await Task.WhenAll( - pipe.WaitForConnectionAsync(cancellationToken).ContinueWith(async x => - { - await pipe.CopyToAsync(output, cancellationToken); - }), - process.ExecuteAsync(cancellationToken).ContinueWith(x => - { - pipe.Disconnect(); - pipe.Dispose(); - }, cancellationToken) - ).ConfigureAwait(false); - - Cleanup(process); + + var ffmpegProcess = CreateProcess(parameters); + try + { + var executeProcess = ffmpegProcess.ExecuteAsync(cancellationToken); + var copyData = pipe.WaitForConnectionAsync(cancellationToken) + .ContinueWith(async x => + { + await pipe.CopyToAsync(output, cancellationToken); + }, cancellationToken).Unwrap(); + await Task.WhenAll(executeProcess, copyData).ConfigureAwait(false); + pipe.Disconnect(); + } + finally + { + pipe.Dispose(); + Cleanup(ffmpegProcess); + } } private async Task ExecuteAsync(FFmpegParameters parameters, CancellationToken cancellationToken)