On 2/20/20 2:12 AM, Nikolay Sivov wrote:
Another important thing that I forgot to mention. IMFMediaStream and IMFMediaSource relationship creates refcount circular dependency - source will have to hold stream reference, and stream has to hold source reference. At the same time they have to separate enough, and not to share critical sections for example when they don't have to, because there is not reason to block streams with one another, or with the source. It's not a structural flaw in your patch, it's how it should work, however I suspect current implementation will not allow to ever release those objects.
The way to solve this is explicit Shutdown() call for source, which dissociates those objects. Calling it will essentially detach streams from source, making GetMediaSource() fail for example (I don't know if we have tests for that yet), it will also shutdown event queues for streams and the source, which is important for waking event handlers that might wait in GetEvent() for example. Source reader should be calling this method correctly already I think, respecting additional configurable option not to shut it down, in case application will want to read from the same source again.
I'm aware of this, I already implement Shutdown() by calling media_source_teardown, which performs the actions you describe: https://github.com/Guy1524/wine/blob/mfplat/dlls/winegstreamer/media_source....
Although looking at it again I should probably reorder the code to release the streams first.