mfreadwrite/reader: Unset sample allocator callbacks while destroying the source reader.
The sample allocator callbacks own a reference to the source reader, which creates a reference loop and prevents the source reader from being properly destroyed. Signed-off-by: Giovanni Mascellani <gmascellani@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
cdb0471eca
commit
a233c49519
|
@ -1412,6 +1412,7 @@ static ULONG WINAPI src_reader_Release(IMFSourceReader *iface)
|
|||
{
|
||||
struct source_reader *reader = impl_from_IMFSourceReader(iface);
|
||||
ULONG refcount = InterlockedDecrement(&reader->public_refcount);
|
||||
unsigned int i;
|
||||
|
||||
TRACE("%p, refcount %lu.\n", iface, refcount);
|
||||
|
||||
|
@ -1430,6 +1431,23 @@ static ULONG WINAPI src_reader_Release(IMFSourceReader *iface)
|
|||
|
||||
LeaveCriticalSection(&reader->cs);
|
||||
}
|
||||
|
||||
for (i = 0; i < reader->stream_count; ++i)
|
||||
{
|
||||
struct media_stream *stream = &reader->streams[i];
|
||||
IMFVideoSampleAllocatorCallback *callback;
|
||||
|
||||
if (!stream->allocator)
|
||||
continue;
|
||||
|
||||
if (SUCCEEDED(IMFVideoSampleAllocatorEx_QueryInterface(stream->allocator, &IID_IMFVideoSampleAllocatorCallback,
|
||||
(void **)&callback)))
|
||||
{
|
||||
IMFVideoSampleAllocatorCallback_SetCallback(callback, NULL);
|
||||
IMFVideoSampleAllocatorCallback_Release(callback);
|
||||
}
|
||||
}
|
||||
|
||||
source_reader_release(reader);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue