Compare commits

...

35 Commits

Author SHA1 Message Date
Jordan Wages 9646efb98e Updated analytics ID in documentation. 2022-01-06 03:08:22 -06:00
Jordan Wages 397730659f
Update README.md 2022-01-03 19:32:57 -06:00
Jordan Wages 43e1759e04 Upgrading version number for release 2021-04-16 18:27:51 -05:00
Jordan Wages f11dbebdec
Update codeql-analysis.yml
github troubleshooting says i need this
2021-04-14 11:35:31 -05:00
Jordan Wages 1d91d964d2
Update codeql-analysis.yml
??
2021-04-14 11:29:33 -05:00
Jordan Wages 0d4ecffaa7
Update codeql-analysis.yml
?
2021-04-14 11:26:37 -05:00
Jordan Wages f3c51afe44
Update codeql-analysis.yml
f
2021-04-14 11:22:45 -05:00
Jordan Wages 85ebb66bd0
Update codeql-analysis.yml 2021-04-14 11:20:08 -05:00
Jordan Wages 8458f3b72c
Update codeql-analysis.yml
running msbuild on ubuntu. what was i thinking?
2021-04-14 11:11:28 -05:00
Jordan Wages d4f88bc92d
Update codeql-analysis.yml
turns out i was not closer.
2021-04-14 11:09:20 -05:00
Jordan Wages 7d0607157f
Update codeql-analysis.yml
i feel like i'm getting closer.
2021-04-14 11:04:55 -05:00
Jordan Wages e1abf6c614
Update codeql-analysis.yml
i dunno i might just remove this workflow...
2021-04-14 11:03:34 -05:00
Jordan Wages e9fd6eff58
Update codeql-analysis.yml
Dude, c'mon. I should have created a different branch, but it's too late now.
2021-04-14 11:02:16 -05:00
Jordan Wages b6bb2abe25
Update codeql-analysis.yml
This testing thing is turning out to be more trouble than its worth.
2021-04-14 11:00:24 -05:00
Jordan Wages 1c5a971bb5
Update codeql-analysis.yml
Trying to fix the build.
2021-04-14 10:20:07 -05:00
Jordan Wages 7bb60e61bf
Update codeql-analysis.yml
Removing the auto-build. Builds are checked locally before release anyway, so this should be fine.
2021-04-14 10:06:00 -05:00
Jordan Wages e2d9b3aea9
Create codeql-analysis.yml
Creating this automated security scan.
2021-04-14 10:02:05 -05:00
Jordan Wages aecfd9b2bc
Merge pull request #6 from kant/patch-1
Minor proposal (lines 190 & 289, 328, 352, 376) [spanish translation chapter]
2021-04-12 19:05:58 -05:00
Darío Hereñú eb59f53f92 Minor proposal (lines 190 & 289, 328, 352, 376)
* line 319: `<value>` `</value>` maybe?
2021-04-12 21:02:11 -03:00
Jordan Wages 64837df786 Updating documentation. 2021-04-12 17:33:45 -05:00
Jordan Wages baa91b4876 Updated documentation analytics. 2021-03-25 03:21:03 -05:00
Jordan Wages 400ed201e3 Adding analytics to documentation. 2021-03-25 00:02:54 -05:00
Jordan Wages a2293b7052
Update README.md
Added external analytics image.
2021-03-24 23:42:35 -05:00
Jordan Wages 23717a15c5
Update README.md 2020-09-02 23:21:00 -05:00
Jordan Wages 78a4ea2256
Update README.md
Updated my patron support link.
2020-09-02 23:18:47 -05:00
Jordan Wages a96c943a89 Updating Installer Configuration
Updating the installer configuration. The new structure in ../ThirdPartyCompiled required a rework of the installer config.
2019-08-17 02:51:08 -05:00
Jordan Wages 703ee8a3e3 Merge branch 'master' of https://github.com/wagesj45/butterflow-ui 2019-08-17 01:05:46 -05:00
Jordan Wages e67997ddfb
Update README.md 2019-08-17 01:05:23 -05:00
Jordan Wages f912673f5f Updating Compiled Libraries
Updating to the newest version of butterflow.
2019-08-17 00:48:18 -05:00
Jordan Wages 13c4225fde Oktokit attribution
Making sure Oktokit is properly attributed on the About window.
2019-02-21 17:03:26 -06:00
Jordan Wages b5665a0134 Update documentation to make sure its up to date.
Updating documentation to be complete and in sync to the current version.
2019-02-01 18:13:40 -06:00
Jordan Wages 2c8f51a453 Added Force CPU option
Added an option to force CPU usage in case no compatible OpenCL devices were found.
2019-01-06 00:20:29 -06:00
Jordan Wages 2d366141a9 Add non-connection failsafe
Added a try/catch as a failsafe for non-operational networks and any other errors involving using Octokit to check for updates on github. Fixes #3.
2019-01-05 20:39:52 -06:00
Jordan Wages 43c3db77d8 Documentation Update
Updated documentation.
2018-09-12 22:56:20 -05:00
Jordan Wages 8a9009fc0e Comments
Adding comments
2018-09-12 22:35:36 -05:00
715 changed files with 27695 additions and 1460 deletions

77
.github/workflows/codeql-analysis.yml vendored Normal file
View File

@ -0,0 +1,77 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ master ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ master ]
jobs:
analyze:
name: Analyze
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
language: [ 'csharp' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
# Learn more:
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
steps:
- name: Checkout repository
uses: actions/checkout@v2
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
#- name: Autobuild
# uses: github/codeql-action/autobuild@v1
- name: Setup MSBuild Path
uses: microsoft/Setup-MSBuild@v1
#- name: Setup NuGet
# uses: NuGet/setup-nuget@v1.0.4
- name: Restore NuGet Packages
run: nuget restore butterflow-ui/butterflow-ui.sln
- name: Build and Publish Web App
run: msbuild /p:UseSharedCompilation=false butterflow-ui/butterflow-ui.sln
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

View File

@ -30,6 +30,10 @@ A graphical user interface for butterflow.
If you'd like to help contribute to the project, please don't be shy! Translation into your local language would always be appreciated. Translations can be generated automatically, but those automatic translations are prone to error. **butterflow-ui** can always be improved, and if there are missing features that you want, please submit a pull request.
### Butterflow Needs a New Maintainer
[butterflow](https://github.com/dthpham/butterflow) is currently looking for a new primary developer. If you're familiar with Python, C++, and the OpenCV toolkit, consider contributing to the project.
## Download
**butterflow-ui** is conveniently packaged in a Windows installer file (MSI) built with the [WIX toolset](http://wixtoolset.org). The latest installer can be downloaded [here](https://github.com/wagesj45/butterflow-ui/releases/latest). You can also download [old releases](https://github.com/wagesj45/butterflow-ui/releases) as well.
@ -37,3 +41,10 @@ If you'd like to help contribute to the project, please don't be shy! Translatio
## Code Documentation
**butterflow-ui** is [fully documented](https://wagesj45.github.io/butterflow-ui) via [Sandcastle](https://github.com/EWSoftware/SHFB). You can find generated documents to help you contribute to the project in the [documentation section](https://wagesj45.github.io/butterflow-ui).
## Donations
[![Donate with Trans Pay](https://support.jordanwages.com/static/donate-with-transpay-en.png)](https://support.jordanwages.com?project=1)
If you would like to donate to the development of **butterflow-ui**, please direct you donation to my [patron page](https://support.jordanwages.com) (powered by Stripe) or directly via my [PayPal.Me](https://www.paypal.me/wagesj45) page. You can also donate Ethereum [to my wallet](https://etherscan.io/address/0x917f3d67e2a7ec8884d241118ee829af57cc4afd).
![Image](https://t.thebreadsticks.com/matomo.php?idsite=6&amp;rec=1&amp;action_name=README.md)

File diff suppressed because it is too large Load Diff

View File

@ -17,6 +17,10 @@
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<OutputPath>bin\$(Configuration)\</OutputPath>
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
<CompilerAdditionalOptions>
</CompilerAdditionalOptions>
<LinkerAdditionalOptions>
</LinkerAdditionalOptions>
</PropertyGroup>
<ItemGroup>
<Compile Include="Product.wxs" />

View File

@ -13,7 +13,7 @@
<RootNamespace>Documentation</RootNamespace>
<Name>Documentation</Name>
<!-- SHFB properties -->
<FrameworkVersion>.NET Framework 4.7.1</FrameworkVersion>
<FrameworkVersion>.NET Framework 4.7.2</FrameworkVersion>
<OutputPath>docs\</OutputPath>
<HtmlHelpName>Documentation</HtmlHelpName>
<Language>en-US</Language>
@ -37,6 +37,25 @@
</NamespaceSummaries>
<VisibleItems>Attributes, ExplicitInterfaceImplementations, InheritedMembers, Internals, Privates, PrivateFields, Protected, SealedProtected, ProtectedInternalAsProtected, PublicCompilerGenerated, NonBrowsable</VisibleItems>
<WarnOnMissingSourceContext>False</WarnOnMissingSourceContext>
<HtmlSdkLinkType>Msdn</HtmlSdkLinkType>
<BinaryTOC>True</BinaryTOC>
<IncludeFavorites>False</IncludeFavorites>
<WebsiteSdkLinkType>Msdn</WebsiteSdkLinkType>
<WebsiteAdContent>&amp;lt%3bscript type=&amp;quot%3btext/javascript&amp;quot%3b&amp;gt%3b
var _paq = window._paq = window._paq || []%3b
/%2a tracker methods like &amp;quot%3bsetCustomDimension&amp;quot%3b should be called before &amp;quot%3btrackPageView&amp;quot%3b %2a/
_paq.push%28[&amp;#39%3btrackPageView&amp;#39%3b]%29%3b
_paq.push%28[&amp;#39%3benableLinkTracking&amp;#39%3b]%29%3b
%28function%28%29 {
var u=&amp;quot%3b//t.thebreadsticks.com/&amp;quot%3b%3b
_paq.push%28[&amp;#39%3bsetTrackerUrl&amp;#39%3b, u+&amp;#39%3bjs/&amp;#39%3b]%29%3b
_paq.push%28[&amp;#39%3bsetSiteId&amp;#39%3b, &amp;#39%3b6&amp;#39%3b]%29%3b
var d=document, g=d.createElement%28&amp;#39%3bscript&amp;#39%3b%29, s=d.getElementsByTagName%28&amp;#39%3bscript&amp;#39%3b%29[0]%3b
g.type=&amp;#39%3btext/javascript&amp;#39%3b%3b g.async=true%3b g.src=u+&amp;#39%3bjs/&amp;#39%3b%3b s.parentNode.insertBefore%28g,s%29%3b
}%29%28%29%3b
&amp;lt%3b/script&amp;gt%3b</WebsiteAdContent>
<AppendMarkdownFileExtensionsToUrls>False</AppendMarkdownFileExtensionsToUrls>
<SaveComponentCacheCapacity>100</SaveComponentCacheCapacity>
</PropertyGroup>
<!-- There are no properties for these groups. AnyCPU needs to appear in order for Visual Studio to perform
the build. The others are optional common platform types that may appear. -->

View File

@ -17,7 +17,7 @@
</StackPanel>
<WrapPanel HorizontalAlignment="Center">
<TextBlock Text="{x:Static loc:Localization.VersionLabel}" />
<TextBlock Text=" - "/>
<TextBlock Text=" - " />
<TextBlock Name="txtVersion" Text="0.0.0.0" />
</WrapPanel>
<TextBlock Text="{x:Static loc:Localization.AboutWindowDescription}" TextAlignment="Center" />
@ -34,31 +34,38 @@
<Label Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" Content="{x:Static loc:Localization.DevelopersLabel}" />
<StackPanel Grid.Row="0" Grid.Column="1" VerticalAlignment="Center">
<TextBlock HorizontalAlignment="Center">
<Hyperlink NavigateUri="https://github.com/wagesj45" RequestNavigate="Hyperlink_RequestNavigate">Jordan Wages</Hyperlink>
<Hyperlink NavigateUri="https://github.com/wagesj45" RequestNavigate="Hyperlink_RequestNavigate">Jordan Wages</Hyperlink>
|
<Hyperlink NavigateUri="https://www.paypal.me/wagesj45" RequestNavigate="Hyperlink_RequestNavigate"><TextBlock Text="{x:Static loc:Localization.DonateLabel}" /></Hyperlink>
</TextBlock>
</StackPanel>
<Label Grid.Row="1" Grid.Column="0" VerticalAlignment="Center" Content="{x:Static loc:Localization.OpenSourceCreditsLabel}" />
<StackPanel Grid.Row="1" Grid.Column="1" VerticalAlignment="Center">
<TextBlock HorizontalAlignment="Center">
butterflow
butterflow
| <Hyperlink NavigateUri="https://github.com/dthpham/butterflow" RequestNavigate="Hyperlink_RequestNavigate"><TextBlock Text="{x:Static loc:Localization.AboutWindowGithubLinkLabel}" /></Hyperlink>
| <Hyperlink NavigateUri="https://github.com/dthpham/butterflow/blob/master/LICENSE" RequestNavigate="Hyperlink_RequestNavigate"><TextBlock Text="{x:Static loc:Localization.AboutWindowLicenseLinkLabel}" /></Hyperlink>
</TextBlock>
<TextBlock HorizontalAlignment="Center">
cs-mic
cs-mic
| <Hyperlink NavigateUri="https://github.com/wagesj45/cs-mic" RequestNavigate="Hyperlink_RequestNavigate"><TextBlock Text="{x:Static loc:Localization.AboutWindowGithubLinkLabel}" /></Hyperlink>
| <Hyperlink NavigateUri="https://github.com/wagesj45/cs-mic/blob/master/LICENSE" RequestNavigate="Hyperlink_RequestNavigate"><TextBlock Text="{x:Static loc:Localization.AboutWindowLicenseLinkLabel}" /></Hyperlink>
</TextBlock>
<TextBlock HorizontalAlignment="Center">
Gu.Wpf.Media
Gu.Wpf.Media
| <Hyperlink NavigateUri="https://github.com/JohanLarsson/Gu.Wpf.Media" RequestNavigate="Hyperlink_RequestNavigate"><TextBlock Text="{x:Static loc:Localization.AboutWindowGithubLinkLabel}" /></Hyperlink>
| <Hyperlink NavigateUri="https://github.com/JohanLarsson/Gu.Wpf.Media/blob/master/LICENSE.md" RequestNavigate="Hyperlink_RequestNavigate"><TextBlock Text="{x:Static loc:Localization.AboutWindowLicenseLinkLabel}" /></Hyperlink>
</TextBlock>
<TextBlock HorizontalAlignment="Center">
Octokit
| <Hyperlink NavigateUri="https://github.com/octokit/octokit.net" RequestNavigate="Hyperlink_RequestNavigate"><TextBlock Text="{x:Static loc:Localization.AboutWindowGithubLinkLabel}" /></Hyperlink>
| <Hyperlink NavigateUri="https://github.com/octokit/octokit.net/blob/master/LICENSE.txt" RequestNavigate="Hyperlink_RequestNavigate"><TextBlock Text="{x:Static loc:Localization.AboutWindowLicenseLinkLabel}" /></Hyperlink>
</TextBlock>
</StackPanel>
</Grid>
<Separator Margin="0,10" />
<TextBlock Text="{x:Static butterflow_ui:OctokitWrapper.CurrentVersionStatusDescription}" TextAlignment="Center" Margin="0,10" />
<Button Name="btnOK" MaxWidth="50" Content="{x:Static loc:Localization.OKLabel}" Click="btnOK_Click"/>
<Button Name="btnOK" MaxWidth="50" Content="{x:Static loc:Localization.OKLabel}" Click="btnOK_Click" />
</StackPanel>
</DockPanel>
</Window>
</Window>

View File

@ -16,6 +16,9 @@
<setting name="Device" serializeAs="String">
<value>0</value>
</setting>
<setting name="UseDefaultDevice" serializeAs="String">
<value>True</value>
</setting>
</butterflow_ui.Properties.Settings>
</userSettings>
</configuration>

View File

@ -97,7 +97,7 @@ namespace butterflow_ui
/// <summary> Gets or sets the list of devices available for butterflow processing. </summary>
/// <value> The devices available for butterflow processing. </value>
public Dictionary<int, string> Devices { get; private set; } = new Dictionary<int, string>();
public Dictionary<int, string> Devices { get; private set; } = new Dictionary<int, string>() { { 0, Localization.Localization.ForceCPU } };
#endregion
@ -237,6 +237,7 @@ namespace butterflow_ui
OnParsedConsoleOutputRecieved(ButterflowOutputType.Progress, progress, consoleOutput);
}
// An alternate test for progression on a rendering video
regex = new Regex(REGEX_PROGRESS_ALT);
foreach (Match match in regex.Matches(consoleOutput))
{
@ -248,13 +249,15 @@ namespace butterflow_ui
OnParsedConsoleOutputRecieved(ButterflowOutputType.Progress, progress, consoleOutput);
}
// Test for device declaration
regex = new Regex(REGEX_DEVICE);
foreach (Match match in regex.Matches(consoleOutput))
{
var deviceID = match.Groups["DeviceID"].Value;
var deviceName = match.Groups["DeviceName"].Value.Trim();
this.interpreter.Interpret(deviceID);
//Add 1 to the index count. This accounts for the 0 index of the "Force CPU" option in the options window.
this.interpreter.Interpret(string.Concat(deviceID,"+1"));
if (!this.Devices.ContainsKey(this.interpreter.Int))
{

View File

@ -312,6 +312,15 @@ namespace butterflow_ui.Localization {
}
}
/// <summary>
/// Looks up a localized string similar to donate.
/// </summary>
public static string DonateLabel {
get {
return ResourceManager.GetString("DonateLabel", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to _Edit.
/// </summary>
@ -402,6 +411,15 @@ namespace butterflow_ui.Localization {
}
}
/// <summary>
/// Looks up a localized string similar to Force CPU.
/// </summary>
public static string ForceCPU {
get {
return ResourceManager.GetString("ForceCPU", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Height.
/// </summary>
@ -852,6 +870,15 @@ namespace butterflow_ui.Localization {
}
}
/// <summary>
/// Looks up a localized string similar to Use Default Compute Device.
/// </summary>
public static string UseDefaultDeviceLabel {
get {
return ResourceManager.GetString("UseDefaultDeviceLabel", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Version.
/// </summary>

View File

@ -393,4 +393,7 @@
<data name="DeviceLabel" xml:space="preserve">
<value>جهاز الحوسبة</value>
</data>
<data name="ForceCPU" xml:space="preserve">
<value>قوة وحدة المعالجة المركزية</value>
</data>
</root>

View File

@ -187,7 +187,7 @@
<value>Resolución de salida</value>
</data>
<data name="SkipBackTooltip" xml:space="preserve">
<value>Salte hacia atrás en el video.</value>
<value>Salta hacia atrás en el video.</value>
</data>
<data name="SkipForwardTooltip" xml:space="preserve">
<value>Salta hacia adelante en el video.</value>
@ -286,7 +286,7 @@
<value>Proceso</value>
</data>
<data name="ProcessTooltip" xml:space="preserve">
<value>Procesar el video Este puede ser un proceso largo.</value>
<value>Procesar el video. Esto puede resultar en un proceso largo.</value>
</data>
<data name="PyramidScaleLabel" xml:space="preserve">
<value>Factor de escala de pirámide</value>
@ -325,7 +325,7 @@
<value>github</value>
</data>
<data name="AboutWindowLicenseLinkLabel" xml:space="preserve">
<value>licencia</value>
<value>Licencia</value>
</data>
<data name="AboutWindowTitle" xml:space="preserve">
<value>Acerca de butterflow-ui</value>
@ -349,13 +349,13 @@
<value>Opciones de aplicación ...</value>
</data>
<data name="OptionsWindowLanguageChangeNotice" xml:space="preserve">
<value>Nota: Cambiar el idioma del usuario requerirá un reinicio del programa.</value>
<value>Nota: Cambiar el idioma del usuario requerirá reiniciar el programa.</value>
</data>
<data name="OptionsWindowTitle" xml:space="preserve">
<value>Opciones</value>
</data>
<data name="SaveLabel" xml:space="preserve">
<value>Salvar</value>
<value>Guardar</value>
</data>
<data name="VersionLabel" xml:space="preserve">
<value>Versión</value>
@ -373,7 +373,7 @@
<value>Tipos de archivos admitidos</value>
</data>
<data name="BehindVersionStatusDescription" xml:space="preserve">
<value>La versión actual está detrás del repositorio de Github y debe actualizarse.</value>
<value>La versión actual está desactualizada respecto del repositorio de Github y debe actualizarse.</value>
</data>
<data name="CurrentVersionStatusDescription" xml:space="preserve">
<value>La versión actual está actualizada con el repositorio github.</value>
@ -393,4 +393,7 @@
<data name="DeviceLabel" xml:space="preserve">
<value>Dispositivo de computación</value>
</data>
</root>
<data name="ForceCPU" xml:space="preserve">
<value>Unidad de procesamiento central de fuerza</value>
</data>
</root>

View File

@ -393,4 +393,7 @@
<data name="DeviceLabel" xml:space="preserve">
<value>コンピューティングデバイス</value>
</data>
<data name="ForceCPU" xml:space="preserve">
<value>中央処理装置を強制する</value>
</data>
</root>

View File

@ -393,4 +393,13 @@
<data name="DeviceLabel" xml:space="preserve">
<value>Computing Device</value>
</data>
<data name="ForceCPU" xml:space="preserve">
<value>Force CPU</value>
</data>
<data name="UseDefaultDeviceLabel" xml:space="preserve">
<value>Use Default Compute Device</value>
</data>
<data name="DonateLabel" xml:space="preserve">
<value>donate</value>
</data>
</root>

View File

@ -393,4 +393,7 @@
<data name="DeviceLabel" xml:space="preserve">
<value>Вычислительное устройство</value>
</data>
<data name="ForceCPU" xml:space="preserve">
<value>Force CPU</value>
</data>
</root>

View File

@ -393,4 +393,7 @@
<data name="DeviceLabel" xml:space="preserve">
<value>计算设备</value>
</data>
<data name="ForceCPU" xml:space="preserve">
<value>部队中央处理股</value>
</data>
</root>

View File

@ -15,13 +15,13 @@
<ObjectDataProvider x:Key="enumRegionTypeDataProvider" MethodName="GetValues"
ObjectType="{x:Type System:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="butterflow_ui:RegionType"/>
<x:Type TypeName="butterflow_ui:RegionType" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<ObjectDataProvider x:Key="enumFlowFilterTypeDataProvider" MethodName="GetValues"
ObjectType="{x:Type System:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="butterflow_ui:FlowFilterType"/>
<x:Type TypeName="butterflow_ui:FlowFilterType" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<butterflow_ui:InverseBoolConverter x:Key="InverseBoolConverter" />
@ -56,7 +56,7 @@
</MenuItem>
</MenuItem>
<MenuItem Header="{x:Static loc:Localization.HelpMenu}">
<MenuItem Name="menuButterflowGithub" Header="{x:Static loc:Localization.AboutButterflowMenu}" Click="menuButterflowGithub_Click" >
<MenuItem Name="menuButterflowGithub" Header="{x:Static loc:Localization.AboutButterflowMenu}" Click="menuButterflowGithub_Click">
<MenuItem.Icon>
<ContentControl Template="{StaticResource LinkIcon}" />
</MenuItem.Icon>
@ -83,7 +83,7 @@
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*" />
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="0.5*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
@ -95,8 +95,8 @@
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Content="{x:Static loc:Localization.FileLabel}"/>
<TextBox Name="txtFileName" Grid.Column="1" IsReadOnly="True"/>
<Label Grid.Column="0" Content="{x:Static loc:Localization.FileLabel}" />
<TextBox Name="txtFileName" Grid.Column="1" IsReadOnly="True" />
<Button Grid.Column="2" MinWidth="25" Name="btnFilePicker" Click="btnFilePicker_Click">...</Button>
</Grid>
</GroupBox>
@ -107,8 +107,8 @@
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Content="{x:Static loc:Localization.FileLabel}"/>
<TextBox Name="txtFileOutputName" Grid.Column="1" IsReadOnly="True" Text="{Binding OptionsConfiguration.VideoOutput, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=PropertyChanged}"/>
<Label Grid.Column="0" Content="{x:Static loc:Localization.FileLabel}" />
<TextBox Name="txtFileOutputName" Grid.Column="1" IsReadOnly="True" Text="{Binding OptionsConfiguration.VideoOutput, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=PropertyChanged}" />
<Button Grid.Column="2" MinWidth="25" Name="btnFileOutputPicker" Click="btnFileOutputPicker_Click">...</Button>
</Grid>
</GroupBox>
@ -134,7 +134,7 @@
<GroupBox Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Header="{x:Static loc:Localization.CommonOptionsGroupBox}">
<ScrollViewer>
<StackPanel>
<butterflow_ui:ButterflowOption LabelValue="{x:Static loc:Localization.PlaybackRateLabel}" >
<butterflow_ui:ButterflowOption LabelValue="{x:Static loc:Localization.PlaybackRateLabel}">
<StackPanel Orientation="Vertical">
<butterflow_ui:ButterflowOption LabelValue="">
<RadioButton GroupName="PlaybackRate" Checked="PlaybackRateRadioButton_Checked" Content="{x:Static loc:Localization._2xLabel}" Tag="2x" />
@ -146,7 +146,7 @@
<RadioButton GroupName="PlaybackRate" Checked="PlaybackRateRadioButton_Checked" Content="{x:Static loc:Localization._4xLabel}" Tag="4x" />
</butterflow_ui:ButterflowOption>
<butterflow_ui:ButterflowOption LabelValue="">
<RadioButton GroupName="PlaybackRate" Checked="PlaybackRateRadioButton_Checked" Content="{x:Static loc:Localization._24fpsLabel}" Tag="24"/>
<RadioButton GroupName="PlaybackRate" Checked="PlaybackRateRadioButton_Checked" Content="{x:Static loc:Localization._24fpsLabel}" Tag="24" />
</butterflow_ui:ButterflowOption>
<butterflow_ui:ButterflowOption LabelValue="">
<RadioButton GroupName="PlaybackRate" Checked="PlaybackRateRadioButton_Checked" Content="{x:Static loc:Localization._30fpsLabel}" Tag="30" />
@ -158,7 +158,7 @@
<RadioButton GroupName="PlaybackRate" Checked="PlaybackRateRadioButton_Checked" Content="{x:Static loc:Localization._120fpsLabel}" Tag="120" />
</butterflow_ui:ButterflowOption>
<butterflow_ui:ButterflowOption LabelValue="{x:Static loc:Localization.CustomPlaybackRateLabel}" DescriptionValue="{x:Static loc:Localization.PlaybackRateDescription}">
<TextBox Name="txtPlaybackRate" Text="{Binding OptionsConfiguration.PlaybackRate, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=PropertyChanged}" GotFocus="txtPlaybackRate_GotFocus" />
<TextBox Name="txtPlaybackRate" Text="{Binding OptionsConfiguration.PlaybackRate, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=PropertyChanged}" GotFocus="txtPlaybackRate_GotFocus" />
</butterflow_ui:ButterflowOption>
</StackPanel>
</butterflow_ui:ButterflowOption>
@ -203,7 +203,6 @@
</ToggleButton.Style>
</ToggleButton>
<Button BorderThickness="0" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" Click="bntVideoStop_Click">
</Button>
<butterflow_ui:ButterflowOption Grid.Column="2" LabelValue="{x:Static loc:Localization.HeightLabel}">
<TextBox Text="{Binding OptionsConfiguration.Height, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=LostFocus}" IsReadOnly="{Binding OptionsConfiguration.LockAspectRatio, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=PropertyChanged}">
@ -233,10 +232,10 @@
<DataTemplate>
<DockPanel MaxHeight="24">
<TextBlock VerticalAlignment="Center" Text="{x:Static loc:Localization.StartLabel}" />
<TextBlock VerticalAlignment="Center" Text="{Binding Start, Converter={x:Static gu:TimeSpanToStringConverter.Default}}" ToolTip="{Binding Start}"/>
<TextBlock VerticalAlignment="Center" Text="{Binding Start, Converter={x:Static gu:TimeSpanToStringConverter.Default}}" ToolTip="{Binding Start}" />
<TextBlock VerticalAlignment="Center" Text="{x:Static loc:Localization.EndLabel}" />
<TextBlock VerticalAlignment="Center" Text="{Binding End, Converter={x:Static gu:TimeSpanToStringConverter.Default}}" ToolTip="{Binding End}"/>
<ComboBox VerticalAlignment="Center" ItemsSource="{Binding Source={StaticResource enumRegionTypeDataProvider}}" SelectedItem="{Binding SubregionType, Mode=TwoWay}"/>
<TextBlock VerticalAlignment="Center" Text="{Binding End, Converter={x:Static gu:TimeSpanToStringConverter.Default}}" ToolTip="{Binding End}" />
<ComboBox VerticalAlignment="Center" ItemsSource="{Binding Source={StaticResource enumRegionTypeDataProvider}}" SelectedItem="{Binding SubregionType, Mode=TwoWay}" />
<TextBox VerticalAlignment="Center" MinWidth="35" Text="{Binding Value, Mode=TwoWay}" />
<TextBlock VerticalAlignment="Center" Text="{x:Static loc:Localization.ToEndLabel}" />
<CheckBox VerticalAlignment="Center" IsChecked="{Binding ToEnd, Mode=TwoWay}" />
@ -276,7 +275,7 @@
<TextBox Text="{Binding OptionsConfiguration.SmoothDerivativeStandardDeviation, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=LostFocus}" />
</butterflow_ui:ButterflowOption>
<butterflow_ui:ButterflowOption LabelValue="{x:Static loc:Localization.FlowFilterLabel}" DescriptionValue="{x:Static loc:Localization.FlowFilterTooltip}">
<ComboBox ItemsSource="{Binding Source={StaticResource enumFlowFilterTypeDataProvider}}" SelectedItem="{Binding OptionsConfiguration.FlowFilterType, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=PropertyChanged}"/>
<ComboBox ItemsSource="{Binding Source={StaticResource enumFlowFilterTypeDataProvider}}" SelectedItem="{Binding OptionsConfiguration.FlowFilterType, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=PropertyChanged}" />
</butterflow_ui:ButterflowOption>
</StackPanel>
</ScrollViewer>
@ -312,7 +311,7 @@
<Canvas x:Name="canvas" Grid.Row="1" Grid.RowSpan="3" Visibility="{Binding OptionsConfiguration.MultipleFiles, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource BoolVisibilityConverter}}">
<TextBlock TextAlignment="Center" VerticalAlignment="Center" Width="{Binding ActualWidth, ElementName=canvas}" Height="{Binding ActualHeight, ElementName=canvas}" TextWrapping="WrapWithOverflow" Text="{x:Static loc:Localization.MultipleFilesPreviewWarningLabel}" />
</Canvas>
<gu:MediaElementWrapper Grid.Row="1" Name="mediaPreview" Stretch="Uniform" ScrubbingEnabled="True" MediaOpened="mediaPreview_MediaOpened" MediaEnded="mediaPreview_MediaEnded" Visibility="{Binding OptionsConfiguration.MultipleFiles, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource InverseBoolVisibilityConverter}}" />
<gu:MediaElementWrapper Grid.Row="1" Name="mediaPreview" Stretch="Uniform" ScrubbingEnabled="True" MediaEnded="mediaPreview_MediaEnded" Visibility="{Binding OptionsConfiguration.MultipleFiles, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource InverseBoolVisibilityConverter}}" />
<Grid Grid.Row="2" Visibility="{Binding OptionsConfiguration.MultipleFiles, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource InverseBoolVisibilityConverter}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
@ -320,8 +319,8 @@
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Content="{Binding ElementName=mediaPreview, Path=Position, Converter={x:Static gu:TimeSpanToStringConverter.Default}}" />
<Slider Grid.Column="1" Name="sliderMedia"
Value="{Binding ElementName=mediaPreview, Path=Position, Converter={x:Static gu:NullableTimeSpanToSecondsConverter.Default}}"
<Slider Grid.Column="1" Name="sliderMedia"
Value="{Binding ElementName=mediaPreview, Path=Position, Converter={x:Static gu:NullableTimeSpanToSecondsConverter.Default}}"
Maximum="{Binding Path=Length, ElementName=mediaPreview, Converter={x:Static gu:NullableTimeSpanToSecondsConverter.Default}}" />
<Label Grid.Column="2" Content="{Binding Path=Length, ElementName=mediaPreview, Converter={x:Static gu:TimeSpanToStringConverter.Default}}" />
</Grid>
@ -360,9 +359,9 @@
</Button>
</StatusBarItem>
<StatusBarItem Grid.Column="1">
<TextBlock Text="{Binding OptionsConfiguration.CommandLineOutput, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}}"/>
<TextBlock Text="{Binding OptionsConfiguration.CommandLineOutput, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}}" />
</StatusBarItem>
</StatusBar>
</Grid>
</DockPanel>
</Window>
</Window>

View File

@ -53,17 +53,18 @@ namespace butterflow_ui
InitializeComponent();
// Check for updates.
if (OctokitWrapper.CurrentVersionStatus == OctokitWrapper.VersionStatus.behind)
if (OctokitWrapper.CurrentVersionStatus == OctokitWrapper.VersionStatus.Behind)
{
var updateMessageBoxResult = MessageBox.Show(string.Format("{0} {1}", Localization.Localization.BehindVersionStatusDescription, Localization.Localization.BehindVersionQuestion), Localization.Localization.UpdateAvailableLabel, MessageBoxButton.YesNo, MessageBoxImage.Information);
// If the user wants to update now, take them to the latest release on github and close this window.
if(updateMessageBoxResult == MessageBoxResult.Yes)
if (updateMessageBoxResult == MessageBoxResult.Yes)
{
Process.Start("https://github.com/wagesj45/butterflow-ui/releases/latest");
this.Close();
}
}
}
#region Methods
@ -113,8 +114,8 @@ namespace butterflow_ui
this.OptionsConfiguration.Height = e.Value;
break;
case ButterflowWrapper.ButterflowOutputType.Progress:
// This case doesn't need to be considered since we're binding the progress bar's value to a property on the butterflow wrapper.
// We may use this in the future, though.
// This case doesn't need to be considered since we're binding the progress bar's value to a property on the butterflow wrapper.
// We may use this in the future, though.
default:
break;
}
@ -257,15 +258,6 @@ namespace butterflow_ui
}
}
/// <summary> Event handler. Called by mediaPreview for media opened events. </summary>
/// <param name="sender"> Source of the event. </param>
/// <param name="e"> Routed event information. </param>
private void mediaPreview_MediaOpened(object sender, RoutedEventArgs e)
{
//this.OptionsConfiguration.Width = this.mediaPreview.NaturalVideoWidth.ToString();
//this.OptionsConfiguration.Height = this.mediaPreview.NaturalVideoHeight.ToString();
}
/// <summary> Event handler. Called by mediaPreview for media ended events. </summary>
/// <param name="sender"> Source of the event. </param>
/// <param name="e"> Routed event information. </param>
@ -357,7 +349,7 @@ namespace butterflow_ui
{
var button = sender as Button;
if(button != null)
if (button != null)
{
if (button.Tag.GetType() == typeof(Guid))
{
@ -385,7 +377,7 @@ namespace butterflow_ui
{
var binaryFormatter = new BinaryFormatter();
var file = binaryFormatter.Deserialize(ofd.OpenFile());
if(file is OptionsConfigurationFile)
if (file is OptionsConfigurationFile)
{
this.OptionsConfiguration.LoadFile((OptionsConfigurationFile)file);
}
@ -441,7 +433,11 @@ namespace butterflow_ui
{
var optionsWindow = new OptionsWindow();
optionsWindow.Show();
optionsWindow.ShowDialog();
//Force an update on the command line arguments in case the user changed something in the
//Options window that necessitates it, such as the compute device.
this.OptionsConfiguration.ForceUpdate();
}
#endregion

View File

@ -22,7 +22,7 @@ namespace butterflow_ui
private const string REGEX_VERSION = @"(?<Major>\d+ ?)\.(?<Minor>\d+ ?)\.(?<Patch>\d+ ?)";
/// <summary> The version status of the current installation. </summary>
private static VersionStatus versionStatus = VersionStatus.unknown;
private static VersionStatus versionStatus = VersionStatus.Unknown;
#endregion
@ -46,13 +46,13 @@ namespace butterflow_ui
{
switch (CurrentVersionStatus)
{
case VersionStatus.current:
case VersionStatus.Current:
return Localization.Localization.CurrentVersionStatusDescription;
case VersionStatus.behind:
case VersionStatus.Behind:
return Localization.Localization.BehindVersionStatusDescription;
case VersionStatus.custom:
case VersionStatus.Custom:
return Localization.Localization.CustomVersionStatusDescription;
case VersionStatus.unknown:
case VersionStatus.Unknown:
default:
return Localization.Localization.UnknownVersionStatusDescription;
}
@ -77,44 +77,53 @@ namespace butterflow_ui
/// <returns> The current version status. </returns>
private static VersionStatus GetVersionStatus()
{
var interpreter = new InputInterpreter();
var client = new GitHubClient(new ProductHeaderValue("butterflow-ui"));
var releases = client.Repository.Release.GetAll("wagesj45", "butterflow-ui").Result;
if (releases.Any())
try
{
var latest = releases.First();
decimal latestMajor = 0, latestMinor = 0, latestPatch = 0, currentMajor = 0, currentMinor = 0, currentPatch = 0;
var interpreter = new InputInterpreter();
var client = new GitHubClient(new ProductHeaderValue("butterflow-ui"));
var releases = client.Repository.Release.GetAll("wagesj45", "butterflow-ui").Result;
var regex = new Regex(REGEX_VERSION);
foreach (Match match in regex.Matches(latest.TagName))
if (releases.Any())
{
latestMajor = interpreter.ComputeExpression(match.Groups["Major"].Value);
latestMinor = interpreter.ComputeExpression(match.Groups["Minor"].Value);
latestPatch = interpreter.ComputeExpression(match.Groups["Patch"].Value);
}
var latest = releases.First();
decimal latestMajor = 0, latestMinor = 0, latestPatch = 0, currentMajor = 0, currentMinor = 0, currentPatch = 0;
foreach (Match match in regex.Matches(Assembly.GetExecutingAssembly().GetName().Version.ToString()))
{
currentMajor = interpreter.ComputeExpression(match.Groups["Major"].Value);
currentMinor = interpreter.ComputeExpression(match.Groups["Minor"].Value);
currentPatch = interpreter.ComputeExpression(match.Groups["Patch"].Value);
}
var regex = new Regex(REGEX_VERSION);
foreach (Match match in regex.Matches(latest.TagName))
{
latestMajor = interpreter.ComputeExpression(match.Groups["Major"].Value);
latestMinor = interpreter.ComputeExpression(match.Groups["Minor"].Value);
latestPatch = interpreter.ComputeExpression(match.Groups["Patch"].Value);
}
if (latestMajor == currentMajor && latestMinor == currentMinor && latestPatch == currentPatch)
{
return VersionStatus.current;
}
foreach (Match match in regex.Matches(Assembly.GetExecutingAssembly().GetName().Version.ToString()))
{
currentMajor = interpreter.ComputeExpression(match.Groups["Major"].Value);
currentMinor = interpreter.ComputeExpression(match.Groups["Minor"].Value);
currentPatch = interpreter.ComputeExpression(match.Groups["Patch"].Value);
}
if (latestMajor >= currentMajor && latestMinor >= currentMinor && latestPatch >= currentPatch)
{
return VersionStatus.behind;
}
if (latestMajor == currentMajor && latestMinor == currentMinor && latestPatch == currentPatch)
{
return VersionStatus.Current;
}
return VersionStatus.custom;
if (latestMajor >= currentMajor && latestMinor >= currentMinor && latestPatch >= currentPatch)
{
return VersionStatus.Behind;
}
return VersionStatus.Custom;
}
}
catch(Exception e)
{
//There was an issue connecting to Github. This could be caused by a missing network connection.
//We can safely ignore an error in this process and proceed, falling through to the default connection
//value of Unknown.
}
return VersionStatus.unknown;
return VersionStatus.Unknown;
}
#endregion
@ -125,13 +134,13 @@ namespace butterflow_ui
public enum VersionStatus
{
/// <summary> The current version is up to date with the github repository. </summary>
current,
Current,
/// <summary> The current version is behind the github repository and should be updated. </summary>
behind,
Behind,
/// <summary> The current version is ahead of the github repository, or is a custom version of butterflow-ui that cannot be compared to the github repository. </summary>
custom,
Custom,
/// <summary> Github failed to respond with the current version. This could be because of rate limits or a network failure. </summary>
unknown
Unknown
}
#endregion

View File

@ -11,7 +11,6 @@ using csmic;
namespace butterflow_ui
{
/// <summary> The butterflow options configuration. Contians all the options necessary to run butterflow and process a video. </summary>
public class OptionsConfiguration : PropertyChangedAlerter
{
@ -19,67 +18,93 @@ namespace butterflow_ui
/// <summary> The default pyramid scale setting. </summary>
private const decimal DEFAULT_PYRAMID_SCALE = 0.5m;
/// <summary> The default levels setting. </summary>
private const int DEFAULT_LEVELS = 3;
/// <summary> The default window size setting. </summary>
private const int DEFAULT_WINDOW_SIZE = 25;
/// <summary> The default iterations setting. </summary>
private const int DEFAULT_ITERATIONS = 3;
/// <summary> The default pixel neighborhood setting. </summary>
private const int DEFAULT_PIXEL_NEIGHBORHOOD = 5;
/// <summary> The default smooth derivative standard deviation setting. </summary>
private const decimal DEFAULT_SMOOTH_DERIVATIVE_STANDARD_DEVIATION = 1.1m;
/// <summary> The default flow filter type setting. </summary>
private const FlowFilterType DEFAULT_FLOW_FILTER_TYPE = FlowFilterType.box;
/// <summary> The output file format when operating on more than one video. </summary>
private const string OUTPUT_FILE_FORMAT = "{0}_{1}";
/// <summary> An input interpreter used for converting string values to numeric values. </summary>
[NonSerialized]
private InputInterpreter interpreter = new InputInterpreter();
/// <summary> The aspect ratio used for calculating heights when the aspect ratio is locked. </summary>
private decimal aspectRatio = 0;
/// <summary> The playback rate. </summary>
private string playbackRate;
/// <summary> A value indicating whether or not to keep the original audio in the final video. </summary>
private bool keepAudio;
/// <summary> The width of the output video. </summary>
private int width;
/// <summary> The height of the output video. </summary>
private int height;
/// <summary> A value indicating whether or not to render unspecified subregions. </summary>
private bool keepSubregions;
/// <summary> A value indicating whether or not to render the final video with lossless quality. </summary>
private bool losslessQuality;
/// <summary> A value indicating whether or not to tune processing for smooth motion. </summary>
private bool smoothMotion;
/// <summary> A value indicating whether or not to lock the aspect ratio to the <seealso cref="width"/> of the video. </summary>
private bool lockAspectRatio;
/// <summary> The video input files. </summary>
private IEnumerable<string> videoInput;
/// <summary> The video output file. </summary>
private string videoOutput;
/// <summary> A value indicating whether or not to use fast pyramids when processing a video. </summary>
private bool fastPyramid;
/// <summary> The pyramid scale setting. </summary>
private decimal pyramidScale;
/// <summary> The level size setting. </summary>
private int levels;
/// <summary> Size of the windowing average. </summary>
private int windowSize;
/// <summary> The number of iterations per pyramid level. </summary>
private int iterations;
/// <summary> The size of pixel neighborhood. </summary>
private int pixelNeighborhood;
/// <summary> The standard deviation of smooth derivatives </summary>
private decimal smoothDerivativeStandardDeviation;
/// <summary> Type of the flow filter to use for processing. </summary>
private FlowFilterType flowFilterType = FlowFilterType.box;
/// <summary> The subregions of the video on which to process. </summary>
private ObservableCollection<ButterflowSubregion> subregions = new ObservableCollection<ButterflowSubregion>();
#endregion
#endregion Members
#region Properties
@ -158,7 +183,7 @@ namespace butterflow_ui
}
set
{
if (value && this.width != 0 && this.height != 0)
if(value && this.width != 0 && this.height != 0)
{
this.aspectRatio = Convert.ToDecimal(this.height) / Convert.ToDecimal(this.width);
}
@ -185,7 +210,7 @@ namespace butterflow_ui
OnPropertyChanged();
if (this.lockAspectRatio)
if(this.lockAspectRatio)
{
interpreter.Interpret(string.Format("{0} * {1}", this.aspectRatio, this.width));
this.height = interpreter.Int;
@ -364,7 +389,7 @@ namespace butterflow_ui
{
interpreter.Interpret(value);
if (interpreter.Int >= 5 && interpreter.Int <= 7)
if(interpreter.Int >= 5 && interpreter.Int <= 7)
{
this.pixelNeighborhood = interpreter.Int;
}
@ -419,7 +444,7 @@ namespace butterflow_ui
}
}
#endregion
#endregion Properties
#region Contructors
@ -445,16 +470,16 @@ namespace butterflow_ui
/// <param name="e"> Notify collection changed event information. </param>
private void Subregions_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null)
if(e.NewItems != null)
{
foreach (ButterflowSubregion newItem in e.NewItems)
foreach(ButterflowSubregion newItem in e.NewItems)
{
newItem.PropertyChanged += SubregionPropertyChanged;
}
}
if (e.OldItems != null)
if(e.OldItems != null)
{
foreach (ButterflowSubregion oldItem in e.OldItems)
foreach(ButterflowSubregion oldItem in e.OldItems)
{
oldItem.PropertyChanged -= SubregionPropertyChanged;
}
@ -463,15 +488,24 @@ namespace butterflow_ui
OnPropertyChanged("CommandLineOutput");
}
#endregion
#endregion Contructors
#region Methods
/// <summary> Subregion property changed. </summary>
/// <param name="sender"> Source of the event. </param>
/// <param name="e"> Property changed event information. </param>
private void SubregionPropertyChanged(object sender, PropertyChangedEventArgs e)
{
OnPropertyChanged("CommandLineOutput");
}
/// <summary> Force the object's properties to report as updated. </summary>
public void ForceUpdate()
{
OnPropertyChanged();
}
/// <summary> Converts this object to a <seealso cref="OptionsConfigurationFile"/>. </summary>
/// <returns> This object as an OptionsConfigurationFile. </returns>
public OptionsConfigurationFile ToFile()
@ -523,7 +557,7 @@ namespace butterflow_ui
{
var stringBuilder = new StringBuilder("-v "); // Verbose
if (this.LockAspectRatio)
if(this.LockAspectRatio)
{
stringBuilder.AppendFormat("-vs {0}:-1 ", this.Width);
}
@ -532,33 +566,40 @@ namespace butterflow_ui
stringBuilder.AppendFormat("-vs {0}:{1} ", this.Width, this.Height);
}
if(Settings.Default.Device != 0)
if(!Settings.Default.UseDefaultDevice)
{
stringBuilder.AppendFormat("-device {0} ", Settings.Default.Device);
if(Settings.Default.Device == 0)
{
stringBuilder.Append("-sw ");
}
if(Settings.Default.Device > 0)
{
stringBuilder.AppendFormat("-device {0} ", Settings.Default.Device - 1);
}
}
if (!string.IsNullOrWhiteSpace(this.PlaybackRate)) stringBuilder.AppendFormat("-r {0} ", this.PlaybackRate);
if (this.KeepAudio) stringBuilder.Append("-audio ");
if (this.LosslessQuality) stringBuilder.Append("-l ");
if(!string.IsNullOrWhiteSpace(this.PlaybackRate)) stringBuilder.AppendFormat("-r {0} ", this.PlaybackRate);
if(this.KeepAudio) stringBuilder.Append("-audio ");
if(this.LosslessQuality) stringBuilder.Append("-l ");
if (this.Subregions.Any())
if(this.Subregions.Any())
{
stringBuilder.Append("-s ");
foreach (var anon in this.Subregions.Select((sr, index) => new { Index = index, Subregion = sr }))
foreach(var anon in this.Subregions.Select((sr, index) => new { Index = index, Subregion = sr }))
{
string format = "ss\\.fff";
if (anon.Index > 0)
if(anon.Index > 0)
{
stringBuilder.Append(":");
}
if (anon.Subregion.Start.TotalHours > 1)
if(anon.Subregion.Start.TotalHours > 1)
{
format = "h\\:m\\:s\\.fff";
}
else if (anon.Subregion.Start.TotalMinutes > 1)
else if(anon.Subregion.Start.TotalMinutes > 1)
{
format = "m\\:s\\.fff";
}
@ -568,26 +609,26 @@ namespace butterflow_ui
stringBuilder.Append(" ");
}
if (this.KeepSubregions) stringBuilder.Append("-k ");
if (this.SmoothMotion) stringBuilder.Append("-sm ");
if (this.FastPyramid) stringBuilder.Append("--fast-pyr ");
if (this.pyramidScale != DEFAULT_PYRAMID_SCALE) stringBuilder.AppendFormat("--pyr-scale {0} ", this.PyramidScale);
if (this.levels != DEFAULT_LEVELS) stringBuilder.AppendFormat("--levels {0} ", this.Levels);
if (this.windowSize != DEFAULT_WINDOW_SIZE) stringBuilder.AppendFormat("--winsize {0} ", this.WindowSize);
if (this.iterations != DEFAULT_ITERATIONS) stringBuilder.AppendFormat("--iters {0} ", this.Iterations);
if (this.pixelNeighborhood != DEFAULT_PIXEL_NEIGHBORHOOD) stringBuilder.AppendFormat("--poly-n {0} ", this.PixelNeighborhood);
if (this.smoothDerivativeStandardDeviation != DEFAULT_SMOOTH_DERIVATIVE_STANDARD_DEVIATION) stringBuilder.AppendFormat("--poly-s {0} ", this.SmoothDerivativeStandardDeviation);
if (this.FlowFilterType != DEFAULT_FLOW_FILTER_TYPE) stringBuilder.AppendFormat("-ff {0} ", this.FlowFilterType);
if(this.KeepSubregions) stringBuilder.Append("-k ");
if(this.SmoothMotion) stringBuilder.Append("-sm ");
if(this.FastPyramid) stringBuilder.Append("--fast-pyr ");
if(this.pyramidScale != DEFAULT_PYRAMID_SCALE) stringBuilder.AppendFormat("--pyr-scale {0} ", this.PyramidScale);
if(this.levels != DEFAULT_LEVELS) stringBuilder.AppendFormat("--levels {0} ", this.Levels);
if(this.windowSize != DEFAULT_WINDOW_SIZE) stringBuilder.AppendFormat("--winsize {0} ", this.WindowSize);
if(this.iterations != DEFAULT_ITERATIONS) stringBuilder.AppendFormat("--iters {0} ", this.Iterations);
if(this.pixelNeighborhood != DEFAULT_PIXEL_NEIGHBORHOOD) stringBuilder.AppendFormat("--poly-n {0} ", this.PixelNeighborhood);
if(this.smoothDerivativeStandardDeviation != DEFAULT_SMOOTH_DERIVATIVE_STANDARD_DEVIATION) stringBuilder.AppendFormat("--poly-s {0} ", this.SmoothDerivativeStandardDeviation);
if(this.FlowFilterType != DEFAULT_FLOW_FILTER_TYPE) stringBuilder.AppendFormat("-ff {0} ", this.FlowFilterType);
if (!string.IsNullOrWhiteSpace(this.VideoOutput))
if(!string.IsNullOrWhiteSpace(this.VideoOutput))
{
string videoOutputFile = string.Empty;
if (this.MultipleFiles)
if(this.MultipleFiles)
{
var format = new StringBuilder(Path.GetFileNameWithoutExtension(this.VideoOutput));
format.Append("_{0:");
for (int i = 0; i < this.videoInput.Count().ToString().Length; i++)
for(int i = 0; i < this.videoInput.Count().ToString().Length; i++)
{
format.Append("0");
}
@ -606,7 +647,7 @@ namespace butterflow_ui
stringBuilder.AppendFormat("-o \"{0}\" ", videoOutputFile);
}
if (this.VideoInput.Any())
if(this.VideoInput.Any())
{
stringBuilder.AppendFormat("\"{0}\"", this.VideoInput.ElementAt(videoInputIndex));
}
@ -621,6 +662,6 @@ namespace butterflow_ui
return ToButterflowArguments();
}
#endregion
#endregion Methods
}
}
}

View File

@ -8,19 +8,26 @@
xmlns:loc="clr-namespace:butterflow_ui.Localization"
mc:Ignorable="d"
Title="{x:Static loc:Localization.OptionsWindowTitle}" SizeToContent="WidthAndHeight">
<Window.Resources>
<butterflow_ui:InverseBoolVisibilityConverter x:Key="InverseBoolVisibilityConverter" />
</Window.Resources>
<DockPanel Margin="32">
<StackPanel>
<WrapPanel>
<Label Content="{x:Static loc:Localization.LanguageLabel}" />
<ComboBox DisplayMemberPath="DisplayName" ItemsSource="{Binding SupportedLanguages, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:OptionsWindow}}, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding Source={x:Static settings:Settings.Default}, Path=Language}" />
<ComboBox DisplayMemberPath="DisplayName" ItemsSource="{Binding SupportedLanguages, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:OptionsWindow}}, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding Source={x:Static settings:Settings.Default}, Path=Language}" VerticalAlignment="Center" />
</WrapPanel>
<TextBlock Text="{x:Static loc:Localization.OptionsWindowLanguageChangeNotice}" Foreground="Gray" />
<WrapPanel>
<Label Content="{x:Static loc:Localization.UseDefaultDeviceLabel}" />
<CheckBox Name="chkUseDefaultDevice" IsChecked="{Binding Source={x:Static settings:Settings.Default}, Path=UseDefaultDevice}" VerticalAlignment="Center" />
</WrapPanel>
<WrapPanel Visibility="{Binding Source={x:Static settings:Settings.Default}, Path=UseDefaultDevice, Converter={StaticResource InverseBoolVisibilityConverter}}">
<Label Content="{x:Static loc:Localization.DeviceLabel}" />
<ComboBox Name="comboDeviceList" DisplayMemberPath="Value" ItemsSource="{Binding ButterflowWrapper.Devices, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:OptionsWindow}}, UpdateSourceTrigger=PropertyChanged}" SelectedIndex="{Binding Source={x:Static settings:Settings.Default}, Path=Device}" />
<ComboBox Name="comboDeviceList" DisplayMemberPath="Value" ItemsSource="{Binding ButterflowWrapper.Devices, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:OptionsWindow}}, UpdateSourceTrigger=PropertyChanged}" SelectedIndex="{Binding Source={x:Static settings:Settings.Default}, Path=Device}" VerticalAlignment="Center" />
</WrapPanel>
<Separator Margin="0,10" />
<Button Name="btnSave" MaxWidth="45" Content="{x:Static loc:Localization.SaveLabel}" Click="btnSave_Click" />
</StackPanel>
</DockPanel>
</Window>
</Window>

View File

@ -37,7 +37,7 @@ namespace butterflow_ui
CultureInfo.CreateSpecificCulture("zh-CN"),
});
#endregion
#endregion Properties
#region Constructors
@ -49,7 +49,7 @@ namespace butterflow_ui
InitializeComponent();
}
#endregion
#endregion Constructors
#region Methods
@ -68,7 +68,7 @@ namespace butterflow_ui
/// <param name="e"> The ButterflowExitArgs to process. </param>
private void ButterflowWrapper_ButterflowExited(object sender, ButterflowWrapper.ButterflowExitArgs e)
{
if (Settings.Default.Device >= 0)
if(Settings.Default.Device >= 0)
{
this.comboDeviceList.Dispatcher.Invoke(() => this.comboDeviceList.SelectedIndex = Settings.Default.Device);
}
@ -78,6 +78,6 @@ namespace butterflow_ui
}
}
#endregion
#endregion Methods
}
}
}

View File

@ -1,6 +1,4 @@
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
@ -30,7 +28,6 @@ using System.Windows;
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
@ -40,7 +37,6 @@ using System.Windows;
// app, or any theme specific resource dictionaries)
)]
// Version information for an assembly consists of the following four values:
//
// Major Version
@ -51,5 +47,5 @@ using System.Windows;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.4.*")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyVersion("1.1.1.*")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -12,7 +12,7 @@ namespace butterflow_ui.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.8.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")]
public sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
@ -46,5 +46,17 @@ namespace butterflow_ui.Properties {
this["Device"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool UseDefaultDevice {
get {
return ((bool)(this["UseDefaultDevice"]));
}
set {
this["UseDefaultDevice"] = value;
}
}
}
}

View File

@ -8,5 +8,8 @@
<Setting Name="Device" Type="System.Int32" Scope="User">
<Value Profile="(Default)">0</Value>
</Setting>
<Setting Name="UseDefaultDevice" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
</Settings>
</SettingsFile>

View File

@ -1,81 +0,0 @@
usage: butterflow [options] [video]
Required arguments:
video Specify the input video
General options:
-h, --help Show this help message and exit
--version Show program's version number and exit
--cache-dir CACHE_DIR
Specify path to the cache directory
-c, --cache Show cache information and exit
--rm-cache Set to clear the cache and exit
-prb, --probe Show media file information and exit
-v, --verbosity Set to increase output verbosity
-q, --quiet Set to suppress console output
Device options:
-d, --show-devices Show detected OpenCL devices and exit
-device DEVICE Specify the preferred OpenCL device to use as an
integer. Device numbers can be listed with the `-d`
option. The device will be chosen automatically if
nothing is specified.
-sw Set to force software rendering
Display options:
-p, --show-preview Set to show video preview
-e, --embed-info Set to embed debugging info into the output video
-tt {light,dark,stroke}, --text-type {light,dark,stroke}
Specify text type for embedded debugging info,
(default: light)
-m, --mark-frames Set to mark interpolated frames
Video options:
-o OUTPUT_PATH, --output-path OUTPUT_PATH
Specify path to the output video
-r PLAYBACK_RATE, --playback-rate PLAYBACK_RATE
Specify the playback rate as an integer or a float.
Fractional forms are acceptable, e.g., 24/1.001 is the
same as 23.976. To use a multiple of the source
video's rate, follow a number with `x`, e.g., "2x"
will double the frame rate. The original rate will be
used by default if nothing is specified.
-s SUBREGIONS, --subregions SUBREGIONS
Specify rendering subregions in the form:
"a=TIME,b=TIME,TARGET=VALUE" where TARGET is either
`spd`, `dur`, `fps`. Valid TIME syntaxes are [hr:m:s],
[m:s], [s], [s.xxx], or `end`, which signifies to the
end the video. You can specify multiple subregions by
separating them with a colon `:`. A special subregion
format that conveniently describes the entire clip is
available in the form: "full,TARGET=VALUE".
-k, --keep-subregions
Set to render subregions that are not explicitly
specified
-vs VIDEO_SCALE, --video-scale VIDEO_SCALE
Specify output video size in the form: "WIDTH:HEIGHT"
or by using a factor. To keep the aspect ratio only
specify one component, either width or height, and set
the other component to -1, (default: 1.0)
-l, --lossless Set to use lossless encoding settings
-sm, --smooth-motion Set to tune for smooth motion. This mode yields
artifact-less frames by emphasizing blended frames
over warping pixels.
Muxing options:
-audio Set to add the source audio to the output video
Advanced options:
--fast-pyr Set to use fast pyramids
--pyr-scale PYR_SCALE
Specify pyramid scale factor, (default: 0.5)
--levels LEVELS Specify number of pyramid layers, (default: 3)
--winsize WINSIZE Specify averaging window size, (default: 25)
--iters ITERS Specify number of iterations at each pyramid level,
(default: 3)
--poly-n {5,7} Specify size of pixel neighborhood, (default: 5)
--poly-s POLY_S Specify standard deviation to smooth derivatives,
(default: 1.1)
-ff {box,gaussian}, --flow-filter {box,gaussian}
Specify which filter to use for optical flow
estimation, (default: box)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More