From: Conor McCarthy cmccarthy@codeweavers.com
Allows resolution failure to be handled locally. --- dlls/mfmediaengine/main.c | 41 ++++++++++++++++++------ dlls/mfmediaengine/tests/mfmediaengine.c | 3 +- 2 files changed, 34 insertions(+), 10 deletions(-)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index a12106d1a1d..607c587aab5 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -1164,27 +1164,41 @@ static HRESULT media_engine_create_effects(struct effect *effects, size_t count, static HRESULT media_engine_create_audio_renderer(struct media_engine *engine, IMFTopologyNode **node) { unsigned int category, role; - IMFActivate *sar_activate; + IMFStreamSink *stream_sink; + IMFAttributes *attributes; + IMFMediaSink *media_sink; HRESULT hr;
*node = NULL;
- if (FAILED(hr = MFCreateAudioRendererActivate(&sar_activate))) + if (FAILED(hr = MFCreateAttributes(&attributes, 2))) return hr;
/* Configuration attributes keys differ between Engine and SAR. */ if (SUCCEEDED(IMFAttributes_GetUINT32(engine->attributes, &MF_MEDIA_ENGINE_AUDIO_CATEGORY, &category))) - IMFActivate_SetUINT32(sar_activate, &MF_AUDIO_RENDERER_ATTRIBUTE_STREAM_CATEGORY, category); + IMFAttributes_SetUINT32(attributes, &MF_AUDIO_RENDERER_ATTRIBUTE_STREAM_CATEGORY, category); if (SUCCEEDED(IMFAttributes_GetUINT32(engine->attributes, &MF_MEDIA_ENGINE_AUDIO_ENDPOINT_ROLE, &role))) - IMFActivate_SetUINT32(sar_activate, &MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ROLE, role); + IMFAttributes_SetUINT32(attributes, &MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ROLE, role); + hr = MFCreateAudioRenderer(attributes, &media_sink); + IMFAttributes_Release(attributes); + + if (FAILED(hr)) + return hr;
if (SUCCEEDED(hr = MFCreateTopologyNode(MF_TOPOLOGY_OUTPUT_NODE, node))) { - IMFTopologyNode_SetObject(*node, (IUnknown *)sar_activate); - IMFTopologyNode_SetUINT32(*node, &MF_TOPONODE_NOSHUTDOWN_ON_REMOVE, FALSE); + if (FAILED(hr = IMFMediaSink_GetStreamSinkByIndex(media_sink, 0, &stream_sink))) + hr = IMFMediaSink_AddStreamSink(media_sink, 0, NULL, &stream_sink); + + if (SUCCEEDED(hr)) + { + IMFTopologyNode_SetObject(*node, (IUnknown *)stream_sink); + IMFTopologyNode_SetUINT32(*node, &MF_TOPONODE_NOSHUTDOWN_ON_REMOVE, FALSE); + IMFStreamSink_Release(stream_sink); + } }
- IMFActivate_Release(sar_activate); + IMFMediaSink_Release(media_sink);
return hr; } @@ -1273,9 +1287,10 @@ static void media_engine_clear_effects(struct effects *effects) static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMediaSource *source) { IMFStreamDescriptor *sd_audio = NULL, *sd_video = NULL; + IMFTopology *topology, *resolved_topology = NULL; IMFPresentationDescriptor *pd; + IMFTopoLoader *topo_loader; DWORD stream_count = 0, i; - IMFTopology *topology; UINT64 duration; HRESULT hr;
@@ -1410,12 +1425,20 @@ static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMedi IMFTopology_SetUINT32(topology, &MF_TOPOLOGY_ENUMERATE_SOURCE_TYPES, TRUE); IMFTopology_SetUINT32(topology, &MF_TOPOLOGY_ENABLE_XVP_FOR_PLAYBACK, TRUE);
+ if (SUCCEEDED(hr) && SUCCEEDED(hr = MFCreateTopoLoader(&topo_loader))) + { + hr = IMFTopoLoader_Load(topo_loader, topology, &resolved_topology, NULL); + IMFTopoLoader_Release(topo_loader); + } if (SUCCEEDED(hr)) - hr = IMFMediaSession_SetTopology(engine->session, MFSESSION_SETTOPOLOGY_IMMEDIATE, topology); + hr = IMFMediaSession_SetTopology(engine->session, + MFSESSION_SETTOPOLOGY_IMMEDIATE | MFSESSION_SETTOPOLOGY_NORESOLUTION, resolved_topology); }
if (topology) IMFTopology_Release(topology); + if (resolved_topology) + IMFTopology_Release(resolved_topology);
if (sd_video) IMFStreamDescriptor_Release(sd_video); diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c index 8ea7a69b158..9e0d5e16fb9 100644 --- a/dlls/mfmediaengine/tests/mfmediaengine.c +++ b/dlls/mfmediaengine/tests/mfmediaengine.c @@ -1239,6 +1239,7 @@ static HRESULT WINAPI test_transfer_notify_EventNotify(IMFMediaEngineNotify *ifa break;
case MF_MEDIA_ENGINE_EVENT_ERROR: + todo_wine_if(param2 == MF_E_NO_MORE_TYPES) ok(broken(param2 == MF_E_UNSUPPORTED_BYTESTREAM_TYPE || param2 == MF_E_INVALIDMEDIATYPE), "Unexpected error %#lx\n", param2); notify->error = param2; @@ -1464,7 +1465,7 @@ static void test_TransferVideoFrame_10bit(void)
if (FAILED(notify->error)) { - win_skip("Media engine reported error %#lx, skipping tests.\n", notify->error); + skip("Media engine reported error %#lx, skipping tests.\n", notify->error); goto done; }