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