private void Decode(string path, string url) { Monitor.CurrentWork = 0; _tokenSource = new CancellationTokenSource(); token.token = false; int width; if (url == "") { width = (new MP4Info()).GetWidthFromPath(path); } else { width = (new MP4Info()).GetWidthFromUrl(url); } OptionsStruct opt = new OptionsStruct(0); opt.cellCount = 1; opt.density = 1; opt.pxlFmtIn = PixelFormat.YUV420P; opt.pxlFmtOut = PixelFormat.YUV420P; opt.resolution = (ResolutionsEnum)width; OptionsStruct headopt = opt; opt.cellCount = 1; opt.density = 1; List <ChainNode> nodes = new List <ChainNode>(); Pipe pipein = new Pipe(_tokenSource.Token); ChainNode node; /* * node = new NodeDebugRawStorage(null,pipein); */ if (url == "") { node = new NodeFrameFromMP4(path, opt, pipein, token); } else { node = new NodeFrameFromYoutube(url, opt, pipein, token); } nodes.Add(node); ChainNode n1 = node; Pipe pipeout = pipein; pipein = new Pipe(_tokenSource.Token); node = new NodeBlocksFromFrame(opt, pipeout, pipein, token); ChainNode n2 = node; nodes.Add(node); pipeout = pipein; // Task.Run(()=>Parallel.ForEach(nodes, (n) => n.Start())); Task.Run(() => { n1.Start(); }, _tokenSource.Token); Task.Run(() => { n2.Start(); }, _tokenSource.Token); nodes = new List <ChainNode>(); //HEADER START string fileName = ""; long fileSize = 0; DataHeader.FromPipe(ref opt, ref fileName, ref fileSize, pipeout); fileName = System.IO.Path.GetDirectoryName(path) + @"\" + fileName; //HEADER END pipein = new Pipe(_tokenSource.Token); node = new NodeBitsFromBlock(opt, pipeout, pipein, token); nodes.Add(node); pipeout = pipein; pipein = new Pipe(_tokenSource.Token); node = new NodeFromBits(pipeout, pipein, token); nodes.Add(node); pipeout = pipein; pipein = new Pipe(_tokenSource.Token); node = new NodeECCDecoder(pipeout, pipein); nodes.Add(node); pipeout = pipein; pipein = new Pipe(_tokenSource.Token); node = new NodeWriter(fileName, fileSize, pipeout, Monitor); nodes.Add(node); Task.Run(() => { Parallel.ForEach(nodes, (n) => n.Start()); } , _tokenSource.Token ); Task.Run(() => { while (Monitor.TotalWork != (Monitor.CurrentWork + 1)) { System.Threading.Thread.Sleep(100); } Monitor.Add(1); _tokenSource.Cancel(); token.token = true; } ); }