From 55814846e544d7de1c6005160dcd3c5e1ffe7f6a Mon Sep 17 00:00:00 2001 From: n00mkrad Date: Tue, 16 Aug 2022 09:18:53 +0200 Subject: [PATCH] Basic realtime GUI implementation --- Code/Form1.Designer.cs | 21 ++------------------- Code/Form1.cs | 35 ++++++++++++++++++++--------------- Code/IO/Config.cs | 15 ++++++++------- Code/Main/Interpolate.cs | 8 +++++++- Code/Os/AiProcess.cs | 7 +++++-- 5 files changed, 42 insertions(+), 44 deletions(-) diff --git a/Code/Form1.Designer.cs b/Code/Form1.Designer.cs index 6edd22c..3ec73bd 100644 --- a/Code/Form1.Designer.cs +++ b/Code/Form1.Designer.cs @@ -96,7 +96,6 @@ this.completionAction = new System.Windows.Forms.ComboBox(); this.label25 = new System.Windows.Forms.Label(); this.encodingSettingsBtn = new HTAlt.WinForms.HTButton(); - this.realtimeBtn = new HTAlt.WinForms.HTButton(); this.inputInfo = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label(); this.browseOutBtn = new HTAlt.WinForms.HTButton(); @@ -227,7 +226,8 @@ "MOV Video (Apple ProRes)", "AVI Video (ffv1, huffyuv, magicyuv, rawvideo)", "Animated GIF (Only supports up to 50 FPS)", - "Image Sequence (PNG, JPG, WEBP)"}); + "Image Sequence (PNG, JPG, WEBP)", + "Real-time Interpolation (Video only)"}); this.outModeCombox.Location = new System.Drawing.Point(281, 157); this.outModeCombox.Name = "outModeCombox"; this.outModeCombox.Size = new System.Drawing.Size(400, 23); @@ -920,7 +920,6 @@ this.interpOptsTab.Controls.Add(this.outSpeedCombox); this.interpOptsTab.Controls.Add(this.completionActionPanel); this.interpOptsTab.Controls.Add(this.encodingSettingsBtn); - this.interpOptsTab.Controls.Add(this.realtimeBtn); this.interpOptsTab.Controls.Add(this.inputInfo); this.interpOptsTab.Controls.Add(this.label1); this.interpOptsTab.Controls.Add(this.browseOutBtn); @@ -1042,21 +1041,6 @@ this.encodingSettingsBtn.UseVisualStyleBackColor = false; this.encodingSettingsBtn.Click += new System.EventHandler(this.encodingSettingsBtn_Click); // - // realtimeBtn - // - this.realtimeBtn.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); - this.realtimeBtn.FlatAppearance.BorderSize = 0; - this.realtimeBtn.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.realtimeBtn.ForeColor = System.Drawing.Color.White; - this.realtimeBtn.Location = new System.Drawing.Point(689, 185); - this.realtimeBtn.Name = "realtimeBtn"; - this.realtimeBtn.Size = new System.Drawing.Size(206, 23); - this.realtimeBtn.TabIndex = 38; - this.realtimeBtn.Text = "Realtime Interpolation"; - this.realtimeBtn.UseVisualStyleBackColor = false; - this.realtimeBtn.Visible = false; - this.realtimeBtn.Click += new System.EventHandler(this.scnDetectTestBtn_Click); - // // inputInfo // this.inputInfo.AutoSize = true; @@ -1824,7 +1808,6 @@ private System.Windows.Forms.Panel mpDedupePanel; private System.Windows.Forms.ComboBox mpdecimateMode; private System.Windows.Forms.LinkLabel linkLabel1; - private HTAlt.WinForms.HTButton realtimeBtn; private System.Windows.Forms.Panel busyControlsPanel; private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; private System.Windows.Forms.Button pauseBtn; diff --git a/Code/Form1.cs b/Code/Form1.cs index 1849d9e..4420617 100644 --- a/Code/Form1.cs +++ b/Code/Form1.cs @@ -74,7 +74,7 @@ namespace Flowframes if (Debugger.IsAttached) { Logger.Log("Debugger is attached - Flowframes seems to be running within VS."); - realtimeBtn.Visible = true; + // ... } completionAction.SelectedIndex = 0; @@ -319,18 +319,32 @@ namespace Flowframes outputTbox.Text = dialog.FileName; } - public void runBtn_Click(object sender, EventArgs e) + public async void runBtn_Click(object sender, EventArgs e) { if (Interpolate.currentMediaFile == null || !Interpolate.currentMediaFile.Initialized) return; ValidateFactor(); - if (!BatchProcessing.busy) // Don't load values from gui if batch processing is used + if (!BatchProcessing.busy) // Don't load values from GUI if batch processing is used Interpolate.currentSettings = GetCurrentSettings(); AiProcessSuspend.Reset(); - Interpolate.Start(); + + if(Interpolate.currentSettings.outMode == Interpolate.OutMode.Realtime) + { + await Interpolate.Realtime(); + SetProgress(0); + } + else + { + await Interpolate.Start(); + } + } + + private async void RealtimeInterp(object sender, EventArgs e) + { + } public ModelCollection.ModelInfo GetModel(AI currentAi) @@ -354,6 +368,7 @@ namespace Flowframes if (outModeCombox.Text.ToLower().Contains("avi")) outMode = Interpolate.OutMode.VidAvi; if (outModeCombox.Text.ToLower().Contains("gif")) outMode = Interpolate.OutMode.VidGif; if (outModeCombox.Text.ToLower().Contains("image")) outMode = Interpolate.OutMode.ImgPng; + if (outModeCombox.Text.ToLower().Contains("real")) outMode = Interpolate.OutMode.Realtime; return outMode; } @@ -370,6 +385,7 @@ namespace Flowframes if (mode == Interpolate.OutMode.VidAvi && currentItem.Contains("avi")) targetIndex = i; if (mode == Interpolate.OutMode.VidGif && currentItem.Contains("gif")) targetIndex = i; if (mode == Interpolate.OutMode.ImgPng && currentItem.Contains("image")) targetIndex = i; + if (mode == Interpolate.OutMode.Realtime && currentItem.Contains("real")) targetIndex = i; } outModeCombox.SelectedIndex = targetIndex; @@ -714,17 +730,6 @@ namespace Flowframes #endregion - private async void scnDetectTestBtn_Click(object sender, EventArgs e) - { - if (BatchProcessing.busy || !File.Exists(inputTbox.Text.Trim())) return; - - Interpolate.currentSettings = GetCurrentSettings(); - - AiProcessSuspend.Reset(); - await Interpolate.Realtime(); - SetProgress(0); - } - private void pauseBtn_Click(object sender, EventArgs e) { AiProcessSuspend.SuspendResumeAi(!AiProcessSuspend.aiProcFrozen); diff --git a/Code/IO/Config.cs b/Code/IO/Config.cs index 1feda6e..c6d008c 100644 --- a/Code/IO/Config.cs +++ b/Code/IO/Config.cs @@ -299,7 +299,6 @@ namespace Flowframes.IO public enum Key { aacBitrate, - askedForDevModeVersion, aiCombox, allowConsecutiveSceneChanges, allowCustomInputRate, @@ -307,11 +306,13 @@ namespace Flowframes.IO allowSymlinkEncoding, allowSymlinkImport, alwaysWaitForAutoEnc, + askedForDevModeVersion, autoEncBackupMode, autoEncDebug, autoEncMode, autoEncSafeBufferCuda, autoEncSafeBufferNcnn, + av1Crf, aviCodec, aviColors, clearLogOnInput, @@ -337,7 +338,6 @@ namespace Flowframes.IO gifDitherType, h264Crf, h265Crf, - av1Crf, imgSeqFormat, imgSeqQuality, imgSeqSampleCount, @@ -349,8 +349,8 @@ namespace Flowframes.IO keepMeta, keepSubs, keepTempFolder, - loopMode, lastUsedAiName, + loopMode, lowDiskSpaceCancelGb, lowDiskSpacePauseGb, maxFps, @@ -359,13 +359,13 @@ namespace Flowframes.IO minOutVidLength, minVidLength, mp4Enc, - pixFmt, mpdecimateMode, ncnnGpus, ncnnThreads, opusBitrate, - processingMode, + pixFmt, proResProfile, + processingMode, rifeCudaBufferSize, rifeCudaFp16, rifeNcnnUseTta, @@ -379,8 +379,9 @@ namespace Flowframes.IO tempFolderLoc, torchGpus, uhdThresh, - vsUseLsmash, - vp9Crf + vp9Crf, + vsRtShowOsd, + vsUseLsmash } } } diff --git a/Code/Main/Interpolate.cs b/Code/Main/Interpolate.cs index 0edaaf3..de45d7f 100644 --- a/Code/Main/Interpolate.cs +++ b/Code/Main/Interpolate.cs @@ -22,7 +22,7 @@ namespace Flowframes { public class Interpolate { - public enum OutMode { VidMp4, VidMkv, VidWebm, VidProRes, VidAvi, VidGif, ImgPng } + public enum OutMode { VidMp4, VidMkv, VidWebm, VidProRes, VidAvi, VidGif, ImgPng, Realtime } public static bool currentlyUsingAutoEnc; public static InterpSettings currentSettings; @@ -89,7 +89,13 @@ namespace Flowframes public static async Task Realtime () { + Program.mainForm.SetWorking(true); + + if(currentSettings.ai.NameInternal != Implementations.rifeNcnnVs.NameInternal) + Cancel($"Real-time interpolation is only available when using {Implementations.rifeNcnnVs.FriendlyName}."); + await AiProcess.RunRifeNcnnVs(currentSettings.framesFolder, "", currentSettings.interpFactor, currentSettings.model.Dir, true); + Program.mainForm.SetWorking(false); } public static async Task GetFrames() diff --git a/Code/Os/AiProcess.cs b/Code/Os/AiProcess.cs index 14cb3ed..5419caf 100644 --- a/Code/Os/AiProcess.cs +++ b/Code/Os/AiProcess.cs @@ -339,6 +339,8 @@ namespace Flowframes.Os public static async Task RunRifeNcnnVs(string framesPath, string outPath, float factor, string mdl, bool rt = false) { + if(Interpolate.canceled) return; + AI ai = Implementations.rifeNcnnVs; processTimeMulti.Restart(); @@ -385,7 +387,8 @@ namespace Flowframes.Os Loop = Config.GetBool(Config.Key.enableLoop), MatchDuration = Config.GetBool(Config.Key.fixOutputDuration), Dedupe = Config.GetInt(Config.Key.dedupMode) != 0, - Realtime = rt + Realtime = rt, + Osd = Config.GetBool(Config.Key.vsRtShowOsd), }; if (rt) @@ -675,7 +678,7 @@ namespace Flowframes.Os if (ai.Piped) // VS specific { - if (!hasShownError && line.ToLower().Contains("fwrite() call failed")) + if (!hasShownError && Interpolate.currentSettings.outMode != Interpolate.OutMode.Realtime && line.ToLower().Contains("fwrite() call failed")) { hasShownError = true; UiUtils.ShowMessageBox($"VapourSynth interpolation failed with an unknown error. Check the log for details:\n\n{lastLogLines}", UiUtils.MessageType.Error);