You don't need to stop the filter to prevent that. In fact, that's exactly what flushing is for.
Decommit the allocator is needed,
Why? Why isn't flushing enough?
becides, we need to stop the reader thread, which means we need to stop the IWMReader. And that's exactly what asf_reader_cleanup_stream() does. So maybe we could replace IBaseFiler_Stop() with asf_reader_cleanup_stream()?
Just IWMReader_Stop() would be enough.
[though note that you also have to put it back in paused state afterward, which this patch is missing]
I'm not sure if Pause() are necessary, the Pause() in the document is to restart the thread and start pushing data again. We have IWMReader_Start() which did this.
Well, you can't leave the filter in stopped state. SetPositions() isn't supposed to change the state. If you are going to call IBaseFilter_Stop() then you need to call IBaseFilter_Pause(). If you're only going to call IWMReader_Start() then you should only call IWMReader_Stop().