示例#1
0
        public void Evaluate(int SpreadMax)
        {
            if (FInDevice.IsChanged || FInMode.IsChanged || FInFormat.IsChanged || FInUsage.IsChanged || FInHandle.IsChanged || FInEnabled.IsChanged || FInSyncLoop.IsChanged || FInSyncLoop.IsChanged)
            {
                foreach (var slice in FInstances)
                {
                    if (slice != null)
                    {
                        slice.Dispose();
                    }
                }

                FInstances.SliceCount = 0;
                FOutStatus.SliceCount = SpreadMax;

                for (int i = 0; i < SpreadMax; i++)
                {
                    try
                    {
                        if (FInDevice[i] == null)
                        {
                            throw (new Exception("No device selected"));
                        }
                        if (FInMode[i] == null)
                        {
                            throw (new Exception("No mode selected"));
                        }
                        if (FInEnabled[i] == false)
                        {
                            throw (new Exception("Disabled"));
                        }

                        FInstances.Add(new Instance(FInDevice[i].Index, FInMode[i].Index, FInHandle[i], FInFormat[i], FInUsage[i], FInSyncLoop[i]));
                        FOutStatus[i] = "OK";
                    }
                    catch (Exception e)
                    {
                        FInstances.Add(null);
                        FOutStatus[i] = e.Message;
                    }
                }
            }

            FOutFramesInBuffer.SliceCount = FInstances.SliceCount;
            for (int i = 0; i < FInstances.SliceCount; i++)
            {
                if (FInstances[i] == null)
                {
                    FOutFramesInBuffer[i] = 0;
                }
                else
                {
                    FOutFramesInBuffer[i] = FInstances[i].FramesInBuffer;
                }
            }
        }
示例#2
0
        public void Evaluate(int SpreadMax)
        {
            if (FInDevice.IsChanged || FInFramerate.IsChanged || FInChannel.IsChanged || FInChannels.IsChanged)
            {
                foreach (var instance in FInstances)
                {
                    if (instance != null)
                    {
                        instance.Dispose();
                    }
                }

                FInstances.SliceCount   = 0;
                FOutStatus.SliceCount   = SpreadMax;
                FOutTimecode.SliceCount = SpreadMax;

                for (int i = 0; i < SpreadMax; i++)
                {
                    try
                    {
                        var instance = new DecodeInstance(FInDevice[i], FInChannels[i], FInChannel[i], FInFramerate[i]);
                        FInstances.Add(instance);
                        FOutStatus[i] = "OK";
                    }
                    catch (Exception e)
                    {
                        FInstances.Add(null);
                        FOutStatus[i] = e.Message;
                    }
                }
            }

            for (int i = 0; i < FInstances.SliceCount; i++)
            {
                if (FInstances[i] != null)
                {
                    try
                    {
                        FOutTimecode[i] = FInstances[i].Timecode;
                    }
                    catch
                    {
                    }
                }
                else
                {
                    FOutTimecode[i] = null;
                }
            }
        }
示例#3
0
        private void CheckChanges()
        {
            if (FCaptures.SliceCount != FPinInCameraID.SliceCount)
            {
                while (FCaptures.SliceCount < FPinInCameraID.SliceCount)
                {
                    FCaptures.Add <CaptureVideoInstance>(new CaptureVideoInstance());
                }
                for (int iDispose = FPinInCameraID.SliceCount; iDispose < FCaptures.SliceCount; iDispose++)
                {
                    FCaptures[iDispose].Dispose();
                }
                FCaptures.SliceCount = FPinInCameraID.SliceCount;
            }

            for (int i = 0; i < FPinInCameraID.SliceCount; i++)
            {
                if (FCaptures[i] == null)
                {
                    FCaptures[i] = new CaptureVideoInstance();
                }


                FCaptures[i].Initialise(FPinInCameraID[i], FPinInWidth[i], FPinInHeight[i]);
            }
        }
示例#4
0
        void CheckSliceCount(int SpreadMax)
        {
            if (SpreadMax == FInstances.SliceCount)
            {
                return;
            }

            for (int i = FInstances.SliceCount; i < SpreadMax; i++)
            {
                FInstances.Add(new ImageInstance());
            }
            for (int i = SpreadMax; i < FInstances.SliceCount; i++)
            {
                FInstances[i] = null;
                FInstances.RemoveAt(i);
            }

            FPinOutImageDepth.SliceCount = SpreadMax;
            FPinOutImageImage.SliceCount = SpreadMax;
            FPinOutImageWorld.SliceCount = SpreadMax;
            FPinOutStatus.SliceCount     = SpreadMax;

            for (int i = 0; i < SpreadMax; i++)
            {
                FPinOutImageDepth[i] = FInstances[i].Depth.Link;
                FPinOutImageImage[i] = FInstances[i].Image.Link;
                FPinOutImageWorld[i] = FInstances[i].World.Link;
            }
        }
        private void Add(CVImageInput input)
        {
            T addition = new T();

            addition.SetInput(input);

            FProcess.Add(addition);
        }
示例#6
0
        public void TestSingleAdd()
        {
            var spread = new Spread <int>(0);

            spread.Add(10);
            Assert.AreEqual(1, spread.SliceCount);
            Assert.AreEqual(10, spread[0]);
        }
示例#7
0
        public void Evaluate(int SpreadMax)
        {
            if (this.FTexIn.IsConnected)
            {
                binSize = FIndex.SliceCount;

                // manage generators
                if (generators.SliceCount > binSize)
                {
                    for (int i = generators.SliceCount; i > binSize; i--)
                    {
                        generators[i].Dispose();
                    }
                }

                if (generators.SliceCount < binSize)
                {
                    for (int i = generators.SliceCount; i < binSize; i++)
                    {
                        generators.Add(new DX11Resource <CopySubArray>());
                    }
                }


                // manage TextureOutput(s)
                if (this.FTextureOutput.SliceCount > binSize)
                {
                    for (int t = binSize; t < this.FTextureOutput.SliceCount; t++)
                    {
                        if (this.FTextureOutput[t] != null)
                        {
                            this.FTextureOutput[t].Dispose();
                        }
                    }
                }

                FTextureOutput.SliceCount = binSize;

                for (int i = 0; i < binSize; i++)
                {
                    if (this.FTextureOutput[i] == null)
                    {
                        this.FTextureOutput[i] = new DX11Resource <DX11RenderTextureArray>();
                    }
                }
            }
            else
            {
                for (int i = 0; i < FTextureOutput.SliceCount; i++)
                {
                    if (this.FTextureOutput[i] != null)
                    {
                        this.FTextureOutput[i].Dispose();
                    }
                }
                FTextureOutput.SliceCount = 0;
            }
        }
        private void Add(CVImageInput input)
        {
            CVImageOutput output   = new CVImageOutput();
            T             addition = new T();

            addition.SetInput(input);

            FProcess.Add(addition);
        }
        private void Add()
        {
            CVImageOutput output   = new CVImageOutput();
            T             addition = new T();

            addition.SetOutput(output);

            FProcess.Add(addition);
            FOutput.Add(output);
        }
示例#10
0
        public override Spread <VObject> ToSpread(VObjectDictionaryWrap Source)
        {
            Spread <VObject>  Out     = new Spread <VObject>();
            VObjectDictionary Content = Source.Content as VObjectDictionary;

            Out.SliceCount = 0;
            foreach (KeyValuePair <string, VObjectCollectionWrap> kvp in Content.Objects)
            {
                Out.Add(kvp.Value);
            }
            return(Out);
        }
示例#11
0
        public static void Split(KeyState keyState, out ISpread <int> keys, out int time)
        {
            keys = new Spread <int>();
            Keys keyCode = keyState.KeyCode;

            if ((keyCode & Keys.Shift) > 0)
            {
                keys.Add((int)Keys.ShiftKey);
            }
            if ((keyCode & Keys.Control) > 0)
            {
                keys.Add((int)Keys.ControlKey);
            }
            if ((keyCode & Keys.Alt) > 0)
            {
                keys.Add((int)Keys.Menu);
            }
            if ((keyCode & ~Keys.Modifiers) != Keys.None)
            {
                keys.Add((int)(keyCode & ~Keys.Modifiers));
            }
            time = keyState.Time;
        }
示例#12
0
        public void TestMultipleAdd()
        {
            var spread = new Spread <int>(0);

            for (int i = 0; i < sampleData.Length; i++)
            {
                spread.Add(sampleData[i]);
            }

            Assert.AreEqual(sampleData.Length, spread.SliceCount);
            for (int i = 0; i < sampleData.Length; i++)
            {
                Assert.AreEqual(sampleData[i], spread[i]);
            }
        }
示例#13
0
文件: Store.cs 项目: vnmone/vvvv-sdk
        //called when data for any output pin is requested
        public void Evaluate(int SpreadMax)
        {
            if (FClear[0])
            {
                FOut.SliceCount = 0;
            }

            if (FFlush[0])
            {
                FOut.AssignFrom(FIn);
            }

            if (PinChanged())
            {
                Spread <Spread <T> > buffer = new Spread <Spread <T> >(0);

                int incr = 0, sum = 0;
                while (!(sum >= FOut.SliceCount && (incr % FBinSize.SliceCount) == 0))
                {
                    buffer.Add((Spread <T>)FOut.GetRange(sum, FBinSize[incr]));
                    sum += FBinSize[incr];
                    incr++;
                }

                incr = 0;
                for (int i = 0; i < FId.SliceCount; i++)
                {
                    int binSize = 1;
                    try
                    {
                        binSize = buffer[FId[i]].SliceCount;
                    }
                    catch
                    {
                        binSize = FBinSize[FId[i]];
                    }
                    Alter(i, incr, binSize, ref buffer);
                    incr += binSize;
                }

                FOut.SliceCount = 0;
                foreach (Spread <T> t in buffer)
                {
                    FOut.AddRange(t);
                }
            }
        }
示例#14
0
 public override Spread <object> ToSpread(object Source)
 {
     if (Source is VObjectCollection)
     {
         Spread <object>   Out     = new Spread <object>();
         VObjectCollection Content = Source as VObjectCollection;
         Out.SliceCount = 0;
         foreach (KeyValuePair <string, object> kvp in Content.Children)
         {
             Out.Add(kvp.Value);
         }
         return(Out);
     }
     else
     {
         Spread <object> Out = new Spread <object>();
         Out.SliceCount = 0;
         return(Out);
     }
 }
示例#15
0
        void CheckSliceCount(int SpreadMax)
        {
            if (SpreadMax == FState.SliceCount)
            {
                return;
            }

            for (int i = FState.SliceCount; i < SpreadMax; i++)
            {
                FState.Add <Device>(new Device());
            }
            for (int i = SpreadMax; i < FState.SliceCount; i++)
            {
                FState[i] = null;
                FState.RemoveAt <Device>(i);
            }

            FPinOutContext.SliceCount = FState.SliceCount;
            FPinOutStatus.SliceCount  = FState.SliceCount;
        }
示例#16
0
文件: Store.cs 项目: vnmone/vvvv-sdk
 public virtual void Alter(int i, int incr, int binSize, ref Spread <Spread <T> > buffer)
 {
     if (FSet[i] && buffer.SliceCount > 0)
     {
         buffer[FId[i]] = (Spread <T>)FIn.GetRange(incr, binSize);
     }
     if (FRemove[i] && buffer.SliceCount > 0)
     {
         buffer.RemoveAt(FId[i]);
     }
     if (FInsert[i])
     {
         int id = VMath.Zmod(FId[i], buffer.SliceCount + 1);
         if (buffer.SliceCount > 0 || id < buffer.SliceCount)
         {
             buffer.Insert(id, (Spread <T>)FIn.GetRange(incr, binSize));
         }
         else
         {
             buffer.Add((Spread <T>)FIn.GetRange(incr, binSize));
         }
     }
 }
        void FillFrameList(BitmapDecoder decoder)
        {
            //continue if loaded
            Progress = 1;
            var list = new List<FrameData>(decoder.Frames.Count);
            var delaySpread = new Spread<int>(0);
            var positionSpread = new Spread<Vector2D>(0);
            var sizeSpread = new Spread<Vector2D>(0);
            var disposalSpread = new Spread<GifDisposal>(0);

            Format = decoder.Frames[0].Format;

            //convert and copy frames
            foreach (var frame in decoder.Frames)
            {

                //read meta data
                if(!frame.IsFrozen)
                    frame.Freeze();

                var meta = frame.Metadata as BitmapMetadata;
                if(meta != null)
                {
                    if(meta.ContainsQuery("/grctlext/Delay"))
                        delaySpread.Add((ushort)meta.GetQuery("/grctlext/Delay"));
                    else
                        delaySpread.Add(0);

                    if(meta.ContainsQuery("/grctlext/Disposal"))
                        disposalSpread.Add((GifDisposal)((byte)meta.GetQuery("/grctlext/Disposal")));
                    else
                        disposalSpread.Add(GifDisposal.None);

                    var left = (ushort)0;
                    var top = (ushort)0;

                     if(meta.ContainsQuery("/imgdesc/Left"))
                         left = (ushort)meta.GetQuery("/imgdesc/Left");

                     if(meta.ContainsQuery("/imgdesc/Top"))
                         top = (ushort)meta.GetQuery("/imgdesc/Top");

                    positionSpread.Add(new Vector2D(left, top));
                }

                sizeSpread.Add(new Vector2D(frame.PixelWidth, frame.PixelHeight));

                var convertedBitmap = new FormatConvertedBitmap();

                convertedBitmap.BeginInit();
                convertedBitmap.Source = frame;
                convertedBitmap.DestinationFormat = PixelFormats.Bgra32;
                convertedBitmap.EndInit();

                list.Add(CopyBitmapFrameToFrameData(convertedBitmap));
            }

            FFrameDataList = list;

            //recreate texture resources
            FTextureSpread.ResizeAndDispose(FFrameDataList.Count, i => CreateTextureResource(i));
            DelaySpread = delaySpread;
            PositionSpread = positionSpread;
            SizeSpread = sizeSpread;
            DisposalSpread = disposalSpread;
            IsLoading = false;
            HasNewData = true;
        }
示例#18
0
        public ISpread <Frame> Preload(
            ISpread <int> visibleFrameIndices,
            ISpread <int> preloadFrameNrs,
            int bufferSize,
            out int frameCount,
            out double durationIO,
            out double durationTexture,
            out int unusedFrames,
            ref ISpread <bool> loadedFrames)
        {
            frameCount      = FFiles.Length;
            durationIO      = 0.0;
            durationTexture = 0.0;
            unusedFrames    = 0;

            // Nothing to do
            if (FFiles.Length == 0)
            {
                loadedFrames.SliceCount = 0;
                return(new Spread <Frame>(0));
            }

            // Map frame numbers to file names
            var preloadFiles = preloadFrameNrs.Select(frameNr => FFiles[VMath.Zmod(frameNr, FFiles.Length)]).ToArray();

            // Dispose previously loaded frames
            foreach (var file in FPreloadedFrames.Keys.ToArray())
            {
                if (!preloadFiles.Contains(file))
                {
                    var frame = FPreloadedFrames[file];
                    Dispose(frame);
                }
            }

            // Ensure that there are as much dequeues as enqueues (or we'll run out of memory)
            while (FScheduledFrameInfos.Count > preloadFrameNrs.SliceCount)
            {
                var frame     = Dequeue();
                var frameInfo = frame.Metadata;
                if (!preloadFiles.Contains(frameInfo.Filename) || frameInfo.IsCanceled)
                {
                    // Not needed anymore
                    Dispose(frame);
                    unusedFrames++;
                }
                else
                {
                    FPreloadedFrames.Add(frameInfo.Filename, frame);
                }
            }

            // Cancel unused scheduled frames
            foreach (var frameInfo in FScheduledFrameInfos.Where(fi => !fi.IsCanceled))
            {
                if (!preloadFiles.Contains(frameInfo.Filename))
                {
                    frameInfo.Cancel();
                }
            }

            // Free resources if there're no frames to preload and we didn't free them yet
            if (preloadFiles.Length == 0 && !FClearedMemoryPool)
            {
                FMemoryPool.Clear();
                // Remember that we cleared the pool
                FClearedMemoryPool = true;
            }

            // Schedule new frames
            foreach (var file in preloadFiles)
            {
                if (!IsScheduled(file) && !IsPreloaded(file))
                {
                    var frameInfo = CreateFrameInfo(file, bufferSize);
                    Enqueue(frameInfo);
                }
                // We're back using resources from the pool -> not clean anymore
                FClearedMemoryPool = false;
            }

            // Write the "is loaded" state
            loadedFrames.SliceCount = preloadFrameNrs.SliceCount;
            for (int i = 0; i < loadedFrames.SliceCount; i++)
            {
                var file = preloadFiles[i];
                if (!IsPreloaded(file))
                {
                    var frameInfo = FScheduledFrameInfos.First(fi => fi.Filename == file);
                    loadedFrames[i] = frameInfo.IsLoaded;
                }
                else
                {
                    loadedFrames[i] = true;
                }
            }

            // Wait for the visible frames (and dipose unused ones)
            var visibleFrames = new Spread <Frame>(0);
            // Map frame numbers to file names
            var visibleFiles = preloadFiles.Length > 0 ? visibleFrameIndices.Select(i => preloadFiles[VMath.Zmod(i, preloadFiles.Length)]) : Enumerable.Empty <string>();

            foreach (var file in visibleFiles)
            {
                while (!IsPreloaded(file))
                {
                    var frame     = Dequeue();
                    var frameInfo = frame.Metadata;
                    if (!preloadFiles.Contains(frameInfo.Filename) || frameInfo.IsCanceled)
                    {
                        // Not needed anymore
                        Dispose(frame);
                        unusedFrames++;
                    }
                    else
                    {
                        FPreloadedFrames.Add(frameInfo.Filename, frame);
                    }
                }
                var visibleFrame     = FPreloadedFrames[file];
                var visibleFrameInfo = visibleFrame.Metadata;
                durationIO      += visibleFrameInfo.DurationIO;
                durationTexture += visibleFrameInfo.DurationTexture;
                visibleFrames.Add(visibleFrame);
            }

            // Release textures of non visible frames
            foreach (var frame in FPreloadedFrames.Values.Where(f => !visibleFrames.Contains(f)))
            {
                frame.Dispose();
            }

            return(visibleFrames);
        }
示例#19
0
 public void Add(CVImageOutput output)
 {
     FOutput.Add(output);
 }
示例#20
0
        public ISpread <Frame> Preload(
            ISpread <int> visibleFrameIndices,
            ISpread <int> preloadFrameNrs,
            int bufferSize,
            EX9.Format preferedFormat,
            out int frameCount,
            out double durationIO,
            out double durationTexture,
            out int unusedFrames,
            ref ISpread <bool> loadedFrames)
        {
            var files = FFiles;

            frameCount      = files.Length;
            durationIO      = 0.0;
            durationTexture = 0.0;
            unusedFrames    = 0;

            // Nothing to do
            if (files.Length == 0)
            {
                loadedFrames.SliceCount = 0;
                return(new Spread <Frame>(0));
            }

            // Map frame numbers to file names
            var preloadFiles = preloadFrameNrs.Select(
                frameNr =>
            {
                var fileName = files[VMath.Zmod(frameNr, files.Length)];
                return(CreateFrameInfo(fileName, bufferSize, preferedFormat));
            })
                               .ToArray();

            // Dispose previously loaded frames
            foreach (var file in FPreloadedFrames.Keys.ToArray())
            {
                if (!preloadFiles.Contains(file))
                {
                    var frame = FPreloadedFrames[file];
                    Dispose(frame);
                }
            }

            // Ensure that there are as much dequeues as enqueues (or we'll run out of memory)
            while (FScheduledFrameInfos.Count > preloadFrameNrs.SliceCount)
            {
                var frame     = Dequeue();
                var frameInfo = frame.Metadata;
                if (!preloadFiles.Contains(frameInfo) || frameInfo.IsCanceled)
                {
                    // Not needed anymore
                    Dispose(frame);
                    unusedFrames++;
                }
                else
                {
                    FPreloadedFrames.Add(frameInfo, frame);
                }
            }

            // Cancel unused scheduled frames
            foreach (var frameInfo in FScheduledFrameInfos.Where(fi => !fi.IsCanceled))
            {
                if (!preloadFiles.Contains(frameInfo))
                {
                    frameInfo.Cancel();
                }
            }

            // Schedule new frames
            foreach (var file in preloadFiles)
            {
                if (!IsScheduled(file) && !IsPreloaded(file))
                {
                    Enqueue(file);
                }
            }

            // Write the "is loaded" state
            loadedFrames.SliceCount = preloadFrameNrs.SliceCount;
            for (int i = 0; i < loadedFrames.SliceCount; i++)
            {
                var file = preloadFiles[i];
                if (!IsPreloaded(file))
                {
                    var frameInfo = FScheduledFrameInfos.First(fi => fi == file);
                    loadedFrames[i] = frameInfo.IsLoaded;
                }
                else
                {
                    loadedFrames[i] = true;
                }
            }

            // Wait for the visible frames (and dipose unused ones)
            var visibleFrames = new Spread <Frame>(0);
            // Map frame numbers to file names
            var visibleFiles = preloadFiles.Length > 0
                ? visibleFrameIndices.Select(i => preloadFiles[VMath.Zmod(i, preloadFiles.Length)])
                : Enumerable.Empty <FrameInfo>();

            foreach (var file in visibleFiles)
            {
                while (!IsPreloaded(file))
                {
                    var frame     = Dequeue();
                    var frameInfo = frame.Metadata;
                    if (!preloadFiles.Contains(frameInfo) || frameInfo.IsCanceled)
                    {
                        // Not needed anymore
                        Dispose(frame);
                        unusedFrames++;
                    }
                    else
                    {
                        FPreloadedFrames.Add(frameInfo, frame);
                    }
                }
                var visibleFrame     = FPreloadedFrames[file];
                var visibleFrameInfo = visibleFrame.Metadata;
                durationIO      += visibleFrameInfo.DurationIO;
                durationTexture += visibleFrameInfo.DurationTexture;
                visibleFrames.Add(visibleFrame);
            }

            // Release textures of non visible frames
            foreach (var frame in FPreloadedFrames.Values.Where(f => !visibleFrames.Contains(f)))
            {
                frame.Dispose();
            }

            return(visibleFrames);
        }
示例#21
0
文件: Levin.cs 项目: mechaz/vvvv-sdk
        public void Evaluate(int spreadMax)
        {
            FBuffer.ResizeAndDismiss(spreadMax, () => new Spread <double>());
            FDelta.SliceCount = spreadMax;

            //return null if one of the control inputs is null
            if (FDoInsert.IsAnyEmpty(FFrameCount, FReset))
            {
                FOutput.SliceCount = 0;
                return;
            }

            //Reset the BufferSlice
            if (FReset.IsChanged)
            {
                for (int i = 0; i < spreadMax; i++)
                {
                    if (FReset[i])
                    {
                        FBuffer[i] = new Spread <double>();
                        FDelta[i]  = 0;
                    }
                }
            }

            //
            for (int i = 0; i < spreadMax; i++)
            {
                if (FDoInsert[i])
                {
                    //insert new values to the buffer
                    FBuffer[i].Insert(0, FInput[i]);

                    //calculate the delta between the first an last slice
                    if (FBuffer[i].SliceCount > 0)
                    {
                        FDelta[i] = (FBuffer[i][0] - FBuffer[i][FBuffer[i].SliceCount - 1]);
                    }
                }
                else
                {
                    if (FBuffer.SliceCount > 0)
                    {
                        if (FBuffer[i].SliceCount > 0)
                        {
                            //add a new caluclate slice via delta to the spread
                            Spread <double>  MovedBuffer = new Spread <double>();
                            ISpread <double> MovedSpread = FBuffer[i].GetRange(0, FBuffer[i].SliceCount - 1);
                            double           NewSlice    = FBuffer[i][FBuffer[i].SliceCount - 1] + FDelta[i];
                            MovedBuffer.Add(NewSlice);
                            MovedBuffer.AddRange(MovedSpread);
                            FBuffer[i] = MovedBuffer;
                        }
                    }
                }

                //remove slices from the Buffer if the framecount gets smaller
                if (FFrameCount.IsChanged)
                {
                    if (FFrameCount[i] >= 0 && FBuffer[i].SliceCount > FFrameCount[i])
                    {
                        FBuffer[i].RemoveRange(FFrameCount[i], FBuffer[i].SliceCount - FFrameCount[i]);
                    }
                }
            }

            //set the output pins
            FDeltaOut.AssignFrom(FDelta as ISpread <double>);
            FOutput.AssignFrom(FBuffer);
        }