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);
|
struct source_reader *reader = impl_from_IMFSourceReader(iface);
|
||||||
ULONG refcount = InterlockedDecrement(&reader->public_refcount);
|
ULONG refcount = InterlockedDecrement(&reader->public_refcount);
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
TRACE("%p, refcount %lu.\n", iface, refcount);
|
TRACE("%p, refcount %lu.\n", iface, refcount);
|
||||||
|
|
||||||
|
@ -1430,6 +1431,23 @@ static ULONG WINAPI src_reader_Release(IMFSourceReader *iface)
|
||||||
|
|
||||||
LeaveCriticalSection(&reader->cs);
|
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);
|
source_reader_release(reader);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue