Imports StaxRip.CommandLine Imports StaxRip.UI Public Class x264Encoder2 Inherits BasicVideoEncoder Property ParamsStore As New PrimitiveStore Sub New() Name = "x264 (under construction)" AutoCompCheckValue = 50 Params.ApplyValues(True) Params.ApplyValues(False) End Sub Private ParamsValue As x264Params2 Property Params As x264Params2 Get If ParamsValue Is Nothing Then ParamsValue = New x264Params2 ParamsValue.Init(ParamsStore) End If Return ParamsValue End Get Set(value As x264Params2) ParamsValue = value End Set End Property Overrides ReadOnly Property OutputExt As String Get Return "h264" End Get End Property Overrides Sub Encode() p.Script.Synchronize() Encode("Encoding video using x264 " + Package.x264.Version, GetArgs(1, p.Script), s.ProcessPriority) If Params.Mode.Value = x264RateMode.TwoPass Then Encode("Encoding video second pass using x264 " + Package.x264.Version, GetArgs(2, p.Script), s.ProcessPriority) ElseIf Params.Mode.Value = x264RateMode.ThreePass Then Encode("Encoding video second pass using x264 " + Package.x264.Version, GetArgs(3, p.Script), s.ProcessPriority) Encode("Encoding video third pass using x264 " + Package.x264.Version, GetArgs(2, p.Script), s.ProcessPriority) End If AfterEncoding() End Sub Overloads Sub Encode(passName As String, batchCode As String, priority As ProcessPriorityClass) p.Script.Synchronize() Dim batchPath = p.TempDir + p.TargetFile.Base + "_encode.bat" batchCode = Proc.WriteBatchFile(batchPath, batchCode) Using proc As New Proc proc.Init(passName) proc.Priority = priority proc.SkipStrings = {"kb/s, eta", "%]"} proc.WriteLine(batchCode + BR2) proc.File = "cmd.exe" proc.Arguments = "/C call " + batchPath.Quotes proc.Start() End Using End Sub Overrides Sub RunCompCheck() If Not g.VerifyRequirements Then Exit Sub If Not g.IsValidSource Then Exit Sub Dim newParams As New x264Params2 Dim newStore = DirectCast(ObjectHelp.GetCopy(ParamsStore), PrimitiveStore) newParams.Init(newStore) Dim enc As New x264Encoder2 enc.Params = newParams enc.Params.Mode.Value = x264RateMode.Quality enc.Params.Quant.Value = enc.Params.CompCheck.Value Dim script As New VideoScript script.Engine = p.Script.Engine script.Filters = p.Script.GetFiltersCopy Dim code As String Dim every = ((100 \ p.CompCheckRange) * 14).ToString If script.Engine = ScriptEngine.AviSynth Then code = "SelectRangeEvery(" + every + ",14)" Else code = "fpsnum = clip.fps_num" + BR + "fpsden = clip.fps_den" + BR + "clip = core.std.SelectEvery(clip = clip, cycle = " + every + ", offsets = range(14))" + BR + "clip = core.std.AssumeFPS(clip = clip, fpsnum = fpsnum, fpsden = fpsden)" End If script.Filters.Add(New VideoFilter("aaa", "aaa", code)) script.Path = p.TempDir + p.Name + "_CompCheck." + script.FileType script.Synchronize() Log.WriteLine(BR + script.GetFullScript + BR) Dim commandLine = enc.Params.GetArgs(0, script, p.TempDir + p.Name + "_CompCheck." + OutputExt, True, True) Try Encode("Compressibility Check", commandLine, ProcessPriorityClass.Normal) Catch ex As AbortException ProcessForm.CloseProcessForm() Exit Sub Catch ex As Exception ProcessForm.CloseProcessForm() g.ShowException(ex) Exit Sub End Try Dim bits = (New FileInfo(p.TempDir + p.Name + "_CompCheck." + OutputExt).Length) * 8 p.Compressibility = (bits / script.GetFrames) / (p.TargetWidth * p.TargetHeight) OnAfterCompCheck() g.MainForm.Assistant() Log.WriteLine("Quality: " & CInt(Calc.GetPercent).ToString() + " %") Log.WriteLine("Compressibility: " + p.Compressibility.ToString("f3")) Log.Save() ProcessForm.CloseProcessForm() End Sub Overloads Function GetArgs(pass As Integer, script As VideoScript, Optional includePaths As Boolean = True) As String Return Params.GetArgs(pass, script, OutputPath.DirAndBase + OutputExtFull, includePaths, True) End Function Overrides Sub ShowConfigDialog() Dim newParams As New x264Params2 Dim store = DirectCast(ObjectHelp.GetCopy(ParamsStore), PrimitiveStore) newParams.Init(store) newParams.ApplyValues(True) Using f As New CommandLineForm(newParams) Dim saveProfileAction = Sub() Dim enc = ObjectHelp.GetCopy(Of x264Encoder2)(Me) Dim params2 As New x264Params2 Dim store2 = DirectCast(ObjectHelp.GetCopy(store), PrimitiveStore) params2.Init(store2) enc.Params = params2 enc.ParamsStore = store2 SaveProfile(enc) End Sub ActionMenuItem.Add(f.cms.Items, "Save Profile...", saveProfileAction).SetImage(Symbol.Save) If f.ShowDialog() = DialogResult.OK Then Params = newParams ParamsStore = store OnStateChange() End If End Using End Sub Overrides Property QualityMode() As Boolean Get Return Params.Mode.Value = x264RateMode.Quantizer OrElse Params.Mode.Value = x264RateMode.Quality End Get Set(Value As Boolean) End Set End Property Public Overrides ReadOnly Property CommandLineParams As CommandLineParams Get Return Params End Get End Property Sub SetMuxer() Muxer = New MkvMuxer() End Sub Overrides Function CreateEditControl() As Control Return New x264Control2(Me) With {.Dock = DockStyle.Fill} End Function End Class Public Class x264Params2 Inherits CommandLineParams Sub New() Title = "x264 Options" End Sub Property Quant As New NumParam With { .Switch = "--crf", .Switches = {"--qp"}, .Name = "Quant", .Text = "Quality", .Path = "Basic", .Help = "--crf Quality-based VBR (0-51) [23.0]" + BR + "--qp Force constant QP (0-69, 0=lossless)", .ArgsFunc = Function() Nothing, .Value = 20, .DefaultValue = -1, .MinMaxStepDec = {0D, 69D, 1D, 1D}} Property Preset As New OptionParam With { .Switch = "--preset", .Text = "Preset", .Path = "Basic", .Options = {"Ultra Fast", "Super Fast", "Very Fast", "Faster", "Fast", "Medium", "Slow", "Slower", "Very Slow", "Placebo"}, .Convert = True, .InitValue = 5} Property Tune As New OptionParam With { .Switch = "--tune", .Text = "Tune", .Path = "Basic", .Options = {"None", "Film", "Animation", "Grain", "Still Image", "PSNR", "SSIM", "Fast Decode", "Zero Latency"}, .Convert = True} Property Mode As New OptionParam With { .Name = "Mode", .Text = "Mode", .Path = "Basic", .Switches = {"--bitrate", "--qp", "--crf", "--pass"}, .Options = {"Bitrate", "Quantizer", "Quality", "Two Pass", "Three Pass"}, .Value = 2} Property CompCheck As New NumParam With { .Name = "CompCheckQuant", .Text = "Comp. Check", .Path = "Other", .Value = 18, .MinMaxStep = {1, 50, 1}} Property Custom As New StringParam With { .Text = "Custom", .Path = "Custom", .InitAction = Sub(tb) tb.Edit.Expandet = True tb.Edit.TextBox.Multiline = True tb.Edit.MultilineHeightFactor = 6 tb.Edit.TextBox.Font = New Font("Consolas", 10 * s.UIScaleFactor) End Sub} Property CustomFirstPass As New StringParam With { .Text = "Custom" + BR + "First Pass:", .Path = "Custom", .ArgsFunc = Function() Nothing, .InitAction = Sub(tb) tb.Edit.Expandet = True tb.Edit.TextBox.Multiline = True tb.Edit.MultilineHeightFactor = 6 tb.Edit.TextBox.Font = New Font("Consolas", 10 * s.UIScaleFactor) End Sub} Property CustomSecondPass As New StringParam With { .Text = "Custom" + BR + "Second Pass:", .Path = "Custom", .ArgsFunc = Function() Nothing, .InitAction = Sub(tb) tb.Edit.Expandet = True tb.Edit.TextBox.Multiline = True tb.Edit.MultilineHeightFactor = 6 tb.Edit.TextBox.Font = New Font("Consolas", 10 * s.UIScaleFactor) End Sub} Property Deblock As New BoolParam With { .Switch = "--deblock", .NoSwitch = "--no-deblock", .Text = "Deblocking", .Path = "Other", .Help = "Loop filter parameters [0:0].", .ArgsFunc = AddressOf GetDeblockArgs} Property DeblockA As New NumParam With { .Text = " Strength", .Path = "Other", .MinMaxStep = {-6, 6, 1}} Property DeblockB As New NumParam With { .Text = " Threshold", .Path = "Other", .MinMaxStep = {-6, 6, 1}} Property _8x8dct As New BoolParam With { .Switch = "--8x8dct", .NoSwitch = "--no-8x8dct", .Text = "8x8dct", .Path = "Analysis"} Property BFrames As New NumParam With { .Switch = "--bframes", .Text = "B-Frames", .Path = "Slice Decision", .MinMaxStep = {0, 16, 1}, .Help = "Number of B-frames between I And P [3]."} Property AqMode As New OptionParam With { .Switch = "--aq-mode", .Text = "AQ Mode", .Path = "Rate Control", .IntegerValue = True, .Expand = True, .Options = {"Disabled", "Variance AQ", "Auto-variance AQ", "Auto-variance AQ with bias to dark scenes"}} Property BAdapt As New OptionParam With { .Switch = "--b-adapt", .Text = "B-Adapt", .Path = "Slice Decision", .IntegerValue = True, .Options = {"Disabled", "Fast", "Optimal"}, .Help = "Adaptive B-frame decision method [1]"} Property Cabac As New BoolParam With { .Path = "Other", .NoSwitch = "--no-cabac", .Text = "Cabac"} Property weightp As New OptionParam With { .Path = "Analysis", .Switch = "--weightp", .Text = "Weight P Prediction", .Expand = True, .Options = {"Disabled", "Weighted refs", "Weighted refs + Duplicates"}, .IntegerValue = True} Property profile As New OptionParam With { .Path = "Basic", .Switch = "--profile", .Text = "Profile", .Help = "Force the limits of an H.264 profile.", .Convert = True, .Options = {"Unrestricted", "Baseline", "Main", "High", "High10", "High422", "High444"}} Property cqm As New OptionParam With { .Path = "Analysis", .Switch = "--cqm", .Options = {"Flat", "JVT"}, .Convert = True, .Text = "Quant Matrice Preset"} Property [me] As New OptionParam With { .Path = "Analysis", .Switch = "--me", .Text = "Motion Search Method", .Expand = True, .Values = {"dia", "hex", "umh", "esa", "tesa"}, .Options = {"Diamond Search, Radius 1 (fast)", "Hexagonal Search, Radius 2", "Uneven Multi-Hexagon Search", "Exhaustive Search", "Hadamard Exhaustive Search (slow)"}, .Help = "Integer pixel motion estimation method [hex]"} Property mbtree As New BoolParam With { .Path = "Rate Control", .NoSwitch = "--no-mbtree", .Text = "MB Tree"} Property mixedRefs As New BoolParam With { .Path = "Analysis", .NoSwitch = "--no-mixed-refs", .Text = "Mixed References", .Help = "Decide references on a per partition basis"} Sub ApplyValues(isDefault As Boolean) Dim setVal = Sub(param As CommandLineParam, value As Object) If TypeOf param Is BoolParam Then If isDefault Then DirectCast(param, BoolParam).DefaultValue = CBool(value) Else DirectCast(param, BoolParam).Value = CBool(value) End If ElseIf TypeOf param Is NumParam Then If isDefault Then DirectCast(param, NumParam).DefaultValue = CSng(value) Else DirectCast(param, NumParam).Value = CSng(value) End If ElseIf TypeOf param Is OptionParam Then If isDefault Then DirectCast(param, OptionParam).DefaultValue = CInt(value) Else DirectCast(param, OptionParam).Value = CInt(value) End If End If End Sub setVal(Deblock, True) setVal(DeblockA, 0) setVal(DeblockB, 0) setVal(_8x8dct, True) setVal(BFrames, 3) setVal(AqMode, 1) setVal(BAdapt, 1) setVal(Cabac, True) setVal(weightp, 2) setVal(mbtree, True) setVal([me], 1) setVal(mixedRefs, True) Select Case Preset.Value Case 0 'ultrafast setVal(Deblock, False) setVal(_8x8dct, False) setVal(BFrames, 0) setVal(AqMode, 0) setVal(BAdapt, 0) setVal(Cabac, False) setVal(weightp, 0) setVal(mbtree, False) setVal([me], 0) setVal(mixedRefs, False) Case 1 'superfast setVal(weightp, 1) setVal(mbtree, False) setVal([me], 0) setVal(mixedRefs, False) Case 2 'veryfast setVal(weightp, 1) setVal(mixedRefs, False) Case 3 'faster setVal(weightp, 1) setVal(mixedRefs, False) Case 4 'fast setVal(weightp, 1) Case 5 'medium Case 6 'slow Case 7 'slower setVal(BAdapt, 2) setVal([me], 2) Case 8 'veryslow setVal(BFrames, 8) setVal(BAdapt, 2) setVal([me], 2) Case 9 'placebo setVal(BFrames, 16) setVal(BAdapt, 2) setVal([me], 4) End Select Select Case Tune.Value Case 1 'film setVal(DeblockA, -1) setVal(DeblockB, -1) Case 2 'animation setVal(DeblockA, 1) setVal(DeblockB, 1) Dim val = BFrames.Value val += 2 setVal(BFrames, If(val > 16, 16, val)) Case 3 'grain setVal(DeblockA, -2) setVal(DeblockB, -2) Case 4 'stillimage setVal(DeblockA, -3) setVal(DeblockB, -3) Case 5 'psnr setVal(AqMode, 0) Case 6 'ssim setVal(AqMode, 2) Case 7 'fastdecode setVal(Deblock, False) setVal(Cabac, False) setVal(weightp, 0) Case 8 'zerolatency setVal(BFrames, 0) setVal(mbtree, False) End Select Select Case profile.Value Case 1 'baseline setVal(Cabac, False) setVal(_8x8dct, False) setVal(BFrames, 0) setVal(weightp, 0) End Select End Sub Private ItemsValue As List(Of CommandLineParam) Overrides ReadOnly Property Items As List(Of CommandLineParam) Get If ItemsValue Is Nothing Then ItemsValue = New List(Of CommandLineParam) From { Quant, Preset, Tune, profile, Mode, weightp, [me], cqm, _8x8dct, mixedRefs, AqMode, mbtree, BAdapt, BFrames, New StringParam With {.Path = "VUI", .Switch = "--sar", .Text = "Sample Aspect Ratio:", .InitValue = "auto", .Menu = s.ParMenu, .ArgsFunc = AddressOf GetSAR}, Deblock, DeblockA, DeblockB, CompCheck, Cabac, Custom, CustomFirstPass, CustomSecondPass} 'Add("Basic", Quant, Preset, Tune, Profile, OutputDepth, 'Add("Custom", Custom, CustomFirstPass, CustomSecondPass) 'New OptionParam With {.Path = "Basic", .Switch = "--preset", .Text = "Preset", .Help = "Use a preset to select encoding settings", .InitValue = 5, Options = {"ultrafast", "superfast", "veryfast", "faster", "fast", "medium", "slow", "slower", "veryslow", "placebo"}}, 'New OptionParam With {.Path = "Basic", .Switch = "--tune", .Text = "Tune", .Help = "Tune the settings for a particular type of source or situation.", Options = {"disabled", film", "animation", "grain", "stillimage", "psnr", "ssim", "fastdecode", "zerolatency"}}, 'New BoolParam With {.Path = "Basic", .Switch = "--slow-firstpass", .Text = "Slow Firstpass"}, 'New NumParam With {.Path = "Frame-type", .Switch = "--keyint", .Text = "keyint", Help = "keyint", Help = "Maximum GOP size [250]"}, 'New NumParam With {.Path = "Frame-type", .Switch = "--min-keyint", .Text = "min-keyint", Help = "Minimum GOP size [auto]"}, 'New NumParam With {.Path = "Frame-type", .Switch = "--scenecut", .Text = "scenecut", Help = "How aggressively to insert extra I-frames [40]"}, 'New BoolParam With {.Path = "Frame-type", .Switch = "--intra-refresh", .Text = "Intra Refresh", .Help = "Use Periodic Intra Refresh instead of IDR frames"}, 'New NumParam With {.Path = "", .Switch = "--b-bias", .Text = "b-bias", Help = "Influences how often B-frames are used [0]"}, 'New StringParam With {.Path = "", .Switch = "--b-pyramid", .Text = "b-pyramid", .Options = {"none", "strict", "normal"}, .Help = "Keep some B-frames as references [normal]"}, 'New BoolParam With {.Path = "", .Switch = "--open-gop", .Text = "open-gop", .Help = "Use recovery points to close GOPs"}, 'New NumParam With {.Path = "", .Switch = "--ref", .Text = "ref", Help = "Number of reference frames [3]"}, 'New BoolParam With {.Path = "", .Switch = "--no-deblock", .Text = "no-deblock", .Help = "Disable loop filter"}, 'New NumParam With {.Path = "", .Switch = "--slices", .Text = "slices", Help = "Number of slices per frame"}, 'New NumParam With {.Path = "", .Switch = "--slices-max", .Text = "slices-max", Help = "Absolute maximum slices per frame"}, 'New NumParam With {.Path = "", .Switch = "--slice-max-size", .Text = "slice-max-size", Help = "Limit the size of each slice in bytes"}, 'New NumParam With {.Path = "", .Switch = "--slice-max-mbs", .Text = "slice-max-mbs", Help = "Limit the size of each slice in macroblocks (max)"}, 'New NumParam With {.Path = "", .Switch = "--slice-min-mbs", .Text = "slice-min-mbs", Help = "Limit the size of each slice in macroblocks (min)"}, 'New BoolParam With {.Path = "", .Switch = "--tff", .Text = "tff", .Help = "Enable interlaced mode (top field first)"}, 'New BoolParam With {.Path = "", .Switch = "--bff", .Text = "bff", .Help = "Enable interlaced mode (bottom field first)"}, 'New BoolParam With {.Path = "", .Switch = "--constrained-intra", .Text = "constrained-intra", .Help = "Enable constrained intra prediction."}, 'New StringParam With {.Path = "", .Switch = "--pulldown", .Text = "pulldown", .Help = "Use soft pulldown to change frame rate"}, '{"none", "22", "32", "64", "double", "triple", "euro"} 'New BoolParam With {.Path = "", .Switch = "--fake-interlaced", .Text = "fake-interlaced", .Help = "Flag stream as interlaced but encode progressive."}, 'New NumParam With {.Path = "", .Switch = "--frame-packing", .Text = "frame-packing", .IntegerValue = True, Help = "For stereoscopic videos define frame arrangement"}, '{"checkerboard", "column alternation", "row alternation", "side by side", "top bottom", "frame alternation", "mono", "tile format"} 'Ratecontrol: 'New NumParam With {.Path = "", .Switch = "--qp", .Text = "qp", Help = "Force constant QP (0-69, 0=lossless)"}, 'New NumParam With {.Path = "", .Switch = "--bitrate", .Text = "bitrate", Help = "Set bitrate (kbit/s)"}, 'New NumParam With {.Path = "", .Switch = "--crf", .Text = "crf", Help = "Quality-based VBR (0-51) [23.0]"}, 'New NumParam With {.Path = "", .Switch = "--rc-lookahead", .Text = "rc-lookahead", Help = "Number of frames for frametype lookahead [40]"}, 'New NumParam With {.Path = "", .Switch = "--vbv-maxrate", .Text = "vbv-maxrate", Help = "Max local bitrate (kbit/s) [0]"}, 'New NumParam With {.Path = "", .Switch = "--vbv-bufsize", .Text = "vbv-bufsize", Help = "Set size of the VBV buffer (kbit) [0]"}, 'New NumParam With {.Path = "", .Switch = "--vbv-init", .Text = "vbv-init", Help = "Initial VBV buffer occupancy [0.9]"}, 'New NumParam With {.Path = "", .Switch = "--crf-max", .Text = "crf-max", Help = "With CRF+VBV, limit RF to this value"}, 'New NumParam With {.Path = "", .Switch = "--qpmin", .Text = "qpmin", Help = "Set min QP [0]"}, 'New NumParam With {.Path = "", .Switch = "--qpmax", .Text = "qpmax", Help = "Set max QP [69]"}, 'New NumParam With {.Path = "", .Switch = "--qpstep", .Text = "qpstep", Help = "Set max QP step [4]"}, 'New NumParam With {.Path = "", .Switch = "--ratetol", .Text = "ratetol", Help = "Tolerance of ABR ratecontrol And VBV [1.0]"}, 'New NumParam With {.Path = "", .Switch = "--ipratio", .Text = "ipratio", Help = "QP factor between I And P [1.40]"}, 'New NumParam With {.Path = "", .Switch = "--pbratio", .Text = "pbratio", Help = "QP factor between P And B [1.30]"}, 'New NumParam With {.Path = "", .Switch = "--chroma-qp-offset", .Text = "chroma-qp-offset", Help = "QP difference between chroma And luma [0]"}, 'New NumParam With {.Path = "", .Switch = "--aq-strength", .Text = "aq-strength", Help = "Reduces blocking And blurring in flat And textured areas. [1.0]"}, 'New StringParam With {.Path = "", .Switch = "--stats", .Text = "stats", .Help = "Filename for 2 pass stats ["x264_2pass.log"]"}, 'New NumParam With {.Path = "", .Switch = "--qcomp", .Text = "qcomp", Help = "QP curve compression [0.60]"}, 'New NumParam With {.Path = "", .Switch = "--cplxblur", .Text = "cplxblur", Help = "Reduce fluctuations in QP (before curve compression) [20.0]"}, 'New NumParam With {.Path = "", .Switch = "--qblur", .Text = "qblur", Help = "Reduce fluctuations in QP (after curve compression) [0.5]"}, 'New StringParam With {.Path = "", .Switch = "--qpfile", .Text = "qpfile", .Help = "Force frametypes And QPs for some Or all frames"}, 'Analysis: 'New StringParam With {.Path = "", .Switch = "--direct", .Text = "direct", .Help = "Direct MV prediction mode ["spatial"]"}, '{"none", "spatial", "temporal", "auto"} 'New BoolParam With {.Path = "", .Switch = "--no-weightb", .Text = "no-weightb", .Help = "Disable weighted prediction for B-frames"}, '{"Disabled", "Weighted refs", "Weighted refs + Duplicates"} 'New NumParam With {.Path = "", .Switch = "--merange", .Text = "merange", Help = "Maximum motion vector search range [16]"}, 'New NumParam With {.Path = "", .Switch = "--mvrange", .Text = "mvrange", Help = "Maximum motion vector length [-1 (auto)]"}, 'New NumParam With {.Path = "", .Switch = "--mvrange-thread", .Text = "mvrange-thread", Help = "Minimum buffer between threads [-1 (auto)]"}, 'New NumParam With {.Path = "", .Switch = "--subme", .Text = "subme", .IntegerValue = True, Help = "Subpixel motion estimation And mode decision [7]"}, '{"fullpel only (Not recommended)", "SAD mode decision, one qpel iteration", "SATD mode decision", "Progressively more qpel", "Progressively more qpel", "Progressively more qpel", "RD mode decision for I/P-frames", "RD mode decision for all frames", "RD refinement for I/P-frames", "RD refinement for all frames", "QP-RD - requires trellis=2, aq-mode>0", "Full RD disable all early terminations"} 'New Param With {.Path = "", .Switch = "--psy-rd", .Text = "Psy RD", .Help = "Strength of psychovisual optimization ["1.0:0.0"]" '{"RD (requires subme>=6)", "Trellis (requires trellis)"} 'New BoolParam With {.Path = "", .Switch = "--no-psy", .Text = "no-psy", .Help = "Disable all visual optimizations that worsen"}, ' both PSNR and SSIM. 'New BoolParam With {.Path = "", .Switch = "--no-chroma-me", .Text = "no-chroma-me", .Help = "Ignore chroma in motion estimation"}, 'New BoolParam With {.Path = "", .Switch = "--no-8x8dct", .Text = "no-8x8dct", .Help = "Disable adaptive spatial transform size"}, 'New NumParam With {.Path = "", .Switch = "--trellis", .Text = "trellis", .IntegerValue = True, Help = "Trellis RD quantization. [1]"}, '{"Disabled", "Final MB", "Always"} 'New BoolParam With {.Path = "", .Switch = "--no-fast-pskip", .Text = "no-fast-pskip", .Help = "Disables early SKIP detection on P-frames"}, 'New BoolParam With {.Path = "", .Switch = "--no-dct-decimate", .Text = "no-dct-decimate", .Help = "Disables coefficient thresholding on P-frames"}, 'New NumParam With {.Path = "", .Switch = "--nr", .Text = "nr", Help = "Noise reduction [0]"}, 'New NumParam With {.Path = "", .Switch = "--deadzone-inter", .Text = "deadzone-inter", .MinMaxStep = {0, 32 , 1}, Help = "Set the size of the inter luma quantization deadzone [21]"}, 'New NumParam With {.Path = "", .Switch = "--deadzone-intra", .Text = "deadzone-intra", .MinMaxStep = {0, 32 , 1}, Help = "Set the size of the intra luma quantization deadzone [11]"}, '{"jvt", "flat"} 'New StringParam With {.Path = "", .Switch = "--cqmfile", .Text = "cqmfile", .Help = "Read custom quant matrices from a JM-compatible file"}, 'New Param With {.Path = "", .Switch = "--cqm4", .Text = "Set all 4x4 quant matrices" 'New Param With {.Path = "", .Switch = "--cqm8", .Text = "Set all 8x8 quant matrices" 'New Param With {.Path = "", .Switch = "--cqm4i, --cqm4p, --cqm8i, --cqm8p", .Text = "Set both luma and chroma quant matrices" 'New Param With {.Path = "", .Switch = "--cqm4iy, --cqm4ic, --cqm4py, --cqm4pc", .Text = "Set individual quant matrices" 'Video Usability Info (Annex E) 'The VUI settings are Not used by the encoder but are merely suggestions to 'the playback equipment. See doc/vui.txt for details. Use at your own risk. 'New StringParam With {.Path = "", .Switch = "--overscan", .Text = "overscan", .Help = "Specify crop overscan setting ["undef"]"}, '{"undef", "show", "crop"} 'New StringParam With {.Path = "", .Switch = "--videoformat", .Text = "videoformat", .Help = "Specify video format ["undef"]"}, '{"undef", "component", "pal", "ntsc", "secam", "mac"} 'New StringParam With {.Path = "", .Switch = "--range", .Text = "range", .Help = "Specify color range ["auto"]"}, '{"auto", "tv", "pc"} 'New StringParam With {.Path = "", .Switch = "--colorprim", .Text = "colorprim", .Help = "Specify color primaries ["undef"]"}, '{"undef", "bt709", "bt470m", "bt470bg", "smpte170m", "smpte240m", "film", "bt2020", "smpte428", "smpte431", "smpte432"} 'New StringParam With {.Path = "", .Switch = "--transfer", .Text = "transfer", .Help = "Specify transfer characteristics ["undef"]"}, '{"undef", "bt709", "bt470m", "bt470bg", "smpte170m", "smpte240m", "linear", "log100", "log316", "iec61966-2-4", "bt1361e", "iec61966-2-1", "bt2020-10", "bt2020-12", "smpte2084", "smpte428"} 'New StringParam With {.Path = "", .Switch = "--colormatrix", .Text = "colormatrix", .Help = "Specify color matrix setting ["???"]"}, '{"undef", "bt709", "fcc", "bt470bg", "smpte170m", "smpte240m", "GBR", "YCgCo", "bt2020nc", "bt2020c", "smpte2085"} 'New NumParam With {.Path = """, ".Switch = "--chromaloc", .Text = "chromaloc", Help = "Specify chroma sample location (0 to 5) [0]"}," 'New StringParam With {.Path = "", .Switch = "--nal-hrd", .Text = "nal-hrd", .Help = "Signal HRD information (requires vbv-bufsize)"}, '{"none", "vbr", "cbr"} 'New BoolParam With {.Path = "", .Switch = "--filler", .Text = "filler", .Help = "Force hard-CBR And generate filler (implied by"}, 'New BoolParam With {.Path = "", .Switch = "--pic-struct", .Text = "pic-struct", .Help = "Force pic_struct in Picture Timing SEI"}, 'New StringParam With {.Path = "", .Switch = "--crop-rect", .Text = "crop-rect", .Help = "Add 'left,top,right,bottom' to the bitstream-level cropping rectangle"}, '[Input/Output] 'New StringParam With {.Path = "", .Switch = "--output", .Text = "output", .Help = "Specify output file"}, 'New StringParam With {.Path = "", .Switch = "--input-fmt", .Text = "input-fmt", .Help = "Specify input file format (requires lavf support)"}, 'New StringParam With {.Path = "", .Switch = "--input-csp", .Text = "input-csp", .Help = "Specify input colorspace format for raw input"}, '{"i420", "yv12", "nv12", "nv21", "i422", "yv16", "nv16", "yuyv", "uyvy", "i444", "yv24", "bgr", "bgra", "rgb"} 'New StringParam With {.Path = "", .Switch = "--output-csp", .Text = "output-csp", .Help = "Specify output colorspace ["i420"]"}, '{"i420", "i422", "i444", "rgb"} 'New NumParam With {.Path = "", .Switch = "--input-depth", .Text = "input-depth", Help = "Specify input bit depth for raw input"}, 'New StringParam With {.Path = "", .Switch = "--input-range", .Text = "input-range", .Help = "Specify input color range ["auto"]"}, '{"auto", "tv", "pc"} 'New Param With {.Path = "", .Switch = "--input-res", .Text = "Specify input resolution (width x height)" 'New StringParam With {.Path = "", .Switch = "--index", .Text = "index", .Help = "Filename for input index file"}, 'New Param With {.Path = "", .Switch = "--fps", .Text = "Specify framerate" 'New NumParam With {.Path = "", .Switch = "--seek", .Text = "seek", Help = "First frame to encode"}, 'New NumParam With {.Path = "", .Switch = "--frames", .Text = "frames", Help = "Maximum number of frames to encode"}, 'New StringParam With {.Path = "", .Switch = "--level", .Text = "level", .Help = "Specify level (as defined by Annex A)"}, 'New BoolParam With {.Path = "", .Switch = "--bluray-compat", .Text = "bluray-compat", .Help = "Enable compatibility hacks for Blu-ray support"}, 'New NumParam With {.Path = "", .Switch = "--avcintra-class", .Text = "avcintra-class", Help = "Use compatibility hacks for AVC-Intra class"}, '{"50", "100", "200"} 'New BoolParam With {.Path = "", .Switch = "--stitchable", .Text = "stitchable", .Help = "Don't optimize headers based on video content"}, 'New BoolParam With {.Path = "", .Switch = "--verbose", .Text = "verbose", .Help = "Print stats for each frame"}, 'New BoolParam With {.Path = "", .Switch = "--no-progress", .Text = "no-progress", .Help = "Don't show the progress indicator while encoding"}, 'New BoolParam With {.Path = "", .Switch = "--quiet", .Text = "quiet", .Help = "Quiet Mode"}, 'New StringParam With {.Path = "", .Switch = "--log-level", .Text = "log-level", .Help = "Specify the maximum level of logging ["info"]"}, '{"none", "error", "warning", "info", "debug"} 'New BoolParam With {.Path = "", .Switch = "--psnr", .Text = "psnr", .Help = "Enable PSNR computation"}, 'New BoolParam With {.Path = "", .Switch = "--ssim", .Text = "ssim", .Help = "Enable SSIM computation"}, 'New NumParam With {.Path = "", .Switch = "--threads", .Text = "threads", Help = "Force a specific number of threads"}, 'New NumParam With {.Path = "", .Switch = "--lookahead-threads", .Text = "lookahead-threads", Help = "Force a specific number of lookahead threads"}, 'New BoolParam With {.Path = "", .Switch = "--sliced-threads", .Text = "sliced-threads", .Help = "Low-latency but lower-efficiency threading"}, 'New BoolParam With {.Path = "", .Switch = "--thread-input", .Text = "thread-input", .Help = "Run Avisynth in its own thread"}, 'New NumParam With {.Path = "", .Switch = "--sync-lookahead", .Text = "sync-lookahead", Help = "Number of buffer frames for threaded lookahead"}, 'New BoolParam With {.Path = "", .Switch = "--non-deterministic", .Text = "non-deterministic", .Help = "Slightly improve quality of SMP, at the cost of repeatability"}, 'New BoolParam With {.Path = "", .Switch = "--cpu-independent", .Text = "cpu-independent", .Help = "Ensure exact reproducibility across different cpus, as opposed to letting them select different algorithms"}, 'New NumParam With {.Path = "", .Switch = "--asm", .Text = "asm", Help = "Override CPU detection"}, 'New BoolParam With {.Path = "", .Switch = "--no-asm", .Text = "no-asm", .Help = "Disable all CPU optimizations"}, 'New BoolParam With {.Path = "", .Switch = "--opencl", .Text = "opencl", .Help = "Enable use of OpenCL"}, 'New StringParam With {.Path = "", .Switch = "--opencl-clbin", .Text = "opencl-clbin", .Help = "Specify path of compiled OpenCL kernel cache"}, 'New NumParam With {.Path = "", .Switch = "--opencl-device", .Text = "opencl-device", Help = "Specify OpenCL device ordinal"}, 'New StringParam With {.Path = "", .Switch = "--dump-yuv", .Text = "dump-yuv", .Help = "Save reconstructed frames"}, 'New NumParam With {.Path = "", .Switch = "--sps-id", .Text = "sps-id", Help = "Set SPS and PPS id numbers [0]"}, 'New BoolParam With {.Path = "", .Switch = "--aud", .Text = "aud", .Help = "Use access unit delimiters"}, 'New BoolParam With {.Path = "", .Switch = "--force-cfr", .Text = "force-cfr", .Help = "Force constant framerate timestamp generation"}, 'New StringParam With {.Path = "", .Switch = "--tcfile-in", .Text = "tcfile-in", .Help = "Force timestamp generation with timecode file"}, 'New StringParam With {.Path = "", .Switch = "--tcfile-out", .Text = "tcfile-out", .Help = "Output timecode v2 file from input timestamps"}, 'New Param With {.Path = "", .Switch = "--timebase", .Text = "Specify timebase numerator and denominator" ' Specify timebase numerator For input timecode file ' Or specify timebase denominator for other input 'New BoolParam With {.Path = "", .Switch = "--dts-compress", .Text = "dts-compress", .Help = "Eliminate initial delay with container DTS hack"}, 'New Param With {.Path = "", .Switch = "--deblock", .Text = "Loop filter parameters [0:0]" 'New StringParam With {.Path = "", .Switch = "--partitions", .Text = "partitions", .Help = "Partitions to consider ["p8x8,b8x8,i8x8,i4x4"]"}, ' - p8x8, p4x4, b8x8, i8x8, i4x4 ' - none, all ' (p4x4 requires p8x8. i8x8 requires --8x8dct.) End If Return ItemsValue End Get End Property Private BlockValueChanged As Boolean Protected Overrides Sub OnValueChanged(item As CommandLineParam) If BlockValueChanged Then Exit Sub If item Is Preset OrElse item Is Tune OrElse item Is Profile Then BlockValueChanged = True ApplyValues(False) BlockValueChanged = False End If DeblockA.NumEdit.Enabled = Deblock.Value DeblockB.NumEdit.Enabled = Deblock.Value MyBase.OnValueChanged(item) End Sub Overloads Overrides Function GetCommandLine(includePaths As Boolean, includeExecutable As Boolean, Optional pass As Integer = 1) As String Return GetArgs(1, p.Script, p.VideoEncoder.OutputPath.DirAndBase + p.VideoEncoder.OutputExtFull, includePaths, includeExecutable) End Function Overloads Function GetArgs(pass As Integer, script As VideoScript, targetPath As String, includePaths As Boolean, includeExecutable As Boolean) As String ApplyValues(True) Dim args As String Dim sourcePath As String If includePaths AndAlso includeExecutable Then If p.Script.Engine = ScriptEngine.VapourSynth Then args += Package.vspipe.Path.Quotes + " " + script.Path.Quotes + " - --y4m | " + Package.x264.Path.Quotes sourcePath = "-" Else args += Package.x264.Path.Quotes sourcePath = script.Path End If End If If Mode.Value = x264RateMode.TwoPass OrElse Mode.Value = x264RateMode.ThreePass Then args += " --pass " & pass If pass = 1 Then If CustomFirstPass.Value <> "" Then args += " " + CustomFirstPass.Value Else If CustomSecondPass.Value <> "" Then args += " " + CustomSecondPass.Value End If End If If Mode.Value = x264RateMode.Quantizer Then If Not IsCustom(pass, "--qp") Then args += " --qp " + CInt(Quant.Value).ToString ElseIf Mode.Value = x264RateMode.Quality Then If Not IsCustom(pass, "--crf") Then args += " --crf " + Quant.Value.ToInvariantString Else If Not IsCustom(pass, "--bitrate") Then args += " --bitrate " & p.VideoBitrate End If Dim q = From i In Items Where i.GetArgs <> "" AndAlso Not IsCustom(pass, i.Switch) If q.Count > 0 Then args += " " + q.Select(Function(item) item.GetArgs).Join(" ") If includePaths Then If sourcePath = "-" Then args += " --demuxer y4m --frames " & script.GetFrames If Mode.Value = x264RateMode.TwoPass OrElse Mode.Value = x264RateMode.ThreePass Then args += " --stats " + (p.TempDir + p.Name + ".stats").Quotes End If If (Mode.Value = x264RateMode.ThreePass AndAlso (pass = 1 OrElse pass = 3)) OrElse Mode.Value = x264RateMode.TwoPass AndAlso pass = 1 Then args += " --output NUL " + sourcePath.Quotes Else args += " --output " + targetPath.Quotes + " " + sourcePath.Quotes End If End If Return Macro.Expand(args.Trim.FixBreak.Replace(BR, " ")) End Function Function IsCustom(pass As Integer, switch As String) As Boolean If switch = "" Then Return False If Mode.Value = x264RateMode.TwoPass OrElse Mode.Value = x264RateMode.ThreePass Then If pass = 1 Then If CustomFirstPass.Value?.Contains(switch + " ") OrElse CustomFirstPass.Value?.EndsWith(switch) Then Return True Else If CustomSecondPass.Value?.Contains(switch + " ") OrElse CustomSecondPass.Value?.EndsWith(switch) Then Return True End If End If If Custom.Value?.Contains(switch + " ") OrElse Custom.Value?.EndsWith(switch) Then Return True End Function Function GetDeblockArgs() As String If Deblock.Value Then If DeblockA.Value = DeblockA.DefaultValue AndAlso DeblockB.Value = DeblockB.DefaultValue AndAlso Deblock.DefaultValue Then Return "" Else Return "--deblock " & DeblockA.Value & ":" & DeblockB.Value End If ElseIf Deblock.DefaultValue Then Return "--no-deblock" End If End Function Public Overrides Function GetPackage() As Package Return Package.x264 End Function End Class Public Enum x264RateMode Bitrate Quantizer Quality TwoPass ThreePass End Enum