diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c4efe2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,261 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +project.fragment.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +#*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..ff89843 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# rav1e_gui +A GUI to convert video files to AV1 using rav1e + +![Screenshot](https://moisescardona.me/files/rav1e_gui/rav1e_gui_v1.0.PNG) + +I wrote this software to test the rav1e software. Unfortunately, at the current state, rav1e is single-threaded. This GUI solves the issue and enabled multithreading by converting and splitting the input video file into 1-second segments y4m files and splitting the audio as a WAV file using ffmpeg. It then encodes each file using a CPU thread. After the encoding is finished, the WAV file is converted to Opus and the .ivf files are concatenated. Lastly, the .ivf and .opus files are merged into a .webm container. + +## Dependencies: +* You need my build of `opusenc.exe`. You can get it here: https://moisescardona.me/opusenc-libopus%201.3-rc2-2-ga8e2a2b1-dirty-resample-10 +* You need ffmpeg as found here: https://ffmpeg.zeranoe.com/builds/. Use the nightly builds. +* You also need rav1e + +Written in Visual Basic .NET using Visual Studio 2017. + +Enjoy! diff --git a/rav1e_gui.sln b/rav1e_gui.sln new file mode 100644 index 0000000..91a04e5 --- /dev/null +++ b/rav1e_gui.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27703.2035 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "rav1e_gui", "rav1e_gui\rav1e_gui.vbproj", "{51B64CB0-26F1-466F-A4EF-05F48DA441ED}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {51B64CB0-26F1-466F-A4EF-05F48DA441ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {51B64CB0-26F1-466F-A4EF-05F48DA441ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {51B64CB0-26F1-466F-A4EF-05F48DA441ED}.Debug|x64.ActiveCfg = Debug|x64 + {51B64CB0-26F1-466F-A4EF-05F48DA441ED}.Debug|x64.Build.0 = Debug|x64 + {51B64CB0-26F1-466F-A4EF-05F48DA441ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {51B64CB0-26F1-466F-A4EF-05F48DA441ED}.Release|Any CPU.Build.0 = Release|Any CPU + {51B64CB0-26F1-466F-A4EF-05F48DA441ED}.Release|x64.ActiveCfg = Release|x64 + {51B64CB0-26F1-466F-A4EF-05F48DA441ED}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {6677CD0A-1F01-4E78-AAC1-7B208DACE1C2} + EndGlobalSection +EndGlobal diff --git a/rav1e_gui/App.config b/rav1e_gui/App.config new file mode 100644 index 0000000..e1ccd9d --- /dev/null +++ b/rav1e_gui/App.config @@ -0,0 +1,30 @@ + + + + + + +
+ + + + + + + + + + 100 + + + 3 + + + + + + 64 + + + + \ No newline at end of file diff --git a/rav1e_gui/Form1.Designer.vb b/rav1e_gui/Form1.Designer.vb new file mode 100644 index 0000000..2cc3443 --- /dev/null +++ b/rav1e_gui/Form1.Designer.vb @@ -0,0 +1,335 @@ + +Partial Class Form1 + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + + Private Sub InitializeComponent() + Me.Label1 = New System.Windows.Forms.Label() + Me.Label2 = New System.Windows.Forms.Label() + Me.InputTxt = New System.Windows.Forms.TextBox() + Me.OutputTxt = New System.Windows.Forms.TextBox() + Me.InputBrowseBtn = New System.Windows.Forms.Button() + Me.OutputBrowseBtn = New System.Windows.Forms.Button() + Me.StartBtn = New System.Windows.Forms.Button() + Me.Label4 = New System.Windows.Forms.Label() + Me.ProgressBar1 = New System.Windows.Forms.ProgressBar() + Me.Label5 = New System.Windows.Forms.Label() + Me.Label6 = New System.Windows.Forms.Label() + Me.OpusVersionLabel = New System.Windows.Forms.Label() + Me.GroupBox1 = New System.Windows.Forms.GroupBox() + Me.audioBitrate = New System.Windows.Forms.NumericUpDown() + Me.Label9 = New System.Windows.Forms.Label() + Me.BrowseTempLocation = New System.Windows.Forms.Button() + Me.Label8 = New System.Windows.Forms.Label() + Me.tempLocationPath = New System.Windows.Forms.TextBox() + Me.speed = New System.Windows.Forms.NumericUpDown() + Me.Label7 = New System.Windows.Forms.Label() + Me.quantizer = New System.Windows.Forms.NumericUpDown() + Me.Label3 = New System.Windows.Forms.Label() + Me.rav1eVersionLabel = New System.Windows.Forms.Label() + Me.GroupBox1.SuspendLayout + CType(Me.audioBitrate,System.ComponentModel.ISupportInitialize).BeginInit + CType(Me.speed,System.ComponentModel.ISupportInitialize).BeginInit + CType(Me.quantizer,System.ComponentModel.ISupportInitialize).BeginInit + Me.SuspendLayout + ' + 'Label1 + ' + Me.Label1.AutoSize = true + Me.Label1.Location = New System.Drawing.Point(12, 9) + Me.Label1.Name = "Label1" + Me.Label1.Size = New System.Drawing.Size(151, 13) + Me.Label1.TabIndex = 0 + Me.Label1.Text = "Step 1: Browse for an input file" + ' + 'Label2 + ' + Me.Label2.AutoSize = true + Me.Label2.Location = New System.Drawing.Point(12, 52) + Me.Label2.Name = "Label2" + Me.Label2.Size = New System.Drawing.Size(182, 13) + Me.Label2.TabIndex = 1 + Me.Label2.Text = "Step 2: Output location and filename:" + ' + 'InputTxt + ' + Me.InputTxt.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles) + Me.InputTxt.Location = New System.Drawing.Point(15, 26) + Me.InputTxt.Name = "InputTxt" + Me.InputTxt.Size = New System.Drawing.Size(340, 20) + Me.InputTxt.TabIndex = 2 + ' + 'OutputTxt + ' + Me.OutputTxt.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles) + Me.OutputTxt.Location = New System.Drawing.Point(15, 68) + Me.OutputTxt.Name = "OutputTxt" + Me.OutputTxt.Size = New System.Drawing.Size(340, 20) + Me.OutputTxt.TabIndex = 3 + ' + 'InputBrowseBtn + ' + Me.InputBrowseBtn.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles) + Me.InputBrowseBtn.Location = New System.Drawing.Point(361, 24) + Me.InputBrowseBtn.Name = "InputBrowseBtn" + Me.InputBrowseBtn.Size = New System.Drawing.Size(75, 23) + Me.InputBrowseBtn.TabIndex = 5 + Me.InputBrowseBtn.Text = "Browse" + Me.InputBrowseBtn.UseVisualStyleBackColor = true + ' + 'OutputBrowseBtn + ' + Me.OutputBrowseBtn.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles) + Me.OutputBrowseBtn.Location = New System.Drawing.Point(361, 68) + Me.OutputBrowseBtn.Name = "OutputBrowseBtn" + Me.OutputBrowseBtn.Size = New System.Drawing.Size(75, 23) + Me.OutputBrowseBtn.TabIndex = 6 + Me.OutputBrowseBtn.Text = "Browse" + Me.OutputBrowseBtn.UseVisualStyleBackColor = true + ' + 'StartBtn + ' + Me.StartBtn.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles) + Me.StartBtn.Location = New System.Drawing.Point(12, 235) + Me.StartBtn.Name = "StartBtn" + Me.StartBtn.Size = New System.Drawing.Size(424, 37) + Me.StartBtn.TabIndex = 8 + Me.StartBtn.Text = "Start" + Me.StartBtn.UseVisualStyleBackColor = true + ' + 'Label4 + ' + Me.Label4.AutoSize = true + Me.Label4.Location = New System.Drawing.Point(12, 282) + Me.Label4.Name = "Label4" + Me.Label4.Size = New System.Drawing.Size(51, 13) + Me.Label4.TabIndex = 9 + Me.Label4.Text = "Progress:" + ' + 'ProgressBar1 + ' + Me.ProgressBar1.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles) + Me.ProgressBar1.Location = New System.Drawing.Point(15, 299) + Me.ProgressBar1.Name = "ProgressBar1" + Me.ProgressBar1.Size = New System.Drawing.Size(421, 23) + Me.ProgressBar1.Step = 1 + Me.ProgressBar1.TabIndex = 10 + ' + 'Label5 + ' + Me.Label5.AutoSize = true + Me.Label5.Location = New System.Drawing.Point(12, 370) + Me.Label5.Name = "Label5" + Me.Label5.Size = New System.Drawing.Size(119, 13) + Me.Label5.TabIndex = 11 + Me.Label5.Text = "GUI by Moises Cardona" + ' + 'Label6 + ' + Me.Label6.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles) + Me.Label6.AutoSize = true + Me.Label6.Location = New System.Drawing.Point(408, 370) + Me.Label6.Name = "Label6" + Me.Label6.Size = New System.Drawing.Size(28, 13) + Me.Label6.TabIndex = 12 + Me.Label6.Text = "v1.0" + ' + 'OpusVersionLabel + ' + Me.OpusVersionLabel.AutoSize = true + Me.OpusVersionLabel.Location = New System.Drawing.Point(12, 348) + Me.OpusVersionLabel.Name = "OpusVersionLabel" + Me.OpusVersionLabel.Size = New System.Drawing.Size(88, 13) + Me.OpusVersionLabel.TabIndex = 14 + Me.OpusVersionLabel.Text = "opusenc version:" + ' + 'GroupBox1 + ' + Me.GroupBox1.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles) + Me.GroupBox1.Controls.Add(Me.audioBitrate) + Me.GroupBox1.Controls.Add(Me.Label9) + Me.GroupBox1.Controls.Add(Me.BrowseTempLocation) + Me.GroupBox1.Controls.Add(Me.Label8) + Me.GroupBox1.Controls.Add(Me.tempLocationPath) + Me.GroupBox1.Controls.Add(Me.speed) + Me.GroupBox1.Controls.Add(Me.Label7) + Me.GroupBox1.Controls.Add(Me.quantizer) + Me.GroupBox1.Controls.Add(Me.Label3) + Me.GroupBox1.Location = New System.Drawing.Point(15, 94) + Me.GroupBox1.Name = "GroupBox1" + Me.GroupBox1.Size = New System.Drawing.Size(421, 122) + Me.GroupBox1.TabIndex = 15 + Me.GroupBox1.TabStop = false + Me.GroupBox1.Text = "Encoder Options" + ' + 'audioBitrate + ' + Me.audioBitrate.Location = New System.Drawing.Point(143, 37) + Me.audioBitrate.Maximum = New Decimal(New Integer() {320, 0, 0, 0}) + Me.audioBitrate.Minimum = New Decimal(New Integer() {1, 0, 0, 0}) + Me.audioBitrate.Name = "audioBitrate" + Me.audioBitrate.Size = New System.Drawing.Size(65, 20) + Me.audioBitrate.TabIndex = 19 + Me.audioBitrate.Value = New Decimal(New Integer() {64, 0, 0, 0}) + ' + 'Label9 + ' + Me.Label9.AutoSize = true + Me.Label9.Location = New System.Drawing.Point(140, 21) + Me.Label9.Name = "Label9" + Me.Label9.Size = New System.Drawing.Size(68, 13) + Me.Label9.TabIndex = 18 + Me.Label9.Text = "audio bitrate:" + ' + 'BrowseTempLocation + ' + Me.BrowseTempLocation.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles) + Me.BrowseTempLocation.Location = New System.Drawing.Point(340, 83) + Me.BrowseTempLocation.Name = "BrowseTempLocation" + Me.BrowseTempLocation.Size = New System.Drawing.Size(75, 23) + Me.BrowseTempLocation.TabIndex = 17 + Me.BrowseTempLocation.Text = "Browse" + Me.BrowseTempLocation.UseVisualStyleBackColor = true + ' + 'Label8 + ' + Me.Label8.AutoSize = true + Me.Label8.Location = New System.Drawing.Point(9, 69) + Me.Label8.Name = "Label8" + Me.Label8.Size = New System.Drawing.Size(123, 13) + Me.Label8.TabIndex = 4 + Me.Label8.Text = "Temporary File Location:" + ' + 'tempLocationPath + ' + Me.tempLocationPath.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles) + Me.tempLocationPath.Location = New System.Drawing.Point(12, 85) + Me.tempLocationPath.Name = "tempLocationPath" + Me.tempLocationPath.Size = New System.Drawing.Size(322, 20) + Me.tempLocationPath.TabIndex = 16 + ' + 'speed + ' + Me.speed.Location = New System.Drawing.Point(80, 37) + Me.speed.Maximum = New Decimal(New Integer() {10, 0, 0, 0}) + Me.speed.Name = "speed" + Me.speed.Size = New System.Drawing.Size(50, 20) + Me.speed.TabIndex = 3 + Me.speed.Value = New Decimal(New Integer() {3, 0, 0, 0}) + ' + 'Label7 + ' + Me.Label7.AutoSize = true + Me.Label7.Location = New System.Drawing.Point(77, 21) + Me.Label7.Name = "Label7" + Me.Label7.Size = New System.Drawing.Size(39, 13) + Me.Label7.TabIndex = 2 + Me.Label7.Text = "speed:" + ' + 'quantizer + ' + Me.quantizer.Location = New System.Drawing.Point(12, 37) + Me.quantizer.Maximum = New Decimal(New Integer() {255, 0, 0, 0}) + Me.quantizer.Minimum = New Decimal(New Integer() {1, 0, 0, 0}) + Me.quantizer.Name = "quantizer" + Me.quantizer.Size = New System.Drawing.Size(50, 20) + Me.quantizer.TabIndex = 1 + Me.quantizer.Value = New Decimal(New Integer() {100, 0, 0, 0}) + ' + 'Label3 + ' + Me.Label3.AutoSize = true + Me.Label3.Location = New System.Drawing.Point(9, 21) + Me.Label3.Name = "Label3" + Me.Label3.Size = New System.Drawing.Size(53, 13) + Me.Label3.TabIndex = 0 + Me.Label3.Text = "quantizer:" + ' + 'rav1eVersionLabel + ' + Me.rav1eVersionLabel.AutoSize = true + Me.rav1eVersionLabel.Location = New System.Drawing.Point(12, 335) + Me.rav1eVersionLabel.Name = "rav1eVersionLabel" + Me.rav1eVersionLabel.Size = New System.Drawing.Size(74, 13) + Me.rav1eVersionLabel.TabIndex = 16 + Me.rav1eVersionLabel.Text = "rav1e version:" + ' + 'Form1 + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6!, 13!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(448, 401) + Me.Controls.Add(Me.rav1eVersionLabel) + Me.Controls.Add(Me.GroupBox1) + Me.Controls.Add(Me.OpusVersionLabel) + Me.Controls.Add(Me.Label6) + Me.Controls.Add(Me.Label5) + Me.Controls.Add(Me.ProgressBar1) + Me.Controls.Add(Me.Label4) + Me.Controls.Add(Me.StartBtn) + Me.Controls.Add(Me.OutputBrowseBtn) + Me.Controls.Add(Me.InputBrowseBtn) + Me.Controls.Add(Me.OutputTxt) + Me.Controls.Add(Me.InputTxt) + Me.Controls.Add(Me.Label2) + Me.Controls.Add(Me.Label1) + Me.MaximizeBox = false + Me.Name = "Form1" + Me.Text = "rav1e GUI" + Me.GroupBox1.ResumeLayout(false) + Me.GroupBox1.PerformLayout + CType(Me.audioBitrate,System.ComponentModel.ISupportInitialize).EndInit + CType(Me.speed,System.ComponentModel.ISupportInitialize).EndInit + CType(Me.quantizer,System.ComponentModel.ISupportInitialize).EndInit + Me.ResumeLayout(false) + Me.PerformLayout + +End Sub + + Friend WithEvents Label1 As Label + Friend WithEvents Label2 As Label + Friend WithEvents InputTxt As TextBox + Friend WithEvents OutputTxt As TextBox + Friend WithEvents InputBrowseBtn As Button + Friend WithEvents OutputBrowseBtn As Button + Friend WithEvents StartBtn As Button + Friend WithEvents Label4 As Label + Friend WithEvents ProgressBar1 As ProgressBar + Friend WithEvents Label5 As Label + Friend WithEvents Label6 As Label + Friend WithEvents OpusVersionLabel As Label + Friend WithEvents GroupBox1 As GroupBox + Friend WithEvents BrowseTempLocation As Button + Friend WithEvents Label8 As Label + Friend WithEvents tempLocationPath As TextBox + Friend WithEvents speed As NumericUpDown + Friend WithEvents Label7 As Label + Friend WithEvents quantizer As NumericUpDown + Friend WithEvents Label3 As Label + Friend WithEvents rav1eVersionLabel As Label + Friend WithEvents audioBitrate As NumericUpDown + Friend WithEvents Label9 As Label +End Class diff --git a/rav1e_gui/Form1.resx b/rav1e_gui/Form1.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/rav1e_gui/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/rav1e_gui/Form1.vb b/rav1e_gui/Form1.vb new file mode 100644 index 0000000..76b32fb --- /dev/null +++ b/rav1e_gui/Form1.vb @@ -0,0 +1,285 @@ +Public Class Form1 + Private GUILoaded As Boolean = False + Private Sub InputBrowseBtn_Click(sender As Object, e As EventArgs) Handles InputBrowseBtn.Click + Dim InputBrowser As New OpenFileDialog With { + .Title = "Browse for a video file", + .FileName = "", + .Filter = "All Files|*.*" + } + Dim OkAction As MsgBoxResult = InputBrowser.ShowDialog + If OkAction = MsgBoxResult.Ok Then + InputTxt.Text = InputBrowser.FileName + End If + End Sub + + Private Sub OutputBrowseBtn_Click(sender As Object, e As EventArgs) Handles OutputBrowseBtn.Click + Dim OutputBrowser As New SaveFileDialog With { + .Title = "Save Video File", + .FileName = "", + .Filter = "WebM|*.webm" + } + Dim OkAction As MsgBoxResult = OutputBrowser.ShowDialog + If OkAction = MsgBoxResult.Ok Then + OutputTxt.Text = OutputBrowser.FileName + End If + End Sub + + Private Sub StartBtn_Click(sender As Object, e As EventArgs) Handles StartBtn.Click + StartBtn.Enabled = False + InputTxt.Enabled = False + OutputTxt.Enabled = False + InputBrowseBtn.Enabled = False + OutputBrowseBtn.Enabled = False + audioBitrate.Enabled = False + quantizer.Enabled = False + speed.Enabled = False + tempLocationPath.Enabled = False + BrowseTempLocation.Enabled = False + If Not IO.Path.GetExtension(OutputTxt.Text) = ".webm" Then + OutputTxt.Text = My.Computer.FileSystem.GetParentPath(OutputTxt.Text) + "\" + IO.Path.GetFileNameWithoutExtension(OutputTxt.Text) + ".webm" + End If + Dim StartTasks As New Threading.Thread(Sub() StartThreads()) + StartTasks.Start() + End Sub + Private Sub StartThreads() + If split_video_file(InputTxt.Text, tempLocationPath.Text) Then + If extract_audio(InputTxt.Text, tempLocationPath.Text) Then + Dim ItemsToProcess As List(Of String) = New List(Of String) + For Each File As String In IO.Directory.GetFiles(tempLocationPath.Text) + If IO.Path.GetExtension(File) = ".y4m" And File.Contains("y4m-part-") Then + ItemsToProcess.Add(File) + End If + Next + ItemsToProcess.Sort() + ProgressBar1.BeginInvoke(Sub() + ProgressBar1.Maximum = ItemsToProcess.Count + ProgressBar1.Value = 0 + End Sub) + Dim tasks = New List(Of Action) + Dim streamWriter As New IO.StreamWriter(tempLocationPath.Text + "\rav1e-concatenate-list.txt") + For Counter As Integer = 0 To ItemsToProcess.Count - 1 + Dim args As Array = {ItemsToProcess(Counter), tempLocationPath.Text + "\" + IO.Path.GetFileNameWithoutExtension(ItemsToProcess(Counter)) + ".ivf", My.Settings.quantizer, My.Settings.speed} + streamWriter.WriteLine("file '" + tempLocationPath.Text.Replace("\", "/") + "/" + IO.Path.GetFileNameWithoutExtension(ItemsToProcess(Counter)) + ".ivf" + "'") + tasks.Add(Function() Run_rav1e(args)) + Next + streamWriter.Close() + Dim options As New ParallelOptions With {.MaxDegreeOfParallelism = Environment.ProcessorCount} + Parallel.Invoke(options, tasks.ToArray()) + Run_opus(My.Settings.bitrate, tempLocationPath.Text) + concatenate_video_files(tempLocationPath.Text + "\rav1e-concatenate-list.txt", tempLocationPath.Text) + merge_audio_video(OutputTxt.Text, tempLocationPath.Text) + clean_temp_folder(tempLocationPath.Text) + StartBtn.BeginInvoke(Sub() + StartBtn.Enabled = True + audioBitrate.Enabled = True + quantizer.Enabled = True + speed.Enabled = True + tempLocationPath.Enabled = True + BrowseTempLocation.Enabled = True + OutputTxt.Enabled = True + InputTxt.Enabled = True + InputBrowseBtn.Enabled = True + OutputBrowseBtn.Enabled = True + End Sub) + MsgBox("Finished") + End If + End If + End Sub + Private Function Run_opus(audio_bitrate As Integer, tempFolder As String) + Dim opusProcessInfo As New ProcessStartInfo + Dim opusProcess As Process + opusProcessInfo.FileName = "opusenc.exe" + opusProcessInfo.Arguments = "--music --bitrate " & audio_bitrate & " """ + tempFolder + "\rav1e-audio.wav""" + opusProcessInfo.CreateNoWindow = True + opusProcessInfo.RedirectStandardOutput = False + opusProcessInfo.UseShellExecute = False + opusProcess = Process.Start(opusProcessInfo) + opusProcess.WaitForExit() + Return True + End Function + Private Function Run_rav1e(args As Array) + Dim Input_File As String = args(0) + Dim Output_File As String = args(1) + Dim Quantizer As String = args(2) + Dim Speed As String = args(3) + Dim rav1eProcessInfo As New ProcessStartInfo + Dim rav1eProcess As Process + rav1eProcessInfo.FileName = "rav1e.exe" + rav1eProcessInfo.Arguments = """" + Input_File + """ -o """ + Output_File + """ --quantizer " + Quantizer + " -s " + Speed + rav1eProcessInfo.CreateNoWindow = True + rav1eProcessInfo.RedirectStandardOutput = False + rav1eProcessInfo.UseShellExecute = False + rav1eProcess = Process.Start(rav1eProcessInfo) + rav1eProcess.WaitForExit() + ProgressBar1.BeginInvoke(Sub() ProgressBar1.PerformStep()) + Return True + End Function + + Private Function split_video_file(input As String, tempFolder As String) + Dim ffmpegProcessInfo As New ProcessStartInfo + Dim ffmpegProcess As Process + ffmpegProcessInfo.FileName = "ffmpeg.exe" + ffmpegProcessInfo.Arguments = "-i """ + input + """ -f segment -segment_time 1 """ + tempFolder + "/y4m-part-%6d.y4m""" + ffmpegProcessInfo.CreateNoWindow = True + ffmpegProcessInfo.RedirectStandardOutput = False + ffmpegProcessInfo.UseShellExecute = False + ffmpegProcess = Process.Start(ffmpegProcessInfo) + ffmpegProcess.WaitForExit() + Return True + End Function + + Private Function concatenate_video_files(input As String, tempFolder As String) + Dim ffmpegProcessInfo As New ProcessStartInfo + Dim ffmpegProcess As Process + ffmpegProcessInfo.FileName = "ffmpeg.exe" + ffmpegProcessInfo.Arguments = "-f concat -safe 0 -i """ + input + """ -c copy """ + tempFolder + "\rav1e-concatenated-file.ivf""" + ffmpegProcessInfo.CreateNoWindow = True + ffmpegProcessInfo.RedirectStandardOutput = False + ffmpegProcessInfo.UseShellExecute = False + ffmpegProcess = Process.Start(ffmpegProcessInfo) + ffmpegProcess.WaitForExit() + Return True + End Function + Private Function clean_temp_folder(tempFolder As String) + For Each File As String In IO.Directory.GetFiles(tempLocationPath.Text) + If (IO.Path.GetExtension(File) = ".y4m" Or IO.Path.GetExtension(File) = ".ivf" And File.Contains("y4m-part-")) Or IO.Path.GetFileName(File) = "rav1e-audio.opus" Or IO.Path.GetFileName(File) = "rav1e-audio.wav" Or IO.Path.GetFileName(File) = "rav1e-concatenated-file.ivf" Or IO.Path.GetFileName(File) = "rav1e-concatenate-list.txt" Then + My.Computer.FileSystem.DeleteFile(File) + End If + Next + Return True + End Function + Private Function merge_audio_video(output As String, tempFolder As String) + Dim ffmpegProcessInfo As New ProcessStartInfo + Dim ffmpegProcess As Process + ffmpegProcessInfo.FileName = "ffmpeg.exe" + ffmpegProcessInfo.Arguments = "-i """ + tempFolder + "\rav1e-concatenated-file.ivf"" -i """ + tempFolder + "\rav1e-audio.opus"" -c:v copy -c:a copy """ + output + """" + ffmpegProcessInfo.CreateNoWindow = True + ffmpegProcessInfo.RedirectStandardOutput = False + ffmpegProcessInfo.UseShellExecute = False + ffmpegProcess = Process.Start(ffmpegProcessInfo) + ffmpegProcess.WaitForExit() + Return True + End Function + + Private Function extract_audio(input As String, tempFolder As String) + Dim ffmpegProcessInfo As New ProcessStartInfo + Dim ffmpegProcess As Process + ffmpegProcessInfo.FileName = "ffmpeg.exe" + ffmpegProcessInfo.Arguments = "-i """ + input + """ -vn """ + tempFolder + "\rav1e-audio.wav""" + ffmpegProcessInfo.CreateNoWindow = True + ffmpegProcessInfo.RedirectStandardOutput = False + ffmpegProcessInfo.UseShellExecute = False + ffmpegProcess = Process.Start(ffmpegProcessInfo) + ffmpegProcess.WaitForExit() + Return True + End Function + + Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load + quantizer.Value = My.Settings.quantizer + speed.Value = My.Settings.speed + audioBitrate.Value = My.Settings.bitrate + tempLocationPath.Text = My.Settings.tempFolder + If OpusEncExists() Then + GetOpusencVersion() + Else + MessageBox.Show("opusenc.exe was not found. Exiting...") + Me.Close() + End If + If rav1eExists() Then + GetRav1eVersion() + Else + MessageBox.Show("rav1e.exe was not found. Exiting...") + Me.Close() + End If + If Not ffmpegExists() Then + MessageBox.Show("ffmpeg.exe was not found. Exiting...") + Me.Close() + End If + GUILoaded = True + End Sub + + Private Sub GetOpusencVersion() + Dim opusProcessInfo As New ProcessStartInfo + Dim opusProcess As Process + opusProcessInfo.FileName = "opusenc.exe" + opusProcessInfo.Arguments = "-V" + opusProcessInfo.CreateNoWindow = True + opusProcessInfo.RedirectStandardOutput = True + opusProcessInfo.UseShellExecute = False + opusProcess = Process.Start(opusProcessInfo) + opusProcess.WaitForExit() + OpusVersionLabel.Text = "opusenc version: " + opusProcess.StandardOutput.ReadLine() + End Sub + Private Sub GetRav1eVersion() + Dim rav1eProcessInfo As New ProcessStartInfo + Dim rav1eProcess As Process + rav1eProcessInfo.FileName = "rav1e.exe" + rav1eProcessInfo.Arguments = "-V" + rav1eProcessInfo.CreateNoWindow = True + rav1eProcessInfo.RedirectStandardOutput = True + rav1eProcessInfo.UseShellExecute = False + rav1eProcess = Process.Start(rav1eProcessInfo) + rav1eProcess.WaitForExit() + rav1eVersionLabel.Text = "rav1e version: " + rav1eProcess.StandardOutput.ReadLine() + End Sub + + Private Function rav1eExists() As Boolean + If My.Computer.FileSystem.FileExists("rav1e.exe") Then + Return True + Else + Return False + End If + End Function + Private Function ffmpegExists() As Boolean + If My.Computer.FileSystem.FileExists("ffmpeg.exe") Then + Return True + Else + Return False + End If + End Function + Private Function OpusEncExists() As Boolean + If My.Computer.FileSystem.FileExists("opusenc.exe") Then + Return True + Else + Return False + End If + End Function + + Private Sub tempLocationPath_TextChanged(sender As Object, e As EventArgs) Handles tempLocationPath.TextChanged + If GUILoaded Then + My.Settings.tempFolder = tempLocationPath.Text + My.Settings.Save() + End If + End Sub + + Private Sub quantizer_ValueChanged(sender As Object, e As EventArgs) Handles quantizer.ValueChanged + If GUILoaded Then + My.Settings.quantizer = quantizer.Value + My.Settings.Save() + End If + End Sub + + Private Sub speed_ValueChanged(sender As Object, e As EventArgs) Handles speed.ValueChanged + If GUILoaded Then + My.Settings.speed = speed.Value + My.Settings.Save() + End If + End Sub + + Private Sub audioBitrate_ValueChanged(sender As Object, e As EventArgs) Handles audioBitrate.ValueChanged + If GUILoaded Then + My.Settings.bitrate = audioBitrate.Value + My.Settings.Save() + End If + End Sub + + Private Sub BrowseTempLocation_Click(sender As Object, e As EventArgs) Handles BrowseTempLocation.Click + Dim TempFolderBrowser As New FolderBrowserDialog With { + .ShowNewFolderButton = False + } + Dim OkAction As MsgBoxResult = TempFolderBrowser.ShowDialog + If OkAction = MsgBoxResult.Ok Then + tempLocationPath.Text = TempFolderBrowser.SelectedPath + End If + End Sub +End Class diff --git a/rav1e_gui/My Project/Application.Designer.vb b/rav1e_gui/My Project/Application.Designer.vb new file mode 100644 index 0000000..0bad600 --- /dev/null +++ b/rav1e_gui/My Project/Application.Designer.vb @@ -0,0 +1,38 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + 'NOTE: This file is auto-generated; do not modify it directly. To make changes, + ' or if you encounter build errors in this file, go to the Project Designer + ' (go to Project Properties or double-click the My Project node in + ' Solution Explorer), and make changes on the Application tab. + ' + Partial Friend Class MyApplication + + _ + Public Sub New() + MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows) + Me.IsSingleInstance = false + Me.EnableVisualStyles = true + Me.SaveMySettingsOnExit = true + Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses + End Sub + + _ + Protected Overrides Sub OnCreateMainForm() + Me.MainForm = Global.rav1e_gui.Form1 + End Sub + End Class +End Namespace diff --git a/rav1e_gui/My Project/Application.myapp b/rav1e_gui/My Project/Application.myapp new file mode 100644 index 0000000..1243847 --- /dev/null +++ b/rav1e_gui/My Project/Application.myapp @@ -0,0 +1,11 @@ + + + true + Form1 + false + 0 + true + 0 + 0 + true + diff --git a/rav1e_gui/My Project/AssemblyInfo.vb b/rav1e_gui/My Project/AssemblyInfo.vb new file mode 100644 index 0000000..bd4053c --- /dev/null +++ b/rav1e_gui/My Project/AssemblyInfo.vb @@ -0,0 +1,35 @@ +Imports System +Imports System.Reflection +Imports System.Runtime.InteropServices + +' General Information about an assembly is controlled through the following +' set of attributes. Change these attribute values to modify the information +' associated with an assembly. + +' Review the values of the assembly attributes + + + + + + + + + + +'The following GUID is for the ID of the typelib if this project is exposed to COM + + +' Version information for an assembly consists of the following four values: +' +' Major Version +' Minor Version +' Build Number +' Revision +' +' You can specify all the values or you can default the Build and Revision Numbers +' by using the '*' as shown below: +' + + + diff --git a/rav1e_gui/My Project/Resources.Designer.vb b/rav1e_gui/My Project/Resources.Designer.vb new file mode 100644 index 0000000..db1081d --- /dev/null +++ b/rav1e_gui/My Project/Resources.Designer.vb @@ -0,0 +1,63 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + +Imports System + +Namespace My.Resources + + 'This class was auto-generated by the StronglyTypedResourceBuilder + 'class via a tool like ResGen or Visual Studio. + 'To add or remove a member, edit your .ResX file then rerun ResGen + 'with the /str option, or rebuild your VS project. + ''' + ''' A strongly-typed resource class, for looking up localized strings, etc. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Returns the cached ResourceManager instance used by this class. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("rav1e_gui.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Overrides the current thread's CurrentUICulture property for all + ''' resource lookups using this strongly typed resource class. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set + resourceCulture = value + End Set + End Property + End Module +End Namespace diff --git a/rav1e_gui/My Project/Resources.resx b/rav1e_gui/My Project/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/rav1e_gui/My Project/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/rav1e_gui/My Project/Settings.Designer.vb b/rav1e_gui/My Project/Settings.Designer.vb new file mode 100644 index 0000000..e0f21a6 --- /dev/null +++ b/rav1e_gui/My Project/Settings.Designer.vb @@ -0,0 +1,121 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings) + +#Region "My.Settings Auto-Save Functionality" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + + _ + Public Property quantizer() As Integer + Get + Return CType(Me("quantizer"),Integer) + End Get + Set + Me("quantizer") = value + End Set + End Property + + _ + Public Property speed() As Integer + Get + Return CType(Me("speed"),Integer) + End Get + Set + Me("speed") = value + End Set + End Property + + _ + Public Property tempFolder() As String + Get + Return CType(Me("tempFolder"),String) + End Get + Set + Me("tempFolder") = value + End Set + End Property + + _ + Public Property bitrate() As Integer + Get + Return CType(Me("bitrate"),Integer) + End Get + Set + Me("bitrate") = value + End Set + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.rav1e_gui.My.MySettings + Get + Return Global.rav1e_gui.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/rav1e_gui/My Project/Settings.settings b/rav1e_gui/My Project/Settings.settings new file mode 100644 index 0000000..09f57b4 --- /dev/null +++ b/rav1e_gui/My Project/Settings.settings @@ -0,0 +1,18 @@ + + + + + + 100 + + + 3 + + + + + + 64 + + + \ No newline at end of file diff --git a/rav1e_gui/rav1e_gui.vbproj b/rav1e_gui/rav1e_gui.vbproj new file mode 100644 index 0000000..a4e2228 --- /dev/null +++ b/rav1e_gui/rav1e_gui.vbproj @@ -0,0 +1,132 @@ + + + + + Debug + AnyCPU + {51B64CB0-26F1-466F-A4EF-05F48DA441ED} + WinExe + rav1e_gui.My.MyApplication + rav1e_gui + rav1e_gui + 512 + WindowsForms + v4.6.1 + true + + + AnyCPU + true + full + true + true + bin\Debug\ + rav1e_gui.xml + 41999,42016,42017,42018,42019,42020,42021,42022,42032,42036 + + + AnyCPU + pdbonly + false + true + true + bin\Release\ + rav1e_gui.xml + 41999,42016,42017,42018,42019,42020,42021,42022,42032,42036 + + + On + + + Binary + + + Off + + + On + + + x64 + bin\x64\Debug\ + 41999,42016,42017,42018,42019,42020,42021,42022,42032,42036 + + + x64 + bin\x64\Release\ + 41999,42016,42017,42018,42019,42020,42021,42022,42032,42036 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Form + + + Form1.vb + Form + + + + True + Application.myapp + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + Form1.vb + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + + \ No newline at end of file