private void CutAndDrawTextAndDrawImageAndApplyTimeWarp( FFMpeg ffMpeg, FFMpegCutOptions cutOptions, TemporaryFilesStorage temporaryFilesStorage) { EnsureFileDoesNotExist(cutOptions.OutputFile); var extensionForResultFile = Path.GetExtension(cutOptions.OutputFile); var imagesExist = cutOptions.ImagesTimeTable != null && cutOptions.ImagesTimeTable.Any(); var timeWarpExists = cutOptions.TimeWarps != null && cutOptions.TimeWarps.Any(); if (!cutOptions.OverlayText.Any() && !imagesExist && !timeWarpExists) { ffMpeg.Cut(cutOptions); return; } var intermediateFile1 = temporaryFilesStorage.GetIntermediateFile(extensionForResultFile); ffMpeg.Cut(cutOptions.CloneWithOtherOutput(intermediateFile1)); if (cutOptions.OverlayText.Any()) { var intermediateFile2 = (imagesExist || timeWarpExists) ? temporaryFilesStorage.GetIntermediateFile(extensionForResultFile) : cutOptions.OutputFile; ffMpeg.DrawText(intermediateFile1, cutOptions.OverlayText, intermediateFile2, cutOptions.GlobalExportProgress); File.Delete(intermediateFile1); intermediateFile1 = intermediateFile2; } if (imagesExist) { var intermediateFile3 = timeWarpExists ? temporaryFilesStorage.GetIntermediateFile(extensionForResultFile) : cutOptions.OutputFile; ffMpeg.DrawImage(intermediateFile1, cutOptions.ImagesTimeTable, intermediateFile3, cutOptions.GlobalExportProgress); File.Delete(intermediateFile1); intermediateFile1 = intermediateFile3; } if (timeWarpExists) { ffMpeg.ApplyTimeWarp(intermediateFile1, cutOptions.TimeWarps, cutOptions.OutputFile, this.globalExportProgress); File.Delete(intermediateFile1); } }