Zebediah Figura : quartz/vmr9: Signal state change completion only after PresentImage() has been called.

Alexandre Julliard julliard at winehq.org
Tue Jul 21 15:40:20 CDT 2020


Module: wine
Branch: master
Commit: d3ef27f7561a8fa47c675c8d537ce153ba3bebd7
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=d3ef27f7561a8fa47c675c8d537ce153ba3bebd7

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Mon Jul 20 17:49:08 2020 -0500

quartz/vmr9: Signal state change completion only after PresentImage() has been called.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/qedit/nullrenderer.c   | 5 +++++
 dlls/quartz/tests/vmr9.c    | 5 +++++
 dlls/quartz/videorenderer.c | 1 +
 dlls/quartz/vmr9.c          | 1 +
 dlls/strmbase/renderer.c    | 2 --
 5 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/dlls/qedit/nullrenderer.c b/dlls/qedit/nullrenderer.c
index e703ea2430..c64d5e2987 100644
--- a/dlls/qedit/nullrenderer.c
+++ b/dlls/qedit/nullrenderer.c
@@ -38,6 +38,11 @@ static struct null_renderer *impl_from_strmbase_renderer(struct strmbase_rendere
 
 static HRESULT WINAPI NullRenderer_DoRenderSample(struct strmbase_renderer *iface, IMediaSample *sample)
 {
+    struct null_renderer *filter = impl_from_strmbase_renderer(iface);
+
+    if (filter->renderer.filter.state == State_Paused)
+        SetEvent(filter->renderer.state_event);
+
     return S_OK;
 }
 
diff --git a/dlls/quartz/tests/vmr9.c b/dlls/quartz/tests/vmr9.c
index e630deb8d7..a2fd5b7686 100644
--- a/dlls/quartz/tests/vmr9.c
+++ b/dlls/quartz/tests/vmr9.c
@@ -2943,6 +2943,11 @@ static void test_renderless_present(IFilterGraph2 *graph, IMemInputPin *input)
     thread = send_frame(input);
     hr = IMediaControl_GetState(control, 1000, &state);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
+    /* Atelier Sophie uses the VMR in renderless mode, calls
+     * IMediaControl::Run() from a stopped state and expects that
+     * IMediaControl::GetState() returns S_OK only after PresentImage() has
+     * been called. */
+    ok(allocator_got_PresentImage == 1, "Got %u calls to PresentImage().\n", allocator_got_PresentImage);
 
     hr = IMediaControl_Run(control);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
diff --git a/dlls/quartz/videorenderer.c b/dlls/quartz/videorenderer.c
index eb6accf2d3..2ad479a630 100644
--- a/dlls/quartz/videorenderer.c
+++ b/dlls/quartz/videorenderer.c
@@ -111,6 +111,7 @@ static HRESULT WINAPI VideoRenderer_DoRenderSample(struct strmbase_renderer *ifa
 
         filter->current_sample = pSample;
 
+        SetEvent(filter->renderer.state_event);
         LeaveCriticalSection(&filter->renderer.csRenderLock);
         WaitForMultipleObjects(2, events, FALSE, INFINITE);
         EnterCriticalSection(&filter->renderer.csRenderLock);
diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c
index a3f5501106..00cd6bbce8 100644
--- a/dlls/quartz/vmr9.c
+++ b/dlls/quartz/vmr9.c
@@ -315,6 +315,7 @@ static HRESULT WINAPI VMR9_DoRenderSample(struct strmbase_renderer *iface, IMedi
 
     if (filter->renderer.filter.state == State_Paused)
     {
+        SetEvent(filter->renderer.state_event);
         LeaveCriticalSection(&filter->renderer.csRenderLock);
         WaitForMultipleObjects(2, events, FALSE, INFINITE);
         EnterCriticalSection(&filter->renderer.csRenderLock);
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c
index b6d552b3b0..dde56b7a34 100644
--- a/dlls/strmbase/renderer.c
+++ b/dlls/strmbase/renderer.c
@@ -193,8 +193,6 @@ static HRESULT WINAPI BaseRenderer_Receive(struct strmbase_sink *pin, IMediaSamp
     }
 
     EnterCriticalSection(&filter->csRenderLock);
-    if (filter->filter.state == State_Paused)
-        SetEvent(filter->state_event);
 
     if (filter->filter.clock && SUCCEEDED(IMediaSample_GetTime(sample, &start, &stop)))
     {




More information about the wine-cvs mailing list