diff --git a/FFMpegCore.Test/VideoTest.cs b/FFMpegCore.Test/VideoTest.cs index b0a85aa..b9e586c 100644 --- a/FFMpegCore.Test/VideoTest.cs +++ b/FFMpegCore.Test/VideoTest.cs @@ -154,7 +154,7 @@ public class VideoTest { using var outputFile = new TemporaryFile($"out{VideoType.Mp4.Extension}"); - var videoFramesSource = new RawVideoPipeSource(BitmapSource.CreateBitmaps(128, pixelFormat, 256, 256)); + var videoFramesSource = new RawVideoPipeSource(BitmapSource.CreateBitmaps(64, pixelFormat, 256, 256)); var success = FFMpegArguments .FromPipeInput(videoFramesSource) .OutputToFile(outputFile, false, opt => opt @@ -474,7 +474,7 @@ public class VideoTest private static async Task Video_ToTS_Args_Pipe_Internal(dynamic pixelFormat, CancellationToken cancellationToken) { using var output = new TemporaryFile($"out{VideoType.Ts.Extension}"); - var input = new RawVideoPipeSource(BitmapSource.CreateBitmaps(128, pixelFormat, 256, 256)); + var input = new RawVideoPipeSource(BitmapSource.CreateBitmaps(64, pixelFormat, 256, 256)); var success = await FFMpegArguments .FromPipeInput(input) @@ -511,7 +511,7 @@ public class VideoTest public void RawVideoPipeSource_Ogv_Scale(SKColorType pixelFormat) { using var outputFile = new TemporaryFile($"out{VideoType.Ogv.Extension}"); - var videoFramesSource = new RawVideoPipeSource(BitmapSource.CreateBitmaps(128, pixelFormat, 256, 256)); + var videoFramesSource = new RawVideoPipeSource(BitmapSource.CreateBitmaps(64, pixelFormat, 256, 256)); FFMpegArguments .FromPipeInput(videoFramesSource) @@ -565,7 +565,7 @@ public class VideoTest private static void Video_ToMP4_Resize_Args_Pipe_Internal(dynamic pixelFormat, CancellationToken cancellationToken) { using var outputFile = new TemporaryFile($"out{VideoType.Mp4.Extension}"); - var videoFramesSource = new RawVideoPipeSource(BitmapSource.CreateBitmaps(128, pixelFormat, 256, 256)); + var videoFramesSource = new RawVideoPipeSource(BitmapSource.CreateBitmaps(64, pixelFormat, 256, 256)); var success = FFMpegArguments .FromPipeInput(videoFramesSource) @@ -927,7 +927,7 @@ public class VideoTest { using var resStream = new MemoryStream(); var reader = new StreamPipeSink(resStream); - var writer = new RawVideoPipeSource(BitmapSource.CreateBitmaps(128, pixelFormat, 128, 128)); + var writer = new RawVideoPipeSource(BitmapSource.CreateBitmaps(64, pixelFormat, 128, 128)); FFMpegArguments .FromPipeInput(writer) @@ -1122,13 +1122,12 @@ public class VideoTest [TestMethod] [Timeout(BaseTimeoutMilliseconds, CooperativeCancellation = true)] - public void Video_Cancel_CancellationToken_Before_Throws() + public void Video_Cancel_CancellationToken_BeforeProcessing_Throws() { using var outputFile = new TemporaryFile("out.mp4"); using var cts = CancellationTokenSource.CreateLinkedTokenSource(TestContext.CancellationToken); - cts.Cancel(); var task = FFMpegArguments .FromFileInput("testsrc2=size=320x240[out0]; sine[out1]", false, args => args .WithCustomArgument("-re") @@ -1139,8 +1138,29 @@ public class VideoTest .WithSpeedPreset(Speed.VeryFast)) .CancellableThrough(cts.Token); - Assert.ThrowsExactly(() => task.CancellableThrough(TestContext.CancellationToken) - .ProcessSynchronously()); + cts.Cancel(); + Assert.ThrowsExactly(() => task.ProcessSynchronously()); + } + + [TestMethod] + [Timeout(BaseTimeoutMilliseconds, CooperativeCancellation = true)] + public void Video_Cancel_CancellationToken_BeforePassing_Throws() + { + using var outputFile = new TemporaryFile("out.mp4"); + + using var cts = CancellationTokenSource.CreateLinkedTokenSource(TestContext.CancellationToken); + cts.Cancel(); + + var task = FFMpegArguments + .FromFileInput("testsrc2=size=320x240[out0]; sine[out1]", false, args => args + .WithCustomArgument("-re") + .ForceFormat("lavfi")) + .OutputToFile(outputFile, false, opt => opt + .WithAudioCodec(AudioCodec.Aac) + .WithVideoCodec(VideoCodec.LibX264) + .WithSpeedPreset(Speed.VeryFast)); + + Assert.ThrowsExactly(() => task.CancellableThrough(cts.Token)); } [TestMethod] diff --git a/FFMpegCore/FFMpeg/FFMpeg.cs b/FFMpegCore/FFMpeg/FFMpeg.cs index b9a0d5d..6a6d8c8 100644 --- a/FFMpegCore/FFMpeg/FFMpeg.cs +++ b/FFMpegCore/FFMpeg/FFMpeg.cs @@ -297,7 +297,7 @@ public static class FFMpeg { if (Path.GetExtension(input) != Path.GetExtension(output)) { - output = Path.Combine(Path.GetDirectoryName(output), Path.GetFileNameWithoutExtension(output), Path.GetExtension(input)); + output = Path.ChangeExtension(output, Path.GetExtension(input)); } return FFMpegArguments diff --git a/FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs b/FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs index 8191223..b1bd3da 100644 --- a/FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs +++ b/FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs @@ -85,6 +85,7 @@ public class FFMpegArgumentProcessor public FFMpegArgumentProcessor CancellableThrough(CancellationToken token, int timeout = 0) { + token.ThrowIfCancellationRequested(); _cancellationTokenRegistration?.Dispose(); _cancellationTokenRegistration = token.Register(() => Cancel(timeout)); return this;