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)); } } } }
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); }
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; } } } } }