mirror of
https://github.com/staxrip/staxrip.git
synced 2026-10-22 09:23:18 +08:00
1344 lines
68 KiB
VB.net
1344 lines
68 KiB
VB.net
|
|
Imports System.Text
|
|
Imports System.Text.RegularExpressions
|
|
Imports StaxRip
|
|
|
|
<Serializable()>
|
|
Public Class VideoScript
|
|
Inherits Profile
|
|
|
|
<NonSerialized()> Public [Error] As String
|
|
<NonSerialized()> Public Info As ServerInfo
|
|
<NonSerialized()> 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
|
|
|
|
<NonSerialized()> Public LastCode As String
|
|
<NonSerialized()> 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
|
|
|
|
<Serializable()>
|
|
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
|
|
|
|
<Serializable()>
|
|
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
|
|
|
|
<Serializable()>
|
|
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
|
|
|
|
<Serializable()>
|
|
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
|