mf/evr: Let mixer request necessary services.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2020-07-09 15:08:52 +03:00 committed by Alexandre Julliard
parent cdf8118ab3
commit 67a840dc5c
1 changed files with 31 additions and 4 deletions

View File

@ -28,7 +28,8 @@ enum video_renderer_flags
{
EVR_SHUT_DOWN = 0x1,
EVR_INIT_SERVICES = 0x2, /* Currently in InitServices() call. */
EVR_PRESENTER_INITED_SERVICES = 0x4,
EVR_MIXER_INITED_SERVICES = 0x4,
EVR_PRESENTER_INITED_SERVICES = 0x8,
};
struct video_renderer
@ -96,6 +97,14 @@ static void video_renderer_release_services(struct video_renderer *renderer)
{
IMFTopologyServiceLookupClient *lookup_client;
if (renderer->flags & EVR_MIXER_INITED_SERVICES && SUCCEEDED(IMFTransform_QueryInterface(renderer->mixer,
&IID_IMFTopologyServiceLookupClient, (void **)&lookup_client)))
{
IMFTopologyServiceLookupClient_ReleaseServicePointers(lookup_client);
IMFTopologyServiceLookupClient_Release(lookup_client);
renderer->flags &= ~EVR_MIXER_INITED_SERVICES;
}
if (renderer->flags & EVR_PRESENTER_INITED_SERVICES && SUCCEEDED(IMFVideoPresenter_QueryInterface(renderer->presenter,
&IID_IMFTopologyServiceLookupClient, (void **)&lookup_client)))
{
@ -716,8 +725,10 @@ static const IMediaEventSinkVtbl media_event_sink_vtbl =
video_renderer_event_sink_Notify,
};
static HRESULT video_renderer_create_mixer(IMFAttributes *attributes, IMFTransform **out)
static HRESULT video_renderer_create_mixer(struct video_renderer *renderer, IMFAttributes *attributes,
IMFTransform **out)
{
IMFTopologyServiceLookupClient *lookup_client;
unsigned int flags = 0;
IMFActivate *activate;
CLSID clsid;
@ -736,7 +747,23 @@ static HRESULT video_renderer_create_mixer(IMFAttributes *attributes, IMFTransfo
if (FAILED(IMFAttributes_GetGUID(attributes, &MF_ACTIVATE_CUSTOM_VIDEO_MIXER_CLSID, &clsid)))
memcpy(&clsid, &CLSID_MFVideoMixer9, sizeof(clsid));
return CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IMFTransform, (void **)out);
if (SUCCEEDED(hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IMFTransform, (void **)out)))
{
if (SUCCEEDED(hr = IMFTransform_QueryInterface(*out, &IID_IMFTopologyServiceLookupClient,
(void **)&lookup_client)))
{
renderer->flags |= EVR_INIT_SERVICES;
if (SUCCEEDED(hr = IMFTopologyServiceLookupClient_InitServicePointers(lookup_client,
&renderer->IMFTopologyServiceLookup_iface)))
{
renderer->flags |= EVR_MIXER_INITED_SERVICES;
}
renderer->flags &= ~EVR_INIT_SERVICES;
IMFTopologyServiceLookupClient_Release(lookup_client);
}
}
return hr;
}
static HRESULT video_renderer_create_presenter(struct video_renderer *renderer, IMFAttributes *attributes,
@ -805,7 +832,7 @@ static HRESULT evr_create_object(IMFAttributes *attributes, void *user_context,
goto failed;
/* Create mixer and presenter. */
if (FAILED(hr = video_renderer_create_mixer(attributes, &object->mixer)))
if (FAILED(hr = video_renderer_create_mixer(object, attributes, &object->mixer)))
goto failed;
if (FAILED(hr = video_renderer_create_presenter(object, attributes, &object->presenter)))