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 MergeStreamsThreadInit(MergeStreamsManager manager) { int imageCtr = 0; bool isMessageDequeueSuccess; int nQueues = manager.input.nInputQueues; bool[] isInputDequeueSuccess = new bool[nQueues]; StreamLoopState state = StreamLoopState.Waiting; Tuple <Mat, FrameMetaData>[][] input; while (true) { UpdateLoopState(); if (state == StreamLoopState.Waiting) { Thread.Sleep(100); continue; } else if (state == StreamLoopState.Exit) { return; } input = new Tuple <Mat, FrameMetaData> [nQueues][]; for (int i = 0; i < nQueues; i++) { while (true) { isInputDequeueSuccess[i] = manager.input.streamQueues[i].TryDequeue(out input[i]); if (isInputDequeueSuccess[i]) { isInputDequeueSuccess[i] = false; break; } else { UpdateLoopState(); if (state == StreamLoopState.Streaming) { continue; } else if (state == StreamLoopState.Waiting) { Thread.Sleep(100); } else if (state == StreamLoopState.Exit) { return; } } } } ProcessInput(); continue; void ProcessInput() { imageCtr += 1; if (imageCtr % manager.output.outputChannels[0].enqueueOrDequeueRate != 0) { input[0][0].Item1.Dispose(); input[1][0].Item1.Dispose(); return; } Mat outputMat = new Mat(size: manager.output.outputChannels[0].imageSize, type: Emgu.CV.CvEnum.DepthType.Cv8U, channels: 1); CvInvoke.VConcat(src1: input[0][0].Item1, src2: input[1][0].Item1, dst: outputMat); FrameMetaData outputMeta = input[0][0].Item2; Tuple <Mat, FrameMetaData>[] output = Util.GetStreamOutput(mat: outputMat, metaData: outputMeta); manager.output.displayQueue.Enqueue(item: output); } void UpdateLoopState() { isMessageDequeueSuccess = manager.messageQueue.TryDequeue(out ButtonCommands message); if (isMessageDequeueSuccess) { if (message == ButtonCommands.BeginStreaming) { Console.WriteLine("BeginStreaming command received in MergeStreamsThread"); state = StreamLoopState.Streaming; } else if (message == ButtonCommands.EndStreaming) { Console.WriteLine("EndStreaming command received in MergeStreamsThread"); state = StreamLoopState.Waiting; } else if (message == ButtonCommands.Exit) { state = StreamLoopState.Exit; } } } } }