I'm sure you can figure that out. It's a kind of bird by the way.
* In DirectShow it was common for renderers to give the upstream filter a device mapped buffer to write to, since it had a couple of problems (a few decoders expected to get back the same buffer and just copied the difference, or effect filters tried to read and manipulate the pixels in the slower video memory) and it isn't really possible in managed code, renderers should just mashal the bytes to an IntPtr now. Not having a pool of samples in the allocator is less efficient, but without reference counting it is impossible to implement the way DirectShow did (refcnt reaching 0 put the sample back to the queue instead of freeing the object, violating COM rules a bit). However, the GC does a good job immidiatelly freeing the samples as they are not needed. Sending an empty 1920x1080 YV12 image to the D3D renderer used 20-30% CPU on an old AMD 3500+ (but Rgb32 maxed it out), Marshal.Copy had a 500 MB/s bandwidth from byte[] to the IntPtr of managed texture ("managed" is a DirectX term here).
* In reality, filters are asked for the match by giving them an Uri and a Stream, only the baseclasses implement it that way.
The army needs you! And the framework needs more filters to be useful. Please help out if you can.