From: Bernhard Kölbl besentv@gmail.com
Some games try to use DXGI formats for MfMediaEngine, which are not converable to DX9 (e.g. DXGI_FORMAT_R32G32B32_FLOAT). This works on Windows, so in this case use DXGI_FORMAT_B8G8R8A8_UNORM as a fallback. --- dlls/mfmediaengine/main.c | 6 +++--- dlls/mfmediaengine/tests/mfmediaengine.c | 9 --------- 2 files changed, 3 insertions(+), 12 deletions(-)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index a191448b69f..5b887c14293 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -1046,10 +1046,10 @@ static HRESULT media_engine_create_video_renderer(struct media_engine *engine, I }
memcpy(&subtype, &MFVideoFormat_Base, sizeof(subtype)); - if (!(subtype.Data1 = MFMapDXGIFormatToDX9Format(output_format))) + while (!(subtype.Data1 = MFMapDXGIFormatToDX9Format(output_format))) { - WARN("Unrecognized output format %#x.\n", output_format); - return E_FAIL; + WARN("Unrecognized output format %#x, using DXGI_FORMAT_B8G8R8A8_UNORM as fallback.\n", output_format); + output_format = DXGI_FORMAT_B8G8R8A8_UNORM; }
if (FAILED(hr = MFCreateMediaType(&media_type))) diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c index ca06f064eb4..4f3bc2920cd 100644 --- a/dlls/mfmediaengine/tests/mfmediaengine.c +++ b/dlls/mfmediaengine/tests/mfmediaengine.c @@ -133,7 +133,6 @@ struct media_engine_notify LONG refcount;
HANDLE event_ended; - HANDLE event_error; HANDLE event_first_frame; HANDLE event_loadeddata; HANDLE event_playing; @@ -172,7 +171,6 @@ static ULONG WINAPI media_engine_notify_Release(IMFMediaEngineNotify *iface) if (!refcount) { CloseHandle(notify->event_ended); - CloseHandle(notify->event_error); CloseHandle(notify->event_first_frame); CloseHandle(notify->event_loadeddata); CloseHandle(notify->event_playing); @@ -190,7 +188,6 @@ static HRESULT WINAPI media_engine_notify_EventNotify(IMFMediaEngineNotify *ifac { case MF_MEDIA_ENGINE_EVENT_ERROR: trace("MF_MEDIA_ENGINE_EVENT_ERROR: err %p, hr %lx.\n", (void *)param1, param2); - SetEvent(impl->event_error); break; case MF_MEDIA_ENGINE_EVENT_LOADEDDATA: SetEvent(impl->event_loadeddata); @@ -224,9 +221,7 @@ static struct media_engine_notify *create_callback(void) struct media_engine_notify *object;
object = calloc(1, sizeof(*object)); - object->event_ended = CreateEventW(NULL, FALSE, FALSE, NULL); - object->event_error = CreateEventW(NULL, FALSE, FALSE, NULL); object->event_first_frame = CreateEventW(NULL, FALSE, FALSE, NULL); object->event_loadeddata = CreateEventW(NULL, FALSE, FALSE, NULL); object->event_playing = CreateEventW(NULL, FALSE, FALSE, NULL); @@ -1230,10 +1225,6 @@ static void test_playback_on_d3d_device(void) hr = IMFMediaEngine_SetSource(engine, filename); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
- /* Skip tests if media engine init fails. Currently always happening in Wine! */ - if (!WaitForSingleObject(notify->event_error, 100)) - goto done; - hr = IMFMediaEngine_Play(engine); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);