Lei Zhang : quartz: Enumerate all the pins on filter and check directions when rendering.

Alexandre Julliard julliard at winehq.org
Tue Dec 16 08:40:37 CST 2008


Module: wine
Branch: master
Commit: 7e1b714f740c3f17a9c8024b0d1d374063e14494
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7e1b714f740c3f17a9c8024b0d1d374063e14494

Author: Lei Zhang <thestig at google.com>
Date:   Mon Dec 15 15:31:43 2008 -0800

quartz: Enumerate all the pins on filter and check directions when rendering.

---

 dlls/quartz/filtergraph.c |   75 ++++++++++++++++++++++++++++----------------
 1 files changed, 48 insertions(+), 27 deletions(-)

diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c
index 8480d25..967a578 100644
--- a/dlls/quartz/filtergraph.c
+++ b/dlls/quartz/filtergraph.c
@@ -1318,7 +1318,7 @@ static HRESULT WINAPI FilterGraph2_Render(IFilterGraph2 *iface, IPin *ppinOut)
             GUID clsid;
             IPin* ppinfilter;
             IBaseFilter* pfilter = NULL;
-            IEnumPins* penumpins;
+            IEnumPins* penumpins = NULL;
             ULONG pin;
 
             hr = GetFilterInfo(pMoniker, &clsid, &var);
@@ -1348,40 +1348,61 @@ static HRESULT WINAPI FilterGraph2_Render(IFilterGraph2 *iface, IPin *ppinOut)
                 WARN("Splitter Enumpins (%x)\n", hr);
                 goto error;
             }
-            hr = IEnumPins_Next(penumpins, 1, &ppinfilter, &pin);
-            IEnumPins_Release(penumpins);
-            if (FAILED(hr)) {
-                WARN("Next (%x)\n", hr);
-                goto error;
-            }
-            if (pin == 0) {
-                WARN("No Pin\n");
-                hr = E_FAIL;
-                goto error;
-            }
 
-            /* Connect the pin to the "Renderer" */
-            hr = IPin_Connect(ppinOut, ppinfilter, NULL);
-            IPin_Release(ppinfilter);
+            while ((hr = IEnumPins_Next(penumpins, 1, &ppinfilter, &pin)) == S_OK)
+            {
+                PIN_DIRECTION dir;
 
-            if (FAILED(hr)) {
-                WARN("Unable to connect %s to renderer (%x)\n", debugstr_w(V_UNION(&var, bstrVal)), hr);
-                goto error;
-            }
-            TRACE("Connected, recursing %s\n",  debugstr_w(V_UNION(&var, bstrVal)));
+                if (pin == 0) {
+                    WARN("No Pin\n");
+                    hr = E_FAIL;
+                    goto error;
+                }
 
-            VariantClear(&var);
+                hr = IPin_QueryDirection(ppinfilter, &dir);
+                if (FAILED(hr)) {
+                    IPin_Release(ppinfilter);
+                    WARN("QueryDirection failed (%x)\n", hr);
+                    goto error;
+                }
+                if (dir != PINDIR_INPUT) {
+                    IPin_Release(ppinfilter);
+                    continue; /* Wrong direction */
+                }
 
-            hr = FilterGraph2_RenderRecurse(This, ppinfilter);
-            if (FAILED(hr)) {
-                WARN("Unable to connect recursively (%x)\n", hr);
-                goto error;
+                /* Connect the pin to the "Renderer" */
+                hr = IPin_Connect(ppinOut, ppinfilter, NULL);
+                IPin_Release(ppinfilter);
+
+                if (FAILED(hr)) {
+                    WARN("Unable to connect %s to renderer (%x)\n", debugstr_w(V_UNION(&var, bstrVal)), hr);
+                    goto error;
+                }
+                TRACE("Connected, recursing %s\n",  debugstr_w(V_UNION(&var, bstrVal)));
+
+                VariantClear(&var);
+
+                hr = FilterGraph2_RenderRecurse(This, ppinfilter);
+                if (FAILED(hr)) {
+                    WARN("Unable to connect recursively (%x)\n", hr);
+                    goto error;
+                }
+                IBaseFilter_Release(pfilter);
+                break;
+            }
+            if (SUCCEEDED(hr)) {
+                IEnumPins_Release(penumpins);
+                break; /* out of IEnumMoniker_Next loop */
             }
-            IBaseFilter_Release(pfilter);
-            break;
+
+            /* IEnumPins_Next failed, all other failure case caught by goto error */
+            WARN("IEnumPins_Next (%x)\n", hr);
+            /* goto error */
 
 error:
             VariantClear(&var);
+            if (penumpins)
+                IEnumPins_Release(penumpins);
             if (pfilter) {
                 IFilterGraph2_RemoveFilter(iface, pfilter);
                 IBaseFilter_Release(pfilter);




More information about the wine-cvs mailing list