Zebediah Figura : quartz/filtergraph: Don't use QueryInternalConnections() to find output pins in FilterGraph2_Connect().

Alexandre Julliard julliard at winehq.org
Thu Sep 20 13:45:34 CDT 2018


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

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Thu Sep 20 10:36:18 2018 -0500

quartz/filtergraph: Don't use QueryInternalConnections() to find output pins in FilterGraph2_Connect().

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

---

 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 7f22475..8d5c5dc 100644
--- a/dlls/quartz/filtergraph.c
+++ b/dlls/quartz/filtergraph.c
@@ -1036,6 +1036,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)
 {
@@ -1047,13 +1096,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);
@@ -1162,11 +1209,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;
@@ -1263,52 +1309,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;
         }
 
@@ -1319,8 +1323,6 @@ error:
             IFilterGraph2_RemoveFilter(iface, pfilter);
             IBaseFilter_Release(pfilter);
         }
-        while (++i < nb) IPin_Release(ppins[i]);
-        CoTaskMemFree(ppins);
     }
 
     IEnumMoniker_Release(pEnumMoniker);




More information about the wine-cvs mailing list