private void DisplayVideoFrames(object state) { while (running) { if (videoObject != null && videoObject.IsConnected && previewOn) { try { IVideoFrame frame = useVariantPixels ? videoObject.LastVideoFrameVariant : videoObject.LastVideoFrame; if (frame != null && (frame.FrameNumber == -1 || frame.FrameNumber != lastDisplayedVideoFrameNumber)) { lastDisplayedVideoFrameNumber = frame.FrameNumber; Bitmap bmp = null; if (Settings.Default.UseNativeCode) { cameraImage.SetImageArray( useVariantPixels ? frame.ImageArrayVariant : frame.ImageArray, imageWidth, imageHeight, videoObject.SensorType); bmp = cameraImage.GetDisplayBitmap(); } else { Array safeArr = useVariantPixels ? (Array)frame.ImageArrayVariant : (Array)frame.ImageArray; int[,] pixels; if (safeArr is int[, ]) { pixels = (int[, ])safeArr; } else if (safeArr is object[, ]) { pixels = new int[imageHeight, imageWidth]; Array.Copy(safeArr, pixels, imageWidth * imageHeight); } else { throw new NotSupportedException("Unsupported pixel format in Managed mode."); } bmp = new Bitmap(imageWidth, imageHeight); BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); try { unsafe { int stride = bmData.Stride; IntPtr Scan0 = bmData.Scan0; byte * p = (byte *)(void *)Scan0; int nOffset = stride - bmp.Width * 3; for (int y = 0; y < bmp.Height; ++y) { for (int x = 0; x < bmp.Width; ++x) { byte red = (byte)pixels[y, x]; p[0] = red; p[1] = red; p[2] = red; p += 3; } p += nOffset; } } } finally { bmp.UnlockBits(bmData); } } Invoke(new PaintVideoFrameDelegate(PaintVideoFrame), new object[] { frame, bmp }); } } catch (ObjectDisposedException) { } catch (Exception ex) { Trace.WriteLine(ex); Bitmap errorBmp = new Bitmap(pictureBox.Width, pictureBox.Height); using (Graphics g = Graphics.FromImage(errorBmp)) { g.Clear(Color.Tomato); g.DrawString(ex.Message, debugTextFont, Brushes.Black, 10, 10); g.Save(); } try { Invoke(new PaintVideoFrameDelegate(PaintVideoFrame), new object[] { null, errorBmp }); } catch (InvalidOperationException) { // InvalidOperationException could be thrown when closing down the app i.e. when the form has been already disposed } } } Thread.Sleep(1); Application.DoEvents(); } }