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:
Giovanni Mascellani 2022-04-09 09:16:18 +03:00 committed by Alexandre Julliard
parent cdb0471eca
commit a233c49519
1 changed files with 18 additions and 0 deletions

View File

@ -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);
}