private void RunSecondPass()
        {
            var inputFile = new InputFileOptions();
            inputFile.FilePath = Path.GetFullPath(SourceFilePath);

            var outputFile = new OutputFileOptions();

            if (ShouldDeinterlaceVideo)
                outputFile.Add(new DeinterlaceVideoOption());

            if (_VideoWidth.IsSet && _VideoWidth.Value != 0)
                GeckonPresets.ApplyHighQualitySecondPassPreset(outputFile, VideoBitrate, AudioBitrate, VideoWidth, VideoHeight);
            else
                GeckonPresets.ApplyHighQualitySecondPassPreset(outputFile, VideoBitrate, AudioBitrate);

            outputFile.FilePath = Path.GetFullPath(DestinationFilePath);

            outputFile.Add(new ThreadsOption(ThreadsOption.AUTOMATICALLY_SELECT_NUMBER_OF_THREADS));

            using (var wrapper = new FFmpegWrapper())
            {
                wrapper.FFmpegExecutablePath = Path.GetFullPath(FFmpegFilePath);

                wrapper.AddInputFileOptions(inputFile);
                wrapper.OutputFileOptions = outputFile;

                wrapper.WorkingDirectory = TemporaryDirectoryPath;

                wrapper.ProgressDataChanged += SecondPassProgressDataChanged;

                wrapper.UnparsedOutputOccurred += (sender, args) => _FFmpegOutput.AppendLine(args.EventObject);
                wrapper.WarningOccurred += (sender, args) => _FFmpegOutput.AppendLine(args.EventObject.Warning);
                wrapper.ErrorOccurred += (sender, args) => _FFmpegOutput.AppendLine(args.EventObject.ToString());

                wrapper.Execute();

                FFmpegArguments += "\n" + wrapper.FFmpegArguments;

                wrapper.ProgressDataChanged -= SecondPassProgressDataChanged;
            }
        }
        private void CutFrame()
        {
            var inputFile = new InputFileOptions();
            inputFile.FilePath = Path.GetFullPath(SourceFilePath);

            var outputFile = new OutputFileOptions();

            if (_Width.IsSet && _Width.Value != 0)
                GeckonPresets.ApplyCutVideoFramePreset(inputFile, outputFile, TimeSpan.Parse(_VideoPosition.Value), Width, Height);
            else
                GeckonPresets.ApplyCutVideoFramePreset(inputFile, outputFile, TimeSpan.Parse(_VideoPosition.Value));

            outputFile.FilePath = Path.GetFullPath(DestinationFilePath);

            using (var wrapper = new FFmpegWrapper())
            {
                wrapper.FFmpegExecutablePath = Path.GetFullPath(FFmpegFilePath);

                wrapper.AddInputFileOptions(inputFile);
                wrapper.OutputFileOptions = outputFile;

                wrapper.ProgressDataChanged += ProgressDataChanged;

                wrapper.RawOutputOccurred += (sender, e) => Console.WriteLine(e.EventObject);

                wrapper.Execute();

                wrapper.ProgressDataChanged -= ProgressDataChanged;
            }
        }
        private void AdjustVideoSize()
        {
            var inputFile = new InputFileOptions();
            inputFile.FilePath = Path.GetFullPath(SourceFilePath);

            using (var wrapper = new FFmpegWrapper())
            {
                wrapper.FFmpegExecutablePath = Path.GetFullPath(FFmpegFilePath);

                wrapper.AddInputFileOptions(inputFile);

                wrapper.WorkingDirectory = TemporaryDirectoryPath;

                wrapper.UnparsedOutputOccurred += (sender, args) => _FFmpegOutput.AppendLine(args.EventObject);
                wrapper.WarningOccurred += (sender, args) => _FFmpegOutput.AppendLine(args.EventObject.Warning);
                wrapper.ErrorOccurred += (sender, args) => _FFmpegOutput.AppendLine(args.EventObject.ToString());

                wrapper.Execute();

                if (wrapper.MediaData.Inputs.Count < 1)
                    return;

                StreamData stream;

                try
                {
                    stream = wrapper.MediaData.Inputs[0].Streams.First(s => s.Value.Type == StreamType.Video).Value;
                }
                catch (InvalidOperationException)
                {
                    return; //No video stream found, so aspectratio can be determined
                }

                var sizeData = stream.ParsedData.OfType<StreamSizeData>();

                if(sizeData.Count() == 0)
                    return;

                var firstSizeData = sizeData.First();

                var aspect = firstSizeData.DisplayAspectRatio ?? firstSizeData.Size.Width / (double)firstSizeData.Size.Height; //Use DAR if available, else use video resolution

                if (VideoWidth / aspect < VideoHeight)
                    _VideoHeight.Value = (uint)(Math.Round(VideoWidth / aspect / 2) * 2); //Make sure size is dividable by two
                else
                    _VideoWidth.Value = (uint)(Math.Round(VideoHeight * aspect / 2) * 2); //Make sure size is dividable by two
            }
        }
        private void AdjustVideoSize()
        {
            var inputFile = new InputFileOptions();
            inputFile.FilePath = Path.GetFullPath(SourceFilePath);

            using (var wrapper = new FFmpegWrapper())
            {
                wrapper.FFmpegExecutablePath = Path.GetFullPath(FFmpegFilePath);

                wrapper.AddInputFileOptions(inputFile);

                wrapper.Execute();

                if (wrapper.MediaData.Inputs.Count < 1)
                    return;

                StreamData stream;

                try
                {
                    stream = wrapper.MediaData.Inputs[0].Streams.First(s => s.Value.Type == StreamType.Video).Value;
                }
                catch (InvalidOperationException)
                {
                    return; //No video stream found, so aspectratio can be determined
                }

                var sizeData = stream.ParsedData.OfType<StreamSizeData>();

                if (sizeData.Count() == 0)
                    return;

                var firstSizeData = sizeData.First();

                var aspect = firstSizeData.DisplayAspectRatio ?? firstSizeData.Size.Width / (double)firstSizeData.Size.Height; //Use DAR if available, else use video resolution

                if (Width / aspect < Height)
                    _Height.Value = (uint)(Math.Round(Width / aspect / 2) * 2); //Make sure size is dividable by two
                else
                    _Width.Value = (uint)(Math.Round(Height * aspect / 2) * 2); //Make sure size is dividable by two
            }
        }