Imports System.Text Imports System.Text.RegularExpressions Imports StaxRip Public Class VideoScript Inherits Profile Public [Error] As String Public Info As ServerInfo Public OriginalInfo As ServerInfo Property Filters As New List(Of VideoFilter) Overridable Property Engine As ScriptEngine = ScriptEngine.AviSynth Overridable Property Path As String = "" Shared Event Changed(script As VideoScript) Sub RaiseChanged() RaiseEvent Changed(Me) End Sub ReadOnly Property IsAviSynth As Boolean Get Return Engine = ScriptEngine.AviSynth End Get End Property ReadOnly Property IsVapourSynth As Boolean Get Return Engine = ScriptEngine.VapourSynth End Get End Property Overridable ReadOnly Property FileType As String Get Return If(Engine = ScriptEngine.VapourSynth, "vpy", "avs") End Get End Property Overridable Function GetScript() As String Return GetScript(Nothing) End Function Overridable Function GetScript(skipCategory As String) As String Dim sb As New StringBuilder() If p.CodeAtTop <> "" Then sb.AppendLine(p.CodeAtTop) End If For Each filter As VideoFilter In Filters If filter.Active Then If skipCategory Is Nothing OrElse filter.Category <> skipCategory Then sb.Append(filter.Script + BR) End If End If Next Return sb.ToString End Function Function GetFullScript() As String Return Macro.Expand(ModifyScript(GetScript, Engine)).Trim End Function Sub RemoveFilter(category As String, Optional name As String = Nothing) For Each i In Filters.ToArray If i.Category = category AndAlso (name = "" OrElse i.Path = name) Then Filters.Remove(i) RaiseChanged() End If Next End Sub Sub RemoveFilterAt(index As Integer) If Filters.Count > 0 AndAlso index < Filters.Count Then Filters.RemoveAt(index) RaiseChanged() End If End Sub Sub RemoveFilter(filter As VideoFilter) If Filters.Contains(filter) Then Filters.Remove(filter) RaiseChanged() End If End Sub Sub InsertFilter(index As Integer, filter As VideoFilter) Filters.Insert(index, filter) RaiseChanged() End Sub Sub AddFilter(filter As VideoFilter) Filters.Add(filter) RaiseChanged() End Sub Sub SetFilter(index As Integer, filter As VideoFilter) Filters(index) = filter RaiseChanged() End Sub Sub SetFilter(category As String, name As String, script As String) For Each i In Filters If i.Category = category Then i.Path = name i.Script = script i.Active = True RaiseChanged() Exit Sub End If Next If Filters.Count > 0 Then Filters.Insert(1, New VideoFilter(category, name, script)) RaiseChanged() End If End Sub Sub InsertAfter(category As String, af As VideoFilter) Dim f = GetFilter(category) Filters.Insert(Filters.IndexOf(f) + 1, af) RaiseChanged() End Sub Function Contains(category As String, search As String) As Boolean If category = "" OrElse search = "" Then Return False Dim filter = GetFilter(category) If filter?.Script?.ToLowerInvariant.Contains(search.ToLowerInvariant) AndAlso filter?.Active Then Return True End If End Function Sub ActivateFilter(category As String) Dim filter = GetFilter(category) If Not filter Is Nothing Then filter.Active = True End If End Sub Function IsFilterActive(category As String) As Boolean Dim filter = GetFilter(category) Return Not filter Is Nothing AndAlso filter.Active End Function Function IsFilterActive(category As String, name As String) As Boolean Dim filter = GetFilter(category) Return Not filter Is Nothing AndAlso filter.Active AndAlso filter.Name = name End Function Function GetFiltersCopy() As List(Of VideoFilter) Dim ret = New List(Of VideoFilter) For Each i In Filters ret.Add(i.GetCopy) Next Return ret End Function Function GetNewScript() As VideoScript Dim returnValue As New VideoScript returnValue.Engine = Engine returnValue.Filters = GetFiltersCopy() Return returnValue End Function Function GetFilter(category As String) As VideoFilter For Each filter In Filters If filter.Category = category Then Return filter End If Next End Function Public LastCode As String Public LastPath As String Sub Synchronize( Optional convertToRGB As Boolean = False, Optional comparePath As Boolean = True, Optional flipVertical As Boolean = False) If Path = "" Then Exit Sub End If Dim srcFilter = GetFilter("Source") If Not srcFilter Is Nothing AndAlso Not srcFilter.Script.Contains("(") Then Exit Sub End If Dim code = GetScript() If convertToRGB Then If Engine = ScriptEngine.AviSynth Then If p.SourceHeight > 576 Then code += BR + "ConvertBits(8)" + BR + "ConvertToRGB32(matrix=""Rec709"")" Else code += BR + "ConvertBits(8)" + BR + "ConvertToRGB32(matrix=""Rec601"")" End If If flipVertical Then code += BR + "FlipVertical()" End If Else code = code.Trim If Not code.Contains(".set_output(") Then code += BR + "clip.set_output()" End If Dim match = Regex.Match(code, "(\w+)\.set_output\(\)") Dim clipname = match.Groups(1).Value Dim vsCode = "" If flipVertical Then vsCode += BR + "clipname = core.std.FlipVertical(clipname)" + BR End If vsCode += " m_rgb = 0 m_709 = 1 m_unspec = 2 m_470bg = 5 m_2020ncl = 9 t_709 = 1 t_470bg = 5 t_st2084 = 16 p_709 = 1 p_470bg = 5 p_2020 = 9 props = clip.get_frame(0).props if '_Matrix' in props and props['_Matrix'] != m_unspec and props['_Matrix'] < 15: matrix = props['_Matrix'] else: if clipname.format.id == vs.RGB24: matrix = m_rgb else: if %source_height% > 576: matrix = m_709 else: matrix = m_470bg if '_Transfer' in props and props['_Transfer'] > 0 and props['_Transfer'] < 19: transfer = props['_Transfer'] else: if matrix == m_470bg: transfer = t_470bg elif matrix == m_2020ncl: transfer = t_st2084 else: transfer = t_709 if '_Primaries' in props and props['_Primaries'] > 0 and props['_Primaries'] < 23: primaries = props['_Primaries'] else: if matrix == m_470bg: primaries = p_470bg elif matrix == m_2020ncl: primaries = p_2020 else: primaries = p_709 clipname = clipname.resize.Bicubic(matrix_in = matrix, transfer_in = transfer, primaries_in = primaries, format = vs.COMPATBGR32) clipname.set_output() " vsCode = vsCode.Replace("clipname", clipname) code = code.Replace(match.Value, vsCode).Trim End If End If code = Macro.Expand(code) If Me.Error <> "" OrElse code <> LastCode OrElse (comparePath AndAlso Path <> LastPath) Then If Path.Dir.DirExists Then If Engine = ScriptEngine.VapourSynth Then ModifyScript(code, Engine).WriteFileUTF8(Path) Else ModifyScript(code, Engine).WriteFile(Path, TextEncoding.EncodingOfProcess) End If If Not Package.AviSynth.VerifyOK OrElse Not Package.VapourSynth.VerifyOK OrElse Not Package.vspipe.VerifyOK Then Throw New AbortException End If g.MainForm.Indexing() Using server = FrameServerFactory.Create(Path) Info = server.Info If Not convertToRGB Then OriginalInfo = Info End If Me.Error = server.Error End Using LastCode = code LastPath = Path End If End If End Sub Shared Function ModifyScript(script As String, engine As ScriptEngine) As String If p.SourceFile.Ext.EqualsAny("avs", "vpy") Then Return script End If If engine = ScriptEngine.VapourSynth Then Return ModifyVSScript(script) Else Return ModifyAVSScript(script) End If End Function Shared Function GetVsPortableAutoLoadPluginCode() As String If FrameServerHelp.IsPortable Then Dim ret As String Dim dir = Folder.Settings + "Plugins\VapourSynth\" If dir.DirExists Then For Each file In Directory.GetFiles(dir, "*.dll") ret += "core.std.LoadPlugin(r""" + file + """, altsearchpath=True)" + BR Next End If dir = Folder.Settings + "Plugins\Dual\" If dir.DirExists Then For Each file In Directory.GetFiles(dir, "*.dll") ret += "core.std.LoadPlugin(r""" + file + """, altsearchpath=True)" + BR Next End If Return ret End If End Function Shared Function ModifyVSScript(script As String) As String Dim code = "" ModifyVSScript(script, code) If Not script.Contains("import importlib.machinery") AndAlso code.Contains("SourceFileLoader") Then code = "import importlib.machinery" + BR + code End If If Not script.Contains("import vapoursynth") Then code = "import os, sys" + BR + "import vapoursynth as vs" + BR + "core = vs.get_core()" + BR + GetVsPortableAutoLoadPluginCode() + BR + "sys.path.append(r""" + Folder.Startup + "Apps\Plugins\VS\Scripts"")" + BR + code End If Dim clip As String If code <> "" Then clip = code + script Else clip = script End If If Not clip.Contains(".set_output(") Then If clip.EndsWith(BR) Then clip += "clip.set_output()" Else clip += BR + "clip.set_output()" End If End If Return clip End Function Shared Function ModifyVSScript(ByRef script As String, ByRef code As String) As String For Each plugin In Package.Items.Values.OfType(Of PluginPackage)() Dim fp = plugin.Path If fp <> "" Then If Not plugin.VsFilterNames Is Nothing Then For Each filterName In plugin.VsFilterNames If ContainsFunction(script, filterName, 0) Then WriteVSCode(script, code, filterName, plugin) End If Next End If Dim scriptCode = script + code If scriptCode.Contains("import " + plugin.Name) Then WriteVSCode(script, code, Nothing, plugin) End If If Not plugin.AvsFilterNames Is Nothing Then For Each filterName In plugin.AvsFilterNames If script.Contains(".avs." + filterName) Then WriteVSCode(script, code, filterName, plugin) End If Next End If End If Next End Function Shared Sub WriteVSCode( ByRef script As String, ByRef code As String, ByRef filterName As String, plugin As PluginPackage) If plugin.Filename.Ext = "py" Then Dim line = plugin.Name + " = importlib.machinery.SourceFileLoader('" + plugin.Name + "', r""" + plugin.Path + """).load_module()" If Not script.Contains(line) AndAlso Not code.Contains(line) Then code = line + BR + code Dim scriptCode = plugin.Path.ReadAllText ModifyVSScript(scriptCode, code) End If Else If s.LoadVapourSynthPlugins AndAlso Not IsVsPluginInAutoLoadFolder(plugin.Filename) AndAlso Not script.Contains(plugin.Filename) AndAlso Not code.Contains(plugin.Filename) Then Dim line As String If script.Contains(".avs." + filterName) OrElse code.Contains(".avs." + filterName) Then line = "core.avs.LoadPlugin(r""" + plugin.Path + """)" + BR Else line = "core.std.LoadPlugin(r""" + plugin.Path + """, altsearchpath=True)" + BR End If code += line End If End If End Sub Shared Function IsVsPluginInAutoLoadFolder(filename As String) As Boolean If FrameServerHelp.IsPortable Then Dim folders = { Package.VapourSynth.Directory + "vapoursynth64\plugins\", Package.VapourSynth.Directory + "vapoursynth64\coreplugins\", Folder.Settings + "Plugins\VapourSynth\", Folder.Settings + "Plugins\Dual\"} For Each folder In folders If File.Exists(folder + filename) Then Return True End If Next Else Return File.Exists(Folder.Plugins + filename) End If End Function Shared Function IsAvsPluginInAutoLoadFolder(filename As String) As Boolean If FrameServerHelp.IsPortable Then Dim folders = { Package.AviSynth.Directory + "plugins\", Folder.Settings + "Plugins\AviSynth\", Folder.Settings + "Plugins\Dual\"} For Each folder In folders If File.Exists(folder + filename) Then Return True End If Next Else Return (Folder.Plugins + filename).FileExists End If End Function Shared Function GetAvsLoadCode(script As String, scriptAlready As String) As String Dim scriptLower = script.ToLowerInvariant Dim scriptAlreadyLower = scriptAlready.ToLowerInvariant Dim loadCode = "" Dim plugins = Package.Items.Values.OfType(Of PluginPackage)() For Each plugin In plugins Dim fp = plugin.Path If fp <> "" Then If Not plugin.AvsFilterNames Is Nothing Then For Each filterName In plugin.AvsFilterNames If s.LoadAviSynthPlugins AndAlso Not IsAvsPluginInAutoLoadFolder(plugin.Filename) AndAlso ContainsFunction(scriptLower, filterName.ToLowerInvariant, 0) Then If plugin.Filename.Ext = "dll" Then Dim load = "LoadPlugin(""" + fp + """)" + BR If Not scriptLower.Contains(load.ToLowerInvariant) AndAlso Not loadCode.ToLowerInvariant.Contains(load.ToLowerInvariant) AndAlso Not scriptAlreadyLower.Contains(load.ToLowerInvariant) Then loadCode += load End If ElseIf plugin.Filename.Ext = "avsi" Then Dim avsiImport = "Import(""" + fp + """)" + BR If Not scriptLower.Contains(avsiImport.ToLowerInvariant) AndAlso Not loadCode.ToLowerInvariant.Contains(avsiImport.ToLowerInvariant) AndAlso Not scriptAlreadyLower.Contains(avsiImport.ToLowerInvariant) Then loadCode += avsiImport End If If Not plugin.Dependencies.NothingOrEmpty Then For Each iDependency In plugin.Dependencies Dim fp2 = Package.Items.Values.OfType(Of PluginPackage).Where(Function(pack) pack.Filename = iDependency AndAlso Not pack.AvsFilterNames.NothingOrEmpty).First.Path If fp2.Ext = "dll" Then Dim load = "LoadPlugin(""" + fp2 + """)" + BR If Not scriptLower.Contains(load.ToLowerInvariant) AndAlso Not loadCode.ToLowerInvariant.Contains(load.ToLowerInvariant) AndAlso Not scriptAlreadyLower.Contains(load.ToLowerInvariant) Then loadCode += load End If ElseIf fp2.Ext = "avsi" Then avsiImport = "Import(""" + fp2 + """)" + BR If Not scriptLower.Contains(avsiImport.ToLowerInvariant) AndAlso Not loadCode.ToLowerInvariant.Contains(avsiImport.ToLowerInvariant) AndAlso Not scriptAlreadyLower.Contains(avsiImport.ToLowerInvariant) Then loadCode += avsiImport End If End If Next End If End If End If Next End If End If Next Return loadCode End Function Shared Function ContainsFunction(script As String, funcName As String, startPos As Integer) As Boolean Dim index = script.IndexOf(funcName, startPos) If index = -1 Then Return False End If Dim charIndexBefore = index - 1 Dim charIndexAfter = index + funcName.Length Dim charBeforeIsWord = charIndexBefore >= 0 AndAlso IsWordChar(script(charIndexBefore)) Dim charAfterIsWord = charIndexAfter < script.Length AndAlso IsWordChar(script(charIndexAfter)) If Not charBeforeIsWord AndAlso Not charAfterIsWord Then Return True Else Dim newStart = index + 1 If newStart + funcName.Length < script.Length Then Return ContainsFunction(script, funcName, newStart) End If End If End Function Shared Function IsWordChar(ch As Char) As Boolean Dim val = Convert.ToInt32(ch) Return (val >= 48 AndAlso val <= 57) OrElse (val >= 65 AndAlso val <= 90) OrElse (val >= 97 AndAlso val <= 122) OrElse val = 95 End Function Shared Function GetAVSLoadCodeFromImports(code As String) As String code = code.ToLowerInvariant Dim ret = "" For Each line In code.SplitLinesNoEmpty If line.Contains("import") Then Dim match = Regex.Match(line, "\bimport\s*\(\s*""\s*(.+\.avsi*)\s*""\s*\)", RegexOptions.IgnoreCase) If match.Success AndAlso File.Exists(match.Groups(1).Value) Then ret += GetAvsLoadCode(match.Groups(1).Value.ReadAllText, code) End If End If Next Return ret End Function Shared Function ModifyAVSScript(script As String) As String Dim newScript As String Dim loadCode = GetAvsLoadCode(script, "") newScript = loadCode + script newScript = GetAVSLoadCodeFromImports(newScript) + newScript Dim initCode As String If FrameServerHelp.IsPortable Then initCode = "AddAutoloadDir(""" + Package.AviSynth.Directory + "plugins"")" + BR Dim pluginDir = Folder.Settings + "Plugins\AviSynth" If FolderHelp.HasFiles(pluginDir) Then initCode += "AddAutoloadDir(""" + pluginDir + """)" + BR End If pluginDir = Folder.Settings + "Plugins\Dual" If FolderHelp.HasFiles(pluginDir) Then initCode += "AddAutoloadDir(""" + pluginDir + """)" + BR End If End If Return initCode + newScript End Function Function GetFramerate() As Double Dim info = GetInfo() Dim ret = info.FrameRateNum / info.FrameRateDen Return If(Calc.IsValidFrameRate(ret), ret, 25) End Function Function GetCachedFrameRate() As Double Dim ret = Info.FrameRateNum / Info.FrameRateDen Return If(Calc.IsValidFrameRate(ret), ret, 25) End Function Function GetInfo() As ServerInfo Synchronize(False, False) Return Info End Function Function GetError() As String Synchronize(False, False) Return Me.Error End Function Function GetSeconds() As Integer Return CInt(GetFrameCount() / GetFramerate()) End Function Function GetFrameCount() As Integer Return GetInfo.FrameCount End Function Shared Function GetDefaults() As List(Of TargetVideoScript) Dim ret As New List(Of TargetVideoScript) Dim script = New TargetVideoScript("AviSynth") script.Engine = ScriptEngine.AviSynth script.Filters.Add(New VideoFilter("Source", "Automatic", "# can be configured at: Tools > Settings > Source Filters")) script.Filters.Add(New VideoFilter("Crop", "Crop", "Crop(%crop_left%, %crop_top%, -%crop_right%, -%crop_bottom%)", False)) script.Filters.Add(New VideoFilter("Field", "QTGMC Medium", "QTGMC(preset=""Medium"")", False)) script.Filters.Add(New VideoFilter("Noise", "DFTTest", "DFTTest(sigma=6, tbsize=1)", False)) script.Filters.Add(New VideoFilter("Resize", "BicubicResize", "BicubicResize(%target_width%, %target_height%)", False)) ret.Add(script) script = New TargetVideoScript("VapourSynth") script.Engine = ScriptEngine.VapourSynth script.Filters.Add(New VideoFilter("Source", "Automatic", "# can be configured at: Tools > Settings > Source Filters")) script.Filters.Add(New VideoFilter("Crop", "Crop", "clip = core.std.Crop(clip, %crop_left%, %crop_right%, %crop_top%, %crop_bottom%)", False)) script.Filters.Add(New VideoFilter("Noise", "DFTTest", "clip = core.dfttest.DFTTest(clip, sigma=6, tbsize=3, opt=3)", False)) script.Filters.Add(New VideoFilter("Field", "QTGMC Medium", $"clip = core.std.SetFieldBased(clip, 2) # 1=BFF, 2=TFF{BR}clip = havsfunc.QTGMC(clip, TFF=True, Preset='Medium')", False)) 'script.Filters.Add(New VideoFilter("Frame Rate", "SVPFlow", "crop_string = """"" + BR + "resize_string = """"" + BR + "super_params = ""{pel:1,scale:{up:0},gpu:1,full:false,rc:true}""" + BR + "analyse_params = ""{block:{w:16},main:{search:{coarse:{type:4,distance:-6,bad:{sad:2000,range:24}},type:4}},refine:[{thsad:250}]}""" + BR + "smoothfps_params = ""{gpuid:11,linear:true,rate:{num:60000,den:1001,abs:true},algo:23,mask:{area:200},scene:{}}""" + BR + "def interpolate(clip):" + BR + " input = clip" + BR + " if crop_string!='':" + BR + " input = eval(crop_string)" + BR + " if resize_string!='':" + BR + " input = eval(resize_string)" + BR + " super = core.svp1.Super(input,super_params)" + BR + " vectors = core.svp1.Analyse(super[""clip""],super[""data""],input,analyse_params)" + BR + " smooth = core.svp2.SmoothFps(input,super[""clip""],super[""data""],vectors[""clip""],vectors[""data""],smoothfps_params,src=clip)" + BR + " smooth = core.std.AssumeFPS(smooth,fpsnum=smooth.fps_num,fpsden=smooth.fps_den)" + BR + " return smooth" + BR + "clip = interpolate(clip)", False)) 'script.Filters.Add(New VideoFilter("Color", "Respec", "clip = core.fmtc.resample(clip, css='444')" + BR + "clip = core.fmtc.matrix(clip, mats='709', matd='709')" + BR + "clip = core.fmtc.resample(clip, css='420')" + BR + "clip = core.fmtc.bitdepth(clip, bits=10, fulls=False, fulld=False)", False)) script.Filters.Add(New VideoFilter("Resize", "BicubicResize", "clip = core.resize.Bicubic(clip, %target_width%, %target_height%)", False)) ret.Add(script) Return ret End Function Overrides Function Edit() As DialogResult Using form As New CodeEditor(Me) form.StartPosition = FormStartPosition.CenterParent If form.ShowDialog() = DialogResult.OK Then Filters = form.GetFilters If Filters.Count = 0 OrElse Filters(0).Category <> "Source" Then MsgError("The first filter must be a source filter.") Filters = GetDefaults(0).Filters End If Return DialogResult.OK End If End Using Return DialogResult.Cancel End Function End Class Public Class TargetVideoScript Inherits VideoScript Sub New(name As String) Me.Name = name CanEditValue = True End Sub Overrides Property Path() As String Get If p.SourceFile = "" OrElse p.TargetFile = "" Then Return "" End If Return p.TempDir + p.TargetFile.Base + "." + FileType End Get Set(value As String) End Set End Property End Class Public Class SourceVideoScript Inherits VideoScript Overrides Property Path() As String Get If p.SourceFile = "" Then Return "" End If Return p.TempDir + p.TargetFile.Base + "_source." + FileType End Get Set(value As String) End Set End Property Public Overrides Property Engine As ScriptEngine Get Return p.Script.Engine End Get Set(value As ScriptEngine) End Set End Property Overrides Function GetScript() As String Dim rotationFilter = p.Script.Filters.Where(Function(x) x.Active = True AndAlso x.Category = "Rotation")?.FirstOrDefault() Dim ret = p.Script.Filters(0).Script ret += If(rotationFilter Is Nothing, "", BR + rotationFilter.Script) Return ret End Function End Class Public Class VideoFilter Implements IComparable(Of VideoFilter) Property Active As Boolean Property Category As String Property Path As String Property Script As String Sub New() Me.New("???", "???", "???", True) End Sub Sub New(code As String) Me.New("???", "???", code, True) End Sub Sub New(category As String, name As String, script As String, Optional active As Boolean = True) Me.Path = name Me.Script = script Me.Category = category Me.Active = active End Sub ReadOnly Property Name As String Get If Path.Contains("|") Then Return Path.RightLast("|").Trim End If Return Path End Get End Property Function GetCopy() As VideoFilter Return New VideoFilter(Category, Path, Script, Active) End Function Overrides Function ToString() As String Return Path End Function Function CompareTo(other As VideoFilter) As Integer Implements System.IComparable(Of VideoFilter).CompareTo Return Path.CompareTo(other.Path) End Function Shared Function GetDefault( category As String, name As String, Optional scriptEngine As ScriptEngine = ScriptEngine.AviSynth) As VideoFilter Dim defaults = If(scriptEngine = ScriptEngine.AviSynth, FilterCategory.GetAviSynthDefaults(), FilterCategory.GetVapourSynthDefaults()) Return defaults.Where(Function(i) i.Name = category).FirstOrDefault()?.Filters.Where(Function(i) i.Name = name).FirstOrDefault() End Function End Class Public Class FilterCategory Sub New(name As String) Me.Name = name End Sub Property Name As String Private FitersValue As New List(Of VideoFilter) ReadOnly Property Filters() As List(Of VideoFilter) Get If FitersValue Is Nothing Then FitersValue = New List(Of VideoFilter) Return FitersValue End Get End Property Overrides Function ToString() As String Return Name End Function Shared Sub AddFilter(filter As VideoFilter, list As List(Of FilterCategory)) Dim matchingCategory = list.Where(Function(category) category.Name = filter.Category).FirstOrDefault If matchingCategory Is Nothing Then Dim newCategory As New FilterCategory(filter.Category) newCategory.Filters.Add(filter) list.Add(newCategory) Else matchingCategory.Filters.Add(filter) End If End Sub Shared Sub AddDefaults(engine As ScriptEngine, list As List(Of FilterCategory)) For Each i In Package.Items.Values.OfType(Of PluginPackage) Dim filters As VideoFilter() = Nothing If engine = ScriptEngine.AviSynth Then If Not i.AvsFiltersFunc Is Nothing Then filters = i.AvsFiltersFunc.Invoke End If Else If Not i.VsFiltersFunc Is Nothing Then filters = i.VsFiltersFunc.Invoke End If End If If Not filters Is Nothing Then For Each iFilter In filters Dim matchingCategory = list.Where(Function(category) category.Name = iFilter.Category).FirstOrDefault If matchingCategory Is Nothing Then Dim newCategory As New FilterCategory(iFilter.Category) newCategory.Filters.Add(iFilter) list.Add(newCategory) Else matchingCategory.Filters.Add(iFilter) End If Next End If Next End Sub Shared Function GetAviSynthDefaults() As List(Of FilterCategory) Dim ret As New List(Of FilterCategory) Dim src As New FilterCategory("Source") src.Filters.AddRange( {New VideoFilter("Source", "Manual", "# shows the filter selection dialog"), New VideoFilter("Source", "Automatic", "# can be configured at: Tools > Settings > Source Filters"), New VideoFilter("Source", "AviSource", "AviSource(""%source_file%"", audio=false)"), New VideoFilter("Source", "DirectShowSource", "DirectShowSource(""%source_file%"", audio=false)")}) ret.Add(src) Dim color As New FilterCategory("Color") color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | AutoAdjust", "AutoAdjust(gamma_limit=1.0, scd_threshold=16, gain_mode=1, auto_gain=$select:msg:Enable Auto Gain?;true;false$, auto_balance=$select:msg:Enable Auto Balance?;true;false$, Input_tv=$select:msg:Is the Input using TV Range?;true;false$, output_tv=$select:msg:Do you want to use TV Range for Output?;true;false$, use_dither=$select:msg:Use Dither?;true;false$, high_quality=$select:msg:Use High Quality Mode?;true;false$, high_bitdepth=$select:msg:Use High Bit Depth Mode?;true;false$, threads_count=$enter_text:How Many Threads do You Wish to use?$)")) color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Levels", "$select:TV to PC|ColorYUV(levels=""TV->PC"");PC to TV|ColorYUV(levels=""PC->TV"")$")) color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Stack", "$select:To Stack|ConvertToStacked();From Stacked|ConvertFromStacked()$")) color.Filters.Add(New VideoFilter(color.Name, "Convert | ConvertTo", "ConvertTo$enter_text:Enter The Format You Wish To Convert To$()")) color.Filters.Add(New VideoFilter(color.Name, "Convert | ConvertBits", "ConvertBits($select:msg:Select the Bit Depth You want to Convert To;8;10;12;14;16;32$)")) color.Filters.Add(New VideoFilter(color.Name, "Convert | ConvertFromDoubleWidth", "ConvertFromDoubleWidth(bits=$select:msg:Select the Bit Depth;8;10;12;14;16;32$)")) color.Filters.Add(New VideoFilter(color.Name, "Dither | Gamma / Linear", "$select:Gamma To Linear|Dither_y_gamma_to_linear;Linear To Gamma|Dither_y_linear_to_gamma$(curve=""$select:msg:Select the Color Curve;601;709;2020$"")")) color.Filters.Add(New VideoFilter(color.Name, "Dither | Sigmoid", "$select:Sigmoid Direct|Dither_sigmoid_direct();Sigmoid Inverse|Dither_sigmoid_inverse()$")) color.Filters.Add(New VideoFilter(color.Name, "Dither | 8Bit to 16Bit", "Dither_convert_8_to_16()")) color.Filters.Add(New VideoFilter(color.Name, "Dither | YUV / RGB", "$select:RGB To YUV|Dither_convert_rgb_to_yuv();YUV To RGB|Dither_convert_yuv_to_rgb()$")) color.Filters.Add(New VideoFilter(color.Name, "Dither | DFTTest(LSB)", "dfttest(lsb=true)")) color.Filters.Add(New VideoFilter(color.Name, "Dither | DitherPost", "DitherPost()")) color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | AutoGain", "ColorYUV(autogain=$select:msg:Enable AutoGain?;true;false$, autowhite=$select:msg:Enable AutoWhite?;true;false$)")) color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Tweak", "Tweak(realcalc=true, dither_strength=1.0, sat=0.75, startHue=105, endHue=138 )")) ret.Add(color) Dim crop As New FilterCategory("Crop") crop.Filters.Add(New VideoFilter(crop.Name, "Crop", "$select:msg:Select Version;Crop;Dither_Crop16$(%crop_left%, %crop_top%, -%crop_right%, -%crop_bottom%)")) crop.Filters.Add(New VideoFilter(crop.Name, "Hardware Encoder", "# hardware encoder crops")) ret.Add(crop) Dim field As New FilterCategory("Field") field.Filters.Add(New VideoFilter(field.Name, "IVTC", "Telecide(guide=1)" + BR + "Decimate()")) field.Filters.Add(New VideoFilter(field.Name, "FieldDeinterlace", "FieldDeinterlace()")) field.Filters.Add(New VideoFilter(field.Name, "Select", "$select:Even|SelectEven();Odd|SelectOdd()$")) field.Filters.Add(New VideoFilter(field.Name, "Assume", "$select:TFF|AssumeTFF();BFF|AssumeTFF()$")) ret.Add(field) Dim framerate As New FilterCategory("Frame Rate") framerate.Filters.Add(New VideoFilter(framerate.Name, "AssumeFPS", "AssumeFPS($select:msg:Select a frame rate;23.976|24000, 1001;24;25;29.970|30000, 1001;30;50;59.940|60000, 1001;60;120;144;240$)")) framerate.Filters.Add(New VideoFilter(framerate.Name, "AssumeFPS Source File", "AssumeFPS(%media_info_video:FrameRate%)")) framerate.Filters.Add(New VideoFilter(framerate.Name, "ChangeFPS", "ChangeFPS($select:msg:Select a frame rate;23.976|24000, 1001;24;25;29.970|30000, 1001;30;50;59.940|60000, 1001;60;120;144;240$)")) framerate.Filters.Add(New VideoFilter(framerate.Name, "ConvertFPS", "ConvertFPS($select:msg:Select a frame rate;23.976|24000, 1001;24;25;29.970|30000, 1001;30;50;59.940|60000, 1001;60;120;144;240$)")) framerate.Filters.Add(New VideoFilter(framerate.Name, "SVPFlow", "Threads = 8" + BR + "super_params = ""{pel:2,gpu:1}""" + BR + "analyse_params = """"""{block:{w:16,h:16}, main:{search:{coarse:{distance:-10}}}, refine:[{thsad:200}]}"""""" " + BR + "smoothfps_params = ""{rate:{num:4,den:2},algo:23,cubic:1}""" + BR + "super = SVSuper(super_params)" + BR + "vectors = SVAnalyse(super, analyse_params)" + BR + "SVSmoothFps(super, vectors, smoothfps_params, mt=threads)" + BR + "#Prefetch(threads) must be added at the end of the script and Threads=9 after the source" + BR + "Prefetch(threads)")) ret.Add(framerate) Dim line As New FilterCategory("Line") line.Filters.Add(New VideoFilter(line.Name, "Anti-Aliasing | SangNom2", "Sangnom2()")) line.Filters.Add(New VideoFilter(line.Name, "Sharpen | MultiSharpen", "MultiSharpen(1)")) ret.Add(line) Dim misc As New FilterCategory("Misc") misc.Filters.Add(New VideoFilter(misc.Name, "MTMode | Prefetch", "Prefetch($enter_text:Enter the Number of Threads to Use$)")) ' Number or Reference to Thread header can Be Used here. misc.Filters.Add(New VideoFilter(misc.Name, "MTMode | Set Threads", "threads=$enter_text:Enter The Number of Threads to Use$")) misc.Filters.Add(New VideoFilter(misc.Name, "MTMode | SetMTMode Filter", "SetFilterMTMode(""$enter_text:Enter The FilterName$"",$enter_text:Enter Mode You Wish to Use$)")) misc.Filters.Add(New VideoFilter(misc.Name, "MTMode | Set Max Memory", "SetMemoryMax($enter_text:Enter the Maximum Memory Avisynth Can use$)")) misc.Filters.Add(New VideoFilter(misc.Name, "Histogram", "Histogram(""levels"", bits=$select:msg:Select BitDepth;8;10;12$)")) misc.Filters.Add(New VideoFilter(misc.Name, "SplitVertical", "Splitvertical=true")) misc.Filters.Add(New VideoFilter(misc.Name, "AddBorders", "AddBorders(0,0,0,0) #left,top,right,bottom")) misc.Filters.Add(New VideoFilter(misc.Name, "SelectRangeEvery", "SelectRangeEvery(1500,50)")) ret.Add(misc) Dim noise As New FilterCategory("Noise") noise.Filters.Add(New VideoFilter(noise.Name, "RemoveGrain | RemoveGrain | RemoveGrain16 with Repair16", "Processed = Dither_removegrain16(mode=2, modeU=2, modeV=2)" + BR + "Dither_repair16(Processed, mode=2, modeU=2, modeV=2)")) ret.Add(noise) Dim resize As New FilterCategory("Resize") resize.Filters.Add(New VideoFilter(resize.Name, "Resize...", "$select:BicubicResize;BilinearResize;BlackmanResize;GaussResize;Lanczos4Resize;LanczosResize;PointResize;SincResize;Jinc36Resize;Jinc64Resize;Jinc144Resize;Jinc256Resize;Spline16Resize;Spline36Resize;Spline64Resize$(%target_width%, %target_height%)")) resize.Filters.Add(New VideoFilter(resize.Name, "Advanced | Hardware Encoder", "# hardware encoder resizes")) resize.Filters.Add(New VideoFilter(resize.Name, "Advanced | SuperRes", "$select:msg:Select Version;SuperResXBR|SuperResXBR;SuperRes|SuperRes;SuperXBR|SuperXBR$(passes=$select:msg:How Many Passes Do you wish to Perform?;2;3;4;5$, factor=$select:msg:Factor Increase by?;2;4$)")) resize.Filters.Add(New VideoFilter(resize.Name, "Advanced | Dither_Resize16", "Dither_resize16(%target_width%, %target_height%)")) resize.Filters.Add(New VideoFilter(resize.Name, "Advanced | Dither_Resize16 In Linear Light", "Dither_convert_yuv_to_rgb (matrix=""2020"", output=""rgb48y"", lsb_in=true)" + BR + "Dither_y_gamma_to_linear(tv_range_in=false, tv_range_out=false, curve=""2020"", sigmoid=true)" + BR + "Dither_resize16nr(%target_width%, %target_height%, kernel=""spline36"")" + BR + "Dither_y_linear_to_gamma(tv_range_in=false, tv_range_out=false, curve=""2020"", sigmoid=true)" + BR + "r = SelectEvery (3, 0)" + BR + "g = SelectEvery (3, 1)" + BR + "b = SelectEvery (3, 2)" + BR + "Dither_convert_rgb_to_yuv(r, g, b, matrix=""2020"", lsb=true)")) ret.Add(resize) Dim restoration As New FilterCategory("Restoration") restoration.Filters.Add(New VideoFilter(restoration.Name, "RCR | ColorBanding", "$select:GradFun3|GradFun3();f3kdb|f3kdb()$")) ret.Add(restoration) Dim rotation As New FilterCategory("Rotation") rotation.Filters.Add(New VideoFilter(rotation.Name, "Left", $"TurnLeft()")) rotation.Filters.Add(New VideoFilter(rotation.Name, "Right", $"TurnRight()")) rotation.Filters.Add(New VideoFilter(rotation.Name, "Upside Down", $"Turn180()")) ret.Add(rotation) FilterCategory.AddDefaults(ScriptEngine.AviSynth, ret) For Each i In ret i.Filters.Sort() Next Return ret End Function Shared Function GetVapourSynthDefaults() As List(Of FilterCategory) Dim ret As New List(Of FilterCategory) Dim src As New FilterCategory("Source") src.Filters.AddRange( {New VideoFilter("Source", "Manual", "# shows filter selection dialog"), New VideoFilter("Source", "Automatic", "# can be configured at: Tools > Settings > Source Filters"), New VideoFilter("Source", "AVISource", "clip = core.avisource.AVISource(r""%source_file%"")")}) ret.Add(src) Dim color As New FilterCategory("Color") color.Filters.Add(New VideoFilter(color.Name, "Dither | Gamma / Linear", "clip = $select:Gamma To Linear|Dither.gamma_to_linear;Linear To Gamma|Dither.linear_to_gamma$(clip, curve='$select:msg:Select the Color Curve;601;709;2020$')")) color.Filters.Add(New VideoFilter(color.Name, "Dither | Sigmoid", "$select:Sigmoid Inverse|clip = havsfunc.SigmoidInverse(clip);Sigmoid Direct|clip = havsfunc.SigmoidDirect(clip)$")) color.Filters.Add(New VideoFilter(color.Name, "Dither | SmoothGrad", "clip = muvsfunc.GradFun3(src=clip, mode=6, smode=1)")) color.Filters.Add(New VideoFilter(color.Name, "Dither | Stack", "$select:Native to Stack16|clip = core.fmtc.nativetostack16(clip);Stack16 to Native|clip = fmtc.stack16tonative(clip)$")) color.Filters.Add(New VideoFilter(color.Name, "Dither | To RGB / YUV", "clip = $select:To RGB|mvsfunc.ToRGB;To YUV|mvsfunc.ToYUV$(clip,matrix='$select:msg:Select Matrix;470bg;240;709;2020;2020cl;bt2020c$')")) color.Filters.Add(New VideoFilter(color.Name, "ColorSpace | Respec", "clip = core.fmtc.resample (clip, css='444')" + BR + "clip = core.fmtc.matrix (clip, mats='$select:msg:Select Input Colorspace;240;601;709;2020$', matd='$select:msg:Select Output Colorspace;240;601;709;2020$')" + BR + "clip = core.fmtc.resample (clip, css='420')" + BR + "clip = core.fmtc.bitdepth (clip, bits=8, fulls=$select:msg:Select Input Range;Limited|False;Full|True$, fulld=$select:msg:Select Output Range;Limited|False;Full|True$)")) color.Filters.Add(New VideoFilter(color.Name, "ColorSpace | Matrix", "clip = core.fmtc.matrix(clip, mat='$select:msg:Select Matrix;Linear;470m;470bg;240m;SRGB;709;2020$')")) color.Filters.Add(New VideoFilter(color.Name, "ColorSpace | Primaries", "clip = core.fmtc.primaries(clip, prims='$select:msg:Select Input;470m;470bg;240m;SRGB;709;2020$', primd='$select:msg:Select Output;Linear;470m;470bg;240m;SRGB;709;2020$')")) color.Filters.Add(New VideoFilter(color.Name, "ColorSpace | Transfer", "clip = core.fmtc.transfer(clip, transs='$select:msg:Select Input;Linear;470m;470bg;240m;SRGB;709;2020;2084$', transd='$select:msg:Select Output;Linear;470m;470bg;240m;SRGB;709;2020;2084$')")) color.Filters.Add(New VideoFilter(color.Name, "ColorSpace | Range", "$select:msg:Select Range;PC to TV|clip = core.fmtc.bitdepth(clip, fulls=True, fulld=False);TV to PC|clip = core.fmtc.bitdepth (clip, fulls=False, fulld=True)$")) color.Filters.Add(New VideoFilter(color.Name, "Convert | Tweak", "clip = adjust.Tweak(clip, sat=0.75, hue=115-138)")) color.Filters.Add(New VideoFilter(color.Name, "Convert | BitDepth (fmtc)", "clip = core.fmtc.bitdepth(clip, bits=$select:msg:Select BitDepth;8;10;12;16;32$)")) color.Filters.Add(New VideoFilter(color.Name, "Convert | Format", "clip = core.avs.z_ConvertFormat(clip, pixel_type='$enter_text:Enter the Format You Wish to Convert to$', colorspace_op='$select:msg:Select Input Color Matrix;rgb;709;unspec;fcc;470bg;170m;240;ycgco;2020ncl;2020cl;chromancl;chromacl;ictcp$:$select:msg:Select Input Color Transfer;709;unspec;470m;470bg;601;240m;linear;log100;log316;xvycc;srgb;2020_10;2020_12;st2084;std-b67$:$select:msg:Select Input Color Primaries;709;unspec;470m;470bg;170m;240m;film;2020;st428;st431-2;st432-1;jedec-p22$:$select:msg:Select Pixel Range;limited;l;full;f$=>$select:msg:Select Output Color Matrix;rgb;709;unspec;fcc;470bg;170m;240;ycgco;2020ncl;2020cl;chromancl;chromacl;ictcp$:$select:msg:Select Output Color Transfer;709;unspec;470m;470bg;601;240m;linear;log100;log316;xvycc;srgb;2020_10;2020_12;st2084;std-b67$:$select:msg:Select Output Color Primaries;709;unspec;470m;470bg;170m;240m;film;2020;st428;st431-2;st432-1;jedec-p22$:$select:msg:Select Pixel Range;limited;l;full;f$', dither_type='$select:msg:Select Dither Type;none;ordered;random;error_diffusion$')")) color.Filters.Add(New VideoFilter(color.Name, "Convert | Convert To", "clip = core.resize.Bicubic(clip, format=vs.$select:COMPATBGR32;COMPATYUY2;GRAY16;GRAY8;GRAYH;GRAYS;RGB24;RGB27;RGB30;RGB48;RGBH;RGBS;YUV410P8;YUV411P8;YUV420P8;YUV420P9;YUV420P10;YUV420P12;YUV420P14;YUV420P16;YUV422P8;YUV422P9;YUV422P10;YUV422P12;YUV422P14;YUV422P16;YUV440P8;YUV444P8;YUV444P9;YUV444P10;YUV444P12;YUV444P14;YUV444P16;YUV444PH;YUV444PS$)")) color.Filters.Add(New VideoFilter(color.Name, "Convert | To 444", "clip = core.fmtc.resample(clip, css='444')")) ret.Add(color) Dim crop As New FilterCategory("Crop") crop.Filters.Add(New VideoFilter(crop.Name, "Crop", "clip = core.std.Crop(clip, %crop_left%, %crop_right%, %crop_top%, %crop_bottom%)")) ret.Add(crop) Dim field As New FilterCategory("Field") field.Filters.Add(New VideoFilter(field.Name, "IVTC", "clip = core.vivtc.VFM(clip, 1)" + BR + "clip = core.vivtc.VDecimate(clip)")) field.Filters.Add(New VideoFilter(field.Name, "W3FDIF", "clip = core.w3fdif.W3FDIF(clip,$select:msg:Select Order Option;BFF|0;TFF|1$,$select:msg:Select Interlacing Filter Coefficients;Simple|0;Complex|1$)")) field.Filters.Add(New VideoFilter(field.Name, "Select", "$select:Even|clip = clip[::2];Odd|clip = clip[1::2]$")) field.Filters.Add(New VideoFilter(field.Name, "eedi", "$select:eedi2|clip = core.eedi2.EEDI2;eedi3|clip = core.eedi3m.EEDI3$(clip,$select:msg:Select Field;Bottom Field|0;Top Field|1;Alternate Each Frame Bottom Field|2;Alternate Each Frame Top Field|3$)")) field.Filters.Add(New VideoFilter(field.Name, "nnedi3", "$select:znedi3|clip = core.znedi3.nnedi3;nnedi3cl|clip = core.nnedi3cl.NNEDI3CL;nnedi3|clip = core.nnedi3.nnedi3$(clip, field=$select:msg:Select Field Option;Same Rate Bottom Field|0;Same Rate Top Field|1;Double Rate Alternates Bottom Field|2;Double Rate Alternates Top Field|3$)")) field.Filters.Add(New VideoFilter(field.Name, "Field Base", "$select:Frame Based|clip = core.std.SetFieldBased(clip, 0);Bottom Field First|clip = core.std.SetFieldBased(clip, 1);Top Field First|clip = core.std.SetFieldBased(clip, 2)$")) ret.Add(field) Dim framerate As New FilterCategory("Frame Rate") framerate.Filters.Add(New VideoFilter(framerate.Name, "AssumeFPS | AssumeFPS Source", "clip = core.std.AssumeFPS(clip, fpsnum=int(%media_info_video:FrameRate% * 1000), fpsden=1000)")) framerate.Filters.Add(New VideoFilter(framerate.Name, "AssumeFPS | AssumeFPS", "clip = core.std.AssumeFPS(clip, None, $select:msg:Select a frame rate.;24000/1001|24000, 1001;24|24, 1;25|25, 1;30000/1001|30000, 1001;30|30, 1;50|50, 1;60000/1001|60000, 1001;60|60, 1$)")) framerate.Filters.Add(New VideoFilter(framerate.Name, "InterFrame", "clip = havsfunc.InterFrame(clip, Preset='Medium', Tuning='$select:msg:Select the Tuning Preset;Animation;Film;Smooth;Weak$', NewNum=$enter_text:Enter the NewNum Value$, NewDen=$enter_text:Enter the NewDen Value$, OverrideAlgo=$select:msg:Which Algorithm Do you Wish to Use?;Strong Predictions|2;Intelligent|13;Smoothest|23$, GPU=$select:msg:Enable GPU Feature?;True;False$)")) framerate.Filters.Add(New VideoFilter(framerate.Name, "SVPFlow | MV", "sup = core.mv.Super(clip, pel=2, hpad=0, vpad=0)" + BR + "bvec = core.mv.Analyse(sup, blksize=16, isb=True, chroma=True, search=3, searchparam=1)" + BR + "fvec = core.mv.Analyse(sup, blksize=16, isb=False, chroma=True, search=3, searchparam=1)" + BR + "$select:msg:Select FPS Filter to Use;FlowFPS|clip = core.mv.FlowFPS(clip, sup, bvec, fvec, mask=2;BlockFPS|clip = core.mv.BlockFPS(clip, sup, bvec, fvec, mode=3, thscd2=12$, num=$enter_text:Enter The Num Value$, den=$enter_text:Enter The Den Value$)")) framerate.Filters.Add(New VideoFilter(framerate.Name, "SVPFlow | Core", "crop_string = ''" + BR + "resize_string = ''" + BR + "super_params = '{pel:1,scale:{up:0},gpu:1,full:false,rc:true}'" + BR + "analyse_params = '{block:{w:16},main:{search:{coarse:{type:4,distance:-6,bad:{sad:2000,range:24}},type:4}},refine:[{thsad:250}]}'" + BR + "smoothfps_params = '{gpuid:11,linear:true,rate:{num:60000,den:1001,abs:true},algo:23,mask:{area:200},scene:{}}'" + BR + "def interpolate(clip):" + BR + " input = clip" + BR + " if crop_string!='':" + BR + " input = eval(crop_string)" + BR + " if resize_string != '':" + BR + " input = eval(resize_string)" + BR + " super = core.svp1.Super(input, super_params)" + BR + " vectors = core.svp1.Analyse(super['clip'], super['data'], input, analyse_params)" + BR + " smooth = core.svp2.SmoothFps(input, super['clip'], super['data'], vectors['clip'], vectors['data'], smoothfps_params, src=clip)" + BR + " smooth = core.std.AssumeFPS(smooth, fpsnum=smooth.fps_num, fpsden=smooth.fps_den)" + BR + " return smooth" + BR + "clip = interpolate(clip)")) ret.Add(framerate) Dim line As New FilterCategory("Line") line.Filters.Add(New VideoFilter(line.Name, "Anti-Aliasing | DAA", "clip = havsfunc.daa(clip)")) line.Filters.Add(New VideoFilter(line.Name, "Anti-Aliasing | nnedi3AA", "clip = muvsfunc.nnedi3aa(clip)")) line.Filters.Add(New VideoFilter(line.Name, "Anti-Aliasing | ediAA", "clip = muvsfunc.ediaa(clip)")) line.Filters.Add(New VideoFilter(line.Name, "Anti-Aliasing | Santiag", "clip = havsfunc.santiag(c=clip, opencl=$select:msg:Use GPU Enabled Feature?;True;False$)")) line.Filters.Add(New VideoFilter(line.Name, "Anti-Aliasing | MAA", "clip = muvsfunc.maa(clip)")) line.Filters.Add(New VideoFilter(line.Name, "Sharpen | LSFmod", "clip = havsfunc.LSFmod(clip, defaults='slow', strength=100, Smode=5, Smethod=3, kernel=11, secure=True, Szrp= 16, Spwr= 4, SdmpLo= 4, SdmpHi= 48, Lmode=4, overshoot=1, undershoot=1, soft=-2, soothe=True, keep=20, edgemode=0, edgemaskHQ=True, ss_x= 1.50, ss_y=1.50)")) line.Filters.Add(New VideoFilter(line.Name, "Sharpen | SharpAAMcmod", "clip = muvsfunc.SharpAAMcmod(clip)")) ret.Add(line) Dim misc As New FilterCategory("Misc") misc.Filters.Add(New VideoFilter(misc.Name, "UnSpec", "clip = core.resize.Point(clip, matrix_in_s='unspec',range_s='limited')" + BR + "clip = core.std.AssumeFPS(clip, fpsnum=int(%media_info_video:FrameRate% * 1000), fpsden=1000)" + BR + "clip = core.std.SetFrameProp(clip=clip, prop='_ColorRange', intval=1)")) misc.Filters.Add(New VideoFilter(misc.Name, "Histogram", "clip = muvsfunc.DisplayHistogram(clip)")) misc.Filters.Add(New VideoFilter(misc.Name, "Cube", "clip = core.timecube.Cube(clip, cube=r""$browse_file$"")")) misc.Filters.Add(New VideoFilter(misc.Name, "Anamorphic to Standard", "clip = core.fmtc.resample (clip, w=1280, h=720, css='444')" + BR + "clip = core.fmtc.matrix (clip, mat='709', col_fam=vs.RGB)" + BR + "clip = core.fmtc.transfer (clip, transs='1886', transd='srgb')" + BR + "clip = core.fmtc.bitdepth (clip, bits=8)")) ret.Add(misc) Dim noise As New FilterCategory("Noise") noise.Filters.Add(New VideoFilter(noise.Name, "RemoveGrain | SMDegrain", "clip = havsfunc.SMDegrain(clip, contrasharp=True)")) noise.Filters.Add(New VideoFilter(noise.Name, "RemoveGrain | RemoveGrain | RemoveGrain", "clip = core.rgvs.RemoveGrain(clip, 1)")) noise.Filters.Add(New VideoFilter(noise.Name, "RemoveGrain | RemoveGrain | RemoveGrain with Repair", "Processed = core.rgvs.RemoveGrain(clip, 1)" + BR + "clip = core.rgvs.Repair(clip,Processed, mode=2)")) noise.Filters.Add(New VideoFilter(noise.Name, "mClean", "clip = G41Fun.mClean(clip)")) noise.Filters.Add(New VideoFilter(noise.Name, "MCTemporalDenoise", "clip = havsfunc.MCTemporalDenoise(i=clip, settings='$select:msg:Select Strength;Very Low;Low;Medium;High;Very High$')")) noise.Filters.Add(New VideoFilter(noise.Name, "BM3D", "clip = mvsfunc.BM3D(clip, sigma=[3,3,3], radius1=0)")) ret.Add(noise) Dim resize As New FilterCategory("Resize") resize.Filters.Add(New VideoFilter(resize.Name, "Resize...", "clip = $select:Bilinear|core.resize.Bilinear;Bicubic|core.resize.Bicubic;Point|core.resize.Point;Lanczos|core.resize.Lanczos;Spline16|core.resize.Spline16;Spline36|core.resize.Spline36;Spline64|core.resize.Spline64;Dither_Resize16|Dither.Resize16nr;Resample|core.fmtc.resample$(clip, %target_width%, %target_height%)")) ret.Add(resize) Dim restoration As New FilterCategory("Restoration") restoration.Filters.Add(New VideoFilter(restoration.Name, "RCR | ColorBanding", "$select:GradFun3|clip = muvsfunc.GradFun3(src=clip, mode=6, smode=1);f3kdb|clip = core.f3kdb.Deband(clip)$")) restoration.Filters.Add(New VideoFilter(restoration.Name, "DeHalo | FineDehalo", "clip = havsfunc.FineDehalo(clip)")) restoration.Filters.Add(New VideoFilter(restoration.Name, "DeHalo | DeHaloAlpha", "clip = havsfunc.DeHalo_alpha(clip)")) restoration.Filters.Add(New VideoFilter(restoration.Name, "DeBlock | Deblock_QED", "clip = havsfunc.Deblock_QED(clip)")) restoration.Filters.Add(New VideoFilter(restoration.Name, "DeBlock | Auto-Deblock", "clip = fvsfunc.AutoDeblock(clip)")) restoration.Filters.Add(New VideoFilter(restoration.Name, "DeHalo | BlindDeHalo3", "clip = muvsfunc.BlindDeHalo3(clip, interlaced=False)")) restoration.Filters.Add(New VideoFilter(restoration.Name, "DeHalo | EdgeCleaner", "clip = havsfunc.EdgeCleaner(clip)")) restoration.Filters.Add(New VideoFilter(restoration.Name, "DeHalo | YAHR", "$select:YAHR|clip = havsfunc.YAHR(clip);YAHRmod|clip = muvsfunc.YAHRmod(clip)$")) restoration.Filters.Add(New VideoFilter(restoration.Name, "DeHalo | MDeRing", "clip = muvsfunc.mdering(clip)")) restoration.Filters.Add(New VideoFilter(restoration.Name, "DeHalo | HQDering", "clip = havsfunc.HQDeringmod(clip, nrmode=2, darkthr=3.0)")) restoration.Filters.Add(New VideoFilter(restoration.Name, "RCR | Vinverse", "$select:Vinverse|clip = havsfunc.Vinverse(clip);Vinverse2|clip = havsfunc.Vinverse2(clip)$")) restoration.Filters.Add(New VideoFilter(restoration.Name, "RCR | CNR2", "clip = core.cnr2.Cnr2(clip)")) ret.Add(restoration) Dim rotation As New FilterCategory("Rotation") rotation.Filters.Add(New VideoFilter(rotation.Name, "Left", $"clip = core.std.FlipHorizontal(clip){BR}clip = core.std.Transpose(clip)")) rotation.Filters.Add(New VideoFilter(rotation.Name, "Right", $"clip = core.std.FlipVertical(clip){BR}clip = core.std.Transpose(clip)")) rotation.Filters.Add(New VideoFilter(rotation.Name, "Upside Down", $"clip = core.std.Turn180(clip)")) ret.Add(rotation) FilterCategory.AddDefaults(ScriptEngine.VapourSynth, ret) For Each i In ret i.Filters.Sort() Next Return ret End Function End Class Public Class FilterParameter Property Name As String Property Value As String Sub New(name As String, value As String) Me.Name = name Me.Value = value End Sub End Class Public Class FilterParameters Property FunctionName As String Property Text As String Property Parameters As New List(Of FilterParameter) Shared DefinitionsValue As List(Of FilterParameters) Shared ReadOnly Property Definitions As List(Of FilterParameters) Get If DefinitionsValue Is Nothing Then DefinitionsValue = New List(Of FilterParameters) Dim add = Sub(func As String(), path As String, params As FilterParameter()) For Each i In func Dim ret As New FilterParameters ret.FunctionName = i ret.Text = path DefinitionsValue.Add(ret) ret.Parameters.AddRange(params) Next End Sub Dim add2 = Sub(func As String(), param As String, value As String, path As String) For Each i In func Dim ret As New FilterParameters ret.FunctionName = i ret.Text = path DefinitionsValue.Add(ret) ret.Parameters.Add(New FilterParameter(param, value)) Next End Sub add({"FFVideoSource", "LWLibavVideoSource", "LSMASHVideoSource", "ffms2.Source", "LibavSMASHSource", "LWLibavSource"}, "fpsnum, fpsden | 30000, 1001", { New FilterParameter("fpsnum", "30000"), New FilterParameter("fpsden", "1001")}) add({"FFVideoSource", "LWLibavVideoSource", "LSMASHVideoSource", "ffms2.Source", "LibavSMASHSource", "LWLibavSource"}, "fpsnum, fpsden | 60000, 1001", { New FilterParameter("fpsnum", "60000"), New FilterParameter("fpsden", "1001")}) add({"FFVideoSource", "LWLibavVideoSource", "LSMASHVideoSource", "ffms2.Source", "LibavSMASHSource", "LWLibavSource"}, "fpsnum, fpsden | 24, 1", { New FilterParameter("fpsnum", "24"), New FilterParameter("fpsden", "1")}) add({"FFVideoSource", "LWLibavVideoSource", "LSMASHVideoSource", "ffms2.Source", "LibavSMASHSource", "LWLibavSource"}, "fpsnum, fpsden | 25, 1", { New FilterParameter("fpsnum", "25"), New FilterParameter("fpsden", "1")}) add({"FFVideoSource", "LWLibavVideoSource", "LSMASHVideoSource", "ffms2.Source", "LibavSMASHSource", "LWLibavSource"}, "fpsnum, fpsden | 30, 1", { New FilterParameter("fpsnum", "30"), New FilterParameter("fpsden", "1")}) add({"FFVideoSource", "LWLibavVideoSource", "LSMASHVideoSource", "ffms2.Source", "LibavSMASHSource", "LWLibavSource"}, "fpsnum, fpsden | 50, 1", { New FilterParameter("fpsnum", "50"), New FilterParameter("fpsden", "1")}) add({"FFVideoSource", "LWLibavVideoSource", "LSMASHVideoSource", "ffms2.Source", "LibavSMASHSource", "LWLibavSource"}, "fpsnum, fpsden | 60, 1", { New FilterParameter("fpsnum", "60"), New FilterParameter("fpsden", "1")}) add2({"ffms2.Source", "FFVideoSource"}, "rffmode", "0", "rffmode | 0 (ignore all flags (default))") add2({"ffms2.Source", "FFVideoSource"}, "rffmode", "1", "rffmode | 1 (honor all pulldown flags)") add2({"ffms2.Source", "FFVideoSource"}, "rffmode", "2", "rffmode | 2 (force film)") add2({"FFVideoSource"}, "colorspace", """YUV420P8""", "colorspace | YUV420P8") add2({"FFVideoSource"}, "colorspace", """YUV422P8""", "colorspace | YUV422P8") add2({"FFVideoSource"}, "colorspace", """YUV444P8""", "colorspace | YUV444P8") add2({"FFVideoSource"}, "colorspace", """YUV410P8""", "colorspace | YUV410P8") add2({"FFVideoSource"}, "colorspace", """YUV411P8""", "colorspace | YUV411P8") add2({"FFVideoSource"}, "colorspace", """YUV420P9""", "colorspace | YUV420P9") add2({"FFVideoSource"}, "colorspace", """YUV422P9""", "colorspace | YUV422P9") add2({"FFVideoSource"}, "colorspace", """YUV444P9""", "colorspace | YUV444P9") add2({"FFVideoSource"}, "colorspace", """YUV420P10""", "colorspace | YUV420P10") add2({"FFVideoSource"}, "colorspace", """YUV422P10""", "colorspace | YUV422P10") add2({"FFVideoSource"}, "colorspace", """YUV444P10""", "colorspace | YUV444P10") add2({"FFVideoSource"}, "colorspace", """YUV420P12""", "colorspace | YUV420P12") add2({"FFVideoSource"}, "colorspace", """YUV422P12""", "colorspace | YUV422P12") add2({"FFVideoSource"}, "colorspace", """YUV444P12""", "colorspace | YUV444P12") add2({"FFVideoSource"}, "colorspace", """YUV420P14""", "colorspace | YUV420P14") add2({"FFVideoSource"}, "colorspace", """YUV422P14""", "colorspace | YUV422P14") add2({"FFVideoSource"}, "colorspace", """YUV444P14""", "colorspace | YUV444P14") add2({"FFVideoSource"}, "colorspace", """YUV420P16""", "colorspace | YUV420P16") add2({"FFVideoSource"}, "colorspace", """YUV422P16""", "colorspace | YUV422P16") add2({"FFVideoSource"}, "colorspace", """YUV444P16""", "colorspace | YUV444P16") add2({"FFVideoSource"}, "colorspace", """Y8""", "colorspace | Y8") add2({"FFVideoSource"}, "colorspace", """YUY2""", "colorspace | YUY2") add2({"FFVideoSource"}, "colorspace", """RGB24""", "colorspace | RGB24") add2({"FFVideoSource"}, "colorspace", """RGB32""", "colorspace | RGB32") add2({"havsfunc.QTGMC"}, "TFF", "True", "TFF | True (top field first)") add2({"havsfunc.QTGMC"}, "TFF", "False", "TFF | False (bottom field first)") add2({"QTGMC"}, "Preset", """Draft""", "Preset | Draft") add2({"QTGMC"}, "Preset", """Ultra Fast""", "Preset | Ultra Fast") add2({"QTGMC"}, "Preset", """Super Fast""", "Preset | Super Fast") add2({"QTGMC"}, "Preset", """Very Fast""", "Preset | Very Fast") add2({"QTGMC"}, "Preset", """Faster""", "Preset | Faster") add2({"QTGMC"}, "Preset", """Fast""", "Preset | Fast") add2({"QTGMC"}, "Preset", """Medium""", "Preset | Medium") add2({"QTGMC"}, "Preset", """Slow""", "Preset | Slow") add2({"QTGMC"}, "Preset", """Slower""", "Preset | Slower") add2({"QTGMC"}, "Preset", """Very Slow""", "Preset | Very Slow") add2({"QTGMC"}, "Preset", """Placebo""", "Preset | Placebo") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "prefer_hw", "0", "prefer_hw | Software Decoder") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "prefer_hw", "1", "prefer_hw | NVIDIA CUVID") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "prefer_hw", "2", "prefer_hw | Intel Quick Sync") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "prefer_hw", "3", "prefer_hw | HW Automatic") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """YUV420P8""", "format | YUV420P8") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """YUV422P8""", "format | YUV422P8") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """YUV444P8""", "format | YUV444P8") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """YUV410P8""", "format | YUV410P8") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """YUV411P8""", "format | YUV411P8") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """YUV420P9""", "format | YUV420P9") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """YUV422P9""", "format | YUV422P9") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """YUV444P9""", "format | YUV444P9") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """YUV420P10""", "format | YUV420P10") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """YUV422P10""", "format | YUV422P10") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """YUV444P10""", "format | YUV444P10") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """YUV420P12""", "format | YUV420P12") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """YUV422P12""", "format | YUV422P12") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """YUV444P12""", "format | YUV444P12") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """YUV420P14""", "format | YUV420P14") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """YUV422P14""", "format | YUV422P14") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """YUV444P14""", "format | YUV444P14") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """YUV420P16""", "format | YUV420P16") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """YUV422P16""", "format | YUV422P16") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """YUV444P16""", "format | YUV444P16") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """Y8""", "format | Y8") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """YUY2""", "format | YUY2") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """RGB24""", "format | RGB24") add2({"LSMASHVideoSource", "LWLibavVideoSource", "LibavSMASHSource", "LWLibavSource"}, "format", """RGB32""", "format | RGB32") End If Return DefinitionsValue End Get End Property Shared Function SplitCSV(input As String) As String() Dim chars = input.ToCharArray() Dim values As New List(Of String)() Dim tempString As String Dim isString As Boolean Dim characterCount As Integer Dim level As Integer For Each i In chars characterCount += 1 If i = """"c Then If isString Then isString = False Else isString = True End If End If If Not isString Then If i = "("c Then level += 1 If i = ")"c Then level -= 1 End If If i <> ","c Then tempString = tempString & i ElseIf i = ","c AndAlso (isString OrElse level > 0) Then tempString = tempString & i Else values.Add(tempString.Trim) tempString = "" End If If characterCount = chars.Length Then values.Add(tempString.Trim) tempString = "" End If Next Return values.ToArray() End Function End Class Public Enum ScriptEngine AviSynth VapourSynth End Enum