Nikolay Sivov : mf/evr: Reinitialize presenter on clock change.
Alexandre Julliard
julliard at winehq.org
Fri Apr 16 15:56:22 CDT 2021
Module: wine
Branch: master
Commit: 55110df7eb51fc296e29e352189385d831df633b
URL: https://source.winehq.org/git/wine.git/?a=commit;h=55110df7eb51fc296e29e352189385d831df633b
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri Apr 16 16:54:55 2021 +0300
mf/evr: Reinitialize presenter on clock change.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mf/evr.c | 55 +++++++++++++++++++++++++++++++++++++------------------
1 file changed, 37 insertions(+), 18 deletions(-)
diff --git a/dlls/mf/evr.c b/dlls/mf/evr.c
index 3479bade251..6c71741436b 100644
--- a/dlls/mf/evr.c
+++ b/dlls/mf/evr.c
@@ -169,18 +169,31 @@ static struct video_stream *impl_from_stream_IMFAttributes(IMFAttributes *iface)
return CONTAINING_RECORD(iface, struct video_stream, IMFAttributes_iface);
}
-static void video_renderer_release_services(struct video_renderer *renderer)
+static HRESULT video_renderer_init_presenter_services(struct video_renderer *renderer)
{
IMFTopologyServiceLookupClient *lookup_client;
+ HRESULT hr;
- if (renderer->flags & EVR_MIXER_INITED_SERVICES && SUCCEEDED(IMFTransform_QueryInterface(renderer->mixer,
- &IID_IMFTopologyServiceLookupClient, (void **)&lookup_client)))
+ if (SUCCEEDED(hr = IMFVideoPresenter_QueryInterface(renderer->presenter, &IID_IMFTopologyServiceLookupClient,
+ (void **)&lookup_client)))
{
- IMFTopologyServiceLookupClient_ReleaseServicePointers(lookup_client);
+ renderer->flags |= EVR_INIT_SERVICES;
+ if (SUCCEEDED(hr = IMFTopologyServiceLookupClient_InitServicePointers(lookup_client,
+ &renderer->IMFTopologyServiceLookup_iface)))
+ {
+ renderer->flags |= EVR_PRESENTER_INITED_SERVICES;
+ }
+ renderer->flags &= ~EVR_INIT_SERVICES;
IMFTopologyServiceLookupClient_Release(lookup_client);
- renderer->flags &= ~EVR_MIXER_INITED_SERVICES;
}
+ return hr;
+}
+
+static void video_renderer_release_presenter_services(struct video_renderer *renderer)
+{
+ IMFTopologyServiceLookupClient *lookup_client;
+
if (renderer->flags & EVR_PRESENTER_INITED_SERVICES && SUCCEEDED(IMFVideoPresenter_QueryInterface(renderer->presenter,
&IID_IMFTopologyServiceLookupClient, (void **)&lookup_client)))
{
@@ -190,6 +203,21 @@ static void video_renderer_release_services(struct video_renderer *renderer)
}
}
+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;
+ }
+
+ video_renderer_release_presenter_services(renderer);
+}
+
static HRESULT WINAPI video_stream_sink_QueryInterface(IMFStreamSink *iface, REFIID riid, void **obj)
{
struct video_stream *stream = impl_from_IMFStreamSink(iface);
@@ -1280,12 +1308,15 @@ static void video_renderer_set_presentation_clock(struct video_renderer *rendere
IMFPresentationClock_RemoveClockStateSink(renderer->clock, &renderer->IMFClockStateSink_iface);
IMFPresentationClock_Release(renderer->clock);
}
+ video_renderer_release_presenter_services(renderer);
+
renderer->clock = clock;
if (renderer->clock)
{
IMFPresentationClock_AddRef(renderer->clock);
IMFPresentationClock_AddClockStateSink(renderer->clock, &renderer->IMFClockStateSink_iface);
}
+ video_renderer_init_presenter_services(renderer);
}
static HRESULT WINAPI video_renderer_sink_SetPresentationClock(IMFMediaSink *iface, IMFPresentationClock *clock)
@@ -1579,7 +1610,6 @@ static HRESULT video_renderer_configure_mixer(struct video_renderer *renderer)
static HRESULT video_renderer_configure_presenter(struct video_renderer *renderer)
{
- IMFTopologyServiceLookupClient *lookup_client;
IMFVideoDisplayControl *control;
HRESULT hr;
@@ -1589,18 +1619,7 @@ static HRESULT video_renderer_configure_presenter(struct video_renderer *rendere
IMFVideoDisplayControl_Release(control);
}
- if (SUCCEEDED(hr = IMFVideoPresenter_QueryInterface(renderer->presenter, &IID_IMFTopologyServiceLookupClient,
- (void **)&lookup_client)))
- {
- renderer->flags |= EVR_INIT_SERVICES;
- if (SUCCEEDED(hr = IMFTopologyServiceLookupClient_InitServicePointers(lookup_client,
- &renderer->IMFTopologyServiceLookup_iface)))
- {
- renderer->flags |= EVR_PRESENTER_INITED_SERVICES;
- }
- renderer->flags &= ~EVR_INIT_SERVICES;
- IMFTopologyServiceLookupClient_Release(lookup_client);
- }
+ hr = video_renderer_init_presenter_services(renderer);
if (FAILED(MFGetService((IUnknown *)renderer->presenter, &MR_VIDEO_ACCELERATION_SERVICE,
&IID_IUnknown, (void **)&renderer->device_manager)))
More information about the wine-cvs
mailing list