Imports System.Security.Cryptography Imports System.Web.UI.WebControls.WebParts Imports StaxRip.UI Imports StaxRip.VideoEncoderCommandLine Public Class NVEncControl Inherits UserControl #Region " Designer " Friend WithEvents lv As StaxRip.UI.ListViewEx Friend WithEvents blConfigCodec As ButtonLabel Friend WithEvents blConfigContainer As ButtonLabel Friend WithEvents blCompCheck As ButtonLabel Friend WithEvents tblOverrideName As ToggleButtonLabel Private components As System.ComponentModel.IContainer Private Sub InitializeComponent() Me.blConfigCodec = New StaxRip.UI.ButtonLabel() Me.blConfigContainer = New StaxRip.UI.ButtonLabel() Me.blCompCheck = New StaxRip.UI.ButtonLabel() Me.tblOverrideName = New StaxRip.UI.ToggleButtonLabel() Me.lv = New StaxRip.UI.ListViewEx() Me.SuspendLayout() ' 'llConfigCodec ' Me.blConfigCodec.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles) Me.blConfigCodec.AutoSize = True Me.blConfigCodec.Location = New System.Drawing.Point(3, 408) Me.blConfigCodec.Margin = New System.Windows.Forms.Padding(3) Me.blConfigCodec.Name = "llConfigCodec" Me.blConfigCodec.Size = New System.Drawing.Size(128, 37) Me.blConfigCodec.TabIndex = 1 Me.blConfigCodec.TabStop = True Me.blConfigCodec.Text = "Options" ' 'blOverrideName ' Me.tblOverrideName.Anchor = CType((AnchorStyles.Bottom Or AnchorStyles.Left Or AnchorStyles.Right), AnchorStyles) Me.tblOverrideName.AutoSize = True Me.tblOverrideName.Location = New System.Drawing.Point(3, 223) Me.tblOverrideName.Margin = New Padding(3) Me.tblOverrideName.Name = "blOverrideName" Me.tblOverrideName.Size = New System.Drawing.Size(128, 37) Me.tblOverrideName.TabIndex = 2 Me.tblOverrideName.TabStop = True Me.tblOverrideName.Text = "Name Override" ' 'llConfigContainer ' Me.blConfigContainer.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) Me.blConfigContainer.AutoSize = True Me.blConfigContainer.Location = New System.Drawing.Point(346, 408) Me.blConfigContainer.Margin = New System.Windows.Forms.Padding(3) Me.blConfigContainer.Name = "llConfigContainer" Me.blConfigContainer.Size = New System.Drawing.Size(276, 37) Me.blConfigContainer.TabIndex = 3 Me.blConfigContainer.TabStop = True Me.blConfigContainer.Text = "Container Options" ' 'llCompCheck ' Me.blCompCheck.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles) Me.blCompCheck.AutoSize = True Me.blCompCheck.Location = New System.Drawing.Point(3, 365) Me.blCompCheck.Margin = New System.Windows.Forms.Padding(3) Me.blCompCheck.Name = "llCompCheck" Me.blCompCheck.Size = New System.Drawing.Size(399, 37) Me.blCompCheck.TabIndex = 4 Me.blCompCheck.TabStop = True Me.blCompCheck.Text = "Run Compressibility Check" ' 'lv ' Me.lv.Dock = System.Windows.Forms.DockStyle.Fill Me.lv.HideSelection = False Me.lv.Location = New System.Drawing.Point(0, 0) Me.lv.Name = "lv" Me.lv.Size = New System.Drawing.Size(625, 448) Me.lv.TabIndex = 0 Me.lv.UseCompatibleStateImageBehavior = False ' 'NVEncControl ' Me.AutoScaleDimensions = New System.Drawing.SizeF(288.0!, 288.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi Me.Controls.Add(Me.blConfigContainer) Me.Controls.Add(Me.tblOverrideName) Me.Controls.Add(Me.blConfigCodec) Me.Controls.Add(Me.blCompCheck) Me.Controls.Add(Me.lv) Me.Name = "NVEncControl" Me.Size = New System.Drawing.Size(625, 448) Me.ResumeLayout(False) Me.PerformLayout() End Sub #End Region Private ReadOnly Encoder As NVEnc Private ReadOnly Params As NVEncParams Private ReadOnly cms As ContextMenuStripEx Private ReadOnly QualityDefinitions As List(Of QualityItem) Sub New(enc As NVEnc) InitializeComponent() components = New ComponentModel.Container() QualityDefinitions = If(s.NVEncCQualityDefinitions IsNot Nothing AndAlso s.NVEncCQualityDefinitions.Any(), s.NVEncCQualityDefinitions, New List(Of QualityItem) From { New QualityItem(10, "Super High", "Super high quality and file size"), New QualityItem(12, "Very High", "Very high quality and file size"), New QualityItem(14, "Higher", "Higher quality and file size"), New QualityItem(16, "High", "High quality and file size"), New QualityItem(18, "Medium", "Medium quality and file size"), New QualityItem(20, "Low", "Low quality and file size"), New QualityItem(22, "Lower", "Lower quality and file size"), New QualityItem(24, "Very Low", "Very low quality and file size"), New QualityItem(26, "Super Low", "Super low quality and file size"), New QualityItem(28, "Giga Low", "Giga low quality and file size"), New QualityItem(30, "Extreme Low", "Extreme low quality and file size"), New QualityItem(33, "Ultra Low", "Ultra low quality and file size")}) Encoder = enc Params = Encoder.Params cms = New ContextMenuStripEx(components) With { .Font = FontManager.GetDefaultFont() } lv.View = View.Details lv.HeaderStyle = ColumnHeaderStyle.None lv.FullRowSelect = True lv.MultiSelect = False lv.ContextMenuStrip = cms lv.ShowContextMenuOnLeftClick = True tblOverrideName.LeftClickAction = Sub(value) Params.OverrideTargetFileName.Value = value If value Then Encoder.UpdateTargetFile() UpdateControls() End Sub tblOverrideName.RightClickAction = Sub(value) Encoder.ShowConfigDialog(Params.OverrideTargetFileName) End Sub AddHandler Params.ValueChanged, AddressOf ParamsValueChanged AddHandler lv.UpdateContextMenu, AddressOf UpdateMenu UpdateControls() ApplyTheme() AddHandler ThemeManager.CurrentThemeChanged, AddressOf OnThemeChanged End Sub Protected Overrides Sub Dispose(disposing As Boolean) RemoveHandler ThemeManager.CurrentThemeChanged, AddressOf OnThemeChanged RemoveHandler Params.ValueChanged, AddressOf ParamsValueChanged RemoveHandler lv.UpdateContextMenu, AddressOf UpdateMenu components?.Dispose() MyBase.Dispose(disposing) End Sub Sub OnThemeChanged(theme As Theme) ApplyTheme(theme) End Sub Sub ApplyTheme() ApplyTheme(ThemeManager.CurrentTheme) End Sub Sub ApplyTheme(theme As Theme) If DesignHelp.IsDesignMode Then Exit Sub SuspendLayout() For Each i In {blCompCheck, blConfigContainer, blConfigCodec} i.BackColor = theme.General.Controls.ListView.BackColor Next For Each i In {tblOverrideName} i.BackColor = theme.General.Controls.ListView.BackColor Next ResumeLayout() End Sub Protected Overrides Sub OnLayout(e As LayoutEventArgs) MyBase.OnLayout(e) If lv.Columns.Count = 0 Then lv.Columns.AddRange({New ColumnHeader, New ColumnHeader}) End If lv.Columns(0).Width = CInt(Width * (32 / 100)) lv.Columns(1).Width = CInt(Width * (66 / 100)) Dim horizontalOffset = FontHeight \ 3 Dim verticalOffset = FontHeight \ 7 blConfigCodec.Left = horizontalOffset blConfigCodec.Top = Height - blConfigCodec.Height - verticalOffset blCompCheck.Left = horizontalOffset blCompCheck.Top = Height - blConfigCodec.Height - blCompCheck.Height - verticalOffset * 2 blConfigContainer.Left = Width - blConfigContainer.Width - horizontalOffset blConfigContainer.Top = Height - blConfigContainer.Height - verticalOffset Dim right = blConfigContainer.Left - blConfigCodec.Left Dim left = blConfigCodec.Left + blConfigCodec.Width + blConfigCodec.Left Dim adjustedText = "Target Name Override" If (right - left) < 125 Then adjustedText = "Override" ElseIf (right - left) < 185 Then adjustedText = "Name Override" End If tblOverrideName.Text = adjustedText tblOverrideName.Left = (right - left - tblOverrideName.Width) \ 2 + left tblOverrideName.Top = Height - tblOverrideName.Height - verticalOffset End Sub Sub ParamsValueChanged(item As CommandLineParam) If item Is Params.OverrideTargetFileName Then tblOverrideName.State = DirectCast(item, BoolParam).Value End If End Sub Sub UpdateMenu() cms.Items.ClearAndDisplose Dim offset = If(Encoder.QualityMode, 0, 1) Dim add = Sub(path As String, action As Action, isSelected As Boolean, help As String) Dim item = MenuItemEx.Add(cms.Items, path & " ", action, help) 'item.Font = New Font(item.Font, If(isSelected, FontStyle.Bold, FontStyle.Regular)) item.CheckState = If(isSelected, CheckState.Checked, CheckState.Unchecked) End Sub If lv.SelectedItems.Count > 0 Then Dim selectedIndex = lv.SelectedIndices(0) Select Case selectedIndex Case 0 - offset Dim param As NumParam If Params.QVBR.Visible Then param = Params.QVBR If Params.QVBRAV1.Visible Then param = Params.QVBRAV1 If Params.QP.Visible Then param = Params.QP If Params.QPAV1.Visible Then param = Params.QPAV1 If Params.VbrQuality.Visible Then param = Params.VbrQuality If param IsNot Nothing Then For Each def In QualityDefinitions Dim p = def.Value & If(Not String.IsNullOrWhiteSpace(def.Text), $": {def.Text}", "") add(p, Sub() SetQuality(selectedIndex, def.Value), param.Value = def.Value, def.Tooltip) Next End If Case 1 - offset Dim param = Params.Mode For x = 0 To param.Options.Length - 1 Dim temp = x add(param.Options(temp), Sub() SetMode(selectedIndex, temp), param.Value = temp, "") Next Case 2 - offset Dim param = Params.Preset For x = 0 To param.Options.Length - 1 Dim temp = x add(param.Options(temp), Sub() SetPreset(selectedIndex, temp), param.Value = temp, "") Next Case 3 - offset Dim param = Params.Tune If Params.TuneH264.Visible Then param = Params.TuneH264 For x = 0 To param.Options.Length - 1 Dim temp = x add(param.Options(temp), Sub() SetTune(selectedIndex, temp), param.Value = temp, "") Next Case 4 - offset Dim param = Params.OutputDepth For x = 0 To param.Options.Length - 1 Dim temp = x add(param.Options(temp), Sub() SetOutputDepth(selectedIndex, temp), param.Value = temp, "") Next Case 5 - offset Dim param = If(Params.DolbyVisionProfileAV1.Visible, Params.DolbyVisionProfileAV1, Params.DolbyVisionProfileH265) For x = 0 To param.Options.Length - 1 Dim temp = x add(param.Options(temp), Sub() SetDolbyVisionProfile(param, selectedIndex, temp), param.Value = temp, "") Next Case 6 - offset Dim param = Params.ColorRange For x = 0 To param.Options.Length - 1 Dim temp = x add(param.Options(temp), Sub() SetColorRange(selectedIndex, temp), param.Value = temp, "") Next Case Else Throw New NotSupportedException(NameOf(selectedIndex)) End Select End If End Sub Sub SetMode(index As Integer, value As Integer) Params.Mode.Value = value lv.Items(index).SubItems(1).Tag = value.ToString() lv.Items(index).SubItems(1).Text = value.ToString() lv.Items(index).Selected = False UpdateControls() Encoder.UpdateTargetFile() End Sub Sub SetQuality(index As Integer, v As Double) If Params.QVBR.Visible Then Params.QVBR.Value = v If Params.QVBRAV1.Visible Then Params.QVBRAV1.Value = v If Params.QP.Visible Then Params.QP.Value = v If Params.QPAV1.Visible Then Params.QPAV1.Value = v If Params.VbrQuality.Visible Then Params.VbrQuality.Value = v lv.Items(index).SubItems(1).Tag = GetQualityCaption(v) lv.Items(index).SubItems(1).Text = GetQualityCaption(v) lv.Items(index).Selected = False UpdateControls() Encoder.UpdateTargetFile() End Sub Sub SetPreset(index As Integer, value As Integer) Params.Preset.Value = value lv.Items(index).SubItems(1).Tag = value.ToString() lv.Items(index).SubItems(1).Text = value.ToString() lv.Items(index).Selected = False UpdateControls() Encoder.UpdateTargetFile() End Sub Sub SetTune(index As Integer, value As Integer) If Params.Tune.Visible Then Params.Tune.Value = value If Params.TuneH264.Visible Then Params.TuneH264.Value = value lv.Items(index).SubItems(1).Tag = value.ToString() lv.Items(index).SubItems(1).Text = value.ToString() lv.Items(index).Selected = False UpdateControls() Encoder.UpdateTargetFile() End Sub Sub SetOutputDepth(index As Integer, value As Integer) Params.OutputDepth.Value = value lv.Items(index).SubItems(1).Tag = value.ToString() lv.Items(index).SubItems(1).Text = value.ToString() lv.Items(index).Selected = False UpdateControls() Encoder.UpdateTargetFile() End Sub Sub SetDolbyVisionProfile(param As OptionParam, index As Integer, value As Integer) param.Value = value lv.Items(index).SubItems(1).Tag = value.ToString() lv.Items(index).SubItems(1).Text = value.ToString lv.Items(index).Selected = False UpdateControls() Encoder.UpdateTargetFile() End Sub Sub SetColorRange(index As Integer, value As Integer) Params.ColorRange.Value = value lv.Items(index).SubItems(1).Tag = value.ToString() lv.Items(index).SubItems(1).Text = value.ToString lv.Items(index).Selected = False UpdateControls() Encoder.UpdateTargetFile() End Sub Sub UpdateControls(item As CommandLineParam) UpdateControls() End Sub Sub UpdateControls() lv.Items.Clear() If Encoder.QualityMode Then Dim val = -1.0 val = If(Params.QVBR.Visible, Params.QVBR.Value, val) val = If(Params.QVBRAV1.Visible, Params.QVBRAV1.Value, val) val = If(Params.QP.Visible, Params.QP.Value, val) val = If(Params.QPAV1.Visible, Params.QPAV1.Value, val) val = If(Params.VbrQuality.Visible, Params.VbrQuality.Value, val) If val >= 0 Then lv.Items.Add(New ListViewItem({"Quality", GetQualityCaption(val)})) End If End If lv.Items.Add(New ListViewItem({"Mode", Params.Mode.OptionText})) lv.Items.Add(New ListViewItem({"Preset", Params.Preset.OptionText})) Dim tuneParam = Params.Tune If Params.TuneH264.Visible Then tuneParam = Params.TuneH264 lv.Items.Add(New ListViewItem({"Tune", tuneParam.OptionText})) lv.Items.Add(New ListViewItem({"Output Depth", Params.OutputDepth.OptionText})) lv.Items.Add(New ListViewItem({"DV Profile", If(Params.DolbyVisionProfileAV1.Visible, Params.DolbyVisionProfileAV1.OptionText, Params.DolbyVisionProfileH265.OptionText)})) lv.Items.Add(New ListViewItem({"Color Range", Params.ColorRange.OptionText})) tblOverrideName.State = Encoder.OverridesTargetFileName 'blCompCheck.Visible = Not Encoder.QualityMode AndAlso Params.Decoder.Value = 0 blCompCheck.Visible = False g.MainForm.UpdateEncoderStateRelatedControls() End Sub Function GetQualityCaption(value As Double) As String For Each def In QualityDefinitions If def.Value = value Then Return value.ToInvariantString() & If(Not String.IsNullOrWhiteSpace(def.Text), $": {def.Text}", "") End If Next Return value.ToInvariantString() End Function Sub llConfigCodec_Click(sender As Object, e As EventArgs) Handles blConfigCodec.Click Encoder.ShowConfigDialog() End Sub Sub llConfigContainer_Click(sender As Object, e As EventArgs) Handles blConfigContainer.Click Encoder.OpenMuxerConfigDialog() End Sub Sub llCompCheck_Click(sender As Object, e As EventArgs) Handles blCompCheck.Click Encoder.RunCompCheck() End Sub Public Class QualityItem Property Value As Double Property Text As String Property Tooltip As String Sub New(value As Double, text As String, tooltip As String) Me.Value = value Me.Text = text Me.Tooltip = tooltip End Sub End Class End Class