[PATCH v4 5/5] strmbase/renderer: Use base sink connection methods.

Zebediah Figura z.figura12 at gmail.com
Tue Dec 10 10:35:15 CST 2019


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
v4: fix test failures.

As regards the todo_wine introduced by this patch, the bug is legitimate (native
can handle 24 bpp) and was previously masked by the fact that we did not
reinitialize the VMR9 on every connection.

 dlls/quartz/tests/vmr7.c |  2 +-
 dlls/quartz/tests/vmr9.c | 21 +++++++++-----
 dlls/quartz/vmr9.c       |  8 +++--
 dlls/strmbase/renderer.c | 63 ++++++++++++++--------------------------
 4 files changed, 40 insertions(+), 54 deletions(-)

diff --git a/dlls/quartz/tests/vmr7.c b/dlls/quartz/tests/vmr7.c
index dae86bd3fa..4a971dcdc1 100644
--- a/dlls/quartz/tests/vmr7.c
+++ b/dlls/quartz/tests/vmr7.c
@@ -1392,7 +1392,7 @@ static void test_connect_pin(void)
     hr = IFilterGraph2_Disconnect(graph, pin);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
     hr = IFilterGraph2_Disconnect(graph, pin);
-    todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+    ok(hr == S_FALSE, "Got hr %#x.\n", hr);
     ok(source.source.pin.peer == pin, "Got peer %p.\n", peer);
     IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface);
 
diff --git a/dlls/quartz/tests/vmr9.c b/dlls/quartz/tests/vmr9.c
index 5ece5c6f7b..241394277b 100644
--- a/dlls/quartz/tests/vmr9.c
+++ b/dlls/quartz/tests/vmr9.c
@@ -901,7 +901,8 @@ static HRESULT WINAPI testsource_AttemptConnection(struct strmbase_source *iface
 
     if (FAILED(hr = IPin_ReceiveConnection(peer, &iface->pin.IPin_iface, mt)))
     {
-        ok(hr == VFW_E_TYPE_NOT_ACCEPTED || hr == E_FAIL, "Got hr %#x.\n", hr);
+        todo_wine_if (((VIDEOINFOHEADER *)mt->pbFormat)->bmiHeader.biBitCount == 24)
+            ok(hr == VFW_E_TYPE_NOT_ACCEPTED || hr == E_FAIL, "Got hr %#x.\n", hr);
         IPin_Release(peer);
         iface->pin.peer = NULL;
         FreeMediaType(&iface->pin.mt);
@@ -1315,13 +1316,17 @@ static void test_connect_pin(void)
                 skip("Got E_FAIL when connecting.\n");
                 goto out;
             }
-            ok(hr == S_OK, "Got hr %#x for subtype %s and bpp %u.\n", hr,
-                    wine_dbgstr_guid(subtype_tests[i]), bpp_tests[j]);
+            todo_wine_if (bpp_tests[j] == 24)
+                ok(hr == S_OK, "Got hr %#x for subtype %s and bpp %u.\n", hr,
+                        wine_dbgstr_guid(subtype_tests[i]), bpp_tests[j]);
 
-            hr = IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface);
-            ok(hr == S_OK, "Got hr %#x.\n", hr);
-            hr = IFilterGraph2_Disconnect(graph, pin);
-            ok(hr == S_OK, "Got hr %#x.\n", hr);
+            if (hr == S_OK)
+            {
+                hr = IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface);
+                ok(hr == S_OK, "Got hr %#x.\n", hr);
+                hr = IFilterGraph2_Disconnect(graph, pin);
+                ok(hr == S_OK, "Got hr %#x.\n", hr);
+            }
         }
     }
 
@@ -1391,7 +1396,7 @@ static void test_connect_pin(void)
     hr = IFilterGraph2_Disconnect(graph, pin);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
     hr = IFilterGraph2_Disconnect(graph, pin);
-    todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+    ok(hr == S_FALSE, "Got hr %#x.\n", hr);
     ok(source.source.pin.peer == pin, "Got peer %p.\n", source.source.pin.peer);
     IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface);
 
diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c
index a9b90b322d..a3391870a7 100644
--- a/dlls/quartz/vmr9.c
+++ b/dlls/quartz/vmr9.c
@@ -356,7 +356,7 @@ static HRESULT VMR9_maybe_init(struct quartz_vmr *This, BOOL force)
     HRESULT hr;
 
     TRACE("my mode: %u, my window: %p, my last window: %p\n", This->mode, This->baseControlWindow.baseWindow.hWnd, This->hWndClippingWindow);
-    if (This->num_surfaces || !This->renderer.sink.pin.peer)
+    if (This->num_surfaces)
         return S_OK;
 
     if (This->mode == VMR9Mode_Windowless && !This->hWndClippingWindow)
@@ -410,7 +410,8 @@ static void vmr_start_stream(struct strmbase_renderer *iface)
 
     TRACE("(%p)\n", This);
 
-    VMR9_maybe_init(This, TRUE);
+    if (This->renderer.sink.pin.peer)
+        VMR9_maybe_init(This, TRUE);
     IVMRImagePresenter9_StartPresenting(This->presenter, This->cookie);
     SetWindowPos(This->baseControlWindow.baseWindow.hWnd, NULL,
         This->source_rect.left,
@@ -1760,7 +1761,8 @@ static HRESULT WINAPI VMR9WindowlessControl_SetVideoClippingWindow(IVMRWindowles
 
     EnterCriticalSection(&This->renderer.filter.csFilter);
     This->hWndClippingWindow = hwnd;
-    VMR9_maybe_init(This, FALSE);
+    if (This->renderer.sink.pin.peer)
+        VMR9_maybe_init(This, FALSE);
     if (!hwnd)
         IVMRSurfaceAllocatorEx9_TerminateDevice(This->allocator, This->cookie);
     LeaveCriticalSection(&This->renderer.filter.csFilter);
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c
index 7d8dbdfa93..7b9736ccfb 100644
--- a/dlls/strmbase/renderer.c
+++ b/dlls/strmbase/renderer.c
@@ -40,46 +40,6 @@ static inline struct strmbase_renderer *impl_from_IPin(IPin *iface)
     return CONTAINING_RECORD(iface, struct strmbase_renderer, sink.pin.IPin_iface);
 }
 
-static HRESULT WINAPI BaseRenderer_InputPin_ReceiveConnection(IPin *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
-{
-    struct strmbase_renderer *filter = impl_from_IPin(iface);
-    HRESULT hr;
-
-    TRACE("iface %p, peer %p, mt %p.\n", iface, peer, mt);
-    strmbase_dump_media_type(mt);
-
-    EnterCriticalSection(&filter->filter.csFilter);
-    hr = BaseInputPinImpl_ReceiveConnection(iface, peer, mt);
-    if (SUCCEEDED(hr))
-    {
-        if (filter->pFuncsTable->renderer_connect)
-            hr = filter->pFuncsTable->renderer_connect(filter, mt);
-    }
-    LeaveCriticalSection(&filter->filter.csFilter);
-
-    return hr;
-}
-
-static HRESULT WINAPI BaseRenderer_InputPin_Disconnect(IPin * iface)
-{
-    struct strmbase_renderer *filter = impl_from_IPin(iface);
-    HRESULT hr;
-
-    TRACE("iface %p.\n", iface);
-
-    EnterCriticalSection(&filter->filter.csFilter);
-    hr = BaseInputPinImpl_Disconnect(iface);
-    if (SUCCEEDED(hr))
-    {
-        if (filter->pFuncsTable->pfnBreakConnect)
-            hr = filter->pFuncsTable->pfnBreakConnect(filter);
-    }
-    BaseRendererImpl_ClearPendingSample(filter);
-    LeaveCriticalSection(&filter->filter.csFilter);
-
-    return hr;
-}
-
 static HRESULT WINAPI BaseRenderer_InputPin_EndOfStream(IPin * iface)
 {
     struct strmbase_renderer *filter = impl_from_IPin(iface);
@@ -157,8 +117,8 @@ static const IPinVtbl BaseRenderer_InputPin_Vtbl =
     BasePinImpl_AddRef,
     BasePinImpl_Release,
     BaseInputPinImpl_Connect,
-    BaseRenderer_InputPin_ReceiveConnection,
-    BaseRenderer_InputPin_Disconnect,
+    BaseInputPinImpl_ReceiveConnection,
+    BaseInputPinImpl_Disconnect,
     BasePinImpl_ConnectedTo,
     BasePinImpl_ConnectionMediaType,
     BasePinImpl_QueryPinInfo,
@@ -312,12 +272,31 @@ static HRESULT WINAPI BaseRenderer_Receive(struct strmbase_sink *pin, IMediaSamp
     return BaseRendererImpl_Receive(filter, sample);
 }
 
+static HRESULT sink_connect(struct strmbase_sink *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
+{
+    struct strmbase_renderer *filter = impl_from_IPin(&iface->pin.IPin_iface);
+
+    if (filter->pFuncsTable->renderer_connect)
+        return filter->pFuncsTable->renderer_connect(filter, mt);
+    return S_OK;
+}
+
+static void sink_disconnect(struct strmbase_sink *iface)
+{
+    struct strmbase_renderer *filter = impl_from_IPin(&iface->pin.IPin_iface);
+
+    if (filter->pFuncsTable->pfnBreakConnect)
+        filter->pFuncsTable->pfnBreakConnect(filter);
+}
+
 static const struct strmbase_sink_ops sink_ops =
 {
     .base.pin_query_accept = sink_query_accept,
     .base.pin_query_interface = sink_query_interface,
     .base.pin_get_media_type = strmbase_pin_get_media_type,
     .pfnReceive = BaseRenderer_Receive,
+    .sink_connect = sink_connect,
+    .sink_disconnect = sink_disconnect,
 };
 
 void strmbase_renderer_cleanup(struct strmbase_renderer *filter)
-- 
2.24.0




More information about the wine-devel mailing list