These were probably the cause of crashes of https://gitlab.winehq.org/wine/wine/-/merge_requests/5459 runs on 32bit Linux VMs. Also included some test fixes that were in https://gitlab.winehq.org/wine/wine/-/merge_requests/5459.
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mf/tests/mf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index fece60d37a7..b3cd355f49d 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -4179,7 +4179,7 @@ static void test_topology_loader(void) { IMFTopology_GetTopologyID(topology, &oldtopoid); IMFTopology_GetTopologyID(full_topology, &newtopoid); - ok(oldtopoid == newtopoid, "Expected the same topology id. %llu == %llu\n", oldtopoid, newtopoid); + ok(oldtopoid == newtopoid, "Expected the same topology id. %I64u == %I64u\n", oldtopoid, newtopoid); ok(topology != full_topology, "Expected a different object for the resolved topology.\n");
hr = IMFTopology_GetCount(full_topology, &count); @@ -4331,7 +4331,7 @@ todo_wine { ok(full_topology != topology2, "Unexpected instance.\n"); IMFTopology_GetTopologyID(topology2, &oldtopoid); IMFTopology_GetTopologyID(full_topology, &newtopoid); - ok(oldtopoid == newtopoid, "Expected the same topology id. %llu == %llu\n", oldtopoid, newtopoid); + ok(oldtopoid == newtopoid, "Expected the same topology id. %I64u == %I64u\n", oldtopoid, newtopoid); hr = IMFTopology_GetUINT32(topology2, &IID_IMFTopology, &value); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfreadwrite/tests/mfplat.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-)
diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index a2c46869250..00b79353090 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -2488,6 +2488,13 @@ static HRESULT WINAPI test_decoder_SetInputType(IMFTransform *iface, DWORD id, I static HRESULT WINAPI test_decoder_SetOutputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) { struct test_decoder *decoder = test_decoder_from_IMFTransform(iface); + GUID subtype; + HRESULT hr; + + if (type && SUCCEEDED(hr = IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype)) + && IsEqualGUID(&subtype, &MFVideoFormat_RGB32)) + return MF_E_INVALIDMEDIATYPE; + if (flags & MFT_SET_TYPE_TEST_ONLY) return S_OK; if (decoder->output_type) @@ -2900,7 +2907,7 @@ static void test_source_reader_transforms_d3d(void) ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video), ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_RGB32), ATTR_RATIO(MF_MT_FRAME_SIZE, 96, 96), - ATTR_UINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, 1, .todo = TRUE), + ATTR_UINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, 1), ATTR_UINT32(MF_MT_COMPRESSED, 0, .todo = TRUE), ATTR_UINT32(MF_MT_INTERLACE_MODE, 2, .todo = TRUE), {0}, @@ -3019,18 +3026,14 @@ static void test_source_reader_transforms_d3d(void)
/* video processor transform is not D3D aware */ hr = IMFSourceReaderEx_GetTransformForStream(reader_ex, 0, 1, NULL, &video_processor); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - /* FIXME: Wine skips the video processor as the test decoder accepts the output type directly */ - if (hr == S_OK) - { - ok(video_processor->lpVtbl != &test_decoder_vtbl, "got unexpected transform\n"); - hr = IMFTransform_GetAttributes(video_processor, &attributes); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = IMFAttributes_GetUINT32(attributes, &MF_SA_D3D_AWARE, &value); - ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); - IMFAttributes_Release(attributes); - IMFTransform_Release(video_processor); - } + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(video_processor->lpVtbl != &test_decoder_vtbl, "got unexpected transform\n"); + hr = IMFTransform_GetAttributes(video_processor, &attributes); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFAttributes_GetUINT32(attributes, &MF_SA_D3D_AWARE, &value); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + IMFAttributes_Release(attributes); + IMFTransform_Release(video_processor);
hr = IMFSourceReaderEx_GetTransformForStream(reader_ex, 0, 0, NULL, &test_decoder); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
From: Rémi Bernon rbernon@codeweavers.com
It's not available on Win7. --- dlls/mfreadwrite/tests/mfplat.c | 54 ++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 17 deletions(-)
diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index 00b79353090..69478bd58cb 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -2604,28 +2604,25 @@ static HRESULT WINAPI test_decoder_ProcessOutput(IMFTransform *iface, DWORD flag
hr = MFCreateSample(&data->pSample); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = MFCreateMediaBufferFromMediaType(decoder->output_type, 0, 0, 0, &buffer); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (hr != S_OK) - { - hr = MFCreateMemoryBuffer(96 * 96 * 4, &buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - } + hr = MFCreateMemoryBuffer(96 * 96 * 4, &buffer); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IMFSample_AddBuffer(data->pSample, buffer); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); IMFMediaBuffer_Release(buffer); } + else + { + ok(!!data->pSample, "Missing sample\n");
- ok(!!data->pSample, "Missing sample\n"); - - hr = IMFSample_GetBufferByIndex(data->pSample, 0, &buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine check_interface(buffer, &IID_IMF2DBuffer2, TRUE); - todo_wine check_interface(buffer, &IID_IMFGetService, TRUE); - check_interface(buffer, &IID_IMFDXGIBuffer, FALSE); - hr = MFGetService((IUnknown *)buffer, &MR_BUFFER_SERVICE, &IID_IDirect3DSurface9, (void **)&unknown); - todo_wine ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr); - IMFMediaBuffer_Release(buffer); + hr = IMFSample_GetBufferByIndex(data->pSample, 0, &buffer); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine check_interface(buffer, &IID_IMF2DBuffer2, TRUE); + todo_wine check_interface(buffer, &IID_IMFGetService, TRUE); + check_interface(buffer, &IID_IMFDXGIBuffer, FALSE); + hr = MFGetService((IUnknown *)buffer, &MR_BUFFER_SERVICE, &IID_IDirect3DSurface9, (void **)&unknown); + todo_wine ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr); + IMFMediaBuffer_Release(buffer); + }
if (decoder->next_output == MF_E_TRANSFORM_STREAM_CHANGE) { @@ -2817,6 +2814,16 @@ static void test_source_reader_transform_stream_change(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); IMFMediaSource_Release(source);
+ /* skip tests on Win7 which misses IMFSourceReaderEx */ + hr = IMFSourceReader_QueryInterface(reader, &IID_IMFSourceReaderEx, (void **)&reader_ex); + ok(hr == S_OK || broken(hr == E_NOINTERFACE) /* Win7 */, "Unexpected hr %#lx.\n", hr); + if (broken(hr == E_NOINTERFACE)) + { + win_skip("missing IMFSourceReaderEx interface, skipping tests on Win7\n"); + goto skip_tests; + } + IMFSourceReaderEx_Release(reader_ex); + hr = IMFSourceReader_SetStreamSelection(reader, 0, TRUE); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
@@ -2881,6 +2888,7 @@ static void test_source_reader_transform_stream_change(void)
IMFTransform_Release(test_decoder);
+skip_tests: IMFSourceReader_Release(reader);
hr = MFTUnregisterLocal(&factory); @@ -2993,6 +3001,17 @@ static void test_source_reader_transforms_d3d(void) IMFAttributes_Release(attributes); IMFMediaSource_Release(source);
+ /* skip tests on Win7 which misses IMFSourceReaderEx */ + hr = IMFSourceReader_QueryInterface(reader, &IID_IMFSourceReaderEx, (void **)&reader_ex); + ok(hr == S_OK || broken(hr == E_NOINTERFACE) /* Win7 */, "Unexpected hr %#lx.\n", hr); + if (broken(hr == E_NOINTERFACE)) + { + win_skip("missing IMFSourceReaderEx interface, skipping tests on Win7\n"); + IMFSourceReader_Release(reader); + goto skip_tests; + } + IMFSourceReaderEx_Release(reader_ex); + hr = IMFSourceReader_SetStreamSelection(reader, 0, TRUE); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
@@ -3152,6 +3171,7 @@ static void test_source_reader_transforms_d3d(void) test_decoder_allocate_samples = FALSE;
+skip_tests: hr = MFTUnregisterLocal(&factory); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfreadwrite/tests/mfplat.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-)
diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index 69478bd58cb..027aa45b1ea 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -2948,6 +2948,7 @@ static void test_source_reader_transforms_d3d(void) HWND window; UINT token; HRESULT hr; + LONG ref;
d3d9 = Direct3DCreate9(D3D_SDK_VERSION); if (!d3d9) @@ -2960,8 +2961,11 @@ static void test_source_reader_transforms_d3d(void) if (!(d3d9_device = create_d3d9_device(d3d9, window))) { skip("Failed to create a D3D9 device, skipping tests.\n"); - goto done; + IDirect3D9_Release(d3d9); + DestroyWindow(window); + return; } + IDirect3D9_Release(d3d9);
test_decoder_d3d_aware = TRUE;
@@ -2978,6 +2982,8 @@ static void test_source_reader_transforms_d3d(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IDirect3DDeviceManager9_ResetDevice(d3d9_manager, d3d9_device, token); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + IDirect3DDevice9_Release(d3d9_device); + hr = IMFAttributes_SetUnknown(attributes, &MF_SOURCE_READER_D3D_MANAGER, (IUnknown *)d3d9_manager); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); expect_d3d_manager = d3d9_manager; @@ -3090,8 +3096,10 @@ static void test_source_reader_transforms_d3d(void)
fail_request_sample = TRUE;
- IMFTransform_Release(test_decoder); - IMFSourceReader_Release(reader); + ref = IMFSourceReader_Release(reader); + ok(ref == 0, "got ref %ld\n", ref); + ref = IMFTransform_Release(test_decoder); + todo_wine ok(ref == 0, "got ref %ld\n", ref);
/* test d3d aware decoder that allocates buffers */ @@ -3165,8 +3173,10 @@ static void test_source_reader_transforms_d3d(void)
fail_request_sample = TRUE;
- IMFTransform_Release(test_decoder); - IMFSourceReader_Release(reader); + ref = IMFSourceReader_Release(reader); + ok(ref == 0, "got ref %ld\n", ref); + ref = IMFTransform_Release(test_decoder); + todo_wine ok(ref == 0, "got ref %ld\n", ref);
test_decoder_allocate_samples = FALSE;
@@ -3175,11 +3185,8 @@ skip_tests: hr = MFTUnregisterLocal(&factory); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
- IDirect3DDeviceManager9_Release(d3d9_manager); - IDirect3DDevice9_Release(d3d9_device); - -done: - IDirect3D9_Release(d3d9); + ref = IDirect3DDeviceManager9_Release(d3d9_manager); + todo_wine ok(ref == 0, "got ref %ld\n", ref); DestroyWindow(window);
test_decoder_d3d_aware = FALSE;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfreadwrite/reader.c | 175 +++++++++++++++++++++++--------- dlls/mfreadwrite/tests/mfplat.c | 6 +- 2 files changed, 129 insertions(+), 52 deletions(-)
diff --git a/dlls/mfreadwrite/reader.c b/dlls/mfreadwrite/reader.c index 11eac81d2ca..9036919bdf6 100644 --- a/dlls/mfreadwrite/reader.c +++ b/dlls/mfreadwrite/reader.c @@ -146,6 +146,7 @@ enum source_reader_flags SOURCE_READER_D3D9_DEVICE_MANAGER = 0x8, SOURCE_READER_DXGI_DEVICE_MANAGER = 0x10, SOURCE_READER_HAS_DEVICE_MANAGER = SOURCE_READER_D3D9_DEVICE_MANAGER | SOURCE_READER_DXGI_DEVICE_MANAGER, + SOURCE_READER_SHUTDOWN = 0x20, };
struct source_reader @@ -234,26 +235,11 @@ static void media_stream_destroy(struct media_stream *stream) static ULONG source_reader_release(struct source_reader *reader) { ULONG refcount = InterlockedDecrement(&reader->refcount); - unsigned int i;
if (!refcount) { - if (reader->device_manager) - IUnknown_Release(reader->device_manager); if (reader->async_callback) IMFSourceReaderCallback_Release(reader->async_callback); - 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) - { - struct media_stream *stream = &reader->streams[i]; - media_stream_destroy(stream); - } - source_reader_release_responses(reader, NULL); free(reader->streams); MFUnlockWorkQueue(reader->queue); DeleteCriticalSection(&reader->cs); @@ -394,6 +380,21 @@ static ULONG WINAPI source_reader_source_events_callback_Release(IMFAsyncCallbac return source_reader_release(reader); }
+static struct source_reader *source_reader_source_events_callback_lock(IMFAsyncCallback *iface) +{ + struct source_reader *reader = impl_from_source_callback_IMFAsyncCallback(iface); + + EnterCriticalSection(&reader->cs); + + if (reader->flags & SOURCE_READER_SHUTDOWN) + { + LeaveCriticalSection(&reader->cs); + return NULL; + } + + return reader; +} + static HRESULT WINAPI source_reader_callback_GetParameters(IMFAsyncCallback *iface, DWORD *flags, DWORD *queue) { @@ -534,8 +535,6 @@ static HRESULT source_reader_new_stream_handler(struct source_reader *reader, IM return hr; }
- EnterCriticalSection(&reader->cs); - for (i = 0; i < reader->stream_count; ++i) { if (id == reader->streams[i].id) @@ -561,8 +560,6 @@ static HRESULT source_reader_new_stream_handler(struct source_reader *reader, IM if (i == reader->stream_count) WARN("Stream with id %#lx was not present in presentation descriptor.\n", id);
- LeaveCriticalSection(&reader->cs); - IMFMediaStream_Release(stream);
return hr; @@ -570,8 +567,6 @@ static HRESULT source_reader_new_stream_handler(struct source_reader *reader, IM
static HRESULT source_reader_source_state_handler(struct source_reader *reader, MediaEventType event_type) { - EnterCriticalSection(&reader->cs); - switch (event_type) { case MESourceStarted: @@ -589,18 +584,12 @@ static HRESULT source_reader_source_state_handler(struct source_reader *reader, WARN("Unhandled event %ld.\n", event_type); }
- LeaveCriticalSection(&reader->cs); - - WakeAllConditionVariable(&reader->state_event); - if (event_type == MESourceStopped) - WakeAllConditionVariable(&reader->stop_event); - return S_OK; }
static HRESULT WINAPI source_reader_source_events_callback_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result) { - struct source_reader *reader = impl_from_source_callback_IMFAsyncCallback(iface); + struct source_reader *reader; MediaEventType event_type; IMFMediaSource *source; IMFMediaEvent *event; @@ -620,13 +609,33 @@ static HRESULT WINAPI source_reader_source_events_callback_Invoke(IMFAsyncCallba switch (event_type) { case MENewStream: + { + if (!(reader = source_reader_source_events_callback_lock(iface))) + { + IMFMediaEvent_Release(event); + return MF_E_SHUTDOWN; + } + hr = source_reader_new_stream_handler(reader, event); + LeaveCriticalSection(&reader->cs); break; + } case MESourceStarted: case MESourcePaused: case MESourceStopped: case MESourceSeeked: + if (!(reader = source_reader_source_events_callback_lock(iface))) + { + IMFMediaEvent_Release(event); + return MF_E_SHUTDOWN; + } + hr = source_reader_source_state_handler(reader, event_type); + LeaveCriticalSection(&reader->cs); + + WakeAllConditionVariable(&reader->state_event); + if (event_type == MESourceStopped) + WakeAllConditionVariable(&reader->stop_event); break; case MEBufferingStarted: case MEBufferingStopped: @@ -637,6 +646,13 @@ static HRESULT WINAPI source_reader_source_events_callback_Invoke(IMFAsyncCallba case MESourceMetadataChanged: case MEContentProtectionMetadata: case MEDeviceThermalStateChanged: + if (!(reader = source_reader_source_events_callback_lock(iface))) + { + IMFMediaEvent_Release(event); + return MF_E_SHUTDOWN; + } + LeaveCriticalSection(&reader->cs); + if (reader->async_callback) IMFSourceReaderCallback_OnEvent(reader->async_callback, MF_SOURCE_READER_MEDIASOURCE, event); break; @@ -676,6 +692,21 @@ static ULONG WINAPI source_reader_stream_events_callback_Release(IMFAsyncCallbac return source_reader_release(reader); }
+static struct source_reader *source_reader_stream_events_callback_lock(IMFAsyncCallback *iface) +{ + struct source_reader *reader = impl_from_stream_callback_IMFAsyncCallback(iface); + + EnterCriticalSection(&reader->cs); + + if (reader->flags & SOURCE_READER_SHUTDOWN) + { + LeaveCriticalSection(&reader->cs); + return NULL; + } + + return reader; +} + static HRESULT source_reader_allocate_stream_sample(MFT_OUTPUT_STREAM_INFO *info, IMFSample **out) { IMFMediaBuffer *buffer; @@ -962,8 +993,6 @@ static HRESULT source_reader_media_sample_handler(struct source_reader *reader, return hr; }
- EnterCriticalSection(&reader->cs); - for (i = 0; i < reader->stream_count; ++i) { if (id == reader->streams[i].id) @@ -978,8 +1007,6 @@ static HRESULT source_reader_media_sample_handler(struct source_reader *reader, if (i == reader->stream_count) WARN("Stream with id %#lx was not present in presentation descriptor.\n", id);
- LeaveCriticalSection(&reader->cs); - IMFSample_Release(sample);
return hr; @@ -1003,8 +1030,6 @@ static HRESULT source_reader_media_stream_state_handler(struct source_reader *re return hr; }
- EnterCriticalSection(&reader->cs); - for (i = 0; i < reader->stream_count; ++i) { struct media_stream *stream = &reader->streams[i]; @@ -1056,17 +1081,12 @@ static HRESULT source_reader_media_stream_state_handler(struct source_reader *re } }
- LeaveCriticalSection(&reader->cs); - - if (event_type == MEStreamStopped) - WakeAllConditionVariable(&reader->stop_event); - return S_OK; }
static HRESULT WINAPI source_reader_stream_events_callback_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result) { - struct source_reader *reader = impl_from_stream_callback_IMFAsyncCallback(iface); + struct source_reader *reader; MediaEventType event_type; IMFMediaStream *stream; IMFMediaEvent *event; @@ -1086,14 +1106,31 @@ static HRESULT WINAPI source_reader_stream_events_callback_Invoke(IMFAsyncCallba switch (event_type) { case MEMediaSample: + if (!(reader = source_reader_stream_events_callback_lock(iface))) + { + IMFMediaEvent_Release(event); + return MF_E_SHUTDOWN; + } + hr = source_reader_media_sample_handler(reader, stream, event); + LeaveCriticalSection(&reader->cs); break; case MEStreamSeeked: case MEStreamStarted: case MEStreamStopped: case MEStreamTick: case MEEndOfStream: + if (!(reader = source_reader_stream_events_callback_lock(iface))) + { + IMFMediaEvent_Release(event); + return MF_E_SHUTDOWN; + } + hr = source_reader_media_stream_state_handler(reader, stream, event); + LeaveCriticalSection(&reader->cs); + + if (event_type == MEStreamStopped) + WakeAllConditionVariable(&reader->stop_event); break; default: ; @@ -1131,6 +1168,21 @@ static ULONG WINAPI source_reader_async_commands_callback_Release(IMFAsyncCallba return source_reader_release(reader); }
+static struct source_reader *source_reader_async_commands_callback_lock(IMFAsyncCallback *iface) +{ + struct source_reader *reader = impl_from_async_commands_callback_IMFAsyncCallback(iface); + + EnterCriticalSection(&reader->cs); + + if (reader->flags & SOURCE_READER_SHUTDOWN) + { + LeaveCriticalSection(&reader->cs); + return NULL; + } + + return reader; +} + static struct stream_response * media_stream_detach_response(struct source_reader *reader, struct stream_response *response) { struct media_stream *stream; @@ -1434,7 +1486,7 @@ static HRESULT source_reader_flush(struct source_reader *reader, unsigned int in
static HRESULT WINAPI source_reader_async_commands_callback_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result) { - struct source_reader *reader = impl_from_async_commands_callback_IMFAsyncCallback(iface); + struct source_reader *reader; struct media_stream *stream, stub_stream = { .requests = 1 }; struct source_reader_async_command *command; struct stream_response *response; @@ -1445,15 +1497,16 @@ static HRESULT WINAPI source_reader_async_commands_callback_Invoke(IMFAsyncCallb HRESULT hr, status; IUnknown *state;
- if (FAILED(hr = IMFAsyncResult_GetState(result, &state))) - return hr; + if (!(state = IMFAsyncResult_GetStateNoAddRef(result))) + return E_INVALIDARG;
command = impl_from_async_command_IUnknown(state);
switch (command->op) { case SOURCE_READER_ASYNC_READ: - EnterCriticalSection(&reader->cs); + if (!(reader = source_reader_async_commands_callback_lock(iface))) + return MF_E_SHUTDOWN;
if (SUCCEEDED(hr = source_reader_start_source(reader))) { @@ -1488,8 +1541,9 @@ static HRESULT WINAPI source_reader_async_commands_callback_Invoke(IMFAsyncCallb break;
case SOURCE_READER_ASYNC_SEEK: + if (!(reader = source_reader_async_commands_callback_lock(iface))) + return MF_E_SHUTDOWN;
- EnterCriticalSection(&reader->cs); if (SUCCEEDED(IMFMediaSource_Start(reader->source, reader->descriptor, &command->u.seek.format, &command->u.seek.position))) { @@ -1500,8 +1554,9 @@ static HRESULT WINAPI source_reader_async_commands_callback_Invoke(IMFAsyncCallb break;
case SOURCE_READER_ASYNC_SAMPLE_READY: + if (!(reader = source_reader_async_commands_callback_lock(iface))) + return MF_E_SHUTDOWN;
- EnterCriticalSection(&reader->cs); response = media_stream_pop_response(reader, NULL); LeaveCriticalSection(&reader->cs);
@@ -1514,7 +1569,9 @@ static HRESULT WINAPI source_reader_async_commands_callback_Invoke(IMFAsyncCallb
break; case SOURCE_READER_ASYNC_FLUSH: - EnterCriticalSection(&reader->cs); + if (!(reader = source_reader_async_commands_callback_lock(iface))) + return MF_E_SHUTDOWN; + source_reader_flush(reader, command->u.flush.stream_index); reader->flags &= ~SOURCE_READER_FLUSHING; LeaveCriticalSection(&reader->cs); @@ -1525,8 +1582,6 @@ static HRESULT WINAPI source_reader_async_commands_callback_Invoke(IMFAsyncCallb ; }
- IUnknown_Release(state); - return S_OK; }
@@ -1598,6 +1653,10 @@ static ULONG WINAPI src_reader_Release(IMFSourceReaderEx *iface)
if (!refcount) { + EnterCriticalSection(&reader->cs); + reader->flags |= SOURCE_READER_SHUTDOWN; + LeaveCriticalSection(&reader->cs); + if (reader->flags & SOURCE_READER_SHUTDOWN_ON_RELEASE) IMFMediaSource_Shutdown(reader->source); else if (SUCCEEDED(IMFMediaSource_Stop(reader->source))) @@ -1626,8 +1685,26 @@ static ULONG WINAPI src_reader_Release(IMFSourceReaderEx *iface) IMFVideoSampleAllocatorCallback_SetCallback(callback, NULL); IMFVideoSampleAllocatorCallback_Release(callback); } + + IMFVideoSampleAllocatorEx_UninitializeSampleAllocator(stream->allocator); + IMFVideoSampleAllocatorEx_SetDirectXManager(stream->allocator, NULL); }
+ if (reader->device_manager) + IUnknown_Release(reader->device_manager); + 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) + { + struct media_stream *stream = &reader->streams[i]; + media_stream_destroy(stream); + } + source_reader_release_responses(reader, NULL); + source_reader_release(reader); }
diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index 027aa45b1ea..ba1029a1e80 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -3099,7 +3099,7 @@ static void test_source_reader_transforms_d3d(void) ref = IMFSourceReader_Release(reader); ok(ref == 0, "got ref %ld\n", ref); ref = IMFTransform_Release(test_decoder); - todo_wine ok(ref == 0, "got ref %ld\n", ref); + ok(ref == 0, "got ref %ld\n", ref);
/* test d3d aware decoder that allocates buffers */ @@ -3176,7 +3176,7 @@ static void test_source_reader_transforms_d3d(void) ref = IMFSourceReader_Release(reader); ok(ref == 0, "got ref %ld\n", ref); ref = IMFTransform_Release(test_decoder); - todo_wine ok(ref == 0, "got ref %ld\n", ref); + ok(ref == 0, "got ref %ld\n", ref);
test_decoder_allocate_samples = FALSE;
@@ -3186,7 +3186,7 @@ skip_tests: ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
ref = IDirect3DDeviceManager9_Release(d3d9_manager); - todo_wine ok(ref == 0, "got ref %ld\n", ref); + ok(ref == 0, "got ref %ld\n", ref); DestroyWindow(window);
test_decoder_d3d_aware = FALSE;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfreadwrite/reader.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/dlls/mfreadwrite/reader.c b/dlls/mfreadwrite/reader.c index 9036919bdf6..bbe12aeed02 100644 --- a/dlls/mfreadwrite/reader.c +++ b/dlls/mfreadwrite/reader.c @@ -224,6 +224,8 @@ static void media_stream_destroy(struct media_stream *stream) transform_entry_destroy(entry); }
+ if (stream->transform_service) + IMFTransform_Release(stream->transform_service); if (stream->stream) IMFMediaStream_Release(stream->stream); if (stream->current)
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=144674
Your paranoid android.
=== w8 (32 bit report) ===
mfreadwrite: mfplat.c:3179: Test failed: got ref 3
=== w8adm (32 bit report) ===
mfreadwrite: mfplat.c:3189: Test failed: got ref 1
=== w864 (32 bit report) ===
mfreadwrite: mfplat.c:3179: Test failed: got ref 3
=== w1064v1507 (32 bit report) ===
mfreadwrite: mfplat.c:3102: Test failed: got ref 3
=== w1064_tsign (32 bit report) ===
mfreadwrite: mfplat.c:3189: Test failed: got ref 2
=== w11pro64 (32 bit report) ===
mfreadwrite: mfplat.c:3189: Test failed: got ref 2
=== w864 (64 bit report) ===
mfreadwrite: mfplat.c:3179: Test failed: got ref 3
=== w1064_2qxl (64 bit report) ===
mfreadwrite: mfplat.c:3102: Test failed: got ref 3 mfplat.c:3179: Test failed: got ref 3
=== w1064_adm (64 bit report) ===
mfreadwrite: mfplat.c:3189: Test failed: got ref 2
=== w10pro64_ja (64 bit report) ===
mfreadwrite: mfplat.c:3189: Test failed: got ref 2
=== w10pro64_zh_CN (64 bit report) ===
mfreadwrite: mfplat.c:3102: Test failed: got ref 3 mfplat.c:3189: Test failed: got ref 1
=== debian11b (64 bit WoW report) ===
user32: input.c:3875: Test succeeded inside todo block: button_down_hwnd_todo 1: got MSG_TEST_WIN hwnd 00000000007300F0, msg WM_LBUTTONDOWN, wparam 0x1, lparam 0x320032
Welp, looks like (https://testbot.winehq.org/JobDetails.pl?Key=144674) transform and d3d manager refcount is transient on Windows... I will probably drop the tests. Any opinion on the fix?