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); }
/// <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); } }
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(); }
/// <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); }
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); }
private void OnFrameAvailable(Bitmap frame) { FrameAvailable?.Invoke(frame); }