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

oldstable
Lei Zhang 2008-12-15 15:31:43 -08:00 committed by Alexandre Julliard
parent db5d8a2bd0
commit 7e1b714f74
1 changed files with 50 additions and 29 deletions

View File

@ -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;
while ((hr = IEnumPins_Next(penumpins, 1, &ppinfilter, &pin)) == S_OK)
{
PIN_DIRECTION dir;
if (pin == 0) {
WARN("No Pin\n");
hr = E_FAIL;
goto error;
}
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 */
}
/* 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 (pin == 0) {
WARN("No Pin\n");
hr = E_FAIL;
goto error;
if (SUCCEEDED(hr)) {
IEnumPins_Release(penumpins);
break; /* out of IEnumMoniker_Next loop */
}
/* 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;
/* 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);