Example #1
0
        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;
            }
                     );
        }