quartz/filtergraph: Don't use QueryInternalConnections() to find output pins in FilterGraph2_Connect().
Signed-off-by: Zebediah Figura <z.figura12@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
2fea063245
commit
6eb05abf5f
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue