public static GlobalExportProgress BuildFromRenderOptionsSingleCommand(ICollection <VideoRenderOption> videoRenderOptions, Action <string, double, double, double> progressChangedCallback)
        {
            var progress = new GlobalExportProgress(videoRenderOptions.Any(v => v.TimeWarpSettings.Any()) ? 2 : 1, progressChangedCallback);

            progress.StartExport();
            return(progress);
        }
        public static GlobalExportProgress BuildFromRenderOptionsPreEffect(ICollection <VideoRenderOption> videoRenderOptions, Action <string, double, double, double> progressChangedCallback)
        {
            // по одной операции для вырезания каждого эпизода.
            var totalOperationsExpected = videoRenderOptions.Count;

            // по одной операции для каждого эпизода с текстом.
            totalOperationsExpected += videoRenderOptions.Count(v => v.OverlayTextTimeTable != null && v.OverlayTextTimeTable.Any());

            // по одной операции для каждого эпизода со штрихами.
            totalOperationsExpected += videoRenderOptions.Count(v => v.ImagesTimeTable != null && v.ImagesTimeTable.Any());

            // по одной операции для каждого эффекта времени.
            totalOperationsExpected += videoRenderOptions.SelectMany(v => v.TimeWarpSettings ?? new List <TimeWarpRecord>()).Count();

            if (videoRenderOptions.Count > 1)
            {
                // один раз склеить и конвертировать эпизоды в конечный формат.
                totalOperationsExpected += 2;
            }

            var progress = new GlobalExportProgress(totalOperationsExpected, progressChangedCallback);

            progress.StartExport();
            return(progress);
        }