Exemple #1
0
        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");
        }