Displaying live video from a raw uncompressed byte source in C#: WPF vs. Win forms
I have a live 16-bit gray-scale video stream that is pushed through a ring-buffer in memory as a raw, uncompressed byte stream (2 bytes per pixel, 2^18 pixels/frame, 32 frames/sec).  (This is coming from a scientific grade camera, via a PCI frame-grabber).  I would like to do some simple processing on the video (clip dynamic range, colorize, add overlays) and then show it in a window, using C#.

I have this working using Windows Forms & GDI (for each frame, build a Bitmap object, write raw 32-bit RGB pixel values based on my post-processing steps, and then draw the frame using the Graphics class).  But this uses a significant chunk of CPU that I'd like to use for other things.  So I'm interested in using WPF for its GPU-accelerated video display.  (I'd also like to start using WPF for its data binding & layout features.)  

But I've never used WPF before, so I'm unsure how to approach this.  Most of what I find online about video & WPF involves reading a compressed video file from disk (e.g. WMV), or getting a stream from a consumer-grade camera using a driver layer that Windows already understands.  So it doesn't seem to apply here (but correct me if I'm wrong about this).

So, my questions:

 - Is there a straighforward, WPF-based way to play video from raw, uncompressed bytes in memory (even if just as 8-bit grayscale, or 24-bit RGB)?

 -  Will I need to build DirectShow filters (or other DirectShow/Media Foundation-ish things) to get the post-processing working on the GPU?  

Also, any general advice / suggestions for documentation, examples, blogs, etc that are appropriate to these tasks would be appreciated.  Thanks!


Displaying live video from a raw uncompressed byte source in C#: WPF vs. Win forms
===

I have a live 16-bit gray-scale video stream that is pushed through a ring-buffer in memory as a raw, uncompressed byte stream (2 bytes per pixel, 2^18 pixels/frame, 32 frames/sec).  (This is coming from a scientific grade camera, via a PCI frame-grabber).  I would like to do some simple processing on the video (clip dynamic range, colorize, add overlays) and then show it in a window, using C#.

I have this working using Windows Forms & GDI (for each frame, build a Bitmap object, write raw 32-bit RGB pixel values based on my post-processing steps, and then draw the frame using the Graphics class).  But this uses a significant chunk of CPU that I'd like to use for other things.  So I'm interested in using WPF for its GPU-accelerated video display.  (I'd also like to start using WPF for its data binding & layout features.)  

But I've never used WPF before, so I'm unsure how to approach this.  Most of what I find online about video & WPF involves reading a compressed video file from disk (e.g. WMV), or getting a stream from a consumer-grade camera using a driver layer that Windows already understands.  So it doesn't seem to apply here (but correct me if I'm wrong about this).

So, my questions:

 - Is there a straighforward, WPF-based way to play video from raw, uncompressed bytes in memory (even if just as 8-bit grayscale, or 24-bit RGB)?

 -  Will I need to build DirectShow filters (or other DirectShow/Media Foundation-ish things) to get the post-processing working on the GPU?  

Also, any general advice / suggestions for documentation, examples, blogs, etc that are appropriate to these tasks would be appreciated.  Thanks!

