コード例 #1
0
ファイル: ProjectCompiler.cs プロジェクト: subelf/CsmStudio
        private async Task <ClipEntry> CompileDocumentClip(CompilingProgressManager reporter, DocumentClipDescriptor clip, DirectoryInfo pesDir)
        {
            byte tId          = 0;
            var  tPgsTaskList = new List <Task <PgsEntryDescriptor> >();

            foreach (var iTrack in clip.Tracks)
            {
                tPgsTaskList.Add(Task.Run(
                                     () => CompileTrack(reporter, clip, iTrack, pesDir, Muxer.GetPgsPid(tId++))
                                     ));
            }
            await Task.WhenAll(tPgsTaskList);

            TimeSpan  tMaxLength = tPgsTaskList.Max(xPgsTask => xPgsTask.Result.Length);
            ClipEntry tClipEntry = new ClipEntry(clip.ClipId, clip.InTimeOffset, clip.InTimeOffset + tMaxLength);

            foreach (var iPgsTask in tPgsTaskList)
            {
                var tPgsDesc = iPgsTask.Result;
                var tPgs     = new PgsEntry(tPgsDesc.Pid, tPgsDesc.PesFile, tPgsDesc.Lang);
                tClipEntry.AddPgs(tPgs);
            }

            return(tClipEntry);
        }
コード例 #2
0
ファイル: ProjectCompiler.cs プロジェクト: subelf/CsmStudio
        private PgsEntryDescriptor CompileTrack(CompilingProgressManager reporter, DocumentClipDescriptor clip, EsTrackDescriptor track, DirectoryInfo pesDir, ushort pid)
        {
            const string PesFileNameFmt = "{0:00000}.{1:x4}.pes";

            using (var tPgsStreamServer = new AnonymousPipeServerStream(PipeDirection.Out))
                using (var tPgsStream = new AnonymousPipeClientStream(PipeDirection.In, tPgsStreamServer.ClientSafePipeHandle))
                    using (var tReporter = reporter.CreatePgsProgressReporter())
                    {
                        Func <int> tEncodeTaskAction = () =>
                        {
                            using (tPgsStreamServer)
                            {
                                return(EncodePgs(clip, track, tPgsStreamServer, tReporter));
                            }
                        };

                        var tEncodeTask = Task.Run(tEncodeTaskAction);

                        var      tPesFileName = string.Format(PesFileNameFmt, clip.ClipId, pid);
                        FileInfo tPesFile     = pesDir.PickFile(tPesFileName);
                        Pgs2Pes(tPgsStream, tPesFile);

                        return(new PgsEntryDescriptor(
                                   pid,
                                   tPesFile.FullName,
                                   TimeFromFrameCount(tEncodeTask.Result, clip.Rate),
                                   track.Track.Lang
                                   ));
                    }
        }
コード例 #3
0
ファイル: ProjectCompiler.cs プロジェクト: subelf/CsmStudio
        public async Task <bool> Compile(ICompilingProgressReporter reporter, Guid projectId, DirectoryInfo outputDir, params DocumentClipDescriptor[] clips)
        {
            AssertNotDisposed();

            var tPgsNum          = clips.Sum(xClip => xClip.Tracks.Count);
            var tProgressManager = new CompilingProgressManager(reporter, tPgsNum);

            ProjectSettings tProjSettings = new ProjectSettings()
            {
                OutputDir = outputDir,
                TempDir   = settings.TempDir.NavigateTo(string.Format(PesMuxOutputPath, projectId))
            };
            Project tProj = new Project(tProjSettings);

            var tPesDir    = settings.TempDir.NavigateTo(string.Format(PesEncOutputPath, projectId)).SafeCreate(string.Empty);
            var tClipTasks =
                (from iClip in clips select CompileDocumentClip(tProgressManager, iClip, tPesDir)).ToArray();

            var tPgsEncTask = Task.WhenAll(tClipTasks);

            try { await tPgsEncTask; } catch { }

            if (tPgsEncTask.Exception != null || reporter.IsCanceled)
            {
                ReportSummary(reporter, tPgsEncTask.Exception);
                return(false);
            }

            tProj.AddClipList(tClipTasks.Select(xClipTask => xClipTask.Result));
            var tPesMuxTask = this.GetPesMuxer().Mux(tProj, tProgressManager);

            try { await tPesMuxTask; } catch { }

            if (tPesMuxTask.Exception != null || reporter.IsCanceled)
            {
                ReportSummary(reporter, tPesMuxTask.Exception);
                return(false);
            }

            ReportSummary(reporter, null);
            return(true);
        }