Giter Site home page Giter Site logo

milankarman / unload Goto Github PK

View Code? Open in Web Editor NEW
32.0 1.0 0.0 11.77 MB

An advanced automatic speedrun load time remover for community verifiers.

License: GNU General Public License v3.0

C# 100.00%
speedrunning speedrun moderation verification timing video

unload's Introduction

Hey. I'm Milan, otherwise known as MKarma

About Me

I'm Milan Karman - a 24 year old developer, designer, and video game enthousiast from The Netherlands. I'm a firm believer that anyone can learn any skill, because of that I'm often trying to expand my skillset into all different types of fields that interest me.

I am experienced in full stack web, desktop application and indepedent game development. I also have experience producing video content from trailers to documentaries, as well as doing freelance graphic design.

Contact Me

Email Discord Twitter

Technical Skills

C# JavaScript Python Unity HTML5 CSS3 Node.js React Bootstrap TypeScript Sass Next.js MySQL Photoshop Illustrator InDesign Resolve

unload's People

Contributors

avasam avatar milankarman avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

unload's Issues

A full disk crashes after converting video to images

After converting I got a warning message about possible dropped frames, then it silently crashed.

Here's the most relevant error from windows event viewer. (the rest are generic file write errors with no stacktrace)

Application: Unload.exe
CoreCLR Version: 5.0.1722.21314
.NET Version: 5.0.17
Description: The process was terminated due to an unhandled exception.
Exception Info: System.Configuration.ConfigurationErrorsException: Failed to save settings: An error occurred loading a configuration file: There is not enough space on the disk. : 'C:\Users\Avasam\AppData\Local\milankarman\Unload_Url_rf0ft2rzmgfxnytdef4cfvvl2wq5nvrb\1.3.0.0\13fcqj4k.newcfg' (C:\Users\Avasam\AppData\Local\milankarman\Unload_Url_rf0ft2rzmgfxnytdef4cfvvl2wq5nvrb\1.3.0.0\user.config)
 ---> System.Configuration.ConfigurationErrorsException: An error occurred loading a configuration file: There is not enough space on the disk. : 'C:\Users\Avasam\AppData\Local\milankarman\Unload_Url_rf0ft2rzmgfxnytdef4cfvvl2wq5nvrb\1.3.0.0\13fcqj4k.newcfg' (C:\Users\Avasam\AppData\Local\milankarman\Unload_Url_rf0ft2rzmgfxnytdef4cfvvl2wq5nvrb\1.3.0.0\user.config)
 ---> System.IO.IOException: There is not enough space on the disk. : 'C:\Users\Avasam\AppData\Local\milankarman\Unload_Url_rf0ft2rzmgfxnytdef4cfvvl2wq5nvrb\1.3.0.0\13fcqj4k.newcfg'
   at System.IO.FileStream.WriteCore(ReadOnlySpan`1 source)
   at System.IO.FileStream.FlushWriteBuffer(Boolean calledFromFinalizer)
   at System.IO.FileStream.Dispose(Boolean disposing)
   at System.IO.Stream.Close()
   at System.IO.StreamWriter.CloseStreamFromDispose(Boolean disposing)
   at System.IO.StreamWriter.Dispose(Boolean disposing)
   at System.IO.TextWriter.Dispose()
   at System.Configuration.MgmtConfigurationRecord.SaveAs(String filename, ConfigurationSaveMode saveMode, Boolean forceUpdateAll)
   --- End of inner exception stack trace ---
   at System.Configuration.MgmtConfigurationRecord.SaveAs(String filename, ConfigurationSaveMode saveMode, Boolean forceUpdateAll)
   at System.Configuration.Configuration.SaveAsImpl(String filename, ConfigurationSaveMode saveMode, Boolean forceSaveAll)
   at System.Configuration.ClientSettingsStore.WriteSettings(String sectionName, Boolean isRoaming, IDictionary newSettings)
   --- End of inner exception stack trace ---
   at System.Configuration.ClientSettingsStore.WriteSettings(String sectionName, Boolean isRoaming, IDictionary newSettings)
   at System.Configuration.LocalFileSettingsProvider.SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection values)
   at System.Configuration.SettingsBase.SaveCore()
   at System.Configuration.SettingsBase.Save()
   at System.Configuration.ApplicationSettingsBase.Save()
   at unload.StartWindow.LoadProject(String framesDirectory) in C:\Users\Milan\repos\Unload\Unload\src\windows\StartWindow.xaml.cs:line 129
   at unload.StartWindow.<>c__DisplayClass7_0.<btnConvert_Click>g__onFinished|0() in C:\Users\Milan\repos\Unload\Unload\src\windows\StartWindow.xaml.cs:line 197
   at unload.ConvertWindow.<>c__DisplayClass13_0.<btnConvert_Click>b__3() in C:\Users\Milan\repos\Unload\Unload\src\windows\ConvertWindow.xaml.cs:line 223
   at System.Windows.Threading.DispatcherOperation.InvokeDelegateCore()
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
--- End of stack trace from previous location ---
   at System.Windows.Threading.DispatcherOperation.Wait(TimeSpan timeout)
   at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherOperation operation, CancellationToken cancellationToken, TimeSpan timeout)
   at System.Windows.Threading.Dispatcher.Invoke(Action callback, DispatcherPriority priority, CancellationToken cancellationToken, TimeSpan timeout)
   at System.Windows.Threading.Dispatcher.Invoke(Action callback)
   at unload.ConvertWindow.<>c__DisplayClass13_0.<<btnConvert_Click>b__1>d.MoveNext() in C:\Users\Milan\repos\Unload\Unload\src\windows\ConvertWindow.xaml.cs:line 218
--- End of stack trace from previous location ---
   at System.Threading.Tasks.Task.<>c.<ThrowAsync>b__140_1(Object state)
   at System.Threading.QueueUserWorkItemCallback.<>c.<.cctor>b__6_0(QueueUserWorkItemCallback quwi)
   at System.Threading.ExecutionContext.RunForThreadPoolUnsafe[TState](ExecutionContext executionContext, Action`1 callback, TState& state)
   at System.Threading.QueueUserWorkItemCallback.Execute()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()

Add option to pick start/end time for converting

Some vods aren't cut perfectly and having extra unneeded video frames only means the conversion will take longer. It would be great if the user could specify a start and end time for the conversion to help with that.

Add a progress bar?

After Covert & Load on a file there is no indication of any progress while it takes its time to load the frames would be a nice feature if you could add it.

Threshold on consecutive load frames

Would it be possible to add a feature where you can assign a minimum to the number of consecutive frames that have to pass the similarity check before it is counted as a load?
This would help prevent random frames from mistakenly being counted as loads without having to up the minimum similarity too much.
In the case of the game I run/moderate we have the problem that loading screens and death screens look the same, so when using Unload we also cut out 5 frames every time the runner dies. But if we could set a threshold of say 10 frames before something is counted as a load, then this problem would be solved.

The ability to manually remove items on the "detected loads" panel would also be nice.

[Feature request] Save preferred settings

Just like in #12 , there are some settings I believe could benefit from being saved across sessions of Unload.

  • Minimum Similarity
  • Minimum Frames
  • Concurrent tasks
  • Fast forward step size
  • Snap to detected loads

Improve load cropping sliders

There's two improvements I'd like to see with the sliders:

  1. Represent absolute values from the edge, rather than a point and distance.
    At the moment the sliders on the left "move" the image, and those on the right are the image size. This feels unnatural and leads to having to adjust the sliders multiple time even though the cropping was fine previously. (ie: crop left > zoom in > fix vertical crop > fix vertical zoom)

  2. I would like to see some sort of labeling or identifier to indicate which slider is which (left, top, right, bottom) without having to remember them by heart.

Feature request: Click seek bar to set value

I'd like the bar in video controls to navigate directly to where I'm clicking instead of slowly moving frame by frame.
It's just more convenient than having to click directly on the handle and drag it over.

Feature request: Action to delete frames once I'm done working

I'd like to have to have the option to easily delete the frames of the video I just verified after I'm done with it. From within Unload.
This could be a simple button to "Delete all frames". Or could also be a prompt after exporting the csv and/or before closing Unload (I don't really tend to use the export functionality in the first place).

I will rapidly generate 100s of GB of frames in mere weeks verifying for a single game. And I don't tend to go back to those files once I'm done with them. They will start taking a lot of place until I'm either out of space, and/or I remember to go manually delete the content of my Unload work folder (which takes a few minutes to clear, even when permanently deleting and not sending to the recycle bin). For those reasons, I'd like to be able to easily clear the files I don't need anymore when I'm done timing a video as part of the workflow when working with Unload. And be reminded to do so when I forget.

As a sidenote. Whether the reminder for this, and the reminder to export as CSV, are shown, could be an option. Since not everyone do, and would want to, use those features.

Missing zero in displayed calculated times

Hello. I noticed a small issue in the time calculations for times 1-2 frames after the start of a second.

To illustrate the issue I'm seeing, I changed the end frame for a run I was retiming by advancing it by one frame then recalculating the times. Since I am advancing by one frame at a time, each of these times should be one frame longer than the previous, or 0.033 of a second as it's from a 30 FPS video.

Time without (and with) loads with 1 additional frame added to the end time in each successive calculation:
1:55:48.967
1:55:49.0
1:55:49.33 (incorrect, should be 1:55:49.033 since I advanced by one frame)
1:55:49.67 (incorrect, should be 1:55:49.067, same issue as above)
1:55:49.100
1:55:49.133
1:55:49.167
1:55:49.2

The numbers all appear to be correct, but those two noted times are missing a zero. Obviously something like 49.033 seconds and 49.33 seconds are very different things so this could be pretty confusing if one is looking to calculate milliseconds accurately.

Videos with certain filenames can't be converted

Just tried a video with filename "The Hobbit Full Summary% (Xbox) Speedrun in 2_49_29-YyCiiB7x7vk.mp4" and the FFMpeg console instantly closed. A workaround is renaming the file to something simple before converting it.

Fractional framerate videos crash when trying to advance by .25 seconds.

A minor issue, but I've noticed if a video file has a fractional framerate such as 29.97 Unload will crash if you advance the video using the "fast forward" button.

It works fine when advancing frame-by-frame. It also works fine if I change the framerate in unload to 29 FPS when converting the video to image files, but I also imagine doing so causes some frames from the video to be missing which is not ideal.

Exported CSV does not report framerate used

I was making a custom parser (really just an excel sheet) to calculate segments time between loads. But noticed that the framerate isn't included in the exported CSV. I kinda need it to automate frames --> seconds conversion.

[Feature Request] Specify default working directory

I would like to be able to specify a working directory for Unload. Here's why:

  1. Stay organized. Wherever I take the video from (either from my downloads folder, or my local recordings), the folder of frames will always be in a predetermined location that won't pollute other folders.
  2. Drive efficiency. My downloads and local recordings are on my 2TB harddrive. Aka my storage drive. When I load a video into Unload, it'll most likely be from either of those locations, and will create the frames on my slow storage drive, rather than my much preferable M.2 SSD. This is currently a huge bottleneck for me in terms of efficiency.
    image

Of course I can just move the video over to my SSD (let's say on my desktop). But that's more annoying steps, slowers, and doesn't help with staying organized. While specifying a working directory is a once time thing.

As a bonus: the saved csv file could also default to the specified folder location, with the same default filename as the video (just like the frames folder does)

Masking frame/loading in image file as comparison

Being able to either add an image with an alpha channel or modifying a frame to check for the exact thing you are looking for would help in my opinion. The run I'm trying it on has a static load text but there are different backgrounds behind the text every time, making the similarity go down and getting the desired time periods hard.

Using multiple Load Frames at the same time

The speedgame I'd want to use this tool with has 3 different loadscreens. While it is possible to do 3 separate hash/calculate cycles, it'd be cool if one could streamline the process so that less user input is required overall.

Easier navigation of detected loads

Hey there. Love the new update and the new features it brings, but I have one suggestion that in my experience would significantly improve the program's usability at least for games that have a large amount of loading screens (100+ for example).

I like using the "Snap to detected loads" toggle to quickly skim through a video and see if there's any false-positive frames at the beginnings or ends of detected loads, but I find this feature a bit difficult to use in its current iteration. At the moment it seems the only way to tab through each load in this way is with the mouse on the video scrubber which is bit difficult/straining when you've got to scrub through a bunch of loads and don't want to skip over any for a long run.

I'd love if there was a way to do this with the keyboard or just a button in the UI (maybe next to the "Snap to detected loads" checkbox?) that one could use to move forward/backwards in a way that mimics the scrubber's functionality with this setting checked. I envision something similar to how the forward/backward frame buttons already work, but specifically it would move forward/backward between each load.

At least for my use case this would help a bunch since using the mouse is difficult and clicking on each load individually with the "Go" buttons would be too tedious when just looking to skim through. Thanks.

Application crashes when presented a file in a folder with a name containing %

(Tested on Windows 10 Pro Version 21H1, against Unload Release 1.3.0)

When attempting to Load & Convert a file inside of a folder, if that folder contains the percent (%) symbol (thusly referred to as the problematic folder), the process will critically fail. When attempting this conversion, Unload will successfully read info from the video file and ask you to modify details before confirming to convert. Additionally, it will briefly show a progress bar as it attempts to convert. A conversion folder will be created within the problematic folder, containing an accurate conversion-info.json file as expected. Unload will then display an error message indicating that the expected frame count does not match the converted frame count, before closing completely.

Unexpectedly, an extensionless file is created in the same directory as Unload, bearing the same name as the problematic folder (barring the percent symbol and any following characters). Opening this file in a hex editor indicates this file appears to be something left over by ffmpeg, as the header contains the string Lavc58.134.100. Opening it in VLC reveals it is a video file with the first frame of the video file i attempted to convert. This issue occurs regardless of what file I choose to convert, as long as the file I choose to convert is in a problematic folder or in a subfolder of a problematic folder.

Likely, this is firmly an ffmpeg issue, as it's evident that Unload is able to handle the file path correctly when saving it's conversion-info.json file, but this left-over file uses the same eac3 encoding version that ffmpeg uses, implying that this file was created by ffmpeg. This is as far as my investigation has gotten me, as I'm unfamiliar with this project's code base nor the C# language itself. However, Unload may be able to detect a problematic file path and either abort the conversion attempt or attempt to further sanitize the file path string for ffmpeg.

Additionally, Unload.exe produced this .NET runtime error in the Windows Event Log.

Application: Unload.exe
CoreCLR Version: 5.0.1722.21314
.NET Version: 5.0.17
Description: The process was terminated due to an unhandled exception.
Exception Info: System.ArgumentException: '1' cannot be greater than 0.
   at System.Math.ThrowMinMaxException[T](T min, T max)
   at unload.MainWindow.SetVideoFrame(Int32 frameIndex) in C:\Users\Milan\repos\Unload\Unload\src\windows\MainWindow.xaml.cs:line 111
   at unload.MainWindow..ctor(Project _project) in C:\Users\Milan\repos\Unload\Unload\src\windows\MainWindow.xaml.cs:line 95
   at unload.StartWindow.LoadProject(String framesDirectory) in C:\Users\Milan\repos\Unload\Unload\src\windows\StartWindow.xaml.cs:line 135
   at unload.StartWindow.<>c__DisplayClass7_0.<btnConvert_Click>g__onFinished|0() in C:\Users\Milan\repos\Unload\Unload\src\windows\StartWindow.xaml.cs:line 197
   at unload.ConvertWindow.<>c__DisplayClass13_0.<btnConvert_Click>b__3() in C:\Users\Milan\repos\Unload\Unload\src\windows\ConvertWindow.xaml.cs:line 223
   at System.Windows.Threading.DispatcherOperation.InvokeDelegateCore()
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
--- End of stack trace from previous location ---
   at System.Windows.Threading.DispatcherOperation.Wait(TimeSpan timeout)
   at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherOperation operation, CancellationToken cancellationToken, TimeSpan timeout)
   at System.Windows.Threading.Dispatcher.Invoke(Action callback, DispatcherPriority priority, CancellationToken cancellationToken, TimeSpan timeout)
   at System.Windows.Threading.Dispatcher.Invoke(Action callback)
   at unload.ConvertWindow.<>c__DisplayClass13_0.<<btnConvert_Click>b__1>d.MoveNext() in C:\Users\Milan\repos\Unload\Unload\src\windows\ConvertWindow.xaml.cs:line 218
--- End of stack trace from previous location ---
   at System.Threading.Tasks.Task.<>c.<ThrowAsync>b__140_1(Object state)
   at System.Threading.QueueUserWorkItemCallback.<>c.<.cctor>b__6_0(QueueUserWorkItemCallback quwi)
   at System.Threading.ExecutionContext.RunForThreadPoolUnsafe[TState](ExecutionContext executionContext, Action`1 callback, TState& state)
   at System.Threading.QueueUserWorkItemCallback.Execute()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()

Update documentation from "Concurrent tasks" to "Maximum concurrent tasks"

  1. There's a typo in the readme: "Cocurrent Tasks"
  2. It should be "Maximum Concurrent Tasks". As it may actually use less (see documentation for MaxDegreeOfParallelism https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.paralleloptions.maxdegreeofparallelism?view=net-6.0 ). Setting it anything higher than the number of logical processors should have no effect as far as I understand. Tests on my machine seems to concur.
  3. Indicate in the documentation that setting it higher than the number of logical processors does nothing (or at least doesn't help). Having to specify the maximum is a very edge case. And anything less is only useful if you'd like to keep using your computer for something else while Unload is converting frames (or if your CPU weirdly has issues with using all cores at once)

Ref for logical processors:
image

(this next one I find optional, especially with the 3 points above and #17)
4. Default "Maximum concurrent tasks" to "Auto" or "Max". (which would not specify a MaxDegreeOfParallelism to ParallelOptions). Unless this is one of those edge cases When the thread pool's heuristics is unable to determine the right number of threads to use and could end up injecting too many threads.

Unhandled crash when changing concurrent tasks between two conversions

Steps before the crash:

  • I set my concurrent tasks to 99
  • Clicked convert and load
  • Let the conversion do its thing
  • Change the concurrent tasks to 12
  • Clicked convert and load
  • Start the conversion
  • It's stuck at 0% for a few seconds before crashing the entire app (no crash handler)

Edit: It is easily replicatable. As long as the number of maximum concurrent tasks changes between two conversions.

This is from Windows' event viewer

Application: Unload.exe
CoreCLR Version: 4.700.21.56803
.NET Core Version: 3.1.22
Description: The process was terminated due to an unhandled exception.
Exception Info: Xabe.FFmpeg.Exceptions.ConversionException: ffmpeg version 4.4-full_build-www.gyan.dev Copyright (c) 2000-2021 the FFmpeg developers
  built with gcc 10.2.0 (Rev6, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libglslang --enable-vulkan --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\Users\Avasam\Desktop\[WR] Pitfall_ The Lost Expedition Any% 24_32.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2020-10-10T07:15:25.000000Z
  Duration: 00:25:01.45, start: 0.000000, bitrate: 1500 kb/s
  Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], 1369 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      creation_time   : 2020-10-10T07:15:25.000000Z
      handler_name    : ISO Media file produced by Google Inc. Created on: 10/10/2020.
      vendor_id       : [0][0][0][0]
  Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      creation_time   : 2020-10-10T07:15:25.000000Z
      handler_name    : ISO Media file produced by Google Inc. Created on: 10/10/2020.
      vendor_id       : [0][0][0][0]
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> mjpeg (native))
Press [q] to stop, [?] for help
[swscaler @ 00000157d085dc40] deprecated pixel format used, make sure you did set range correctly
Output #0, image2, to 'C:\Users\Avasam\Desktop\WRPitfallTheLostExpeditionAny2432mp4_frames\%d.jpg':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    encoder         : Lavf58.76.100
  Stream #0:0(und): Video: mjpeg, yuvj420p(pc, bt709, progressive), 640x360 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 30 fps, 30 tbn (default)
    Metadata:
      creation_time   : 2020-10-10T07:15:25.000000Z
      handler_name    : ISO Media file produced by Google Inc. Created on: 10/10/2020.
      vendor_id       : [0][0][0][0]
      encoder         : Lavc58.134.100 mjpeg
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A
frame=    1 fps=0.0 q=0.0 size=N/A time=00:00:00.00 bitrate=N/A speed=   0x    
[image2 @ 00000157ce320540] Could not open file : C:\Users\Avasam\Desktop\WRPitfallTheLostExpeditionAny2432mp4_frames\1.jpg
av_interleaved_write_frame(): I/O error
frame=    2 fps=0.0 q=3.0 Lsize=N/A time=00:00:00.03 bitrate=N/A speed=1.17x    
video:7kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Conversion failed!
   at Xabe.FFmpeg.FFmpegWrapper.<>c__DisplayClass11_0.<RunProcess>b__0()
   at System.Threading.Tasks.Task`1.InnerInvoke()
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location where exception was thrown ---
   at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- End of stack trace from previous location where exception was thrown ---
   at Xabe.FFmpeg.Conversion.Start(String parameters, CancellationToken cancellationToken)
   at unload.VideoProcessor.ConvertToImageSequence(String inputPath, String outputPath, TimeSpan startTime, TimeSpan endTime, Int32 frameWidth, Int32 frameHeight, Double fps, CancellationTokenSource cts, Action`1 onProgress) in C:\Users\milan\repos\UnLoad\Unload\src\processors\VideoProcessor.cs:line 46
   at unload.ConvertWindow.<>c__DisplayClass7_0.<<btnConvert_Click>b__0>d.MoveNext() in C:\Users\milan\repos\UnLoad\Unload\src\windows\ConvertWindow.xaml.cs:line 116
--- End of stack trace from previous location where exception was thrown ---
   at System.Threading.Tasks.Task.<>c.<ThrowAsync>b__139_1(Object state)
   at System.Threading.QueueUserWorkItemCallback.<>c.<.cctor>b__6_0(QueueUserWorkItemCallback quwi)
   at System.Threading.ExecutionContext.RunForThreadPoolUnsafe[TState](ExecutionContext executionContext, Action`1 callback, TState& state)
   at System.Threading.QueueUserWorkItemCallback.Execute()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()

Feature request: hold arrow buttons

I'd like to be able to click and hold the navigation arrows instead of having to mash click them
image

The same speed as clicking and holding the seek/scrub bar at the moment would be fine.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.