[PATCH] qedit: try all possible splitter filters instead of only the first one
Maarten Lankhorst
m.b.lankhorst at gmail.com
Thu Nov 25 17:04:13 CST 2010
---
dlls/qedit/mediadet.c | 78 +++++++++++++++++++++++++-----------------------
1 files changed, 41 insertions(+), 37 deletions(-)
diff --git a/dlls/qedit/mediadet.c b/dlls/qedit/mediadet.c
index 9aeb9c0..5ccccd6 100644
--- a/dlls/qedit/mediadet.c
+++ b/dlls/qedit/mediadet.c
@@ -378,52 +378,56 @@ static HRESULT GetSplitter(MediaDetImpl *This)
if (FAILED(hr))
return hr;
- hr = IEnumMoniker_Next(filters, 1, &mon, NULL);
- IEnumMoniker_Release(filters);
- if (hr != S_OK) /* No matches, what do we do? */
- return E_NOINTERFACE;
+ hr = E_NOINTERFACE;
+ while (IEnumMoniker_Next(filters, 1, &mon, NULL) == S_OK)
+ {
+ hr = GetFilterInfo(mon, &clsid, &var);
+ IMoniker_Release(mon);
+ if (FAILED(hr))
+ continue;
- hr = GetFilterInfo(mon, &clsid, &var);
- IMoniker_Release(mon);
- if (FAILED(hr))
- return hr;
+ hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IBaseFilter, (void **) &splitter);
+ if (FAILED(hr))
+ {
+ VariantClear(&var);
+ goto retry;
+ }
- hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER,
- &IID_IBaseFilter, (void **) &splitter);
- if (FAILED(hr))
- {
+ hr = IGraphBuilder_AddFilter(This->graph, splitter,
+ V_UNION(&var, bstrVal));
VariantClear(&var);
- return hr;
- }
+ This->splitter = splitter;
+ if (FAILED(hr))
+ goto retry;
- hr = IGraphBuilder_AddFilter(This->graph, splitter,
- V_UNION(&var, bstrVal));
- VariantClear(&var);
- if (FAILED(hr))
- {
- IBaseFilter_Release(splitter);
- return hr;
- }
- This->splitter = splitter;
+ hr = IBaseFilter_EnumPins(This->source, &pins);
+ if (FAILED(hr))
+ goto retry;
+ IEnumPins_Next(pins, 1, &source_pin, NULL);
+ IEnumPins_Release(pins);
- hr = IBaseFilter_EnumPins(This->source, &pins);
- if (FAILED(hr))
- return hr;
- IEnumPins_Next(pins, 1, &source_pin, NULL);
- IEnumPins_Release(pins);
+ hr = IBaseFilter_EnumPins(splitter, &pins);
+ if (FAILED(hr))
+ {
+ IPin_Release(source_pin);
+ goto retry;
+ }
+ IEnumPins_Next(pins, 1, &splitter_pin, NULL);
+ IEnumPins_Release(pins);
- hr = IBaseFilter_EnumPins(splitter, &pins);
- if (FAILED(hr))
- {
+ hr = IPin_Connect(source_pin, splitter_pin, NULL);
IPin_Release(source_pin);
- return hr;
+ IPin_Release(splitter_pin);
+ if (SUCCEEDED(hr))
+ break;
+
+retry:
+ IBaseFilter_Release(splitter);
+ This->splitter = NULL;
}
- IEnumPins_Next(pins, 1, &splitter_pin, NULL);
- IEnumPins_Release(pins);
- hr = IPin_Connect(source_pin, splitter_pin, NULL);
- IPin_Release(source_pin);
- IPin_Release(splitter_pin);
+ IEnumMoniker_Release(filters);
if (FAILED(hr))
return hr;
--
1.7.1
More information about the wine-patches
mailing list