From: Brendan McGrath brendan@redmandi.com
Resent with some tweaks in code style.
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/filtergraph.c | 93 +++++++---------------------------------------- 1 file changed, 14 insertions(+), 79 deletions(-)
diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c index ead6036..56da3ad 100644 --- a/dlls/quartz/filtergraph.c +++ b/dlls/quartz/filtergraph.c @@ -1002,68 +1002,6 @@ static HRESULT GetFilterInfo(IMoniker* pMoniker, VARIANT* pvar) return hr; }
-static HRESULT GetInternalConnections(IBaseFilter* pfilter, IPin* pinputpin, IPin*** pppins, ULONG* pnb) -{ - HRESULT hr; - ULONG nb = 0; - - TRACE("(%p, %p, %p, %p)\n", pfilter, pinputpin, pppins, pnb); - hr = IPin_QueryInternalConnections(pinputpin, NULL, &nb); - if (hr == S_OK) { - /* Rendered input */ - } else if (hr == S_FALSE) { - *pppins = CoTaskMemAlloc(sizeof(IPin*)*nb); - hr = IPin_QueryInternalConnections(pinputpin, *pppins, &nb); - if (hr != S_OK) { - WARN("Error (%x)\n", hr); - } - } else if (hr == E_NOTIMPL) { - /* Input connected to all outputs */ - IEnumPins* penumpins; - IPin* ppin; - int i = 0; - TRACE("E_NOTIMPL\n"); - hr = IBaseFilter_EnumPins(pfilter, &penumpins); - if (FAILED(hr)) { - WARN("filter Enumpins failed (%x)\n", hr); - return hr; - } - i = 0; - /* Count output pins */ - while(IEnumPins_Next(penumpins, 1, &ppin, &nb) == S_OK) { - PIN_DIRECTION pindir; - IPin_QueryDirection(ppin, &pindir); - if (pindir == PINDIR_OUTPUT) - i++; - IPin_Release(ppin); - } - *pppins = CoTaskMemAlloc(sizeof(IPin*)*i); - /* Retrieve output pins */ - IEnumPins_Reset(penumpins); - i = 0; - while(IEnumPins_Next(penumpins, 1, &ppin, &nb) == S_OK) { - PIN_DIRECTION pindir; - IPin_QueryDirection(ppin, &pindir); - if (pindir == PINDIR_OUTPUT) - (*pppins)[i++] = ppin; - else - IPin_Release(ppin); - } - IEnumPins_Release(penumpins); - nb = i; - if (FAILED(hr)) { - WARN("Next failed (%x)\n", hr); - return hr; - } - } else if (FAILED(hr)) { - WARN("Cannot get internal connection (%x)\n", hr); - return hr; - } - - *pnb = nb; - 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) @@ -2111,12 +2049,12 @@ static HRESULT ExploreGraph(IFilterGraphImpl* pGraph, IPin* pOutputPin, fnFoundF { IAMFilterMiscFlags *flags; IMediaSeeking *seeking; + IEnumPins *enumpins; + PIN_DIRECTION dir; HRESULT hr; IPin* pInputPin; - IPin** ppPins; - ULONG nb; - ULONG i; PIN_INFO PinInfo; + IPin *pin;
TRACE("%p %p\n", pGraph, pOutputPin); PinInfo.pFilter = NULL; @@ -2126,26 +2064,23 @@ static HRESULT ExploreGraph(IFilterGraphImpl* pGraph, IPin* pOutputPin, fnFoundF if (SUCCEEDED(hr)) { hr = IPin_QueryPinInfo(pInputPin, &PinInfo); - if (SUCCEEDED(hr)) - hr = GetInternalConnections(PinInfo.pFilter, pInputPin, &ppPins, &nb); IPin_Release(pInputPin); }
if (SUCCEEDED(hr)) - { - if (nb) - { - for(i = 0; i < nb; i++) - { - /* Explore the graph downstream from this pin - * FIXME: We should prevent exploring from a pin more than once. This can happens when - * several input pins are connected to the same output (a MUX for instance). */ - ExploreGraph(pGraph, ppPins[i], FoundFilter, data); - IPin_Release(ppPins[i]); - } + hr = IBaseFilter_EnumPins(PinInfo.pFilter, &enumpins);
- CoTaskMemFree(ppPins); + if (SUCCEEDED(hr)) + { + while (IEnumPins_Next(enumpins, 1, &pin, NULL) == S_OK) + { + IPin_QueryDirection(pin, &dir); + if (dir == PINDIR_OUTPUT) + ExploreGraph(pGraph, pin, FoundFilter, data); + IPin_Release(pin); } + + IEnumPins_Release(enumpins); TRACE("Doing stuff with filter %p\n", PinInfo.pFilter);
if (SUCCEEDED(IBaseFilter_QueryInterface(PinInfo.pFilter,