Nikolay Sivov : mf/evr: Let mixer request necessary services.
Alexandre Julliard
julliard at winehq.org
Thu Jul 9 17:10:39 CDT 2020
Module: wine
Branch: master
Commit: 67a840dc5cbb7f07e2c482047a896b1c90ebb7ca
URL: https://source.winehq.org/git/wine.git/?a=commit;h=67a840dc5cbb7f07e2c482047a896b1c90ebb7ca
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Thu Jul 9 15:08:52 2020 +0300
mf/evr: Let mixer request necessary services.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mf/evr.c | 35 +++++++++++++++++++++++++++++++----
1 file changed, 31 insertions(+), 4 deletions(-)
diff --git a/dlls/mf/evr.c b/dlls/mf/evr.c
index 42a6c98cf6..8a4aa3c350 100644
--- a/dlls/mf/evr.c
+++ b/dlls/mf/evr.c
@@ -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)))
More information about the wine-cvs
mailing list