quartz: Return proper error codes from GraphBuilder_RenderFile.

This commit is contained in:
Chris Robinson 2007-02-17 23:55:32 -08:00 committed by Alexandre Julliard
parent 763fc7cf3a
commit c5ae1fc7d8
1 changed files with 42 additions and 40 deletions

View File

@ -961,9 +961,9 @@ static HRESULT WINAPI GraphBuilder_RenderFile(IGraphBuilder *iface,
IEnumPins* penumpins; IEnumPins* penumpins;
ULONG pin; ULONG pin;
HRESULT hr; HRESULT hr;
IEnumMoniker* pEnumMoniker; IEnumMoniker* pEnumMoniker = NULL;
GUID tab[2]; GUID tab[2];
IPin** ppins; IPin** ppins = NULL;
ULONG nb; ULONG nb;
IMoniker* pMoniker; IMoniker* pMoniker;
IFileSourceFilter* pfile = NULL; IFileSourceFilter* pfile = NULL;
@ -972,6 +972,9 @@ static HRESULT WINAPI GraphBuilder_RenderFile(IGraphBuilder *iface,
TRACE("(%p/%p)->(%s, %s)\n", This, iface, debugstr_w(lpcwstrFile), debugstr_w(lpcwstrPlayList)); TRACE("(%p/%p)->(%s, %s)\n", This, iface, debugstr_w(lpcwstrFile), debugstr_w(lpcwstrPlayList));
if (lpcwstrPlayList != NULL)
return E_INVALIDARG;
hr = IGraphBuilder_AddSourceFilter(iface, lpcwstrFile, string, &preader); hr = IGraphBuilder_AddSourceFilter(iface, lpcwstrFile, string, &preader);
/* Retrieve file media type */ /* Retrieve file media type */
@ -982,6 +985,13 @@ static HRESULT WINAPI GraphBuilder_RenderFile(IGraphBuilder *iface,
IFileSourceFilter_Release(pfile); IFileSourceFilter_Release(pfile);
} }
if (SUCCEEDED(hr))
hr = IBaseFilter_EnumPins(preader, &penumpins);
if (SUCCEEDED(hr)) {
hr = IEnumPins_Next(penumpins, 1, &ppinreader, &pin);
IEnumPins_Release(penumpins);
}
if (SUCCEEDED(hr)) { if (SUCCEEDED(hr)) {
tab[0] = mt.majortype; tab[0] = mt.majortype;
tab[1] = mt.subtype; tab[1] = mt.subtype;
@ -990,6 +1000,8 @@ static HRESULT WINAPI GraphBuilder_RenderFile(IGraphBuilder *iface,
if (FAILED(hr)) if (FAILED(hr))
{ {
if (pEnumMoniker)
IEnumMoniker_Release(pEnumMoniker);
if (preader) { if (preader) {
IGraphBuilder_RemoveFilter(iface, preader); IGraphBuilder_RemoveFilter(iface, preader);
IBaseFilter_Release(preader); IBaseFilter_Release(preader);
@ -1019,65 +1031,49 @@ static HRESULT WINAPI GraphBuilder_RenderFile(IGraphBuilder *iface,
hr = IGraphBuilder_AddFilter(iface, psplitter, NULL); hr = IGraphBuilder_AddFilter(iface, psplitter, NULL);
if (FAILED(hr)) { if (FAILED(hr)) {
ERR("Unable add filter (%x)\n", hr); ERR("Unable add filter (%x)\n", hr);
return hr; IBaseFilter_Release(psplitter);
continue;
} }
/* Connect file source and splitter filters together */ /* Connect file source and splitter filters together */
/* Make the splitter analyze incoming data */ /* Make the splitter analyze incoming data */
hr = IBaseFilter_EnumPins(preader, &penumpins);
if (FAILED(hr)) {
ERR("Enumpins (%x)\n", hr);
return hr;
}
hr = IEnumPins_Next(penumpins, 1, &ppinreader, &pin);
if (FAILED(hr)) {
ERR("Next (%x)\n", hr);
return hr;
}
if (pin == 0) {
ERR("No Pin\n");
return E_FAIL;
}
IEnumPins_Release(penumpins);
hr = IBaseFilter_EnumPins(psplitter, &penumpins); hr = IBaseFilter_EnumPins(psplitter, &penumpins);
if (FAILED(hr)) { if (SUCCEEDED(hr)) {
ERR("Splitter Enumpins (%x)\n", hr); hr = IEnumPins_Next(penumpins, 1, &ppinsplitter, &pin);
return hr; IEnumPins_Release(penumpins);
} }
hr = IEnumPins_Next(penumpins, 1, &ppinsplitter, &pin);
if (FAILED(hr)) {
ERR("Next (%x)\n", hr);
return hr;
}
if (pin == 0) {
ERR("No Pin\n");
return E_FAIL;
}
IEnumPins_Release(penumpins);
hr = IPin_Connect(ppinreader, ppinsplitter, NULL); if (SUCCEEDED(hr))
hr = IPin_Connect(ppinreader, ppinsplitter, NULL);
if (SUCCEEDED(hr)) { if (SUCCEEDED(hr)) {
/* Make sure there's some output pins in the filter */ /* Make sure there's some output pins in the filter */
hr = GetInternalConnections(psplitter, ppinsplitter, &ppins, &nb); hr = GetInternalConnections(psplitter, ppinsplitter, &ppins, &nb);
if(SUCCEEDED(hr)) { if (SUCCEEDED(hr)) {
if(nb > 0) { if(nb > 0) {
TRACE("Successfully connected to filter\n"); TRACE("Successfully connected to filter\n");
break; break;
} }
CoTaskMemFree(ppins); CoTaskMemFree(ppins);
ppins = NULL; ppins = NULL;
TRACE("No output pins found in filter\n");
} }
IBaseFilter_Release(ppinsplitter);
ppinsplitter = NULL; TRACE("No output pins found in filter\n");
hr = VFW_E_CANNOT_RENDER;
} }
IPin_Release(ppinsplitter);
ppinsplitter = NULL;
IGraphBuilder_RemoveFilter(iface, psplitter);
IBaseFilter_Release(psplitter);
ppinsplitter = NULL;
TRACE("Cannot connect to filter (%x), trying next one\n", hr); TRACE("Cannot connect to filter (%x), trying next one\n", hr);
hr = E_FAIL;
} }
/* Render all output pin of the splitter by calling IGraphBuilder_Render on each of them */ /* Render all output pin of the splitter by calling IGraphBuilder_Render on each of them */
if (SUCCEEDED(hr)) { if (SUCCEEDED(hr)) {
int partial = 0;
int i; int i;
TRACE("pins to consider: %d\n", nb); TRACE("pins to consider: %d\n", nb);
for(i = 0; i < nb; i++) { for(i = 0; i < nb; i++) {
@ -1085,13 +1081,19 @@ static HRESULT WINAPI GraphBuilder_RenderFile(IGraphBuilder *iface,
hr = IGraphBuilder_Render(iface, ppins[i]); hr = IGraphBuilder_Render(iface, ppins[i]);
if (FAILED(hr)) { if (FAILED(hr)) {
ERR("Cannot render pin %p (%x)\n", ppins[i], hr); ERR("Cannot render pin %p (%x)\n", ppins[i], hr);
/* FIXME: We should clean created things properly */ partial = 1;
break;
} }
IPin_Release(ppins[i]);
} }
CoTaskMemFree(ppins); CoTaskMemFree(ppins);
hr = (partial ? VFW_S_PARTIAL_RENDER : S_OK);
} }
if (psplitter)
IBaseFilter_Release(psplitter);
IBaseFilter_Release(preader);
return hr; return hr;
} }