private void ReceiveThreadProc() { var recvInstance = _ndiReceiveInstance; if (recvInstance == IntPtr.Zero) { return; } while (!_exitReceiveThread) { NDIlib_video_frame_t videoFrame = new NDIlib_video_frame_t(); NDIlib_audio_frame_t audioFrame = new NDIlib_audio_frame_t(); NDIlib_metadata_frame_t metadataFrame = new NDIlib_metadata_frame_t(); switch (Ndi.NDIlib_recv_capture(recvInstance, ref videoFrame, ref audioFrame, ref metadataFrame, 1000)) { case NDIlib_frame_type_e.NDIlib_frame_type_video: if (videoFrame.p_data == IntPtr.Zero) { Ndi.NDIlib_recv_free_video(recvInstance, ref videoFrame); break; } int yres = (int)videoFrame.yres; int xres = (int)videoFrame.xres; double dpiY = 96.0 * (videoFrame.picture_aspect_ratio / ((double)xres / yres)); int stride = (int)videoFrame.line_stride_in_bytes; int bufferSize = yres * stride; Application.Current?.Dispatcher.BeginInvoke(new Action(delegate { if (VideoBitmap == null || VideoBitmap.PixelWidth != xres || VideoBitmap.PixelHeight != yres) { VideoBitmap = new WriteableBitmap(xres, yres, 96, dpiY, System.Windows.Media.PixelFormats.Pbgra32, null); } // update the writeable bitmap VideoBitmap.Lock(); VideoBitmap.WritePixels(new Int32Rect(0, 0, xres, yres), videoFrame.p_data, bufferSize, stride); VideoBitmap.Unlock(); Ndi.NDIlib_recv_free_video(recvInstance, ref videoFrame); })); break; case NDIlib_frame_type_e.NDIlib_frame_type_audio: Ndi.NDIlib_recv_free_audio(recvInstance, ref audioFrame); break; case NDIlib_frame_type_e.NDIlib_frame_type_metadata: Ndi.NDIlib_recv_free_metadata(recvInstance, ref metadataFrame); break; } } Debug.WriteLine(this, "Receive thread exited"); }