From 4b79891bb787b52c0799b3f7ab195bd748d5bcfa Mon Sep 17 00:00:00 2001 From: Victor Nova Date: Fri, 20 May 2022 14:13:40 -0700 Subject: [PATCH 1/6] AddDeviceInput similar to AddFileInput and FromDeviceInput Former-commit-id: aced40695711e350d5f3a8bdaad34a6f28b86109 --- FFMpegCore/FFMpeg/FFMpegArguments.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/FFMpegCore/FFMpeg/FFMpegArguments.cs b/FFMpegCore/FFMpeg/FFMpegArguments.cs index fad42ce..e4396fe 100644 --- a/FFMpegCore/FFMpeg/FFMpegArguments.cs +++ b/FFMpegCore/FFMpeg/FFMpegArguments.cs @@ -45,6 +45,7 @@ public FFMpegArguments WithGlobalOptions(Action configure public FFMpegArguments AddFileInput(string filePath, bool verifyExists = true, Action? addArguments = null) => WithInput(new InputArgument(verifyExists, filePath), addArguments); public FFMpegArguments AddFileInput(FileInfo fileInfo, Action? addArguments = null) => WithInput(new InputArgument(fileInfo.FullName, false), addArguments); public FFMpegArguments AddUrlInput(Uri uri, Action? addArguments = null) => WithInput(new InputArgument(uri.AbsoluteUri, false), addArguments); + public FFMpegArguments AddDeviceInput(string device, Action? addArguments = null) => WithInput(new InputDeviceArgument(device), addArguments); public FFMpegArguments AddPipeInput(IPipeSource sourcePipe, Action? addArguments = null) => WithInput(new InputPipeArgument(sourcePipe), addArguments); public FFMpegArguments AddMetaData(string content, Action? addArguments = null) => WithInput(new MetaDataArgument(content), addArguments); public FFMpegArguments AddMetaData(IReadOnlyMetaData metaData, Action? addArguments = null) => WithInput(new MetaDataArgument(MetaDataSerializer.Instance.Serialize(metaData)), addArguments); From 0d7bf18832d1027940fe3af500f113a20d766dd8 Mon Sep 17 00:00:00 2001 From: Victor Nova Date: Mon, 23 May 2022 10:41:39 -0700 Subject: [PATCH 2/6] fixed hwaccel parameter not working in 5.0 Former-commit-id: 7938ec3c0a9ca60b2574f06e939b981750b6def5 --- FFMpegCore/FFMpeg/Arguments/HardwareAccelerationArgument.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/FFMpegCore/FFMpeg/Arguments/HardwareAccelerationArgument.cs b/FFMpegCore/FFMpeg/Arguments/HardwareAccelerationArgument.cs index da4b9ee..c0a2182 100644 --- a/FFMpegCore/FFMpeg/Arguments/HardwareAccelerationArgument.cs +++ b/FFMpegCore/FFMpeg/Arguments/HardwareAccelerationArgument.cs @@ -11,8 +11,6 @@ public HardwareAccelerationArgument(HardwareAccelerationDevice hardwareAccelerat HardwareAccelerationDevice = hardwareAccelerationDevice; } - public string Text => HardwareAccelerationDevice != HardwareAccelerationDevice.Auto - ? $"-hwaccel {HardwareAccelerationDevice.ToString().ToLower()}" - : "-hwaccel"; + public string Text => $"-hwaccel {HardwareAccelerationDevice.ToString().ToLower()}"; } } \ No newline at end of file From 28deedc03836d1ae8bd26227c5840b6c6b2781c4 Mon Sep 17 00:00:00 2001 From: Victor Nova Date: Mon, 23 May 2022 10:42:19 -0700 Subject: [PATCH 3/6] a hack to unconditionally kill ffmpeg when parent .NET process exits Former-commit-id: 5ac61011c48994870386e9cd3db649ba6cda753f --- FFMpegCore/Extend/Job.cs | 46 ++++++++++++++++++++ FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs | 15 ++++++- FFMpegCore/FFMpegCore.csproj | 1 + 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 FFMpegCore/Extend/Job.cs diff --git a/FFMpegCore/Extend/Job.cs b/FFMpegCore/Extend/Job.cs new file mode 100644 index 0000000..788bb79 --- /dev/null +++ b/FFMpegCore/Extend/Job.cs @@ -0,0 +1,46 @@ +using System; +using System.Runtime.InteropServices; + +using static PInvoke.Kernel32; + + +namespace FFMpegCore.Extend { + public class Job : IDisposable { + readonly SafeObjectHandle handle; + + public Job() { + this.handle = CreateJobObject(IntPtr.Zero, null); + + var info = new JOBOBJECT_BASIC_LIMIT_INFORMATION { + LimitFlags = JOB_OBJECT_LIMIT_FLAGS.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE, + }; + + var extendedInfo = new JOBOBJECT_EXTENDED_LIMIT_INFORMATION { BasicLimitInformation = info }; + + int length = Marshal.SizeOf(typeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION)); + IntPtr extendedInfoPtr = Marshal.AllocHGlobal(length); + Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false); + + if (!SetInformationJobObject(this.handle, JOBOBJECTINFOCLASS.JobObjectExtendedLimitInformation, extendedInfoPtr, (uint)length)) + throw new System.ComponentModel.Win32Exception(); + } + + public bool AddProcess(SafeObjectHandle processHandle) { + return AssignProcessToJobObject(this.handle, processHandle); + } + + #region IDisposable Members + + public void Dispose() { + this.Dispose(true); + GC.SuppressFinalize(this); + } + + + private void Dispose(bool disposing) => this.Close(); + + public void Close() => this.handle.Close(); + + #endregion + } +} diff --git a/FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs b/FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs index 423f881..57b5d4d 100644 --- a/FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs +++ b/FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs @@ -9,6 +9,12 @@ using System.Threading; using System.Threading.Tasks; using FFMpegCore.Enums; +using FFMpegCore.Exceptions; +using FFMpegCore.Extend; +using FFMpegCore.Helpers; +using Instances; + +using PInvoke; namespace FFMpegCore { @@ -141,7 +147,14 @@ private async Task Process(ProcessArguments processArguments, Ca _ffMpegArguments.Pre(); - using var instance = processArguments.Start(); + using var instance = (ProcessInstance)processArguments.Start(); + + using var job = new Job(); + var processHack = (Process)typeof(ProcessInstance).GetField("_process", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance) + .GetValue(instance); + using var instanceHandle = new Kernel32.SafeObjectHandle(processHack.Handle, ownsHandle: false); + job.AddProcess(instanceHandle); + var cancelled = false; void OnCancelEvent(object sender, int timeout) { diff --git a/FFMpegCore/FFMpegCore.csproj b/FFMpegCore/FFMpegCore.csproj index ecd0b85..9c9aba6 100644 --- a/FFMpegCore/FFMpegCore.csproj +++ b/FFMpegCore/FFMpegCore.csproj @@ -17,6 +17,7 @@ + From cabfb0b2dbdceb11c29753803d141f9f56460c8e Mon Sep 17 00:00:00 2001 From: Malte Rosenbjerg Date: Tue, 31 Jan 2023 23:25:33 +0100 Subject: [PATCH 4/6] Remove PInvoke.Kernel32 Former-commit-id: f0c9993c6e5d0a1e1f206c1517508c04f563b3bc --- FFMpegCore/Extend/Job.cs | 46 -------------------- FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs | 13 ------ FFMpegCore/FFMpegCore.csproj | 7 ++- 3 files changed, 3 insertions(+), 63 deletions(-) delete mode 100644 FFMpegCore/Extend/Job.cs diff --git a/FFMpegCore/Extend/Job.cs b/FFMpegCore/Extend/Job.cs deleted file mode 100644 index 788bb79..0000000 --- a/FFMpegCore/Extend/Job.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using System.Runtime.InteropServices; - -using static PInvoke.Kernel32; - - -namespace FFMpegCore.Extend { - public class Job : IDisposable { - readonly SafeObjectHandle handle; - - public Job() { - this.handle = CreateJobObject(IntPtr.Zero, null); - - var info = new JOBOBJECT_BASIC_LIMIT_INFORMATION { - LimitFlags = JOB_OBJECT_LIMIT_FLAGS.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE, - }; - - var extendedInfo = new JOBOBJECT_EXTENDED_LIMIT_INFORMATION { BasicLimitInformation = info }; - - int length = Marshal.SizeOf(typeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION)); - IntPtr extendedInfoPtr = Marshal.AllocHGlobal(length); - Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false); - - if (!SetInformationJobObject(this.handle, JOBOBJECTINFOCLASS.JobObjectExtendedLimitInformation, extendedInfoPtr, (uint)length)) - throw new System.ComponentModel.Win32Exception(); - } - - public bool AddProcess(SafeObjectHandle processHandle) { - return AssignProcessToJobObject(this.handle, processHandle); - } - - #region IDisposable Members - - public void Dispose() { - this.Dispose(true); - GC.SuppressFinalize(this); - } - - - private void Dispose(bool disposing) => this.Close(); - - public void Close() => this.handle.Close(); - - #endregion - } -} diff --git a/FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs b/FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs index 57b5d4d..d044e5b 100644 --- a/FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs +++ b/FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs @@ -9,12 +9,6 @@ using System.Threading; using System.Threading.Tasks; using FFMpegCore.Enums; -using FFMpegCore.Exceptions; -using FFMpegCore.Extend; -using FFMpegCore.Helpers; -using Instances; - -using PInvoke; namespace FFMpegCore { @@ -148,13 +142,6 @@ private async Task Process(ProcessArguments processArguments, Ca _ffMpegArguments.Pre(); using var instance = (ProcessInstance)processArguments.Start(); - - using var job = new Job(); - var processHack = (Process)typeof(ProcessInstance).GetField("_process", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance) - .GetValue(instance); - using var instanceHandle = new Kernel32.SafeObjectHandle(processHack.Handle, ownsHandle: false); - job.AddProcess(instanceHandle); - var cancelled = false; void OnCancelEvent(object sender, int timeout) { diff --git a/FFMpegCore/FFMpegCore.csproj b/FFMpegCore/FFMpegCore.csproj index 9c9aba6..7c3f7bb 100644 --- a/FFMpegCore/FFMpegCore.csproj +++ b/FFMpegCore/FFMpegCore.csproj @@ -12,13 +12,12 @@ - + - - - + + From b2847b99e2d6930555ff86e614975a4763ab7f92 Mon Sep 17 00:00:00 2001 From: Malte Rosenbjerg Date: Tue, 31 Jan 2023 23:26:18 +0100 Subject: [PATCH 5/6] Remove unneeded cast Former-commit-id: 751019a36d1b27acda864ae724bced1bc87c00f6 --- FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs b/FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs index d044e5b..423f881 100644 --- a/FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs +++ b/FFMpegCore/FFMpeg/FFMpegArgumentProcessor.cs @@ -141,7 +141,7 @@ private async Task Process(ProcessArguments processArguments, Ca _ffMpegArguments.Pre(); - using var instance = (ProcessInstance)processArguments.Start(); + using var instance = processArguments.Start(); var cancelled = false; void OnCancelEvent(object sender, int timeout) { From d2658b17c0372642c8f582ba7aab1f372ed19652 Mon Sep 17 00:00:00 2001 From: Malte Rosenbjerg Date: Tue, 31 Jan 2023 23:32:30 +0100 Subject: [PATCH 6/6] Update test Former-commit-id: d3d6c8c40b78bc453813a3868c9a6233fe210b5a --- FFMpegCore.Test/ArgumentBuilderTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FFMpegCore.Test/ArgumentBuilderTest.cs b/FFMpegCore.Test/ArgumentBuilderTest.cs index 1c9cb5c..9772054 100644 --- a/FFMpegCore.Test/ArgumentBuilderTest.cs +++ b/FFMpegCore.Test/ArgumentBuilderTest.cs @@ -75,7 +75,7 @@ public void Builder_BuildString_HardwareAcceleration_Auto() { var str = FFMpegArguments.FromFileInput("input.mp4") .OutputToFile("output.mp4", false, opt => opt.WithHardwareAcceleration()).Arguments; - Assert.AreEqual("-i \"input.mp4\" -hwaccel \"output.mp4\"", str); + Assert.AreEqual("-i \"input.mp4\" -hwaccel auto \"output.mp4\"", str); } [TestMethod]