[PATCH 0/4] MR10731: mfmediaengine: Support media engine extensions.
The test_TransferVideoFrame() change is just something I spotted, not related to anything else. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10731
From: Conor McCarthy <cmccarthy@codeweavers.com> --- dlls/mfmediaengine/tests/mfmediaengine.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c index 5018cefb82e..4d08023f58f 100644 --- a/dlls/mfmediaengine/tests/mfmediaengine.c +++ b/dlls/mfmediaengine/tests/mfmediaengine.c @@ -1472,12 +1472,12 @@ static void test_TransferVideoFrame(void) IMFDXGIDeviceManager_Release(manager); - hr = IMFMediaEngineEx_SetVolume(media_engine, 0.5); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (!(notify->media_engine = media_engine)) goto done; + hr = IMFMediaEngineEx_SetVolume(media_engine, 0.5); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + memset(&desc, 0, sizeof(desc)); desc.Width = 64; desc.Height = 64; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10731
From: Conor McCarthy <cmccarthy@codeweavers.com> --- dlls/mfmediaengine/tests/mfmediaengine.c | 153 +++++++++++++++-------- 1 file changed, 103 insertions(+), 50 deletions(-) diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c index 4d08023f58f..445d5f6988f 100644 --- a/dlls/mfmediaengine/tests/mfmediaengine.c +++ b/dlls/mfmediaengine/tests/mfmediaengine.c @@ -279,8 +279,19 @@ static ID3D11Device *create_d3d11_device(void) return NULL; } -static HRESULT create_media_engine(IMFMediaEngineNotify *callback, IMFDXGIDeviceManager *manager, UINT32 output_format, - REFIID riid, void **obj) +struct test_extension +{ + IMFMediaEngineExtension IMFMediaEngineExtension_iface; + LONG refcount; + IMFMediaEngine *media_engine; + IMFSourceResolver *resolver; + BOOL have_bytestream; +}; + +static struct test_extension *create_extension(void); + +static HRESULT create_media_engine(IMFMediaEngineNotify *callback, IMFDXGIDeviceManager *manager, BOOL add_extension, + UINT32 output_format, REFIID riid, void **obj) { IMFMediaEngine *media_engine; IMFAttributes *attributes; @@ -300,6 +311,16 @@ static HRESULT create_media_engine(IMFMediaEngineNotify *callback, IMFDXGIDevice hr = IMFAttributes_SetUINT32(attributes, &MF_MEDIA_ENGINE_VIDEO_OUTPUT_FORMAT, output_format); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (add_extension) + { + struct test_extension *extension = create_extension(); + ok(!!extension, "Failed to create an extension.\n"); + hr = IMFAttributes_SetUnknown(attributes, &MF_MEDIA_ENGINE_EXTENSION, (IUnknown *)&extension->IMFMediaEngineExtension_iface); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + extension->media_engine = media_engine; + IMFMediaEngineExtension_Release(&extension->IMFMediaEngineExtension_iface); + } + hr = IMFMediaEngineClassFactory_CreateInstance(factory, 0, attributes, &media_engine); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); @@ -455,7 +476,7 @@ static void test_CreateInstance(void) IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); } -static void test_Shutdown(void) +static void test_Shutdown(BOOL add_extension) { MF_MEDIA_ENGINE_CANPLAY can_play_state; struct media_engine_notify *notify; @@ -473,7 +494,7 @@ static void test_Shutdown(void) notify = create_callback(); - hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, DXGI_FORMAT_UNKNOWN, + hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, add_extension, DXGI_FORMAT_UNKNOWN, &IID_IMFMediaEngine, (void **)&media_engine); ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); @@ -650,7 +671,7 @@ static void test_Shutdown(void) IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); } -static void test_Play(void) +static void test_Play(BOOL add_extension) { struct media_engine_notify *notify; IMFMediaTimeRange *range, *range1; @@ -662,7 +683,7 @@ static void test_Play(void) notify = create_callback(); - hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, DXGI_FORMAT_UNKNOWN, + hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, add_extension, DXGI_FORMAT_UNKNOWN, &IID_IMFMediaEngine, (void **)&media_engine); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); @@ -713,7 +734,7 @@ static void test_Play(void) IMFMediaEngine_Release(media_engine); /* Play -> Pause */ - hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, DXGI_FORMAT_UNKNOWN, + hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, add_extension, DXGI_FORMAT_UNKNOWN, &IID_IMFMediaEngine, (void **)&media_engine); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); @@ -733,7 +754,7 @@ static void test_Play(void) IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); } -static void test_playback_rate(void) +static void test_playback_rate(BOOL add_extension) { struct media_engine_notify *notify; IMFMediaEngine *media_engine; @@ -742,7 +763,7 @@ static void test_playback_rate(void) notify = create_callback(); - hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, DXGI_FORMAT_UNKNOWN, + hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, add_extension, DXGI_FORMAT_UNKNOWN, &IID_IMFMediaEngine, (void **)&media_engine); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); @@ -861,7 +882,7 @@ cleanup: IMMDeviceEnumerator_Release(mme); } -static void test_mute(void) +static void test_mute(BOOL add_extension) { struct media_engine_notify *notify; IMFMediaEngine *media_engine; @@ -871,7 +892,7 @@ static void test_mute(void) notify = create_callback(); - hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, DXGI_FORMAT_UNKNOWN, + hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, add_extension, DXGI_FORMAT_UNKNOWN, &IID_IMFMediaEngine, (void **)&media_engine); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); @@ -914,7 +935,7 @@ static void test_mute(void) IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); } -static void test_error(void) +static void test_error(BOOL add_extension) { struct media_engine_notify *notify; IMFMediaEngine *media_engine; @@ -924,7 +945,7 @@ static void test_error(void) notify = create_callback(); - hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, DXGI_FORMAT_UNKNOWN, + hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, add_extension, DXGI_FORMAT_UNKNOWN, &IID_IMFMediaEngine, (void **)&media_engine); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); @@ -1188,7 +1209,7 @@ static void test_SetSourceFromByteStream(void) notify = create_callback(); - hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, DXGI_FORMAT_UNKNOWN, + hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, FALSE, DXGI_FORMAT_UNKNOWN, &IID_IMFMediaEngineEx, (void **)&media_engine); if (FAILED(hr)) { @@ -1224,7 +1245,7 @@ static void test_SetSourceFromByteStream(void) IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); } -static void test_audio_configuration(void) +static void test_audio_configuration(BOOL add_extension) { struct media_engine_notify *notify; IMFMediaEngineEx *media_engine; @@ -1233,7 +1254,7 @@ static void test_audio_configuration(void) notify = create_callback(); - hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, DXGI_FORMAT_UNKNOWN, + hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, add_extension, DXGI_FORMAT_UNKNOWN, &IID_IMFMediaEngineEx, (void **)&media_engine); if (FAILED(hr)) { @@ -1433,7 +1454,7 @@ static DWORD compare_rgb32_(int line, ID3D11Texture2D *texture, const RECT *dst_ return res; } -static void test_TransferVideoFrame(void) +static void test_TransferVideoFrame(BOOL add_extension) { struct test_transfer_notify *notify; ID3D11Texture2D *texture = NULL, *rb_texture; @@ -1467,7 +1488,7 @@ static void test_TransferVideoFrame(void) hr = IMFDXGIDeviceManager_ResetDevice(manager, (IUnknown *)device, token); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - create_media_engine(¬ify->IMFMediaEngineNotify_iface, manager, DXGI_FORMAT_B8G8R8X8_UNORM, + create_media_engine(¬ify->IMFMediaEngineNotify_iface, manager, add_extension, DXGI_FORMAT_B8G8R8X8_UNORM, &IID_IMFMediaEngineEx, (void **)&media_engine); IMFDXGIDeviceManager_Release(manager); @@ -1563,7 +1584,7 @@ static void test_TransferVideoFrame(void) hr = IMFMediaEngineEx_SetVolume(media_engine, 0.5); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - test_audio_session(FALSE); + test_audio_session(add_extension); ID3D11Texture2D_Release(rb_texture); @@ -1590,7 +1611,7 @@ done: IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); } -static void test_TransferVideoFrame_wic(void) +static void test_TransferVideoFrame_wic(BOOL add_extension) { struct test_transfer_notify *notify; UINT lock_buffer_size, lock_buffer_stride; @@ -1611,7 +1632,7 @@ static void test_TransferVideoFrame_wic(void) notify = create_transfer_notify(); - create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, DXGI_FORMAT_B8G8R8X8_UNORM, + create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, add_extension, DXGI_FORMAT_B8G8R8X8_UNORM, &IID_IMFMediaEngineEx, (void **)&media_engine); if (!(notify->media_engine = media_engine)) @@ -2025,7 +2046,7 @@ static HRESULT WINAPI test_transform_create(UINT input_count, IMFMediaType **inp return S_OK; } -static void test_effect(void) +static void test_effect(BOOL add_extension) { IMFTransform *video_effect = NULL, *video_effect2 = NULL, *audio_effect = NULL, *audio_effect2 = NULL; IMFMediaType *video_i420, *video_rgb32, *audio_pcm; @@ -2094,7 +2115,7 @@ static void test_effect(void) hr = IMFDXGIDeviceManager_ResetDevice(manager, (IUnknown *)device, token); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - create_media_engine(¬ify->IMFMediaEngineNotify_iface, manager, DXGI_FORMAT_B8G8R8X8_UNORM, + create_media_engine(¬ify->IMFMediaEngineNotify_iface, manager, add_extension, DXGI_FORMAT_B8G8R8X8_UNORM, &IID_IMFMediaEngineEx, (void **)&media_engine); IMFDXGIDeviceManager_Release(manager); notify->media_engine = media_engine; @@ -2212,7 +2233,7 @@ done: IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); } -static void test_GetDuration(void) +static void test_GetDuration(BOOL add_extension) { static const double allowed_error = 0.000001; struct test_transfer_notify *notify; @@ -2224,7 +2245,7 @@ static void test_GetDuration(void) BSTR url; notify = create_transfer_notify(); - hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, DXGI_FORMAT_B8G8R8X8_UNORM, + hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, add_extension, DXGI_FORMAT_B8G8R8X8_UNORM, &IID_IMFMediaEngineEx, (void **)&media_engine); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); notify->media_engine = media_engine; @@ -2562,7 +2583,7 @@ static struct test_seek_notify *create_seek_notify(void) return object; } -static void test_GetSeekable(void) +static void test_GetSeekable(BOOL add_extension) { IMFByteStream *stream, *unseekable_stream = NULL; struct test_seek_notify *notify; @@ -2576,7 +2597,7 @@ static void test_GetSeekable(void) BSTR url; notify = create_seek_notify(); - hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, DXGI_FORMAT_B8G8R8X8_UNORM, + hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, add_extension, DXGI_FORMAT_B8G8R8X8_UNORM, &IID_IMFMediaEngineEx, (void **)&media_engine); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); @@ -2639,7 +2660,7 @@ static void test_GetSeekable(void) /* Unseekable bytestreams */ notify = create_seek_notify(); - hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, DXGI_FORMAT_B8G8R8X8_UNORM, + hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, add_extension, DXGI_FORMAT_B8G8R8X8_UNORM, &IID_IMFMediaEngineEx, (void **)&media_engine); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); @@ -2672,12 +2693,6 @@ done: IMFByteStream_Release(stream); } -struct test_extension -{ - IMFMediaEngineExtension IMFMediaEngineExtension_iface; - LONG refcount; -}; - static struct test_extension *impl_from_IMFMediaEngineExtension(IMFMediaEngineExtension *iface) { return CONTAINING_RECORD(iface, struct test_extension, IMFMediaEngineExtension_iface); @@ -2709,7 +2724,10 @@ static ULONG WINAPI test_extension_Release(IMFMediaEngineExtension *iface) ULONG refcount = InterlockedDecrement(&extension->refcount); if (!refcount) + { + IMFSourceResolver_Release(extension->resolver); free(extension); + } return refcount; } @@ -2717,14 +2735,28 @@ static ULONG WINAPI test_extension_Release(IMFMediaEngineExtension *iface) static HRESULT WINAPI test_extension_CanPlayType(IMFMediaEngineExtension *iface, BOOL audio_only, BSTR mime_type, MF_MEDIA_ENGINE_CANPLAY *answer) { - return 0x80001234; + struct test_extension *extension = impl_from_IMFMediaEngineExtension(iface); + return extension->media_engine ? IMFMediaEngine_CanPlayType(extension->media_engine, mime_type, answer) : 0x80001234; } static HRESULT WINAPI test_extension_BeginCreateObject(IMFMediaEngineExtension *iface, BSTR url, IMFByteStream *bytestream, MF_OBJECT_TYPE type, IUnknown **cancel_cookie, IMFAsyncCallback *callback, IUnknown *state) { - return E_NOTIMPL; + struct test_extension *extension = impl_from_IMFMediaEngineExtension(iface); + DWORD flags; + + flags = type == MF_OBJECT_BYTESTREAM ? MF_RESOLUTION_BYTESTREAM : MF_RESOLUTION_MEDIASOURCE; + flags |= MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE; + + if (bytestream) + { + extension->have_bytestream = TRUE; + return IMFSourceResolver_BeginCreateObjectFromByteStream(extension->resolver, bytestream, url, flags, + NULL, NULL, callback, state); + } + else + return IMFSourceResolver_BeginCreateObjectFromURL(extension->resolver, url, flags, NULL, NULL, callback, NULL); } static HRESULT WINAPI test_extension_CancelObjectCreation(IMFMediaEngineExtension *iface, @@ -2736,7 +2768,13 @@ static HRESULT WINAPI test_extension_CancelObjectCreation(IMFMediaEngineExtensio static HRESULT WINAPI test_extension_EndCreateObject(IMFMediaEngineExtension *iface, IMFAsyncResult *result, IUnknown **object) { - return E_NOTIMPL; + struct test_extension *extension = impl_from_IMFMediaEngineExtension(iface); + MF_OBJECT_TYPE obj_type; + + if (extension->have_bytestream) + return IMFSourceResolver_EndCreateObjectFromByteStream(extension->resolver, result, &obj_type, object); + else + return IMFSourceResolver_EndCreateObjectFromURL(extension->resolver, result, &obj_type, object); } static const IMFMediaEngineExtensionVtbl test_extension_vtbl = @@ -2753,12 +2791,16 @@ static const IMFMediaEngineExtensionVtbl test_extension_vtbl = static struct test_extension *create_extension(void) { struct test_extension *object; + HRESULT hr; object = calloc(1, sizeof(*object)); object->IMFMediaEngineExtension_iface.lpVtbl = &test_extension_vtbl; object->refcount = 1; + hr = MFCreateSourceResolver(&object->resolver); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + return object; } @@ -2839,7 +2881,7 @@ static void test_SetCurrentTime(void) BSTR url; notify = create_seek_notify(); - hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, DXGI_FORMAT_B8G8R8X8_UNORM, + hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, FALSE, DXGI_FORMAT_B8G8R8X8_UNORM, &IID_IMFMediaEngineEx, (void **)&media_engine); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); @@ -2938,7 +2980,7 @@ static void test_SetCurrentTime(void) /* Unseekable bytestreams */ notify = create_seek_notify(); - hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, DXGI_FORMAT_B8G8R8X8_UNORM, + hr = create_media_engine(¬ify->IMFMediaEngineNotify_iface, NULL, FALSE, DXGI_FORMAT_B8G8R8X8_UNORM, &IID_IMFMediaEngineEx, (void **)&media_engine); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); @@ -3000,19 +3042,30 @@ START_TEST(mfmediaengine) test_factory(); test_CreateInstance(); - test_Shutdown(); - test_Play(); - test_playback_rate(); - test_mute(); - test_error(); + test_Shutdown(FALSE); + test_Shutdown(TRUE); + test_Play(FALSE); + test_Play(TRUE); + test_playback_rate(FALSE); + test_playback_rate(TRUE); + test_mute(FALSE); + test_mute(TRUE); + test_error(FALSE); + test_error(TRUE); test_time_range(); test_SetSourceFromByteStream(); - test_audio_configuration(); - test_TransferVideoFrame(); - test_TransferVideoFrame_wic(); - test_effect(); - test_GetDuration(); - test_GetSeekable(); + test_audio_configuration(FALSE); + test_audio_configuration(TRUE); + test_TransferVideoFrame(FALSE); + test_TransferVideoFrame(TRUE); + test_TransferVideoFrame_wic(FALSE); + test_TransferVideoFrame_wic(TRUE); + test_effect(FALSE); + test_effect(TRUE); + test_GetDuration(FALSE); + test_GetDuration(TRUE); + test_GetSeekable(FALSE); + test_GetSeekable(TRUE); test_media_extension(); test_SetCurrentTime(); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10731
From: Conor McCarthy <cmccarthy@codeweavers.com> When extension support is added, if an extension doesn't use an async work item in BeginCreateObject() and instead invokes the callback from the current thread, it breaks ordering of FLAGS_ENGINE_SOURCE_PENDING set/clear because the critical section in our Invoke() function won't block. --- dlls/mfmediaengine/main.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index fc04cdbd567..213592b1d80 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -1735,6 +1735,9 @@ static HRESULT media_engine_set_source(struct media_engine *engine, IMFByteStrea if (url || bytestream) { + if (SUCCEEDED(hr)) + media_engine_set_flag(engine, FLAGS_ENGINE_SOURCE_PENDING, TRUE); + if (engine->extension) FIXME("Use extension to load from.\n"); @@ -1750,8 +1753,6 @@ static HRESULT media_engine_set_source(struct media_engine *engine, IMFByteStrea else hr = IMFSourceResolver_BeginCreateObjectFromURL(engine->resolver, url, flags, props, NULL, &engine->load_handler, NULL); - if (SUCCEEDED(hr)) - media_engine_set_flag(engine, FLAGS_ENGINE_SOURCE_PENDING, TRUE); if (props) IPropertyStore_Release(props); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10731
From: Conor McCarthy <cmccarthy@codeweavers.com> --- dlls/mfmediaengine/main.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index 213592b1d80..2c245609bfb 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -1530,7 +1530,9 @@ static HRESULT WINAPI media_engine_load_handler_Invoke(IMFAsyncCallback *iface, start_playback = engine->flags & FLAGS_ENGINE_PLAY_PENDING; media_engine_set_flag(engine, FLAGS_ENGINE_SOURCE_PENDING | FLAGS_ENGINE_PLAY_PENDING, FALSE); - if (SUCCEEDED(IMFAsyncResult_GetState(result, &state))) + if (engine->extension) + hr = IMFMediaEngineExtension_EndCreateObject(engine->extension, result, &object); + else if (SUCCEEDED(IMFAsyncResult_GetState(result, &state))) { hr = IMFSourceResolver_EndCreateObjectFromByteStream(engine->resolver, result, &obj_type, &object); IUnknown_Release(state); @@ -1739,20 +1741,25 @@ static HRESULT media_engine_set_source(struct media_engine *engine, IMFByteStrea media_engine_set_flag(engine, FLAGS_ENGINE_SOURCE_PENDING, TRUE); if (engine->extension) - FIXME("Use extension to load from.\n"); - - flags = MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE; - if (engine->flags & MF_MEDIA_ENGINE_DISABLE_LOCAL_PLUGINS) - flags |= MF_RESOLUTION_DISABLE_LOCAL_PLUGINS; - - IMFAttributes_GetUnknown(engine->attributes, &MF_MEDIA_ENGINE_SOURCE_RESOLVER_CONFIG_STORE, - &IID_IPropertyStore, (void **)&props); - if (bytestream) - hr = IMFSourceResolver_BeginCreateObjectFromByteStream(engine->resolver, bytestream, url, flags, - props, NULL, &engine->load_handler, (IUnknown *)bytestream); + { + hr = IMFMediaEngineExtension_BeginCreateObject(engine->extension, url, bytestream, MF_OBJECT_MEDIASOURCE, NULL, + &engine->load_handler, (IUnknown *)bytestream); + } else - hr = IMFSourceResolver_BeginCreateObjectFromURL(engine->resolver, url, flags, props, NULL, - &engine->load_handler, NULL); + { + flags = MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE; + if (engine->flags & MF_MEDIA_ENGINE_DISABLE_LOCAL_PLUGINS) + flags |= MF_RESOLUTION_DISABLE_LOCAL_PLUGINS; + + IMFAttributes_GetUnknown(engine->attributes, &MF_MEDIA_ENGINE_SOURCE_RESOLVER_CONFIG_STORE, + &IID_IPropertyStore, (void **)&props); + if (bytestream) + hr = IMFSourceResolver_BeginCreateObjectFromByteStream(engine->resolver, bytestream, url, flags, + props, NULL, &engine->load_handler, (IUnknown *)bytestream); + else + hr = IMFSourceResolver_BeginCreateObjectFromURL(engine->resolver, url, flags, props, NULL, + &engine->load_handler, NULL); + } if (props) IPropertyStore_Release(props); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10731
Is this useful for to improve testing or some application is using extensions? -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10731#note_137461
On Thu Apr 23 14:30:05 2026 +0000, Nikolay Sivov wrote:
Is this useful for to improve testing or some application is using extensions? Idle Iktah is using one.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/10731#note_137462
participants (3)
-
Conor McCarthy -
Conor McCarthy (@cmccarthy) -
Nikolay Sivov (@nsivov)