private unsafe byte[] ProcessCaptureData() { fixed(InteropVideodev2.V4l2FrameBuffer *buffers = &ApplyFrameBuffers()[0]) { // Start data stream InteropVideodev2.v4l2_buf_type type = InteropVideodev2.v4l2_buf_type.V4L2_BUF_TYPE_VIDEO_CAPTURE; Interop.ioctl(_deviceFileDescriptor, InteropVideodev2.V4l2Request.VIDIOC_STREAMON, new IntPtr(&type)); byte[] dataBuffer = GetFrameData(buffers); // Close data stream Interop.ioctl(_deviceFileDescriptor, InteropVideodev2.V4l2Request.VIDIOC_STREAMOFF, new IntPtr(&type)); UnmappingFrameBuffers(buffers); return(dataBuffer); } }
public override unsafe void CaptureContinuous(CancellationToken token) { _capturing = true; fixed(InteropVideodev2.V4l2FrameBuffer *buffers = &ApplyFrameBuffers()[0]) { // Start data stream InteropVideodev2.v4l2_buf_type type = InteropVideodev2.v4l2_buf_type.V4L2_BUF_TYPE_VIDEO_CAPTURE; Interop.ioctl(_deviceFileDescriptor, InteropVideodev2.V4l2Request.VIDIOC_STREAMON, new IntPtr(&type)); while (!token.IsCancellationRequested) { NewImageBufferReady?.Invoke(this, GetFrameDataPooled(buffers)); } // Close data stream Interop.ioctl(_deviceFileDescriptor, InteropVideodev2.V4l2Request.VIDIOC_STREAMOFF, new IntPtr(&type)); UnmappingFrameBuffers(buffers); } _capturing = false; }