Compare commits

...

70 Commits
1.0 ... master

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
Jordan Wages 2878ff900f Localization Update
Completes localization and fixes #2
2018-09-12 21:55:53 -05:00
Jordan Wages d454d7a7f0 Added compute device selection
Added a call to butterflow to get compute devices, as well as a user setting that lets them set which device they want to use. I only have a single GPU, so I am unable to test this.
2018-09-12 21:35:06 -05:00
Jordan Wages 77d409b4c7 Updating localizations. 2018-07-29 16:03:34 -05:00
Jordan Wages 4a9571e153 Adding Octokit to installer 2018-07-28 19:38:20 -05:00
Jordan Wages 5751726f99 Update Check 2018-07-28 19:30:13 -05:00
Jordan Wages 0c3921f6b0 Updated documentation. 2018-07-26 17:40:53 -05:00
Jordan Wages 641ffbd617 Merge branch 'master' of https://github.com/wagesj45/butterflow-ui 2018-07-26 17:37:00 -05:00
Jordan Wages 6d41f96b1f XML Docs 2018-07-26 17:36:57 -05:00
Jordan Wages 0ec848ff79 Update issue templates 2018-07-26 15:42:24 -05:00
Jordan Wages df48c26af8 Merge branch 'master' of https://github.com/wagesj45/butterflow-ui 2018-07-26 14:28:48 -05:00
Jordan Wages 955374781f Updating Build Number 2018-07-26 14:28:46 -05:00
Jordan Wages a913369510
Update README.md 2018-07-26 14:25:19 -05:00
Jordan Wages d647ac1b86 Updating Localizations
Added some localized strings and updated the translation files.
2018-07-24 23:03:17 -05:00
Jordan Wages 8cab2cef5c Variable to Const
Just cause it should be, right?
2018-07-24 02:24:36 -05:00
Jordan Wages b9a9c3e503 Adding Multible File Support
Added the neccesary functions to support batch processing.
2018-07-24 02:12:53 -05:00
Jordan Wages cd23ef899d Updated installer 2018-07-14 23:38:38 -05:00
Jordan Wages 01d62e8136 Localizations
Added Arabic, Japanese, Russian, and Chinese translations via auto-translator.
2018-07-14 22:17:15 -05:00
Jordan Wages 5becb42a63 Adding versioning and meta data 2018-07-14 22:00:48 -05:00
Jordan Wages 300fad34e7
Update README.md 2018-07-09 23:17:07 -05:00
Jordan Wages 75a5bd2f90 Updating path so that documentation gets placed in the correct folder. 2018-07-09 15:15:22 -05:00
Jordan Wages b89319529b Sandcastle Help File 2018-07-09 15:11:26 -05:00
Jordan Wages 1e0a7c4f88
Update README.md 2018-07-09 14:56:50 -05:00
Jordan Wages fb517aba9d Adding generated help documents. 2018-07-09 14:50:36 -05:00
Jordan Wages 1a143b9e81 Merge branch 'master' of https://github.com/wagesj45/butterflow-ui 2018-07-09 14:49:50 -05:00
Jordan Wages 92f7229c96 Added documentation. 2018-07-09 14:49:48 -05:00
Jordan Wages 7f73b4a809
Update index.html 2018-07-09 14:46:51 -05:00
Jordan Wages 00f7c92c07
Create index.html 2018-07-09 14:45:28 -05:00
Jordan Wages f3717bf8c4
Delete index.html 2018-07-09 14:44:40 -05:00
Jordan Wages 3a721e31c1
Create index.html 2018-07-09 14:44:00 -05:00
Jordan Wages 329feaf342 Created XML Documentation file 2018-07-09 14:04:35 -05:00
Jordan Wages 116a6f2a34 Video Formats
Better video format list.
2018-07-06 17:29:12 -05:00
Jordan Wages 82b511f876 Merge branch 'master' of https://github.com/wagesj45/butterflow-ui 2018-07-06 17:00:17 -05:00
Jordan Wages 49e081ff7e Video Formats
Expanded the list of video formats supported by ffmpeg
2018-07-06 17:00:15 -05:00
Jordan Wages 9f9d4a66b7
Update README.md 2018-07-05 15:15:38 -05:00
Jordan Wages df503fa44f WIX Installer Project
Added installer project for creating automated installers that will include all components necessary, including third party compiled libraries.
2018-07-05 14:51:38 -05:00
829 changed files with 35297 additions and 382 deletions

28
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@ -0,0 +1,28 @@
---
name: Bug report
about: Create a report to help us improve
---
**Desktop (please complete the following information):**
- OS: [e.g. Windows 10]
- butterflow-ui Version [e.g. 1.0.2]
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Additional context**
Add any other context about the problem here.

View File

@ -0,0 +1,17 @@
---
name: Feature request
about: Suggest an idea for this project
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

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

@ -1,2 +1,50 @@
# butterflow-ui
A graphical user interface for butterflow.
![butterflow-ui screenshot](https://i.imgur.com/aE6oIrQ.png)
---
## About
**butterflow-ui** is a graphical front end for interacting with the [butterflow](https://github.com/dthpham/butterflow) command line application in Windows.
## Features
* *Multilingual Interface*
Support for language settings.
* *Subregion Clipper*
Helps find subregions in the video to process.
* *Reusable Configurations*
Save your favorite configurations and load them for use with other videos.
* *Batch Processing*
Process multiple files at once using the same settings across all files.
## Contribution
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.
## 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

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" InitialTargets="EnsureWixToolsetInstalled" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>3.10</ProductVersion>
<ProjectGuid>3cf49318-3c4a-40ad-9e0c-8940bc3be4f9</ProjectGuid>
<SchemaVersion>2.0</SchemaVersion>
<OutputName>butterflow_ui.setup</OutputName>
<OutputType>Package</OutputType>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<OutputPath>bin\$(Configuration)\</OutputPath>
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
<DefineConstants>Debug</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<OutputPath>bin\$(Configuration)\</OutputPath>
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
<CompilerAdditionalOptions>
</CompilerAdditionalOptions>
<LinkerAdditionalOptions>
</LinkerAdditionalOptions>
</PropertyGroup>
<ItemGroup>
<Compile Include="Product.wxs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\butterflow-ui\butterflow-ui.csproj">
<Name>butterflow-ui</Name>
<Project>{19f7e2b7-9c06-4a10-8aa2-bd0dd5abb9c4}</Project>
<Private>True</Private>
<DoNotHarvest>True</DoNotHarvest>
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
<RefTargetDir>INSTALLFOLDER</RefTargetDir>
</ProjectReference>
</ItemGroup>
<Import Project="$(WixTargetsPath)" Condition=" '$(WixTargetsPath)' != '' " />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets" Condition=" '$(WixTargetsPath)' == '' AND Exists('$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets') " />
<Target Name="EnsureWixToolsetInstalled" Condition=" '$(WixTargetsImported)' != 'true' ">
<Error Text="The WiX Toolset v3.11 (or newer) build tools must be installed to build this project. To download the WiX Toolset, see http://wixtoolset.org/releases/" />
</Target>
<!--
To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Wix.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

89
butterflow-ui.shfbproj Normal file
View File

@ -0,0 +1,89 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<!-- The configuration and platform will be used to determine which assemblies to include from solution and
project documentation sources -->
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{4174406f-c64c-4595-89d8-4b51824bc187}</ProjectGuid>
<SHFBSchemaVersion>2017.9.26.0</SHFBSchemaVersion>
<!-- AssemblyName, Name, and RootNamespace are not used by SHFB but Visual Studio adds them anyway -->
<AssemblyName>Documentation</AssemblyName>
<RootNamespace>Documentation</RootNamespace>
<Name>Documentation</Name>
<!-- SHFB properties -->
<FrameworkVersion>.NET Framework 4.7.2</FrameworkVersion>
<OutputPath>docs\</OutputPath>
<HtmlHelpName>Documentation</HtmlHelpName>
<Language>en-US</Language>
<DocumentationSources>
<DocumentationSource sourceFile="butterflow-ui\butterflow-ui.sln" />
</DocumentationSources>
<HelpFileFormat>Website</HelpFileFormat>
<SyntaxFilters>C#</SyntaxFilters>
<PresentationStyle>VS2013</PresentationStyle>
<CleanIntermediates>True</CleanIntermediates>
<KeepLogFile>True</KeepLogFile>
<DisableCodeBlockComponent>False</DisableCodeBlockComponent>
<IndentHtml>False</IndentHtml>
<BuildAssemblerVerbosity>OnlyWarningsAndErrors</BuildAssemblerVerbosity>
<ProjectSummary>butterflow-ui is a graphical front end for interacting with the butterflow command line application in Windows.</ProjectSummary>
<NamespaceSummaries>
<NamespaceSummaryItem name="(global)" isDocumented="False">butterflow-ui is a graphical front end for interacting with the butterflow command line application in Windows.</NamespaceSummaryItem>
<NamespaceSummaryItem name="butterflow_ui" isDocumented="True">butterflow-ui is a graphical front end for interacting with the butterflow command line application in Windows.</NamespaceSummaryItem>
<NamespaceSummaryItem name="butterflow_ui.Localization" isDocumented="False" />
<NamespaceSummaryItem name="butterflow_ui.Properties" isDocumented="False" />
</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. -->
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|Win32' ">
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|Win32' ">
</PropertyGroup>
<!-- Import the SHFB build targets -->
<Import Project="$(SHFBROOT)\SandcastleHelpFileBuilder.targets" />
<!-- The pre-build and post-build event properties must appear *after* the targets file import in order to be
evaluated correctly. -->
<PropertyGroup>
<PreBuildEvent>
</PreBuildEvent>
<PostBuildEvent>
</PostBuildEvent>
<RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
</PropertyGroup>
</Project>

View File

@ -15,6 +15,11 @@
<ContentControl VerticalAlignment="Center" Template="{StaticResource ButterflowUIIcon}" />
<TextBlock VerticalAlignment="Center" Text="{x:Static loc:Localization.Title}" FontSize="64" FontFamily="Segoe UI Black" />
</StackPanel>
<WrapPanel HorizontalAlignment="Center">
<TextBlock Text="{x:Static loc:Localization.VersionLabel}" />
<TextBlock Text=" - " />
<TextBlock Name="txtVersion" Text="0.0.0.0" />
</WrapPanel>
<TextBlock Text="{x:Static loc:Localization.AboutWindowDescription}" TextAlignment="Center" />
<Separator Margin="0,15" />
<Grid>
@ -29,30 +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" />
<Button Name="btnOK" MaxWidth="50" Content="{x:Static loc:Localization.OKLabel}" Click="btnOK_Click"/>
<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" />
</StackPanel>
</DockPanel>
</Window>
</Window>

View File

@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
@ -20,9 +21,12 @@ namespace butterflow_ui
/// </summary>
public partial class AboutWindow : Window
{
/// <summary> Default constructor. </summary>
public AboutWindow()
{
InitializeComponent();
this.txtVersion.Text = Assembly.GetExecutingAssembly().GetName().Version.ToString();
}
/// <summary> Event handler. Called by Hyperlink for request navigate events. </summary>

View File

@ -13,6 +13,12 @@
<setting name="Language" serializeAs="String">
<value>en-US</value>
</setting>
<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

@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;
namespace butterflow_ui
{
/// <summary> A visibility converter. </summary>
[ValueConversion(typeof(bool), typeof(Visibility))]
public class BoolVisibilityConverter : IValueConverter
{
/// <summary> Converts a value. </summary>
/// <exception cref="InvalidCastException"> Thrown when an object cannot be cast to a required
/// type. </exception>
/// <param name="value"> The value produced by the binding source. </param>
/// <param name="targetType"> The type of the binding target property. </param>
/// <param name="parameter"> The converter parameter to use. </param>
/// <param name="culture"> The culture to use in the converter. </param>
/// <returns>
/// A converted value. If the method returns <see langword="null" />, the valid null value is
/// used.
/// </returns>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (targetType == typeof(Visibility))
{
return (bool)value ? Visibility.Visible : Visibility.Hidden;
}
throw new InvalidCastException(string.Format("Cannot convert type to {0} from bool.", targetType.Name));
}
/// <summary> Converts a value. </summary>
/// <exception cref="InvalidCastException"> Thrown when an object cannot be cast to a required
/// type. </exception>
/// <param name="value"> The value that is produced by the binding target. </param>
/// <param name="targetType"> The type to convert to. </param>
/// <param name="parameter"> The converter parameter to use. </param>
/// <param name="culture"> The culture to use in the converter. </param>
/// <returns>
/// A converted value. If the method returns <see langword="null" />, the valid null value is
/// used.
/// </returns>
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (targetType == typeof(Visibility))
{
return ((Visibility)value == Visibility.Visible) ? true : false;
}
throw new InvalidCastException(string.Format("Cannot convert type {0} to boolean.", targetType.Name));
}
}
}

View File

@ -24,9 +24,13 @@ namespace butterflow_ui
private const string REGEX_PROGRESS = @"To write\:\s*\w*\s*\w*\,*\w*\s*(?<Progress>\d+\.*\d*)%";
/// <summary> An alternative RegEx string for detecting progress made when rendering a video. </summary>
private const string REGEX_PROGRESS_ALT = @"\<Rendering progress\:\s*(?<Progress>\d+\.*\d*)%\>";
/// <summary> The RegEx string for determining available processing devices in butterflow.. </summary>
private const string REGEX_DEVICE = @"\*\s*Device\s*(?<DeviceID>\d+)\s*\:\s*(?<DeviceName>(\w*\s*)*)";
/// <summary> Full pathname of the butterflow executable file. </summary>
private Lazy<string> executablePath = new Lazy<string>(() => Path.Combine(Directory.GetCurrentDirectory(), "ThirdPartyCompiled", "butterflow.exe"));
/// <summary> Queue of butterflow commands to run. </summary>
private Queue<string> runQueue = new Queue<string>();
/// <summary> The console output from butterflow. </summary>
private string consoleOutput = string.Empty;
/// <summary> True if butterflow is running, false if not. </summary>
@ -39,6 +43,8 @@ namespace butterflow_ui
private InputInterpreter interpreter = new InputInterpreter();
/// <summary> Event queue for all listeners interested in ParsedConsoleOutputRecieved events. </summary>
public event EventHandler<ButterflowOutputArgs> ParsedConsoleOutputRecieved;
/// <summary> Event queue for all listeners interested in ButterflowExited events. </summary>
public event EventHandler<ButterflowExitArgs> ButterflowExited;
#endregion
@ -89,42 +95,34 @@ 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>() { { 0, Localization.Localization.ForceCPU } };
#endregion
#region Methods
/// <summary> Runs butterflow with the given <paramref name="optionsConfiguration"/>. </summary>
/// <summary> Runs butterflow with the given <paramref name="optionsConfiguration"/> by adding it to the queue. </summary>
/// <param name="optionsConfiguration"> The options configuration. </param>
public void Run(OptionsConfiguration optionsConfiguration)
{
string arguments = optionsConfiguration.ToButterflowArguments();
Run(arguments);
}
/// <summary> Kills the running instance of butterflow, cancelling its current operation. </summary>
public void Cancel()
{
if(this.IsRunning && this.runningProcess != null)
for (int i = 0; i < optionsConfiguration.VideoInput.Count(); i++)
{
this.runningProcess.Kill();
var arguments = optionsConfiguration.ToButterflowArguments(i);
this.runQueue.Enqueue(arguments);
}
ProcessQueue();
}
/// <summary> Probes a video file. </summary>
/// <param name="videoFile"> The video file to be probed. </param>
public void Probe(string videoFile)
/// <summary> Process the queue of butterflow arguments. </summary>
public void ProcessQueue()
{
string arguments = string.Format("-prb \"{0}\"", videoFile);
Run(arguments);
}
/// <summary> Runs butterflow with the given <paramref name="arguments"/>. </summary>
/// <param name="arguments"> Options for controlling the operation. </param>
private void Run(string arguments)
{
if (!this.IsRunning)
if (!this.IsRunning && this.runQueue.Any())
{
var arguments = this.runQueue.Dequeue();
var process = new Process();
process.StartInfo = new ProcessStartInfo(executablePath.Value, arguments);
@ -146,6 +144,41 @@ namespace butterflow_ui
}
}
/// <summary> Kills the running instance of butterflow, cancelling its current operation. </summary>
public void Cancel()
{
if (this.IsRunning && this.runningProcess != null)
{
this.runningProcess.Kill();
}
this.runQueue.Clear();
}
/// <summary> Probes a video file. </summary>
/// <param name="videoFile"> The video file to be probed. </param>
public void Probe(string videoFile)
{
string arguments = string.Format("-prb \"{0}\"", videoFile);
Run(arguments);
}
/// <summary> Gets the devices available for butterflow processing. </summary>
public void GetDevices()
{
string arguments = "--show-devices";
Run(arguments);
}
/// <summary> Runs butterflow with the given <paramref name="arguments"/> by adding it to the queue. </summary>
/// <param name="arguments"> Options for controlling the operation. </param>
private void Run(string arguments)
{
this.runQueue.Enqueue(arguments);
ProcessQueue();
}
/// <summary> Event handler. Called by Process for exited events. </summary>
/// <param name="sender"> Source of the event. </param>
/// <param name="e"> Event information. </param>
@ -153,6 +186,10 @@ namespace butterflow_ui
{
this.IsRunning = false;
this.runningProcess = null;
OnButterflowExited();
ProcessQueue();
}
/// <summary>
@ -181,7 +218,7 @@ namespace butterflow_ui
// Test for playback rate
regex = new Regex(REGEX_RATE);
foreach(Match match in regex.Matches(consoleOutput))
foreach (Match match in regex.Matches(consoleOutput))
{
var rate = match.Groups["Rate"].Value;
@ -190,7 +227,7 @@ namespace butterflow_ui
// Test for progress being made when rendering a video
regex = new Regex(REGEX_PROGRESS);
foreach(Match match in regex.Matches(consoleOutput))
foreach (Match match in regex.Matches(consoleOutput))
{
var progress = match.Groups["Progress"].Value;
@ -200,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))
{
@ -210,6 +248,25 @@ 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();
//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))
{
this.Devices.Add(this.interpreter.Int, deviceName);
OnPropertyChanged("Devices");
}
OnParsedConsoleOutputRecieved(ButterflowOutputType.Device, deviceName, consoleOutput);
}
}
/// <summary> Executes the parsed console output recieved action. </summary>
@ -218,10 +275,13 @@ namespace butterflow_ui
/// <param name="consoleOutput"> The console output from butterflow. </param>
private void OnParsedConsoleOutputRecieved(ButterflowOutputType outputType, string value, string consoleOutput)
{
if (this.ParsedConsoleOutputRecieved != null)
{
this.ParsedConsoleOutputRecieved(this, new ButterflowOutputArgs(outputType, value, consoleOutput));
}
this.ParsedConsoleOutputRecieved?.Invoke(this, new ButterflowOutputArgs(outputType, value, consoleOutput));
}
/// <summary> Executes the butterflow exited action. </summary>
private void OnButterflowExited()
{
this.ButterflowExited?.Invoke(this, new ButterflowExitArgs());
}
/// <summary> Event handler. Called by Process for output data received events. </summary>
@ -288,6 +348,19 @@ namespace butterflow_ui
#endregion
}
/// <summary> Arguments for butterflow exiting. </summary>
public class ButterflowExitArgs : EventArgs
{
#region Constructors
public ButterflowExitArgs()
{
//
}
#endregion
}
/// <summary> Values that represent butterflow output types. </summary>
public enum ButterflowOutputType
{
@ -298,7 +371,9 @@ namespace butterflow_ui
/// <summary> Video playback rate. </summary>
Rate,
/// <summary> Video processing progress. </summary>
Progress
Progress,
/// <summary> An available processing device. </summary>
Device
}
#endregion

View File

@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;
namespace butterflow_ui
{
/// <summary> An inverse bool visibility converter. </summary>
[ValueConversion(typeof(bool), typeof(Visibility))]
public class InverseBoolVisibilityConverter : IValueConverter
{
/// <summary> Converts a value. </summary>
/// <exception cref="InvalidCastException"> Thrown when an object cannot be cast to a required
/// type. </exception>
/// <param name="value"> The value produced by the binding source. </param>
/// <param name="targetType"> The type of the binding target property. </param>
/// <param name="parameter"> The converter parameter to use. </param>
/// <param name="culture"> The culture to use in the converter. </param>
/// <returns>
/// A converted value. If the method returns <see langword="null" />, the valid null value is
/// used.
/// </returns>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (targetType == typeof(Visibility))
{
return (bool)value ? Visibility.Hidden : Visibility.Visible;
}
throw new InvalidCastException(string.Format("Cannot convert type to {0} from bool.", targetType.Name));
}
/// <summary> Converts a value. </summary>
/// <exception cref="InvalidCastException"> Thrown when an object cannot be cast to a required
/// type. </exception>
/// <param name="value"> The value that is produced by the binding target. </param>
/// <param name="targetType"> The type to convert to. </param>
/// <param name="parameter"> The converter parameter to use. </param>
/// <param name="culture"> The culture to use in the converter. </param>
/// <returns>
/// A converted value. If the method returns <see langword="null" />, the valid null value is
/// used.
/// </returns>
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (targetType == typeof(Visibility))
{
return ((Visibility)value == Visibility.Visible) ? false : true;
}
throw new InvalidCastException(string.Format("Cannot convert type {0} to boolean.", targetType.Name));
}
}
}

View File

@ -195,6 +195,33 @@ namespace butterflow_ui.Localization {
}
}
/// <summary>
/// Looks up a localized string similar to Would you like to visit butterflow-ui on github to update to the latest version?.
/// </summary>
public static string BehindVersionQuestion {
get {
return ResourceManager.GetString("BehindVersionQuestion", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The current version is behind the github repository and should be updated..
/// </summary>
public static string BehindVersionStatusDescription {
get {
return ResourceManager.GetString("BehindVersionStatusDescription", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to ButterflowUI Configuration File.
/// </summary>
public static string ButterflowUIConfigurationLabel {
get {
return ResourceManager.GetString("ButterflowUIConfigurationLabel", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Cancel.
/// </summary>
@ -240,6 +267,15 @@ namespace butterflow_ui.Localization {
}
}
/// <summary>
/// Looks up a localized string similar to The current version is up to date with the github repository..
/// </summary>
public static string CurrentVersionStatusDescription {
get {
return ResourceManager.GetString("CurrentVersionStatusDescription", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Custom Rate.
/// </summary>
@ -249,6 +285,15 @@ namespace butterflow_ui.Localization {
}
}
/// <summary>
/// Looks up a localized string similar to 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>
public static string CustomVersionStatusDescription {
get {
return ResourceManager.GetString("CustomVersionStatusDescription", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Developers and Contributors.
/// </summary>
@ -258,6 +303,24 @@ namespace butterflow_ui.Localization {
}
}
/// <summary>
/// Looks up a localized string similar to Computing Device.
/// </summary>
public static string DeviceLabel {
get {
return ResourceManager.GetString("DeviceLabel", resourceCulture);
}
}
/// <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>
@ -348,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>
@ -465,6 +537,24 @@ namespace butterflow_ui.Localization {
}
}
/// <summary>
/// Looks up a localized string similar to Video previewing and subregion clipping is not available when processing multiple files..
/// </summary>
public static string MultipleFilesPreviewWarningLabel {
get {
return ResourceManager.GetString("MultipleFilesPreviewWarningLabel", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to [Multiple Files].
/// </summary>
public static string MultipleFilesText {
get {
return ResourceManager.GetString("MultipleFilesText", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to OK.
/// </summary>
@ -735,6 +825,15 @@ namespace butterflow_ui.Localization {
}
}
/// <summary>
/// Looks up a localized string similar to Supported File Types.
/// </summary>
public static string SupportedFileTypesLabel {
get {
return ResourceManager.GetString("SupportedFileTypesLabel", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to butterflow-ui.
/// </summary>
@ -753,6 +852,42 @@ namespace butterflow_ui.Localization {
}
}
/// <summary>
/// Looks up a localized string similar to Github failed to respond with the current version. This could be because of rate limits or a network failure..
/// </summary>
public static string UnknownVersionStatusDescription {
get {
return ResourceManager.GetString("UnknownVersionStatusDescription", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to A newer version of butterflow-ui is available..
/// </summary>
public static string UpdateAvailableLabel {
get {
return ResourceManager.GetString("UpdateAvailableLabel", resourceCulture);
}
}
/// <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>
public static string VersionLabel {
get {
return ResourceManager.GetString("VersionLabel", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Width.
/// </summary>

View File

@ -0,0 +1,399 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="AboutButterflowMenu" xml:space="preserve">
<value>butterflow على جيثب ...</value>
</data>
<data name="AboutButterflowUIMenu" xml:space="preserve">
<value>butterflow -ii على جيثب ...</value>
</data>
<data name="AboutMenu" xml:space="preserve">
<value>حول butterflow -ii</value>
</data>
<data name="AdvancedOptionsGroupBox" xml:space="preserve">
<value>خيارات متقدمة</value>
</data>
<data name="ClipTooltip" xml:space="preserve">
<value>مقطع منطقة فرعية في الفيديو.</value>
</data>
<data name="CommonOptionsGroupBox" xml:space="preserve">
<value>خيارات مشتركة</value>
</data>
<data name="CustomPlaybackRateLabel" xml:space="preserve">
<value>معدل مخصص</value>
</data>
<data name="EditMenu" xml:space="preserve">
<value>_تصحيح</value>
</data>
<data name="EndLabel" xml:space="preserve">
<value>E</value>
</data>
<data name="FileInputGroupBox" xml:space="preserve">
<value>إدخال</value>
</data>
<data name="FileLabel" xml:space="preserve">
<value>ملف فيديو</value>
</data>
<data name="FileMenu" xml:space="preserve">
<value>_ملف</value>
</data>
<data name="HeightLabel" xml:space="preserve">
<value>ارتفاع</value>
</data>
<data name="HelpMenu" xml:space="preserve">
<value>_مساعدة</value>
</data>
<data name="KeepAudioDescription" xml:space="preserve">
<value>يعرض الفيديو الناتج مع الصوت من الفيديو الأصلي. في غير محدد ، لن يتم تضمين أي صوت في الفيديو الناتج.</value>
</data>
<data name="KeepAudioLabel" xml:space="preserve">
<value>حافظ على الصوت</value>
</data>
<data name="LosslessDescription" xml:space="preserve">
<value>يعرض الفيديو دون ضغط الفقد. لن يفقد الفيديو أي جودة بصرية ، ولكنه سينتج عنه ملف إخراج كبير جدًا.</value>
</data>
<data name="LosslessLabel" xml:space="preserve">
<value>جودة بلا خسائر</value>
</data>
<data name="PlaybackRateDescription" xml:space="preserve">
<value>يتحكم في معدل الإطارات الجديد لمخرجات الفيديو. يمكن تعيين هذا في كل من الشروط المطلقة والنسبية.</value>
</data>
<data name="PlaybackRateLabel" xml:space="preserve">
<value>معدل التشغيل</value>
</data>
<data name="PlayPauseTooltip" xml:space="preserve">
<value>تشغيل / إيقاف مؤقت للفيديو.</value>
</data>
<data name="RenderingLabel" xml:space="preserve">
<value>تقديم الفيديو</value>
</data>
<data name="ResolutionLabel" xml:space="preserve">
<value>قرار الإخراج</value>
</data>
<data name="SkipBackTooltip" xml:space="preserve">
<value>تخطي للخلف في الفيديو.</value>
</data>
<data name="SkipForwardTooltip" xml:space="preserve">
<value>تخط إلى الأمام في الفيديو.</value>
</data>
<data name="StartLabel" xml:space="preserve">
<value>S</value>
</data>
<data name="StopTooltip" xml:space="preserve">
<value>أوقف الفيديو.</value>
</data>
<data name="SubregionsDescription" xml:space="preserve">
<value>المناطق الفردية للفيديو لمعالجة.</value>
</data>
<data name="SubregionsLabel" xml:space="preserve">
<value>المناطق الفرعية</value>
</data>
<data name="Title" xml:space="preserve">
<value>butterflow-واجهة المستخدم</value>
</data>
<data name="ToEndLabel" xml:space="preserve">
<value>إلى النهاية</value>
</data>
<data name="WidthLabel" xml:space="preserve">
<value>عرض</value>
</data>
<data name="_120fpsLabel" xml:space="preserve">
<value>120 إطارًا في الثانية</value>
</data>
<data name="_24fpsLabel" xml:space="preserve">
<value>24 إطارًا في الثانية</value>
</data>
<data name="_2xLabel" xml:space="preserve">
<value>2X</value>
</data>
<data name="_30fpsLabel" xml:space="preserve">
<value>30 إطارًا في الثانية</value>
</data>
<data name="_3xLabel" xml:space="preserve">
<value>3X</value>
</data>
<data name="_4xLabel" xml:space="preserve">
<value>4X</value>
</data>
<data name="_60fpsLabel" xml:space="preserve">
<value>60 إطارًا في الثانية</value>
</data>
<data name="CancelLabel" xml:space="preserve">
<value>إلغاء</value>
</data>
<data name="CancelTooltip" xml:space="preserve">
<value>إلغاء عملية butterflow الحالية.</value>
</data>
<data name="FastPyramidsLabel" xml:space="preserve">
<value>استخدم الأهرامات السريعة</value>
</data>
<data name="FastPyramidsTooltip" xml:space="preserve">
<value />
</data>
<data name="FileOutputGroupBox" xml:space="preserve">
<value>انتاج |</value>
</data>
<data name="FlowFilterLabel" xml:space="preserve">
<value>فلتر التدفق</value>
</data>
<data name="FlowFilterTooltip" xml:space="preserve">
<value>مرشح يستخدم لتقدير التدفق البصري.</value>
</data>
<data name="IterationsLabel" xml:space="preserve">
<value>تكرارات الهرم</value>
</data>
<data name="IterationsTooltip" xml:space="preserve">
<value>عدد التكرارات المستخدمة لكل طبقة هرمية.</value>
</data>
<data name="KeepSubregionsLabel" xml:space="preserve">
<value>حافظ على مناطق فرعية</value>
</data>
<data name="KeepSubregionsTooltip" xml:space="preserve">
<value>تجعل المناطق الفرعية غير محددة صراحة.</value>
</data>
<data name="LevelsLabel" xml:space="preserve">
<value>مستويات</value>
</data>
<data name="LevelsTooltip" xml:space="preserve">
<value>عدد طبقات الهرم.</value>
</data>
<data name="OpenMenuItem" xml:space="preserve">
<value>_افتح...</value>
</data>
<data name="PixelNeighborhoodLabel" xml:space="preserve">
<value>حي بكسل</value>
</data>
<data name="PixelNeighborhoodTooltip" xml:space="preserve">
<value>حجم حي البكسل.</value>
</data>
<data name="ProcessLabel" xml:space="preserve">
<value>معالجة</value>
</data>
<data name="ProcessTooltip" xml:space="preserve">
<value>قم بمعالجة الفيديو. هذا قد يكون عملية طويلة.</value>
</data>
<data name="PyramidScaleLabel" xml:space="preserve">
<value>عامل مقياس الهرم</value>
</data>
<data name="PyramidScaleTooltip" xml:space="preserve">
<value />
</data>
<data name="SaveAsMenuItem" xml:space="preserve">
<value>حفظ التهيئة _As ...</value>
</data>
<data name="SaveMenuItem" xml:space="preserve">
<value>_حفظ التكوين...</value>
</data>
<data name="SmoothDerivativeLabel" xml:space="preserve">
<value>مشتقة سلسة</value>
</data>
<data name="SmoothDerivativeTooltip" xml:space="preserve">
<value>حجم الانحراف المعياري المستخدم للمشتقات السلسة.</value>
</data>
<data name="SmoothMotionLabel" xml:space="preserve">
<value>الحركة السلسة</value>
</data>
<data name="SmoothMotionTooltip" xml:space="preserve">
<value>اضبط لضبط الحركة السلسة. ينتج هذا الوضع إطارات أقل تأثيرًا عن طريق التأكيد على الإطارات الممزوجة على وحدات البكسل المخروطية.</value>
</data>
<data name="WindowSizeLabel" xml:space="preserve">
<value>بحجم النافذه</value>
</data>
<data name="WindowSizeTooltip" xml:space="preserve">
<value />
</data>
<data name="AboutWindowDescription" xml:space="preserve">
<value>buttterflow-ui هي واجهة مستخدم رسومية لمعالج الفيديو butterflow.</value>
</data>
<data name="AboutWindowGithubLinkLabel" xml:space="preserve">
<value>جيثب</value>
</data>
<data name="AboutWindowLicenseLinkLabel" xml:space="preserve">
<value>رخصة</value>
</data>
<data name="AboutWindowTitle" xml:space="preserve">
<value>حول butterflow -ii</value>
</data>
<data name="CopyArgumentsMenu" xml:space="preserve">
<value>نسخ الحجج butterflow</value>
</data>
<data name="DevelopersLabel" xml:space="preserve">
<value>المطورين والمساهمين</value>
</data>
<data name="LanguageLabel" xml:space="preserve">
<value>لغة</value>
</data>
<data name="OKLabel" xml:space="preserve">
<value>حسنا</value>
</data>
<data name="OpenSourceCreditsLabel" xml:space="preserve">
<value>مكتبات المصدر المفتوح</value>
</data>
<data name="OptionsMenu" xml:space="preserve">
<value>خيارات التطبيق ...</value>
</data>
<data name="OptionsWindowLanguageChangeNotice" xml:space="preserve">
<value>ملاحظة: سيتطلب تغيير لغة المستخدم إعادة تشغيل البرنامج.</value>
</data>
<data name="OptionsWindowTitle" xml:space="preserve">
<value>خيارات</value>
</data>
<data name="SaveLabel" xml:space="preserve">
<value>حفظ</value>
</data>
<data name="VersionLabel" xml:space="preserve">
<value>الإصدار</value>
</data>
<data name="ButterflowUIConfigurationLabel" xml:space="preserve">
<value>ButterflowUI ملف التكوين</value>
</data>
<data name="MultipleFilesPreviewWarningLabel" xml:space="preserve">
<value>لا تتوفر إمكانية معاينة الفيديو والقاطع الفرعي عند معالجة ملفات متعددة.</value>
</data>
<data name="MultipleFilesText" xml:space="preserve">
<value>[ملفات متعددة]</value>
</data>
<data name="SupportedFileTypesLabel" xml:space="preserve">
<value>أنواع الملفات المدعومة</value>
</data>
<data name="BehindVersionStatusDescription" xml:space="preserve">
<value>الإصدار الحالي هو وراء مستودع جيثب ويجب تحديثه.</value>
</data>
<data name="CurrentVersionStatusDescription" xml:space="preserve">
<value>الإصدار الحالي محدث مع مستودع جيثب.</value>
</data>
<data name="CustomVersionStatusDescription" xml:space="preserve">
<value>الإصدار الحالي هو قبل مستودع github ، أو هو نسخة مخصصة من butterflow -ii لا يمكن مقارنتها بمستودع جيثب.</value>
</data>
<data name="UnknownVersionStatusDescription" xml:space="preserve">
<value>فشل Github للرد مع الإصدار الحالي. قد يكون ذلك بسبب حدود المعدل أو فشل الشبكة.</value>
</data>
<data name="BehindVersionQuestion" xml:space="preserve">
<value>هل ترغب في زيارة butterflow -i على جيثب للتحديث إلى أحدث إصدار؟</value>
</data>
<data name="UpdateAvailableLabel" xml:space="preserve">
<value>يتوفر إصدار أحدث من butterflow-ui.</value>
</data>
<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>
@ -348,10 +348,52 @@
<data name="OptionsMenu" xml:space="preserve">
<value>Opciones de aplicación ...</value>
</data>
<data name="OptionsWindowLanguageChangeNotice" xml:space="preserve">
<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>
</root>
<data name="VersionLabel" xml:space="preserve">
<value>Versión</value>
</data>
<data name="ButterflowUIConfigurationLabel" xml:space="preserve">
<value>Archivo de configuración de ButterflowUI</value>
</data>
<data name="MultipleFilesPreviewWarningLabel" xml:space="preserve">
<value>La vista previa de video y el recorte subregional no están disponibles cuando se procesan varios archivos.</value>
</data>
<data name="MultipleFilesText" xml:space="preserve">
<value>[Varios archivos]</value>
</data>
<data name="SupportedFileTypesLabel" xml:space="preserve">
<value>Tipos de archivos admitidos</value>
</data>
<data name="BehindVersionStatusDescription" xml:space="preserve">
<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>
</data>
<data name="CustomVersionStatusDescription" xml:space="preserve">
<value>La versión actual está por delante del repositorio github, o es una versión personalizada de butterflow-ui que no se puede comparar con el repositorio github.</value>
</data>
<data name="UnknownVersionStatusDescription" xml:space="preserve">
<value>Github no respondió con la versión actual. Esto podría deberse a límites de velocidad o a una falla de la red.</value>
</data>
<data name="BehindVersionQuestion" xml:space="preserve">
<value>¿Le gustaría visitar butterflow-ui en github para actualizar a la última versión?</value>
</data>
<data name="UpdateAvailableLabel" xml:space="preserve">
<value>Una versión más reciente de butterflow-ui está disponible.</value>
</data>
<data name="DeviceLabel" xml:space="preserve">
<value>Dispositivo de computación</value>
</data>
<data name="ForceCPU" xml:space="preserve">
<value>Unidad de procesamiento central de fuerza</value>
</data>
</root>

View File

@ -0,0 +1,399 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="AboutButterflowMenu" xml:space="preserve">
<value>ギターのバターフロー...</value>
</data>
<data name="AboutButterflowUIMenu" xml:space="preserve">
<value>butterflow-ui on github ...</value>
</data>
<data name="AboutMenu" xml:space="preserve">
<value>butterflow-uiについて</value>
</data>
<data name="AdvancedOptionsGroupBox" xml:space="preserve">
<value>高度なオプション</value>
</data>
<data name="ClipTooltip" xml:space="preserve">
<value>ビデオ内の部分領域をクリップする。</value>
</data>
<data name="CommonOptionsGroupBox" xml:space="preserve">
<value>共通オプション</value>
</data>
<data name="CustomPlaybackRateLabel" xml:space="preserve">
<value>カスタムレート</value>
</data>
<data name="EditMenu" xml:space="preserve">
<value>_編集</value>
</data>
<data name="EndLabel" xml:space="preserve">
<value>E</value>
</data>
<data name="FileInputGroupBox" xml:space="preserve">
<value>入力</value>
</data>
<data name="FileLabel" xml:space="preserve">
<value>ビデオファイル</value>
</data>
<data name="FileMenu" xml:space="preserve">
<value>_ファイル</value>
</data>
<data name="HeightLabel" xml:space="preserve">
<value>高さ</value>
</data>
<data name="HelpMenu" xml:space="preserve">
<value>_助けて</value>
</data>
<data name="KeepAudioDescription" xml:space="preserve">
<value>出力ビデオを元のビデオからのオーディオでレンダリングします。チェックされていない場合、サウンドは出力ビデオに含まれません。</value>
</data>
<data name="KeepAudioLabel" xml:space="preserve">
<value>オーディオを保持する</value>
</data>
<data name="LosslessDescription" xml:space="preserve">
<value>非可逆圧縮なしでビデオをレンダリングします。ビデオのビジュアル品質は損なわれませんが、出力ファイルが非常に大きくなります。</value>
</data>
<data name="LosslessLabel" xml:space="preserve">
<value>ロスレス品質</value>
</data>
<data name="PlaybackRateDescription" xml:space="preserve">
<value>出力ビデオの新しいフレームレートを制御します。これは、絶対的および相対的な両方の用語で設定できます。</value>
</data>
<data name="PlaybackRateLabel" xml:space="preserve">
<value>再生レート</value>
</data>
<data name="PlayPauseTooltip" xml:space="preserve">
<value>ビデオを再生/一時停止する。</value>
</data>
<data name="RenderingLabel" xml:space="preserve">
<value>ビデオレンダリング</value>
</data>
<data name="ResolutionLabel" xml:space="preserve">
<value>出力解像度</value>
</data>
<data name="SkipBackTooltip" xml:space="preserve">
<value>動画の後ろをスキップしてください。</value>
</data>
<data name="SkipForwardTooltip" xml:space="preserve">
<value>ビデオで前方にスキップします。</value>
</data>
<data name="StartLabel" xml:space="preserve">
<value>S</value>
</data>
<data name="StopTooltip" xml:space="preserve">
<value>ビデオを停止します。</value>
</data>
<data name="SubregionsDescription" xml:space="preserve">
<value>処理するビデオの個々の領域。</value>
</data>
<data name="SubregionsLabel" xml:space="preserve">
<value>サブリージョン</value>
</data>
<data name="Title" xml:space="preserve">
<value>バターフロー</value>
</data>
<data name="ToEndLabel" xml:space="preserve">
<value>最後まで</value>
</data>
<data name="WidthLabel" xml:space="preserve">
<value>幅</value>
</data>
<data name="_120fpsLabel" xml:space="preserve">
<value>120 fps</value>
</data>
<data name="_24fpsLabel" xml:space="preserve">
<value>24 fps</value>
</data>
<data name="_2xLabel" xml:space="preserve">
<value>2倍</value>
</data>
<data name="_30fpsLabel" xml:space="preserve">
<value>30 fps</value>
</data>
<data name="_3xLabel" xml:space="preserve">
<value>3倍</value>
</data>
<data name="_4xLabel" xml:space="preserve">
<value>4倍</value>
</data>
<data name="_60fpsLabel" xml:space="preserve">
<value>60 fps</value>
</data>
<data name="CancelLabel" xml:space="preserve">
<value>キャンセル</value>
</data>
<data name="CancelTooltip" xml:space="preserve">
<value>現在のバターフロー操作をキャンセルします。</value>
</data>
<data name="FastPyramidsLabel" xml:space="preserve">
<value>高速ピラミッドを使用する</value>
</data>
<data name="FastPyramidsTooltip" xml:space="preserve">
<value />
</data>
<data name="FileOutputGroupBox" xml:space="preserve">
<value>出力</value>
</data>
<data name="FlowFilterLabel" xml:space="preserve">
<value>フローフィルタ</value>
</data>
<data name="FlowFilterTooltip" xml:space="preserve">
<value>オプティカルフロー推定に使用されるフィルタ。</value>
</data>
<data name="IterationsLabel" xml:space="preserve">
<value>ピラミッド反復</value>
</data>
<data name="IterationsTooltip" xml:space="preserve">
<value>各ピラミッド層に使用する反復回数。</value>
</data>
<data name="KeepSubregionsLabel" xml:space="preserve">
<value>サブリージョンを保持</value>
</data>
<data name="KeepSubregionsTooltip" xml:space="preserve">
<value>明示的に指定されていないサブ領域をレンダリングします。</value>
</data>
<data name="LevelsLabel" xml:space="preserve">
<value>レベル</value>
</data>
<data name="LevelsTooltip" xml:space="preserve">
<value>ピラミッド層の数。</value>
</data>
<data name="OpenMenuItem" xml:space="preserve">
<value>_開いた...</value>
</data>
<data name="PixelNeighborhoodLabel" xml:space="preserve">
<value>ピクセル近傍</value>
</data>
<data name="PixelNeighborhoodTooltip" xml:space="preserve">
<value>ピクセル近傍のサイズ。</value>
</data>
<data name="ProcessLabel" xml:space="preserve">
<value>プロセス</value>
</data>
<data name="ProcessTooltip" xml:space="preserve">
<value>ビデオを処理します。これは長いプロセスかもしれません。</value>
</data>
<data name="PyramidScaleLabel" xml:space="preserve">
<value>ピラミッドスケールファクタ</value>
</data>
<data name="PyramidScaleTooltip" xml:space="preserve">
<value />
</data>
<data name="SaveAsMenuItem" xml:space="preserve">
<value>設定を保存する_As ...</value>
</data>
<data name="SaveMenuItem" xml:space="preserve">
<value>_保存設定...</value>
</data>
<data name="SmoothDerivativeLabel" xml:space="preserve">
<value>スムーズデリバティブ</value>
</data>
<data name="SmoothDerivativeTooltip" xml:space="preserve">
<value>滑らかな導関数に使用される標準偏差のサイズ。</value>
</data>
<data name="SmoothMotionLabel" xml:space="preserve">
<value>スムースモーション</value>
</data>
<data name="SmoothMotionTooltip" xml:space="preserve">
<value>滑らかな動きに合わせて調整します。このモードは、ワーピングピクセル上でブレンドされたフレームを強調することによって、アーティファクトなしのフレームを生成します。</value>
</data>
<data name="WindowSizeLabel" xml:space="preserve">
<value>ウィンドウサイズ</value>
</data>
<data name="WindowSizeTooltip" xml:space="preserve">
<value />
</data>
<data name="AboutWindowDescription" xml:space="preserve">
<value>buttterflow-uiは、butterflowビデオプロセッサ用のグラフィカルユーザーインターフェイスです。</value>
</data>
<data name="AboutWindowGithubLinkLabel" xml:space="preserve">
<value>ギブス</value>
</data>
<data name="AboutWindowLicenseLinkLabel" xml:space="preserve">
<value>ライセンス</value>
</data>
<data name="AboutWindowTitle" xml:space="preserve">
<value>butterflow-uiについて</value>
</data>
<data name="CopyArgumentsMenu" xml:space="preserve">
<value>バターフローの引数をコピーする</value>
</data>
<data name="DevelopersLabel" xml:space="preserve">
<value>開発者と貢献者</value>
</data>
<data name="LanguageLabel" xml:space="preserve">
<value>言語</value>
</data>
<data name="OKLabel" xml:space="preserve">
<value>[OK]</value>
</data>
<data name="OpenSourceCreditsLabel" xml:space="preserve">
<value>オープンソースライブラリ</value>
</data>
<data name="OptionsMenu" xml:space="preserve">
<value>アプリケーションオプション...</value>
</data>
<data name="OptionsWindowLanguageChangeNotice" xml:space="preserve">
<value>注:ユーザー言語を変更するには、プログラムを再起動する必要があります。</value>
</data>
<data name="OptionsWindowTitle" xml:space="preserve">
<value>オプション</value>
</data>
<data name="SaveLabel" xml:space="preserve">
<value>セーブ</value>
</data>
<data name="VersionLabel" xml:space="preserve">
<value>バージョン</value>
</data>
<data name="ButterflowUIConfigurationLabel" xml:space="preserve">
<value>ButterflowUI構成ファイル</value>
</data>
<data name="MultipleFilesPreviewWarningLabel" xml:space="preserve">
<value>複数のファイルを処理する場合、ビデオのプレビューとサブリージョンのクリッピングは使用できません。</value>
</data>
<data name="MultipleFilesText" xml:space="preserve">
<value>[複数のファイル]</value>
</data>
<data name="SupportedFileTypesLabel" xml:space="preserve">
<value>サポートされているファイルの種類</value>
</data>
<data name="BehindVersionStatusDescription" xml:space="preserve">
<value>現在のバージョンはgithubリポジトリの後ろにあり、更新する必要があります。</value>
</data>
<data name="CurrentVersionStatusDescription" xml:space="preserve">
<value>現在のバージョンはgithubリポジトリで最新のものです。</value>
</data>
<data name="CustomVersionStatusDescription" xml:space="preserve">
<value>現在のバージョンはgithubリポジトリより先にあるか、githubリポジトリと比較できないカスタムバージョンのbutterflow-uiです。</value>
</data>
<data name="UnknownVersionStatusDescription" xml:space="preserve">
<value>Githubは現在のバージョンでは応答できませんでした。これは、レート制限またはネットワーク障害が原因である可能性があります。</value>
</data>
<data name="BehindVersionQuestion" xml:space="preserve">
<value>最新版に更新するgithubでbutterflow-uiにアクセスしますか</value>
</data>
<data name="UpdateAvailableLabel" xml:space="preserve">
<value>新しいバージョンのbutterflow-uiが利用可能です。</value>
</data>
<data name="DeviceLabel" xml:space="preserve">
<value>コンピューティングデバイス</value>
</data>
<data name="ForceCPU" xml:space="preserve">
<value>中央処理装置を強制する</value>
</data>
</root>

View File

@ -357,4 +357,49 @@
<data name="SaveLabel" xml:space="preserve">
<value>Save</value>
</data>
<data name="VersionLabel" xml:space="preserve">
<value>Version</value>
</data>
<data name="ButterflowUIConfigurationLabel" xml:space="preserve">
<value>ButterflowUI Configuration File</value>
</data>
<data name="MultipleFilesPreviewWarningLabel" xml:space="preserve">
<value>Video previewing and subregion clipping is not available when processing multiple files.</value>
</data>
<data name="MultipleFilesText" xml:space="preserve">
<value>[Multiple Files]</value>
</data>
<data name="SupportedFileTypesLabel" xml:space="preserve">
<value>Supported File Types</value>
</data>
<data name="BehindVersionStatusDescription" xml:space="preserve">
<value>The current version is behind the github repository and should be updated.</value>
</data>
<data name="CurrentVersionStatusDescription" xml:space="preserve">
<value>The current version is up to date with the github repository.</value>
</data>
<data name="CustomVersionStatusDescription" xml:space="preserve">
<value>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.</value>
</data>
<data name="UnknownVersionStatusDescription" xml:space="preserve">
<value>Github failed to respond with the current version. This could be because of rate limits or a network failure.</value>
</data>
<data name="BehindVersionQuestion" xml:space="preserve">
<value>Would you like to visit butterflow-ui on github to update to the latest version?</value>
</data>
<data name="UpdateAvailableLabel" xml:space="preserve">
<value>A newer version of butterflow-ui is available.</value>
</data>
<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

@ -0,0 +1,399 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="AboutButterflowMenu" xml:space="preserve">
<value>масляный поток на github ...</value>
</data>
<data name="AboutButterflowUIMenu" xml:space="preserve">
<value>butterflow-ui на github ...</value>
</data>
<data name="AboutMenu" xml:space="preserve">
<value>О butterflow-ui</value>
</data>
<data name="AdvancedOptionsGroupBox" xml:space="preserve">
<value>Расширенные опции</value>
</data>
<data name="ClipTooltip" xml:space="preserve">
<value>Закрепите субрегион в видео.</value>
</data>
<data name="CommonOptionsGroupBox" xml:space="preserve">
<value>Общие параметры</value>
</data>
<data name="CustomPlaybackRateLabel" xml:space="preserve">
<value>Пользовательская ставка</value>
</data>
<data name="EditMenu" xml:space="preserve">
<value>_Редактировать</value>
</data>
<data name="EndLabel" xml:space="preserve">
<value>Е</value>
</data>
<data name="FileInputGroupBox" xml:space="preserve">
<value>вход</value>
</data>
<data name="FileLabel" xml:space="preserve">
<value>Видеофайл</value>
</data>
<data name="FileMenu" xml:space="preserve">
<value>_Файл</value>
</data>
<data name="HeightLabel" xml:space="preserve">
<value>Высота</value>
</data>
<data name="HelpMenu" xml:space="preserve">
<value>_Помогите</value>
</data>
<data name="KeepAudioDescription" xml:space="preserve">
<value>Отображает видеоизображение с аудио из исходного видео. Неконтролируемый звук не будет включен в выходной видеосигнал.</value>
</data>
<data name="KeepAudioLabel" xml:space="preserve">
<value>Сохранить аудио</value>
</data>
<data name="LosslessDescription" xml:space="preserve">
<value>Отображает видео без сжатия с потерями. Видео не потеряет визуального качества, но это приведет к очень большому выходному файлу.</value>
</data>
<data name="LosslessLabel" xml:space="preserve">
<value>Качество без потерь</value>
</data>
<data name="PlaybackRateDescription" xml:space="preserve">
<value>Управляет новой частотой кадров выходного видео. Это можно установить как в абсолютном, так и в относительном терминах.</value>
</data>
<data name="PlaybackRateLabel" xml:space="preserve">
<value>Скорость воспроизведения</value>
</data>
<data name="PlayPauseTooltip" xml:space="preserve">
<value>Воспроизведение / Пауза видео.</value>
</data>
<data name="RenderingLabel" xml:space="preserve">
<value>Видеообъявления</value>
</data>
<data name="ResolutionLabel" xml:space="preserve">
<value>Разрешение вывода</value>
</data>
<data name="SkipBackTooltip" xml:space="preserve">
<value>Пропустите назад в видео.</value>
</data>
<data name="SkipForwardTooltip" xml:space="preserve">
<value>Пропустить вперед в видео.</value>
</data>
<data name="StartLabel" xml:space="preserve">
<value>S</value>
</data>
<data name="StopTooltip" xml:space="preserve">
<value>Остановите видео.</value>
</data>
<data name="SubregionsDescription" xml:space="preserve">
<value>Отдельные области видео для обработки.</value>
</data>
<data name="SubregionsLabel" xml:space="preserve">
<value>Субрегионы</value>
</data>
<data name="Title" xml:space="preserve">
<value>butterflow-щ</value>
</data>
<data name="ToEndLabel" xml:space="preserve">
<value>В конец</value>
</data>
<data name="WidthLabel" xml:space="preserve">
<value>Ширина</value>
</data>
<data name="_120fpsLabel" xml:space="preserve">
<value>120 кадров в секунду</value>
</data>
<data name="_24fpsLabel" xml:space="preserve">
<value>24 кадра в секунду</value>
</data>
<data name="_2xLabel" xml:space="preserve">
<value>2x</value>
</data>
<data name="_30fpsLabel" xml:space="preserve">
<value>30 кадров в секунду</value>
</data>
<data name="_3xLabel" xml:space="preserve">
<value>3x</value>
</data>
<data name="_4xLabel" xml:space="preserve">
<value>4x</value>
</data>
<data name="_60fpsLabel" xml:space="preserve">
<value>60 кадров в секунду</value>
</data>
<data name="CancelLabel" xml:space="preserve">
<value>Отмена</value>
</data>
<data name="CancelTooltip" xml:space="preserve">
<value>Отмените текущую операцию масляного потока.</value>
</data>
<data name="FastPyramidsLabel" xml:space="preserve">
<value>Использование быстрых пирамид</value>
</data>
<data name="FastPyramidsTooltip" xml:space="preserve">
<value />
</data>
<data name="FileOutputGroupBox" xml:space="preserve">
<value>Вывод</value>
</data>
<data name="FlowFilterLabel" xml:space="preserve">
<value>Фильтр потока</value>
</data>
<data name="FlowFilterTooltip" xml:space="preserve">
<value>Фильтр, используемый для оценки оптического потока.</value>
</data>
<data name="IterationsLabel" xml:space="preserve">
<value>Итерации пирамид</value>
</data>
<data name="IterationsTooltip" xml:space="preserve">
<value>Количество итераций, используемых для каждого слоя пирамиды.</value>
</data>
<data name="KeepSubregionsLabel" xml:space="preserve">
<value>Сохранять субрегионы</value>
</data>
<data name="KeepSubregionsTooltip" xml:space="preserve">
<value>Показывает субрегионы, явно не указанные.</value>
</data>
<data name="LevelsLabel" xml:space="preserve">
<value>Уровни</value>
</data>
<data name="LevelsTooltip" xml:space="preserve">
<value>Количество пирамидных слоев.</value>
</data>
<data name="OpenMenuItem" xml:space="preserve">
<value>_Открыто...</value>
</data>
<data name="PixelNeighborhoodLabel" xml:space="preserve">
<value>Пиксельное соседство</value>
</data>
<data name="PixelNeighborhoodTooltip" xml:space="preserve">
<value>Размер окрестности пикселя.</value>
</data>
<data name="ProcessLabel" xml:space="preserve">
<value>Обработать</value>
</data>
<data name="ProcessTooltip" xml:space="preserve">
<value>Обработайте видео. Это может быть долгий процесс.</value>
</data>
<data name="PyramidScaleLabel" xml:space="preserve">
<value>Масштабный коэффициент пирамиды</value>
</data>
<data name="PyramidScaleTooltip" xml:space="preserve">
<value />
</data>
<data name="SaveAsMenuItem" xml:space="preserve">
<value>Сохранить конфигурацию _As ...</value>
</data>
<data name="SaveMenuItem" xml:space="preserve">
<value>_Сохранить конфигурацию ...</value>
</data>
<data name="SmoothDerivativeLabel" xml:space="preserve">
<value>Гладкий производный</value>
</data>
<data name="SmoothDerivativeTooltip" xml:space="preserve">
<value>Размер стандартного отклонения, используемого для гладких производных.</value>
</data>
<data name="SmoothMotionLabel" xml:space="preserve">
<value>Плавное движение</value>
</data>
<data name="SmoothMotionTooltip" xml:space="preserve">
<value>Установите настройку для плавного движения. Этот режим дает без артефактов кадров, подчеркивая смешанные кадры по сравнению с пикселями пикселей.</value>
</data>
<data name="WindowSizeLabel" xml:space="preserve">
<value>Размер окна</value>
</data>
<data name="WindowSizeTooltip" xml:space="preserve">
<value />
</data>
<data name="AboutWindowDescription" xml:space="preserve">
<value>buttterflow-ui - графический пользовательский интерфейс для видеопроцессора butterflow.</value>
</data>
<data name="AboutWindowGithubLinkLabel" xml:space="preserve">
<value>GitHub</value>
</data>
<data name="AboutWindowLicenseLinkLabel" xml:space="preserve">
<value>лицензия</value>
</data>
<data name="AboutWindowTitle" xml:space="preserve">
<value>О butterflow-ui</value>
</data>
<data name="CopyArgumentsMenu" xml:space="preserve">
<value>Копировать аргументы масляного потока</value>
</data>
<data name="DevelopersLabel" xml:space="preserve">
<value>Разработчики и участники</value>
</data>
<data name="LanguageLabel" xml:space="preserve">
<value>язык</value>
</data>
<data name="OKLabel" xml:space="preserve">
<value>ОК</value>
</data>
<data name="OpenSourceCreditsLabel" xml:space="preserve">
<value>Библиотеки с открытым исходным кодом</value>
</data>
<data name="OptionsMenu" xml:space="preserve">
<value>Параметры приложения ...</value>
</data>
<data name="OptionsWindowLanguageChangeNotice" xml:space="preserve">
<value>Примечание. Для изменения языка пользователя потребуется перезапуск программы.</value>
</data>
<data name="OptionsWindowTitle" xml:space="preserve">
<value>Опции</value>
</data>
<data name="SaveLabel" xml:space="preserve">
<value>Сохранить</value>
</data>
<data name="VersionLabel" xml:space="preserve">
<value>Версия</value>
</data>
<data name="ButterflowUIConfigurationLabel" xml:space="preserve">
<value>Файл конфигурации ButterflowUI</value>
</data>
<data name="MultipleFilesPreviewWarningLabel" xml:space="preserve">
<value>Предварительный просмотр видео и отсечение субрегиона недоступны при обработке нескольких файлов.</value>
</data>
<data name="MultipleFilesText" xml:space="preserve">
<value>[Несколько файлов]</value>
</data>
<data name="SupportedFileTypesLabel" xml:space="preserve">
<value>Поддерживаемые типы файлов</value>
</data>
<data name="BehindVersionStatusDescription" xml:space="preserve">
<value>Текущая версия находится за репозиторием github и должна быть обновлена.</value>
</data>
<data name="CurrentVersionStatusDescription" xml:space="preserve">
<value>Текущая версия обновлена с помощью репозитория github.</value>
</data>
<data name="CustomVersionStatusDescription" xml:space="preserve">
<value>Текущая версия опережает репозиторий github или представляет собой пользовательскую версию butterflow-ui, которую нельзя сравнить с репозиторием github.</value>
</data>
<data name="UnknownVersionStatusDescription" xml:space="preserve">
<value>Github не смог ответить текущей версией. Это может быть связано с ограничениями скорости или сбоем сети.</value>
</data>
<data name="BehindVersionQuestion" xml:space="preserve">
<value>Вы хотите посетить butterflow-ui на github для обновления до последней версии?</value>
</data>
<data name="UpdateAvailableLabel" xml:space="preserve">
<value>Доступна более новая версия butterflow-ui.</value>
</data>
<data name="DeviceLabel" xml:space="preserve">
<value>Вычислительное устройство</value>
</data>
<data name="ForceCPU" xml:space="preserve">
<value>Force CPU</value>
</data>
</root>

View File

@ -0,0 +1,399 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="AboutButterflowMenu" xml:space="preserve">
<value>github上的butterflow ...</value>
</data>
<data name="AboutButterflowUIMenu" xml:space="preserve">
<value>在github上的butterflow-ui ...</value>
</data>
<data name="AboutMenu" xml:space="preserve">
<value>关于butterflow-ui</value>
</data>
<data name="AdvancedOptionsGroupBox" xml:space="preserve">
<value>高级选项</value>
</data>
<data name="ClipTooltip" xml:space="preserve">
<value>剪辑视频中的子区域。</value>
</data>
<data name="CommonOptionsGroupBox" xml:space="preserve">
<value>常见选项</value>
</data>
<data name="CustomPlaybackRateLabel" xml:space="preserve">
<value>自定义费率</value>
</data>
<data name="EditMenu" xml:space="preserve">
<value>_编辑</value>
</data>
<data name="EndLabel" xml:space="preserve">
<value>Ë</value>
</data>
<data name="FileInputGroupBox" xml:space="preserve">
<value>输入</value>
</data>
<data name="FileLabel" xml:space="preserve">
<value>视频文件</value>
</data>
<data name="FileMenu" xml:space="preserve">
<value>_文件</value>
</data>
<data name="HeightLabel" xml:space="preserve">
<value>高度</value>
</data>
<data name="HelpMenu" xml:space="preserve">
<value>_帮帮我</value>
</data>
<data name="KeepAudioDescription" xml:space="preserve">
<value>使用原始视频中的音频渲染输出视频。在未选中状态下,输出视频中不会包含任何声音。</value>
</data>
<data name="KeepAudioLabel" xml:space="preserve">
<value>保持音频</value>
</data>
<data name="LosslessDescription" xml:space="preserve">
<value>在没有有损压缩的情况下呈现视频。视频不会失去任何视觉质量,但会产生非常大的输出文件。</value>
</data>
<data name="LosslessLabel" xml:space="preserve">
<value>无损质量</value>
</data>
<data name="PlaybackRateDescription" xml:space="preserve">
<value>控制输出视频的新帧速率。这可以用绝对和相对术语来设置。</value>
</data>
<data name="PlaybackRateLabel" xml:space="preserve">
<value>播放率</value>
</data>
<data name="PlayPauseTooltip" xml:space="preserve">
<value>播放/暂停视频。</value>
</data>
<data name="RenderingLabel" xml:space="preserve">
<value>视频渲染</value>
</data>
<data name="ResolutionLabel" xml:space="preserve">
<value>输出分辨率</value>
</data>
<data name="SkipBackTooltip" xml:space="preserve">
<value>在视频中向后跳过。</value>
</data>
<data name="SkipForwardTooltip" xml:space="preserve">
<value>在视频中向前跳过。</value>
</data>
<data name="StartLabel" xml:space="preserve">
<value>小号</value>
</data>
<data name="StopTooltip" xml:space="preserve">
<value>停止视频。</value>
</data>
<data name="SubregionsDescription" xml:space="preserve">
<value>要处理的视频的各个区域。</value>
</data>
<data name="SubregionsLabel" xml:space="preserve">
<value>分区域</value>
</data>
<data name="Title" xml:space="preserve">
<value>butterflow的UI</value>
</data>
<data name="ToEndLabel" xml:space="preserve">
<value>结束</value>
</data>
<data name="WidthLabel" xml:space="preserve">
<value>宽度</value>
</data>
<data name="_120fpsLabel" xml:space="preserve">
<value>120 fps</value>
</data>
<data name="_24fpsLabel" xml:space="preserve">
<value>24 fps</value>
</data>
<data name="_2xLabel" xml:space="preserve">
<value>2倍</value>
</data>
<data name="_30fpsLabel" xml:space="preserve">
<value>30 fps</value>
</data>
<data name="_3xLabel" xml:space="preserve">
<value>3X</value>
</data>
<data name="_4xLabel" xml:space="preserve">
<value>4X</value>
</data>
<data name="_60fpsLabel" xml:space="preserve">
<value>60 fps</value>
</data>
<data name="CancelLabel" xml:space="preserve">
<value>取消</value>
</data>
<data name="CancelTooltip" xml:space="preserve">
<value>取消当前的butterflow操作。</value>
</data>
<data name="FastPyramidsLabel" xml:space="preserve">
<value>使用快速金字塔</value>
</data>
<data name="FastPyramidsTooltip" xml:space="preserve">
<value />
</data>
<data name="FileOutputGroupBox" xml:space="preserve">
<value>产量</value>
</data>
<data name="FlowFilterLabel" xml:space="preserve">
<value>流量过滤器</value>
</data>
<data name="FlowFilterTooltip" xml:space="preserve">
<value>用于光流估计的滤波器。</value>
</data>
<data name="IterationsLabel" xml:space="preserve">
<value>金字塔迭代</value>
</data>
<data name="IterationsTooltip" xml:space="preserve">
<value>每个金字塔图层使用的迭代次数。</value>
</data>
<data name="KeepSubregionsLabel" xml:space="preserve">
<value>保留子区域</value>
</data>
<data name="KeepSubregionsTooltip" xml:space="preserve">
<value>渲染未明确指定的子区域。</value>
</data>
<data name="LevelsLabel" xml:space="preserve">
<value>水平</value>
</data>
<data name="LevelsTooltip" xml:space="preserve">
<value>金字塔层数。</value>
</data>
<data name="OpenMenuItem" xml:space="preserve">
<value>_打开...</value>
</data>
<data name="PixelNeighborhoodLabel" xml:space="preserve">
<value>像素邻居</value>
</data>
<data name="PixelNeighborhoodTooltip" xml:space="preserve">
<value>像素邻域的大小。</value>
</data>
<data name="ProcessLabel" xml:space="preserve">
<value>处理</value>
</data>
<data name="ProcessTooltip" xml:space="preserve">
<value>处理视频。这可能是一个漫长的过程。</value>
</data>
<data name="PyramidScaleLabel" xml:space="preserve">
<value>金字塔比例因子</value>
</data>
<data name="PyramidScaleTooltip" xml:space="preserve">
<value />
</data>
<data name="SaveAsMenuItem" xml:space="preserve">
<value>保存配置_As ...</value>
</data>
<data name="SaveMenuItem" xml:space="preserve">
<value>_保存配置......</value>
</data>
<data name="SmoothDerivativeLabel" xml:space="preserve">
<value>光滑的衍生物</value>
</data>
<data name="SmoothDerivativeTooltip" xml:space="preserve">
<value>用于平滑导数的标准偏差的大小。</value>
</data>
<data name="SmoothMotionLabel" xml:space="preserve">
<value>平稳运动</value>
</data>
<data name="SmoothMotionTooltip" xml:space="preserve">
<value>设置为调整平滑运动。此模式通过强调扭曲像素上的混合帧来产生无伪影帧。</value>
</data>
<data name="WindowSizeLabel" xml:space="preserve">
<value>窗口大小</value>
</data>
<data name="WindowSizeTooltip" xml:space="preserve">
<value />
</data>
<data name="AboutWindowDescription" xml:space="preserve">
<value>buttterflow-ui是butterflow视频处理器的图形用户界面。</value>
</data>
<data name="AboutWindowGithubLinkLabel" xml:space="preserve">
<value>github上</value>
</data>
<data name="AboutWindowLicenseLinkLabel" xml:space="preserve">
<value>执照</value>
</data>
<data name="AboutWindowTitle" xml:space="preserve">
<value>关于butterflow-ui</value>
</data>
<data name="CopyArgumentsMenu" xml:space="preserve">
<value>复制butterflow参数</value>
</data>
<data name="DevelopersLabel" xml:space="preserve">
<value>开发人员和贡献者</value>
</data>
<data name="LanguageLabel" xml:space="preserve">
<value>语言</value>
</data>
<data name="OKLabel" xml:space="preserve">
<value>好</value>
</data>
<data name="OpenSourceCreditsLabel" xml:space="preserve">
<value>开源库</value>
</data>
<data name="OptionsMenu" xml:space="preserve">
<value>应用选项......</value>
</data>
<data name="OptionsWindowLanguageChangeNotice" xml:space="preserve">
<value>注意:更改用户语言将需要重新启动程序。</value>
</data>
<data name="OptionsWindowTitle" xml:space="preserve">
<value>选项</value>
</data>
<data name="SaveLabel" xml:space="preserve">
<value>保存</value>
</data>
<data name="VersionLabel" xml:space="preserve">
<value>版</value>
</data>
<data name="ButterflowUIConfigurationLabel" xml:space="preserve">
<value>ButterflowUI配置文件</value>
</data>
<data name="MultipleFilesPreviewWarningLabel" xml:space="preserve">
<value>处理多个文件时,视频预览和子区域剪辑不可用。</value>
</data>
<data name="MultipleFilesText" xml:space="preserve">
<value>[多个文件]</value>
</data>
<data name="SupportedFileTypesLabel" xml:space="preserve">
<value>支持的文件类型</value>
</data>
<data name="BehindVersionStatusDescription" xml:space="preserve">
<value>当前版本位于github存储库后面应该更新。</value>
</data>
<data name="CurrentVersionStatusDescription" xml:space="preserve">
<value>当前版本是github存储库的最新版本。</value>
</data>
<data name="CustomVersionStatusDescription" xml:space="preserve">
<value>当前版本领先于github存储库或者是butterflow-ui的自定义版本无法与github存储库进行比较。</value>
</data>
<data name="UnknownVersionStatusDescription" xml:space="preserve">
<value>Github未对当前版本做出回应。这可能是因为速率限制或网络故障。</value>
</data>
<data name="BehindVersionQuestion" xml:space="preserve">
<value>你是否想在github上访问butterflow-ui更新到最新版本</value>
</data>
<data name="UpdateAvailableLabel" xml:space="preserve">
<value>有更新版本的butterflow-ui可供选择。</value>
</data>
<data name="DeviceLabel" xml:space="preserve">
<value>计算设备</value>
</data>
<data name="ForceCPU" xml:space="preserve">
<value>部队中央处理股</value>
</data>
</root>

View File

@ -15,16 +15,18 @@
<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" />
<butterflow_ui:BoolVisibilityConverter x:Key="BoolVisibilityConverter" />
<butterflow_ui:InverseBoolVisibilityConverter x:Key="InverseBoolVisibilityConverter" />
</Window.Resources>
<DockPanel>
<Menu DockPanel.Dock="Top">
@ -54,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>
@ -81,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>
@ -93,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" Text="{Binding OptionsConfiguration.VideoInput, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=PropertyChanged}"/>
<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>
@ -105,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=TwoWay, 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>
@ -132,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" />
@ -144,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" />
@ -156,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>
@ -201,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}">
@ -231,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}" />
@ -274,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>
@ -307,20 +308,23 @@
</ProgressBar.Style>
</ProgressBar>
</Grid>
<gu:MediaElementWrapper Grid.Row="1" Name="mediaPreview" Stretch="Uniform" ScrubbingEnabled="True" Source="{Binding OptionsConfiguration.VideoInput, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=PropertyChanged}" MediaOpened="mediaPreview_MediaOpened" MediaEnded="mediaPreview_MediaEnded" />
<Grid Grid.Row="2">
<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" 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" />
<ColumnDefinition Width="*" />
<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>
<StackPanel Grid.Row="3" Orientation="Horizontal" HorizontalAlignment="Center">
<StackPanel Grid.Row="3" Orientation="Horizontal" HorizontalAlignment="Center" Visibility="{Binding OptionsConfiguration.MultipleFiles, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type butterflow_ui:MainWindow}}, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource InverseBoolVisibilityConverter}}">
<Button Name="bntVideoBackward" BorderThickness="0" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" Click="bntVideoBackward_Click">
<ContentControl HorizontalAlignment="Center" Template="{StaticResource BackwardIcon}" />
</Button>
@ -355,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

@ -25,6 +25,9 @@ namespace butterflow_ui
{
#region Members
/// <summary> List of types of videos supported by ffmpeg, and thus butterflow. </summary>
private const string SUPPORTED_FILE_TYPES = "*.3dostr;*.3g2;*.3gp;*.4xm;*.a64;*.aa;*.aac;*.ac3;*.acm;*.act;*.adf;*.adp;*.ads;*.adts;*.adx;*.aea;*.afc;*.aiff;*.aix;*.alaw;*.alias_pix;*.alsa;*.amr;*.anm;*.apc;*.ape;*.apng;*.aqtitle;*.asf;*.asf_o;*.asf_stream;*.ass;*.ast;*.au;*.avi;*.avisynth;*.avm2;*.avr;*.avs;*.bethsoftvid;*.bfi;*.bfstm;*.bin;*.bink;*.bit;*.bmp_pipe;*.bmv;*.boa;*.brender_pix;*.brstm;*.c93;*.caca;*.caf;*.cavsvideo;*.cdg;*.cdxl;*.chromaprint;*.cine;*.concat;*.crc;*.dash;*.data;*.daud;*.dcstr;*.dds_pipe;*.dfa;*.dirac;*.dnxhd;*.dpx_pipe;*.dsf;*.dsicin;*.dss;*.dts;*.dtshd;*.dv;*.dv1394;*.dvbsub;*.dvbtxt;*.dvd;*.dxa;*.ea;*.ea_cdata;*.eac3;*.epaf;*.exr_pipe;*.f32be;*.f32le;*.f4v;*.f64be;*.f64le;*.fbdev;*.ffm;*.ffmetadata;*.fifo;*.film_cpk;*.filmstrip;*.flac;*.flic;*.flv;*.framecrc;*.framehash;*.framemd5;*.frm;*.fsb;*.g722;*.g723_1;*.g729;*.genh;*.gif;*.gsm;*.gxf;*.h261;*.h263;*.h264;*.hash;*.hds;*.hevc;*.hls;*.hls;*.applehttp;*.hnm;*.ico;*.idcin;*.idf;*.iec61883;*.iff;*.ilbc;*.image2;*.image2pipe;*.ingenient;*.ipmovie;*.ipod;*.ircam;*.ismv;*.iss;*.iv8;*.ivf;*.ivr;*.j2k_pipe;*.jack;*.jacosub;*.jpeg_pipe;*.jpegls_pipe;*.jv;*.latm;*.lavfi;*.libcdio;*.libdc1394;*.libgme;*.libopenmpt;*.live_flv;*.lmlm4;*.loas;*.lrc;*.lvf;*.lxf;*.m4v;*.matroska;*.matroska;*.webm;*.md5;*.mgsts;*.microdvd;*.mjpeg;*.mkvtimestamp_v2;*.mkv;*.mlp;*.mlv;*.mm;*.mmf;*.mov;*.mov;*.mp4;*.m4a;*.3gp;*.3g2;*.mj2;*.mp2;*.mp3;*.mp4;*.mpc;*.mpc8;*.mpeg;*.mpeg1video;*.mpeg2video;*.mpegts;*.mpegtsraw;*.mpegvideo;*.mpjpeg;*.mpl2;*.mpsub;*.msf;*.msnwctcp;*.mtaf;*.mtv;*.mulaw;*.musx;*.mv;*.mvi;*.mxf;*.mxf_d10;*.mxf_opatom;*.mxg;*.nc;*.nistsphere;*.nsv;*.null;*.nut;*.nuv;*.oga;*.ogg;*.ogv;*.oma;*.openal;*.opengl;*.opus;*.oss;*.paf;*.pam_pipe;*.pbm_pipe;*.pcx_pipe;*.pgm_pipe;*.pgmyuv_pipe;*.pictor_pipe;*.pjs;*.pmp;*.png_pipe;*.ppm_pipe;*.psp;*.psxstr;*.pulse;*.pva;*.pvf;*.qcp;*.qdraw_pipe;*.r3d;*.rawvideo;*.realtext;*.redspark;*.rl2;*.rm;*.roq;*.rpl;*.rsd;*.rso;*.rtp;*.rtp_mpegts;*.rtsp;*.s16be;*.s16le;*.s24be;*.s24le;*.s32be;*.s32le;*.s8;*.sami;*.sap;*.sbg;*.sdl;*.sdl2;*.sdp;*.sdr2;*.segment;*.sgi_pipe;*.shn;*.siff;*.singlejpeg;*.sln;*.smjpeg;*.smk;*.smoothstreaming;*.smush;*.sndio;*.sol;*.sox;*.spdif;*.spx;*.srt;*.stl;*.stream_segment;*.ssegment;*.subviewer;*.subviewer1;*.sunrast_pipe;*.sup;*.svag;*.svcd;*.swf;*.tak;*.tedcaptions;*.tee;*.thp;*.tiertexseq;*.tiff_pipe;*.tmv;*.truehd;*.tta;*.tty;*.txd;*.u16be;*.u16le;*.u24be;*.u24le;*.u32be;*.u32le;*.u8;*.uncodedframecrc;*.v210;*.v210x;*.v4l2;*.vag;*.vc1;*.vc1test;*.vcd;*.video4linux2;*.v4l2;*.vivo;*.vmd;*.vob;*.vobsub;*.voc;*.vpk;*.vplayer;*.vqf;*.w64;*.wav;*.wc3movie;*.webm;*.webm_chunk;*.webm_dash_manifest;*.webp;*.webp_pipe;*.webvtt;*.wsaud;*.wsd;*.wsvqa;*.wtv;*.wv;*.wve;*.x11grab;*.xa;*.xbin;*.xmv;*.xv;*.xvag;*.xwma;*.yop;*.yuv4mpegpipe";
/// <summary> True if is the user has started clipping, false if not. </summary>
private bool isClipping;
/// <summary> The temporary storage for the clip start time. </summary>
@ -48,6 +51,20 @@ namespace butterflow_ui
this.ButterflowWrapper.ParsedConsoleOutputRecieved += ButterflowWrapper_ParsedConsoleOutputRecieved;
this.OptionsConfiguration.AddConstantCallProperty("CommandLineOutput");
InitializeComponent();
// Check for updates.
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)
{
Process.Start("https://github.com/wagesj45/butterflow-ui/releases/latest");
this.Close();
}
}
}
#region Methods
@ -97,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;
}
@ -110,18 +127,29 @@ namespace butterflow_ui
private void btnFilePicker_Click(object sender, RoutedEventArgs e)
{
var ofd = new OpenFileDialog();
ofd.Filter = "Supported Video Files|*.mp4;*.mkv";
ofd.Multiselect = true;
ofd.Filter = Localization.Localization.SupportedFileTypesLabel + "|" + SUPPORTED_FILE_TYPES;
var result = ofd.ShowDialog(this);
if (result.HasValue && result.Value)
{
this.OptionsConfiguration.VideoInput = ofd.FileName;
this.OptionsConfiguration.VideoInput = ofd.FileNames;
this.ButterflowWrapper.Probe(ofd.FileName);
//Hack to get the first frame to display in the media preview element.
mediaPreview.Play();
mediaPreview.PausePlayback();
if (ofd.FileNames.Count() == 1)
{
this.txtFileName.Text = ofd.FileName;
this.mediaPreview.Source = new Uri(ofd.FileName);
//Hack to get the first frame to display in the media preview element.
this.mediaPreview.Play();
this.mediaPreview.PausePlayback();
}
else
{
this.txtFileName.Text = Localization.Localization.MultipleFilesText;
this.mediaPreview.Source = default(Uri);
}
}
}
@ -230,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>
@ -330,7 +349,7 @@ namespace butterflow_ui
{
var button = sender as Button;
if(button != null)
if (button != null)
{
if (button.Tag.GetType() == typeof(Guid))
{
@ -351,14 +370,14 @@ namespace butterflow_ui
private void menuOpen_Click(object sender, RoutedEventArgs e)
{
var ofd = new OpenFileDialog();
ofd.Filter = "ButterflowUI Configuration|*.bui";
ofd.Filter = Localization.Localization.ButterflowUIConfigurationLabel + "|*.bui";
var result = ofd.ShowDialog(this);
if (result.HasValue && result.Value)
{
var binaryFormatter = new BinaryFormatter();
var file = binaryFormatter.Deserialize(ofd.OpenFile());
if(file is OptionsConfigurationFile)
if (file is OptionsConfigurationFile)
{
this.OptionsConfiguration.LoadFile((OptionsConfigurationFile)file);
}
@ -371,7 +390,7 @@ namespace butterflow_ui
private void menuSaveConfiguration_Click(object sender, RoutedEventArgs e)
{
var sfd = new SaveFileDialog();
sfd.Filter = "ButterflowUI Configuration|*.bui";
sfd.Filter = Localization.Localization.ButterflowUIConfigurationLabel + "|*.bui";
var result = sfd.ShowDialog(this);
if (result.HasValue && result.Value)
@ -414,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

@ -0,0 +1,148 @@
using csmic;
using Octokit;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace butterflow_ui
{
/// <summary>
/// An wrapper for the Octokit.net class. This class is used to extract functionality for
/// checking github for updates to butterflow-ui installation.
/// </summary>
public static class OctokitWrapper
{
#region Members
/// <summary> The RegEx string for matching . </summary>
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;
#endregion
#region Properties
/// <summary> Gets the current version status of this installation. </summary>
/// <value> The current version status of this installation. </value>
public static VersionStatus CurrentVersionStatus
{
get
{
return versionStatus;
}
}
/// <summary> Gets information describing the current version status. </summary>
/// <value> Information describing the current version status. </value>
public static string CurrentVersionStatusDescription
{
get
{
switch (CurrentVersionStatus)
{
case VersionStatus.Current:
return Localization.Localization.CurrentVersionStatusDescription;
case VersionStatus.Behind:
return Localization.Localization.BehindVersionStatusDescription;
case VersionStatus.Custom:
return Localization.Localization.CustomVersionStatusDescription;
case VersionStatus.Unknown:
default:
return Localization.Localization.UnknownVersionStatusDescription;
}
}
}
#endregion
#region Constructor
/// <summary> Static constructor. </summary>
static OctokitWrapper()
{
versionStatus = GetVersionStatus();
}
#endregion
#region Methods
/// <summary> Gets version status from github. </summary>
/// <returns> The current version status. </returns>
private static VersionStatus GetVersionStatus()
{
try
{
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())
{
var latest = releases.First();
decimal latestMajor = 0, latestMinor = 0, latestPatch = 0, currentMajor = 0, currentMinor = 0, currentPatch = 0;
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);
}
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.Current;
}
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;
}
#endregion
#region Subclasses
/// <summary> Values that represent version status of the current installation of butterflow-ui. </summary>
public enum VersionStatus
{
/// <summary> The current version is up to date with the github repository. </summary>
Current,
/// <summary> The current version is behind the github repository and should be updated. </summary>
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,
/// <summary> Github failed to respond with the current version. This could be because of rate limits or a network failure. </summary>
Unknown
}
#endregion
}
}

View File

@ -2,54 +2,109 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using butterflow_ui.Properties;
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
{
#region Members
/// <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;
private bool keepSubRegions;
/// <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;
private string videoInput;
/// <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
@ -63,6 +118,16 @@ namespace butterflow_ui
}
}
/// <summary> Gets a value indicating whether butterflow will process multiple files. </summary>
/// <value> True if butterflow will process multiple files, false if not. </value>
public bool MultipleFiles
{
get
{
return this.VideoInput != null && this.VideoInput.Count() > 1;
}
}
/// <summary> Gets or sets the playback rate. </summary>
/// <value> The playback rate. </value>
public string PlaybackRate
@ -79,7 +144,7 @@ namespace butterflow_ui
}
/// <summary> Gets or sets a value indicating whether the keep audio. </summary>
/// <value> True if keep audio, false if not. </value>
/// <value> True if keeping audio in the final video, false if not. </value>
public bool KeepAudio
{
get
@ -118,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);
}
@ -145,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;
@ -177,11 +242,11 @@ namespace butterflow_ui
{
get
{
return this.keepSubRegions;
return this.keepSubregions;
}
set
{
this.keepSubRegions = value;
this.keepSubregions = value;
OnPropertyChanged();
}
}
@ -203,7 +268,7 @@ namespace butterflow_ui
/// <summary> Gets or sets the video input file path. </summary>
/// <value> The video input file path. </value>
public string VideoInput
public IEnumerable<string> VideoInput
{
get
{
@ -213,6 +278,7 @@ namespace butterflow_ui
{
this.videoInput = value;
OnPropertyChanged();
OnPropertyChanged("MultipleFiles");
}
}
@ -323,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;
}
@ -378,7 +444,7 @@ namespace butterflow_ui
}
}
#endregion
#endregion Properties
#region Contructors
@ -394,6 +460,8 @@ namespace butterflow_ui
this.smoothDerivativeStandardDeviation = DEFAULT_SMOOTH_DERIVATIVE_STANDARD_DEVIATION;
this.flowFilterType = DEFAULT_FLOW_FILTER_TYPE;
this.videoInput = new string[0];
this.subregions.CollectionChanged += Subregions_CollectionChanged; ;
}
@ -402,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;
}
@ -420,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()
@ -439,7 +516,7 @@ namespace butterflow_ui
FlowFilterType = this.flowFilterType,
Iterations = this.iterations,
KeepAudio = this.keepAudio,
KeepSubregions = this.keepSubRegions,
KeepSubregions = this.keepSubregions,
Levels = this.levels,
LockAspectRatio = this.lockAspectRatio,
LosslessQuality = this.losslessQuality,
@ -476,11 +553,11 @@ namespace butterflow_ui
/// <summary> Converts this object to a butterflow options. </summary>
/// <returns> This object as a string. </returns>
public string ToButterflowArguments()
public string ToButterflowArguments(int videoInputIndex = 0)
{
var stringBuilder = new StringBuilder("-v "); // Verbose
if (this.LockAspectRatio)
if(this.LockAspectRatio)
{
stringBuilder.AppendFormat("-vs {0}:-1 ", this.Width);
}
@ -489,28 +566,40 @@ namespace butterflow_ui
stringBuilder.AppendFormat("-vs {0}:{1} ", this.Width, this.Height);
}
if (!string.IsNullOrWhiteSpace(this.PlaybackRate)) stringBuilder.AppendFormat("-r {0} ", this.PlaybackRate);
if (this.KeepAudio) stringBuilder.Append("-audio ");
if (this.LosslessQuality) stringBuilder.Append("-l ");
if(!Settings.Default.UseDefaultDevice)
{
if(Settings.Default.Device == 0)
{
stringBuilder.Append("-sw ");
}
if(Settings.Default.Device > 0)
{
stringBuilder.AppendFormat("-device {0} ", Settings.Default.Device - 1);
}
}
if (this.Subregions.Any())
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())
{
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";
}
@ -520,19 +609,48 @@ 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 (!string.IsNullOrWhiteSpace(this.VideoOutput)) stringBuilder.AppendFormat("-o \"{0}\" ", this.VideoOutput);
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);
stringBuilder.AppendFormat("\"{0}\"", this.VideoInput);
if(!string.IsNullOrWhiteSpace(this.VideoOutput))
{
string videoOutputFile = string.Empty;
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++)
{
format.Append("0");
}
format.Append("}");
format.Append(Path.GetExtension(this.VideoOutput));
var newName = string.Format(format.ToString(), videoInputIndex + 1); // Since the index is zero based, we will add one to make the output more human readable.
videoOutputFile = Path.Combine(Path.GetDirectoryName(this.VideoOutput), newName);
}
else
{
videoOutputFile = this.VideoOutput;
}
stringBuilder.AppendFormat("-o \"{0}\" ", videoOutputFile);
}
if(this.VideoInput.Any())
{
stringBuilder.AppendFormat("\"{0}\"", this.VideoInput.ElementAt(videoInputIndex));
}
return stringBuilder.ToString();
}
@ -544,6 +662,6 @@ namespace butterflow_ui
return ToButterflowArguments();
}
#endregion
#endregion Methods
}
}
}

View File

@ -6,25 +6,67 @@ using System.Threading.Tasks;
namespace butterflow_ui
{
/// <summary> An options configuration file. </summary>
/// <summary> An options configuration file. This class is used to serialize out the configuration to a file. </summary>
[Serializable]
public class OptionsConfigurationFile
{
#region Properties
/// <summary> Gets or sets the playback rate. </summary>
/// <value> The playback rate. </value>
public string PlaybackRate { get; set; }
/// <summary> Gets or sets a value indicating whether the keep audio. </summary>
/// <value> True if keep audio, false if not. </value>
public bool KeepAudio { get; set; }
/// <summary> Gets or sets a value indicating whether the keep subregions that are not explicitly specified. </summary>
/// <value> True if keeping subregions not explicitly specified, false if not. </value>
public bool KeepSubregions { get; set; }
/// <summary> Gets or sets a value indicating whether the result is rendered in lossless quality. </summary>
/// <value> True if lossless quality is selected, false if not. </value>
public bool LosslessQuality { get; set; }
/// <summary> Gets or sets a value indicating whether the butterflow should be turned toward smooth motion. </summary>
/// <value> True if tuned toward smooth motion, false if not. </value>
public bool SmoothMotion { get; set; }
/// <summary> Gets or sets a value indicating whether to lock aspect ratio of the video. </summary>
/// <value> True if locking aspect ratio of the video, false if not. </value>
public bool LockAspectRatio { get; set; }
/// <summary> Gets or sets a value indicating whether to use fast pyramids. </summary>
/// <value> True if using fast pyramids, false if not. </value>
public bool FastPyramid { get; set; }
/// <summary> Gets or sets the pyramid scale factor. </summary>
/// <value> The pyramid scale factor. </value>
public decimal PyramidScale { get; set; }
/// <summary> Gets or sets the number of pyramid layers. </summary>
/// <value> The number of pyramid layers. </value>
public int Levels { get; set; }
/// <summary> Gets or sets the size of the windowing average. </summary>
/// <value> The size of the windowing average. </value>
public int WindowSize { get; set; }
/// <summary> Gets or sets the number of iterations at each pyramid level. </summary>
/// <value> The number of iterations at each pyramid level. </value>
public int Iterations { get; set; }
/// <summary> Gets or sets the size of the pixel neighborhood. </summary>
/// <value> The size of the pixel neighborhood. </value>
/// <remarks> Per butterflow's documentation, the valid range for --poly-n is {5,7}. </remarks>
public int PixelNeighborhood { get; set; }
/// <summary> Gets or sets the standard deviation of smooth derivatives. </summary>
/// <value> The standard deviation of smooth derivatives. </value>
public decimal SmoothDerivativeStandardDeviation { get; set; }
/// <summary> Gets or sets the type of the flow filter used for optical flow calculations. </summary>
/// <value> The type of the flow filter used for optical flow calculations. </value>
public FlowFilterType FlowFilterType { get; set; }
#endregion

View File

@ -8,15 +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}" VerticalAlignment="Center" />
</WrapPanel>
<TextBlock Text="{x:Static loc:Localization.OptionsWindowLanguageChangeNotice}" />
<Separator Margin="0,10" />
<Button Name="btnSave" MaxWidth="45" Content="{x:Static loc:Localization.SaveLabel}" Click="btnSave_Click" />
</StackPanel>
</DockPanel>
</Window>
</Window>

View File

@ -1,4 +1,5 @@
using System;
using butterflow_ui.Properties;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
@ -21,25 +22,34 @@ namespace butterflow_ui
{
#region Properties
/// <summary> The butterflow wrapper used to call butterflow. </summary>
public ButterflowWrapper ButterflowWrapper { get; set; } = new ButterflowWrapper();
/// <summary> Gets or sets the supported languages. </summary>
/// <value> The supported languages. </value>
public List<CultureInfo> SupportedLanguages { get; set; } = new List<CultureInfo>(new[]
{
CultureInfo.CreateSpecificCulture("en-US"),
CultureInfo.CreateSpecificCulture("es-ES")
CultureInfo.CreateSpecificCulture("es"),
CultureInfo.CreateSpecificCulture("ar"),
CultureInfo.CreateSpecificCulture("ja"),
CultureInfo.CreateSpecificCulture("ru"),
CultureInfo.CreateSpecificCulture("zh-CN"),
});
#endregion
#endregion Properties
#region Constructors
/// <summary> Default constructor. </summary>
public OptionsWindow()
{
this.ButterflowWrapper.GetDevices();
this.ButterflowWrapper.ButterflowExited += ButterflowWrapper_ButterflowExited;
InitializeComponent();
}
#endregion
#endregion Constructors
#region Methods
@ -53,6 +63,21 @@ namespace butterflow_ui
this.Close();
}
#endregion
/// <summary> Butterflow wrapper butterflow exited. </summary>
/// <param name="sender"> Source of the event. </param>
/// <param name="e"> The ButterflowExitArgs to process. </param>
private void ButterflowWrapper_ButterflowExited(object sender, ButterflowWrapper.ButterflowExitArgs e)
{
if(Settings.Default.Device >= 0)
{
this.comboDeviceList.Dispatcher.Invoke(() => this.comboDeviceList.SelectedIndex = Settings.Default.Device);
}
else
{
this.comboDeviceList.Dispatcher.Invoke(() => this.comboDeviceList.SelectedIndex = 0);
}
}
#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;
@ -8,11 +6,11 @@ using System.Windows;
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("butterflow-ui")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyDescription("A graphical user interface for butterflow. ")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyCompany("butterflow-ui developers")]
[assembly: AssemblyProduct("butterflow-ui")]
[assembly: AssemblyCopyright("Copyright © 2018")]
[assembly: AssemblyCopyright("MIT License")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@ -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.0.0")]
[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.7.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())));
@ -34,5 +34,29 @@ namespace butterflow_ui.Properties {
this["Language"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("0")]
public int Device {
get {
return ((int)(this["Device"]));
}
set {
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

@ -5,5 +5,11 @@
<Setting Name="Language" Type="System.Globalization.CultureInfo" Scope="User">
<Value Profile="(Default)">en-US</Value>
</Setting>
<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

@ -28,8 +28,28 @@ namespace butterflow_ui
#region Methods
/// <summary> Executes the property changed action. </summary>
/// <param name="name"> The name. </param>
/// <summary>
/// Executes the property changed action. This alerts subscribers to its change in value.
/// </summary>
/// <param name="name"> (Optional) The name of the property. </param>
/// <example>
/// This will automatically pass in "SomeProperty" as the property name, derived useing the
/// <see cref="CallerMemberNameAttribute" /> attribute.
/// <code lang="cs" title="Automatic Property Detection">
/// public bool SomeProperty
/// {
/// get
/// {
/// return this.someProperty;
/// }
/// set
/// {
/// this.someProperty = value;
/// OnPropertyChanged();
/// }
/// }
/// </code>
/// </example>
protected virtual void OnPropertyChanged([CallerMemberName]string name = null)
{
if (!string.IsNullOrWhiteSpace(name))
@ -42,6 +62,7 @@ namespace butterflow_ui
}
}
/// <summary> Executes when all properties are changed and should be updated. </summary>
protected virtual void OnAllPropertiesChanged()
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(string.Empty));
@ -51,7 +72,7 @@ namespace butterflow_ui
/// <param name="name"> The name of the property. </param>
public void AddConstantCallProperty(string name)
{
if(this.alwaysCall == null)
if (this.alwaysCall == null)
{
// This item has been deserialized and the list needs to be reinitialized.
this.alwaysCall = new List<string>();

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.

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