public static void Transcode(FormatType type, FormatData data, IList <IFormat> targets, FormatData destination, ProgressIndicator progress) { foreach (IFormat format in targets) { if (format.HasFormat(data)) { Transfer(format, data, destination, progress); return; } } IList <IFormat> formats = FindTranscodePath(data.GetFormats(type), targets); if (formats.Count == 0) { throw new UnsupportedTranscodeException("Could not find a supported transcode path."); } if (formats.Count == 1) { if (formats[0].CanTransfer(data)) { Transfer(formats[0], data, destination, progress); return; } else { formats.Add(formats[0]); } } FormatData tempdata = null; if (formats.Count > 2) { tempdata = new TemporaryFormatData(); } progress.NewTask(formats.Count - 1); for (int i = 1; i < formats.Count; i++) { FormatData dest = i < formats.Count - 1 ? tempdata : destination; Transcode(formats[i - 1], data, formats[i], dest, progress); data = dest; progress.Progress(); } progress.EndTask(); }