コード例 #1
0
        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();
        }