示例#1
0
        private void PreviewImageAvailable(object sender, Image e)
        {
            var planes = e.GetPlanes();

            var buffer  = planes[0].Buffer;
            var yValues = new byte[buffer.Remaining()];

            buffer.Get(yValues);

            buffer = planes[1].Buffer;
            var uValues = new byte[buffer.Remaining()];

            buffer.Get(uValues);

            buffer = planes[2].Buffer;
            var vValues = new byte[buffer.Remaining()];

            buffer.Get(vValues);

            var uvPixelStride = planes[1].PixelStride;
            var uvRowStride   = planes[1].RowStride;
            var yRowStride    = planes[0].RowStride;

            e.Close();

            if (_bufferFrame == null)
            {
                _bufferFrame = new Yuv420888(Bootstrapper.Rs, PixelSize.Width, PixelSize.Height, yRowStride,
                                             uvPixelStride, uvRowStride);
            }

            var rgb = _bufferFrame.ToRgba8888(yValues, uValues, vValues);

            FrameAvailable?.Invoke(this, rgb);
        }
示例#2
0
        /// <summary>
        /// Invoked when a new frame arrived
        /// </summary>
        /// <param name="sender">Sender</param>
        /// <param name="e">EventArgs</param>
        private void capGrabber_NewFrameArrived(object sender, EventArgs e)
        {
            // Make sure to be thread safe
            if (Dispatcher != null)
            {
                this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Render, (SendOrPostCallback) delegate
                {
                    if (BitmapSource != null)
                    {
                        BitmapSource.Invalidate();
                        UpdateFramerate();

                        FrameAvailable?.Invoke(this, null);
                    }
                }, null);
            }
        }
示例#3
0
        public override void DidOutputSampleBuffer(AVCaptureOutput captureOutput, CMSampleBuffer sampleBuffer,
                                                   AVCaptureConnection connection)
        {
            if (_stopwatch == null)
            {
                _stopwatch = Stopwatch.StartNew();
            }
            else if (_stopwatch.ElapsedMilliseconds < 33)
            {
                sampleBuffer.Dispose();
                return;
            }
            else
            {
                _stopwatch.Restart();
            }

            if (!(sampleBuffer?.GetImageBuffer() is CVPixelBuffer pixelBuffer))
            {
                sampleBuffer?.Dispose();
                return;
            }

            pixelBuffer.Lock(CVPixelBufferLock.ReadOnly);
            var width       = pixelBuffer.Width;
            var height      = pixelBuffer.Height;
            var length      = (int)(width * height * 4);
            var baseAddress = pixelBuffer.BaseAddress;
            var buffer      = new byte[length];

            Marshal.Copy(baseAddress, buffer, 0, length);

            Task.Run(() =>
            {
                var frame = ToRgba8888(buffer, length);
                FrameAvailable?.Invoke(this, frame);
            });

            pixelBuffer.Unlock(CVPixelBufferLock.ReadOnly);
            pixelBuffer.Dispose();
            sampleBuffer.Dispose();
        }
示例#4
0
        /// <summary>
        /// The callback that is called from the unmanaged code whenever a new packet arrives.
        /// It parses the frame and forwards it to anyone listening on the <see cref="FrameAvailable"/> event
        /// </summary>
        /// <param name="hCaptureEngine">The engine who captured the packet</param>
        /// <param name="ulAdapterIndex">The index of the adapter</param>
        /// <param name="pCallerContext">Context - a way to transfer state from the initializer thread to the callback thread (null in our case)</param>
        /// <param name="hFrame">The handle for the frame</param>
        private void FrameCapturedCallback(IntPtr hCaptureEngine, UInt32 ulAdapterIndex, IntPtr pCallerContext, IntPtr hFrame)
        {
            // Basic parsing: Get MAC (link layer) type & frame's bytes
            uint res = NetmonAPI.NmGetFrameMacType(hFrame, out var macType);

            if (res != 0)
            {
                return;
            }

            // Seems like the MAC value we are getting is not zero-based and it should be
            macType -= 1;

            byte[] rawFrameData = NetmonAPI.NmGetRawFrameManaged(hFrame);

            // Dispose of unmanaged frame handle
            NetmonAPI.NmCloseHandle(hFrame);

            // Forward to any listeners
            FrameAvailable?.Invoke(this, macType, rawFrameData);
        }
示例#5
0
        private void HandleFrameAvailable(IInputAdapter source, MocapFrame frame)
        {
            /* frame available occurs inside adapter thread
             * so synchronize access to the stopwatch
             */
            lock (StopwatchLock)
            {
                frame.ElapsedMillis = _applicationWatch.ElapsedMilliseconds;
                Session.Duration    = Convert.ToUInt32(_applicationWatch.ElapsedMilliseconds);
            }

            /* get a data merger specific to the type of input adapter,
             * so only a optitrack merger gets frames from an optitrack
             * input adapter and so forth.
             */
            var merger = _dataMergers.First(m => m.MergerType == source.AdapterType);

            Logger.Debug("{Frame #{0} available from {1}", frame.ElapsedMillis, source.Config.AdapterType);
            var mergedFrame = merger.HandleFrame(frame);

            //get the output from datamerger to output manager
            _outputManager.ReadyToOutput(mergedFrame);
            FrameAvailable?.Invoke(frame);
        }
 private void FireFrameAvailable(MocapFrame frame)
 {
     FrameAvailable?.Invoke(frame);
 }
示例#7
0
 private void OnFrameAvailable(Bitmap frame)
 {
     FrameAvailable?.Invoke(frame);
 }