コード例 #1
0
ファイル: PipelineManager.cs プロジェクト: jfpk/kinoveaIDS
        public void Connect(ImageDescriptor imageDescriptor, IFrameProducer producer, ConsumerDisplay consumerDisplay, ConsumerMJPEGRecorder consumerRecord)
        {
            // At that point the consumer threads are already started.
            // But only the display thread (actually the UI main thread) should be "active".
            // The producer thread is not started yet, it will be started outside the pipeline manager.
            this.producer        = producer;
            this.consumerDisplay = consumerDisplay;
            this.consumerRecord  = consumerRecord;

            consumerDisplay.SetImageDescriptor(imageDescriptor);
            consumerRecord.SetImageDescriptor(imageDescriptor);

            consumers.Clear();
            consumers.Add(consumerDisplay as IFrameConsumer);
            consumers.Add(consumerRecord as IFrameConsumer);

            int buffers = 8;

            pipeline = new FramePipeline(producer, consumers, buffers, imageDescriptor.BufferSize);
            pipeline.SetBenchmarkMode(BenchmarkMode.None);

            if (pipeline.Allocated)
            {
                producer.FrameProduced += producer_FrameProduced;
                connected = true;
            }
        }
コード例 #2
0
        public void Connect(ImageDescriptor imageDescriptor, IFrameProducer producer, ConsumerDisplay consumerDisplay, ConsumerDelayer consumerDelayer)
        {
            // Same as above but for the recording mode "delay" case.
            this.producer         = producer;
            this.consumerRealtime = null;
            this.consumerDelayer  = consumerDelayer;

            consumerDisplay.SetImageDescriptor(imageDescriptor);
            consumerDelayer.SetImageDescriptor(imageDescriptor);

            consumers.Clear();
            consumers.Add(consumerDisplay as IFrameConsumer);
            consumers.Add(consumerDelayer as IFrameConsumer);

            CreatePipeline(imageDescriptor);
        }
コード例 #3
0
        public void Connect(ImageDescriptor imageDescriptor, IFrameProducer producer, ConsumerDisplay consumerDisplay, ConsumerRealtime consumerRealtime)
        {
            // At that point the consumer threads are already started.
            // But only the display thread (actually the UI main thread) should be "active".
            // The producer thread is not started yet, it will be started outside the pipeline manager.
            this.producer         = producer;
            this.consumerRealtime = consumerRealtime;
            this.consumerDelayer  = null;

            consumerDisplay.SetImageDescriptor(imageDescriptor);
            consumerRealtime.SetImageDescriptor(imageDescriptor);

            consumers.Clear();
            consumers.Add(consumerDisplay as IFrameConsumer);
            consumers.Add(consumerRealtime as IFrameConsumer);

            CreatePipeline(imageDescriptor);
        }
コード例 #4
0
        public FramePipeline(IFrameProducer producer, List <IFrameConsumer> consumers, int buffers, int bufferSize)
        {
            log.DebugFormat("Starting frame pipeline.");

            this.producer  = producer;
            this.consumers = consumers;

            InitializeBenchmarkCounters();

            ringBuffer = new RingBuffer(buffers, bufferSize);

            if (ringBuffer.Allocated)
            {
                frameLength = bufferSize;
                log.DebugFormat("Ring buffer allocated.");

                Bind();
                GC.Collect();
            }
        }
コード例 #5
0
ファイル: Presenter.cs プロジェクト: wyj64852999/Kinovea
        private void view_StartBenchmark(object sender, EventArgs <BenchmarkMode> e)
        {
            IFrameProducer frameProducer = grabber as IFrameProducer;
            //int width = grabber.Size.Width;
            //int height = grabber.Size.Height;
            //int depth = grabber.Depth;
            int width  = 2048;
            int height = 1084;
            int depth  = 1;

            benchmarkMode = e.Value;

            switch (benchmarkMode)
            {
            case BenchmarkMode.Heartbeat:
            case BenchmarkMode.Commitbeat:
            case BenchmarkMode.Bradycardia:
            case BenchmarkMode.FrameDrops:
                break;

            case BenchmarkMode.Noop:
                consumers.Add(new ConsumerNoop());
                break;

            case BenchmarkMode.OccasionallySlow:
                consumers.Add(new ConsumerOccasionallySlow());
                break;

            case BenchmarkMode.Slow:
                consumers.Add(new ConsumerSlow());
                break;

            case BenchmarkMode.LZ4:
                consumers.Add(new ConsumerLZ4());
                break;

            case BenchmarkMode.JPEG1:
                consumers.Add(new ConsumerJPEG());
                break;

            case BenchmarkMode.FrameNumber:
                consumers.Add(new ConsumerFrameNumber());
                break;

            default:
                break;
            }

            // Start all consumer threads.
            // In a real application some consumers would have been long started.
            // for example the application main thread is also the display consumer.
            foreach (IFrameConsumer consumer in consumers)
            {
                Thread thread = new Thread(consumer.Run)
                {
                    IsBackground = true
                };
                thread.Name = consumer.GetType().Name;
                thread.Start();
            }

            // Bind the ring buffer to consumers and producers.
            pipeline = new FramePipeline(frameProducer, consumers, width, height, depth);

            pipeline.SetBenchmarkMode(benchmarkMode);
            grabber.Start();

            // Activate all consumers.
            // In a real application this may be done much later, in a "record" button event handler for example.
            foreach (IFrameConsumer consumer in consumers)
            {
                consumer.Activate();
            }
        }