[PATCH 0/3] MR10327: mfsrcsnk: Move IMFByteStream release into IMFMediaSource_Shutdown
The game "Atelier Yumia: The Alchemist of Memories & The Envisioned Land" expects the IMFByteStream that's held in the IMFSourceReader to be fully released in sequence with the public refcount going to zero. To achieve this, make use of the fact that IMFMediaSource already releases the IMFByteStream on IMFByteStream_Shutdown(). -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10327
From: Bernhard Kölbl <bkoelbl@codeweavers.com> --- dlls/mfreadwrite/tests/mfplat.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index b258b10441e..a3f615006ed 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -1512,6 +1512,27 @@ static void test_source_reader_from_media_source(void) IMFStreamDescriptor_Release(audio_streams[i]); } +static void test_source_reader_release(void) +{ + IMFByteStream *stream = get_resource_stream("test.wav"); + IMFAttributes *attributes; + IMFSourceReader *reader; + HRESULT hr; + LONG ref; + + hr = MFCreateAttributes(&attributes, 1); + ok(hr == S_OK, "failed to create IMFAttributes hr %#lx\n", hr); + + hr = MFCreateSourceReaderFromByteStream(stream, attributes, &reader); + ok(hr == S_OK, "failed to create SourceReader hr %#lx\n", hr); + + ref = IMFSourceReader_Release(reader); + ok(ref == 0, "got unexpected ref %lu\n", ref); + + ref = IMFByteStream_Release(stream); + flaky_wine ok(ref == 0, "got unexpected ref %lu\n", ref); +} + static void test_reader_d3d9(void) { static const struct attribute_desc audio_stream_type_desc[] = @@ -3887,6 +3908,7 @@ START_TEST(mfplat) test_source_reader_transform_stream_change(); test_source_reader_transforms_d3d9(); test_source_reader_transforms_d3d11(); + test_source_reader_release(); test_reader_d3d9(); test_sink_writer_create(); test_sink_writer_get_object(); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10327
From: Bernhard Kölbl <bkoelbl@codeweavers.com> --- dlls/mfsrcsnk/tests/mfsrcsnk.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/dlls/mfsrcsnk/tests/mfsrcsnk.c b/dlls/mfsrcsnk/tests/mfsrcsnk.c index 527c0051050..e879dcbeda2 100644 --- a/dlls/mfsrcsnk/tests/mfsrcsnk.c +++ b/dlls/mfsrcsnk/tests/mfsrcsnk.c @@ -66,6 +66,13 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO IUnknown_Release(unk); } +static ULONG get_refcount(void *iface) +{ + IUnknown *unknown = iface; + IUnknown_AddRef(unknown); + return IUnknown_Release(unknown); +} + static void test_wave_sink(void) { IMFMediaType *media_type, *media_type2; @@ -920,6 +927,30 @@ static void test_end_of_presentation(void) IMFAsyncCallback_Release(callback); } +static void test_release(void) +{ + IMFByteStream *byte_stream; + IMFMediaSource *source; + HRESULT hr; + LONG ref; + + byte_stream = create_resource_byte_stream(L"test_thinning.avi"); + hr = create_source(&CLSID_AVIByteStreamPlugin, byte_stream, &source); + ok(hr == S_OK, "failed to create MediaSource with hr %#lx\n", hr); + + ref = get_refcount(byte_stream); + ok(ref > 1, "got unexpected ref %lu\n", ref); + + hr = IMFMediaSource_Shutdown(source); + ok(hr == S_OK, "IMFMediaSource_Shutdown failed with hr %#lx\n", hr); + + ref = IMFByteStream_Release(byte_stream); + todo_wine ok(ref == 0, "got unexpected ref %lu\n", ref); + + ref = IMFMediaSource_Release(source); + ok(ref == 0, "got unexpected ref %lu\n", ref); +} + START_TEST(mfsrcsnk) { HRESULT hr; @@ -930,6 +961,7 @@ START_TEST(mfsrcsnk) test_wave_sink(); test_thinning(); test_end_of_presentation(); + test_release(); hr = MFShutdown(); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10327
This looks harmless, but also makes mfsrcsnk differ from winegstreamer source. I think we should keep them in sync. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10327#note_132789
On Thu Mar 19 13:24:37 2026 +0000, Nikolay Sivov wrote:
This looks harmless, but also makes mfsrcsnk differ from winegstreamer source. I think we should keep them in sync. I does keep them in sync, or am I missing something?
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/10327#note_132794
This merge request was approved by Rémi Bernon. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10327
On Thu Mar 19 13:57:58 2026 +0000, Rémi Bernon wrote:
I does keep them in sync, or am I missing something? Ah, sorry. I missed that changed file.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/10327#note_132801
This merge request was approved by Nikolay Sivov. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10327
participants (3)
-
Bernhard Kölbl -
Nikolay Sivov (@nsivov) -
Rémi Bernon