From 7e1b714f740c3f17a9c8024b0d1d374063e14494 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Mon, 15 Dec 2008 15:31:43 -0800 Subject: [PATCH] quartz: Enumerate all the pins on filter and check directions when rendering. --- dlls/quartz/filtergraph.c | 75 ++++++++++++++++++++++++++++++----------------- 1 file changed, 48 insertions(+), 27 deletions(-) diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c index 8480d25c3e2..967a578199b 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); -- 2.11.4.GIT