Esempio n. 1
0
        void SetupThreads()
        {
            threads = new Thread[streamGraph.nThreadLayers][];
            for (int i = 0; i < streamGraph.nThreadLayers; i++)
            {
                threads[i] = new Thread[streamGraph.nThreadsPerLayer[i]];
                for (int j = 0; j < streamGraph.nThreadsPerLayer[i]; j++)
                {
                    int _i = i;
                    int _j = j;

                    if (streamGraph.graph[i][j] == ThreadType.Camera)
                    {
                        CamStreamManager _manager = managerBundle.camStreamManagers[_j];
                        threads[i][j] = new Thread(() => new OryxCamera(camNumber: _j, managedCamera: managedCameras[_j],
                                                                        manager: _manager, setupInfo: oryxSetups[_j]));
                    }
                    else if (streamGraph.graph[i][j] == ThreadType.SingleCameraStream)
                    {
                        SingleStreamManager _manager = managerBundle.singleStreamManagers[_j];
                        threads[i][j] = new Thread(() => BasicStreamThreadSetups.SingleStreamThreadInit(idx: _j, manager: _manager));
                    }
                    else if (streamGraph.graph[i][j] == ThreadType.MergeStreams)
                    {
                        MergeStreamsManager _manager = managerBundle.mergeStreamsManager;
                        threads[i][j] = new Thread(() => BasicStreamThreadSetups.MergeStreamsThreadInit(manager: _manager));
                    }
                }
            }
        }
Esempio n. 2
0
            void Setup()
            {
                if (graph.architecture != StreamArchitecture.ThreeLevelBasic)
                {
                    throw new ArgumentException(message: "Only StreamArchitecture.ThreeLevelBasic is currently supported.");
                }

                camStreamManagers = new CamStreamManager[graph.nThreadsPerLayer[0]];
                for (int j = 0; j < graph.nThreadsPerLayer[0]; j++)
                {
                    camStreamManagers[j] = new CamStreamManager(messageQueue: messageQueues[0][j], sessionPath: sessionPaths[j], setupStyle: CamStreamManager.CamStreamManagerSetup.BasicStream);
                }

                SingleStreamManager.Output[] _singleStreamOutputs = new SingleStreamManager.Output[graph.nThreadsPerLayer[1]];
                singleStreamManagers = new SingleStreamManager[graph.nThreadsPerLayer[1]];
                for (int j = 0; j < graph.nThreadsPerLayer[1]; j++)
                {
                    CamStreamManager.Output _camOutput = camStreamManagers[j].output;
                    singleStreamManagers[j] = new SingleStreamManager(camOutputManager: _camOutput,
                                                                      messageQueue: messageQueues[1][j], sessionPath: sessionPaths[j], setupStyle: SingleStreamManager.SingleStreamManangerSetup.BasicStream);

                    _singleStreamOutputs[j] = singleStreamManagers[j].output;
                }

                mergeStreamsManager = new MergeStreamsManager(singleStreamOutputManagers: _singleStreamOutputs,
                                                              messageQueue: messageQueues[2][0], sessionPath: sessionPaths[0], setupStyle: MergeStreamsManager.MergeStreamManangerSetup.BasicStream);
            }
Esempio n. 3
0
        public static void SingleStreamThreadInit(int idx, SingleStreamManager manager)
        {
            int             imageCtr        = 0;
            bool            isResizeNeeded  = false;
            Mat             background      = new Mat(size: manager.output.outputChannels[0].imageSize, type: Emgu.CV.CvEnum.DepthType.Cv8U, channels: 1);
            bool            resetBackground = true;
            bool            saveThisImage   = false;
            bool            isMessageDequeueSuccess;
            bool            isInputDequeueSuccess;
            StreamLoopState state = StreamLoopState.Waiting;

            while (true)
            {
                isInputDequeueSuccess = manager.input.streamQueue.TryDequeue(out Tuple <Mat, FrameMetaData>[] input);
                if (isInputDequeueSuccess)
                {
                    ProcessInput();
                }

                UpdateLoopState();
                if (state == StreamLoopState.Streaming)
                {
                    continue;
                }
                else if (state == StreamLoopState.Waiting)
                {
                    Thread.Sleep(100);
                }
                else if (state == StreamLoopState.Exit)
                {
                    return;
                }

                void ProcessInput()
                {
                    imageCtr += 1;
                    if (imageCtr % manager.input.inputChannels[0].enqueueOrDequeueRate != 0)
                    {
                        input[0].Item1.Dispose();
                        return;
                    }

                    if (isResizeNeeded)
                    {
                        // TODO: Implement resize operation
                    }

                    if (saveThisImage)
                    {
                        Console.WriteLine("SaveThisImage message received on SingleStreamThread");
                        saveThisImage = false;
                    }

                    if (resetBackground)
                    {
                        Console.WriteLine("ResetBackground message received on SingleStreamThread");
                        input[0].Item1.CopyTo(background);
                        resetBackground = false;
                        Console.WriteLine("resetBackground = false");
                    }

                    if (imageCtr % manager.output.outputChannels[0].enqueueOrDequeueRate != 0)
                    {
                        input[0].Item1.Dispose();
                        return;
                    }
                    else
                    {
                        manager.output.streamQueue.Enqueue(item: input);
                    }
                }

                void UpdateLoopState()
                {
                    isMessageDequeueSuccess = manager.messageQueue.TryDequeue(out ButtonCommands message);
                    if (isMessageDequeueSuccess)
                    {
                        if (message == ButtonCommands.BeginStreaming)
                        {
                            Console.WriteLine("BeginStreaming command received in SingleStreamThread");
                            state = StreamLoopState.Streaming;
                        }
                        else if (message == ButtonCommands.ResetBackgroundImage)
                        {
                            resetBackground = true;
                        }
                        else if (message == ButtonCommands.SaveThisImage)
                        {
                            saveThisImage = true;
                        }
                        else if (message == ButtonCommands.EndStreaming)
                        {
                            state = StreamLoopState.Waiting;
                        }
                        else if (message == ButtonCommands.Exit)
                        {
                            state = StreamLoopState.Exit;
                        }
                    }
                }
            }
        }