Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfreadwrite/reader.c | 6 ++++++ dlls/mfreadwrite/tests/mfplat.c | 16 +++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/dlls/mfreadwrite/reader.c b/dlls/mfreadwrite/reader.c index 0e0fe1ad9cd..86507bde5a1 100644 --- a/dlls/mfreadwrite/reader.c +++ b/dlls/mfreadwrite/reader.c @@ -169,6 +169,7 @@ struct source_reader IMFMediaSource *source; IMFPresentationDescriptor *descriptor; IMFSourceReaderCallback *async_callback; + IMFAttributes *attributes; unsigned int first_audio_stream_index; unsigned int first_video_stream_index; unsigned int last_read_index; @@ -1268,6 +1269,8 @@ static ULONG WINAPI src_reader_Release(IMFSourceReader *iface) IMFMediaSource_Shutdown(reader->source); if (reader->descriptor) IMFPresentationDescriptor_Release(reader->descriptor); + if (reader->attributes) + IMFAttributes_Release(reader->attributes); IMFMediaSource_Release(reader->source);
for (i = 0; i < reader->stream_count; ++i) @@ -2162,6 +2165,9 @@ static HRESULT create_source_reader_from_source(IMFMediaSource *source, IMFAttri
if (attributes) { + object->attributes = attributes; + IMFAttributes_AddRef(object->attributes); + IMFAttributes_GetUnknown(attributes, &MF_SOURCE_READER_ASYNC_CALLBACK, &IID_IMFSourceReaderCallback, (void **)&object->async_callback); if (object->async_callback) diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index 8455ac64688..9d84265244a 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -41,6 +41,13 @@ DEFINE_GUID(GUID_NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); #include "wine/heap.h" #include "wine/test.h"
+static ULONG get_refcount(void *iface) +{ + IUnknown *unknown = iface; + IUnknown_AddRef(unknown); + return IUnknown_Release(unknown); +} + static HRESULT (WINAPI *pMFCreateMFByteStreamOnStream)(IStream *stream, IMFByteStream **bytestream);
static void init_functions(void) @@ -620,6 +627,7 @@ static void test_source_reader(void) IMFByteStream *stream; LONGLONG timestamp; IMFSample *sample; + ULONG refcount; BOOL selected; HRESULT hr;
@@ -836,9 +844,12 @@ skip_read_sample: ok(hr == S_OK, "Failed to set attribute value, hr %#x.\n", hr); IMFSourceReaderCallback_Release(&callback->IMFSourceReaderCallback_iface);
+ refcount = get_refcount(attributes); hr = MFCreateSourceReaderFromByteStream(stream, attributes, &reader); -todo_wine +todo_wine { ok(hr == S_OK, "Failed to create source reader, hr %#x.\n", hr); + ok(get_refcount(attributes) > refcount, "Unexpected refcount.\n"); +} IMFAttributes_Release(attributes); if (hr == S_OK) IMFSourceReader_Release(reader); @@ -856,6 +867,7 @@ static void test_source_reader_from_media_source(void) IMFSample *sample; LONGLONG timestamp; IMFAttributes *attributes; + ULONG refcount; int i;
source = create_test_source(); @@ -967,8 +979,10 @@ static void test_source_reader_from_media_source(void) ok(hr == S_OK, "Failed to set attribute value, hr %#x.\n", hr); IMFSourceReaderCallback_Release(&callback->IMFSourceReaderCallback_iface);
+ refcount = get_refcount(attributes); hr = MFCreateSourceReaderFromMediaSource(source, attributes, &reader); ok(hr == S_OK, "Failed to create source reader, hr %#x.\n", hr); + ok(get_refcount(attributes) > refcount, "Unexpected refcount.\n");
hr = IMFSourceReader_SetStreamSelection(reader, 0, TRUE); ok(hr == S_OK, "Failed to select a stream, hr %#x.\n", hr);