[PATCH 3/5] quartz/filtergraph: Don't use QueryInternalConnections() to find output pins in FilterGraph2_Connect().

Zebediah Figura z.figura12 at gmail.com
Thu Sep 20 10:36:18 CDT 2018


The tests need the following patch in order to pass.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/quartz/filtergraph.c | 102 +++++++++++++++++++++++-----------------------
 1 file changed, 52 insertions(+), 50 deletions(-)

diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c
index 1fa6476..6fe5b80 100644
--- a/dlls/quartz/filtergraph.c
+++ b/dlls/quartz/filtergraph.c
@@ -1070,6 +1070,55 @@ static HRESULT GetInternalConnections(IBaseFilter* pfilter, IPin* pinputpin, IPi
     return S_OK;
 }
 
+/* Attempt to connect one of the output pins on filter to sink. Helper for
+ * FilterGraph2_Connect(). */
+static HRESULT connect_output_pin(IFilterGraphImpl *graph, IBaseFilter *filter, IPin *sink)
+{
+    IEnumPins *enumpins;
+    PIN_DIRECTION dir;
+    HRESULT hr;
+    WCHAR *id;
+    IPin *pin;
+
+    hr = IBaseFilter_EnumPins(filter, &enumpins);
+    if (FAILED(hr))
+        return hr;
+
+    while (IEnumPins_Next(enumpins, 1, &pin, NULL) == S_OK)
+    {
+        IPin_QueryDirection(pin, &dir);
+        if (dir == PINDIR_OUTPUT)
+        {
+            hr = IPin_QueryId(pin, &id);
+            if (FAILED(hr))
+            {
+                IPin_Release(pin);
+                IEnumPins_Release(enumpins);
+                return hr;
+            }
+
+            if (id[0] == '~')
+            {
+                TRACE("Skipping non-rendered pin %s.\n", debugstr_w(id));
+                IPin_Release(pin);
+                IEnumPins_Release(enumpins);
+                return E_FAIL;
+            }
+
+            if (SUCCEEDED(IFilterGraph2_Connect(&graph->IFilterGraph2_iface, pin, sink)))
+            {
+                IPin_Release(pin);
+                IEnumPins_Release(enumpins);
+                return S_OK;
+            }
+        }
+        IPin_Release(pin);
+    }
+
+    IEnumPins_Release(enumpins);
+    return VFW_E_CANNOT_CONNECT;
+}
+
 /*** IGraphBuilder methods ***/
 static HRESULT WINAPI FilterGraph2_Connect(IFilterGraph2 *iface, IPin *ppinOut, IPin *ppinIn)
 {
@@ -1081,13 +1130,11 @@ static HRESULT WINAPI FilterGraph2_Connect(IFilterGraph2 *iface, IPin *ppinOut,
     IEnumPins* penumpins;
     IEnumMoniker* pEnumMoniker;
     GUID tab[2];
-    ULONG nb = 0;
     IMoniker* pMoniker;
     ULONG pin;
     PIN_INFO PinInfo;
     CLSID FilterCLSID;
     PIN_DIRECTION dir;
-    unsigned int i = 0;
     IFilterMapper2 *pFilterMapper2 = NULL;
 
     TRACE("(%p/%p)->(%p, %p)\n", This, iface, ppinOut, ppinIn);
@@ -1196,11 +1243,10 @@ static HRESULT WINAPI FilterGraph2_Connect(IFilterGraph2 *iface, IPin *ppinOut,
     }
 
     hr = VFW_E_CANNOT_RENDER;
-    while(IEnumMoniker_Next(pEnumMoniker, 1, &pMoniker, &nb) == S_OK)
+    while (IEnumMoniker_Next(pEnumMoniker, 1, &pMoniker, NULL) == S_OK)
     {
         VARIANT var;
         GUID clsid;
-        IPin** ppins = NULL;
         IPin* ppinfilter = NULL;
         IBaseFilter* pfilter = NULL;
         IAMGraphBuilderCallback *callback = NULL;
@@ -1297,52 +1343,10 @@ static HRESULT WINAPI FilterGraph2_Connect(IFilterGraph2 *iface, IPin *ppinOut,
         }
         TRACE("Successfully connected to filter, follow chain...\n");
 
-        /* Render all output pins of the filter by calling IFilterGraph2_Connect on each of them */
-        hr = GetInternalConnections(pfilter, ppinfilter, &ppins, &nb);
-
-        if (SUCCEEDED(hr)) {
-            if (nb == 0) {
-                IPin_Disconnect(ppinfilter);
-                IPin_Disconnect(ppinOut);
-                goto error;
-            }
-            TRACE("pins to consider: %d\n", nb);
-            for(i = 0; i < nb; i++)
-            {
-                LPWSTR pinname = NULL;
-
-                TRACE("Processing pin %u\n", i);
-
-                hr = IPin_QueryId(ppins[i], &pinname);
-                if (SUCCEEDED(hr))
-                {
-                    if (pinname[0] == '~')
-                    {
-                        TRACE("Pinname=%s, skipping\n", debugstr_w(pinname));
-                        hr = E_FAIL;
-                    }
-                    else
-                        hr = IFilterGraph2_Connect(iface, ppins[i], ppinIn);
-                    CoTaskMemFree(pinname);
-                }
-
-                if (FAILED(hr)) {
-                   TRACE("Cannot connect pin %p (%x)\n", ppinfilter, hr);
-                }
-                IPin_Release(ppins[i]);
-                if (SUCCEEDED(hr)) break;
-            }
-            while (++i < nb) IPin_Release(ppins[i]);
-            CoTaskMemFree(ppins);
+        if (SUCCEEDED(hr = connect_output_pin(This, pfilter, ppinIn)))
+        {
             IPin_Release(ppinfilter);
             IBaseFilter_Release(pfilter);
-            if (FAILED(hr))
-            {
-                IPin_Disconnect(ppinfilter);
-                IPin_Disconnect(ppinOut);
-                IFilterGraph2_RemoveFilter(iface, pfilter);
-                continue;
-            }
             break;
         }
 
@@ -1353,8 +1357,6 @@ error:
             IFilterGraph2_RemoveFilter(iface, pfilter);
             IBaseFilter_Release(pfilter);
         }
-        while (++i < nb) IPin_Release(ppins[i]);
-        CoTaskMemFree(ppins);
     }
 
     IEnumMoniker_Release(pEnumMoniker);
-- 
2.7.4




More information about the wine-devel mailing list