Gabriel Ivăncescu : qedit: Move GetSplitter up and rename it.
Alexandre Julliard
julliard at winehq.org
Fri Apr 24 15:11:38 CDT 2020
Module: wine
Branch: master
Commit: 2ba32469f28d0eac1fc58e29ea50a8e78e95a241
URL: https://source.winehq.org/git/wine.git/?a=commit;h=2ba32469f28d0eac1fc58e29ea50a8e78e95a241
Author: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Date: Thu Apr 23 14:45:41 2020 -0500
qedit: Move GetSplitter up and rename it.
Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/qedit/mediadet.c | 229 ++++++++++++++++++++++++++------------------------
1 file changed, 119 insertions(+), 110 deletions(-)
diff --git a/dlls/qedit/mediadet.c b/dlls/qedit/mediadet.c
index 059465d3d7..49d9bc36c0 100644
--- a/dlls/qedit/mediadet.c
+++ b/dlls/qedit/mediadet.c
@@ -99,6 +99,124 @@ static HRESULT get_filter_info(IMoniker *moniker, GUID *clsid, VARIANT *var)
return hr;
}
+static HRESULT find_splitter(MediaDetImpl *detector)
+{
+ IPin *source_pin, *splitter_pin;
+ IFileSourceFilter *file_source;
+ IEnumMoniker *enum_moniker;
+ IFilterMapper2 *mapper;
+ IBaseFilter *splitter;
+ IEnumPins *enum_pins;
+ LPOLESTR filename;
+ AM_MEDIA_TYPE mt;
+ IMoniker *mon;
+ GUID type[2];
+ VARIANT var;
+ HRESULT hr;
+ GUID clsid;
+
+ if (FAILED(hr = IBaseFilter_QueryInterface(detector->source,
+ &IID_IFileSourceFilter, (void **)&file_source)))
+ {
+ ERR("Failed to get file source interface.\n");
+ return hr;
+ }
+
+ hr = IFileSourceFilter_GetCurFile(file_source, &filename, &mt);
+ IFileSourceFilter_Release(file_source);
+ CoTaskMemFree(filename);
+ if (FAILED(hr))
+ {
+ ERR("Failed to get current file, hr %#x.\n", hr);
+ return hr;
+ }
+ type[0] = mt.majortype;
+ type[1] = mt.subtype;
+ FreeMediaType(&mt);
+
+ if (FAILED(hr = IBaseFilter_EnumPins(detector->source, &enum_pins)))
+ {
+ ERR("Failed to enumerate source pins, hr %#x.\n", hr);
+ return hr;
+ }
+ hr = IEnumPins_Next(enum_pins, 1, &source_pin, NULL);
+ IEnumPins_Release(enum_pins);
+ if (FAILED(hr))
+ {
+ ERR("Failed to get source pin, hr %#x.\n", hr);
+ return hr;
+ }
+
+ if (FAILED(hr = CoCreateInstance(&CLSID_FilterMapper2, NULL,
+ CLSCTX_INPROC_SERVER, &IID_IFilterMapper2, (void **)&mapper)))
+ {
+ IPin_Release(source_pin);
+ return hr;
+ }
+
+ hr = IFilterMapper2_EnumMatchingFilters(mapper, &enum_moniker, 0, TRUE,
+ MERIT_UNLIKELY, FALSE, 1, type, NULL, NULL, FALSE, TRUE, 0, NULL, NULL, NULL);
+ IFilterMapper2_Release(mapper);
+ if (FAILED(hr))
+ {
+ IPin_Release(source_pin);
+ return hr;
+ }
+
+ hr = E_NOINTERFACE;
+ while (IEnumMoniker_Next(enum_moniker, 1, &mon, NULL) == S_OK)
+ {
+ hr = get_filter_info(mon, &clsid, &var);
+ IMoniker_Release(mon);
+ if (FAILED(hr))
+ continue;
+
+ hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IBaseFilter, (void **)&splitter);
+ if (FAILED(hr))
+ {
+ VariantClear(&var);
+ continue;
+ }
+
+ hr = IGraphBuilder_AddFilter(detector->graph, splitter, V_BSTR(&var));
+ VariantClear(&var);
+ if (FAILED(hr))
+ {
+ IBaseFilter_Release(splitter);
+ continue;
+ }
+
+ hr = IBaseFilter_EnumPins(splitter, &enum_pins);
+ if (FAILED(hr))
+ {
+ IBaseFilter_Release(splitter);
+ continue;
+ }
+ hr = IEnumPins_Next(enum_pins, 1, &splitter_pin, NULL);
+ IEnumPins_Release(enum_pins);
+ if (FAILED(hr))
+ {
+ IBaseFilter_Release(splitter);
+ continue;
+ }
+
+ hr = IPin_Connect(source_pin, splitter_pin, NULL);
+ IPin_Release(splitter_pin);
+ if (SUCCEEDED(hr))
+ {
+ detector->splitter = splitter;
+ break;
+ }
+
+ IBaseFilter_Release(splitter);
+ }
+
+ IEnumMoniker_Release(enum_moniker);
+ IPin_Release(source_pin);
+ return hr;
+}
+
/* MediaDet inner IUnknown */
static HRESULT WINAPI MediaDet_inner_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
{
@@ -401,115 +519,6 @@ static HRESULT WINAPI MediaDet_get_Filename(IMediaDet* iface, BSTR *pVal)
return S_OK;
}
-static HRESULT GetSplitter(MediaDetImpl *This)
-{
- IFileSourceFilter *file;
- LPOLESTR name;
- AM_MEDIA_TYPE mt;
- GUID type[2];
- IFilterMapper2 *map;
- IEnumMoniker *filters;
- IMoniker *mon;
- VARIANT var;
- GUID clsid;
- IBaseFilter *splitter;
- IEnumPins *pins;
- IPin *source_pin, *splitter_pin;
- HRESULT hr;
-
- hr = CoCreateInstance(&CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER,
- &IID_IFilterMapper2, (void **) &map);
- if (FAILED(hr))
- return hr;
-
- hr = IBaseFilter_QueryInterface(This->source, &IID_IFileSourceFilter,
- (void **) &file);
- if (FAILED(hr))
- {
- IFilterMapper2_Release(map);
- return hr;
- }
-
- hr = IFileSourceFilter_GetCurFile(file, &name, &mt);
- IFileSourceFilter_Release(file);
- CoTaskMemFree(name);
- if (FAILED(hr))
- {
- IFilterMapper2_Release(map);
- return hr;
- }
- type[0] = mt.majortype;
- type[1] = mt.subtype;
- CoTaskMemFree(mt.pbFormat);
-
- hr = IFilterMapper2_EnumMatchingFilters(map, &filters, 0, TRUE,
- MERIT_UNLIKELY, FALSE, 1, type,
- NULL, NULL, FALSE, TRUE,
- 0, NULL, NULL, NULL);
- IFilterMapper2_Release(map);
- if (FAILED(hr))
- return hr;
-
- hr = E_NOINTERFACE;
- while (IEnumMoniker_Next(filters, 1, &mon, NULL) == S_OK)
- {
- hr = get_filter_info(mon, &clsid, &var);
- IMoniker_Release(mon);
- if (FAILED(hr))
- continue;
-
- hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER,
- &IID_IBaseFilter, (void **) &splitter);
- if (FAILED(hr))
- {
- VariantClear(&var);
- continue;
- }
-
- hr = IGraphBuilder_AddFilter(This->graph, splitter, V_BSTR(&var));
- VariantClear(&var);
- This->splitter = splitter;
- if (FAILED(hr))
- goto retry;
-
- hr = IBaseFilter_EnumPins(This->source, &pins);
- if (FAILED(hr))
- goto retry;
- IEnumPins_Next(pins, 1, &source_pin, NULL);
- IEnumPins_Release(pins);
-
- hr = IBaseFilter_EnumPins(splitter, &pins);
- if (FAILED(hr))
- {
- IPin_Release(source_pin);
- goto retry;
- }
- if (IEnumPins_Next(pins, 1, &splitter_pin, NULL) != S_OK)
- {
- IEnumPins_Release(pins);
- IPin_Release(source_pin);
- goto retry;
- }
- IEnumPins_Release(pins);
-
- hr = IPin_Connect(source_pin, splitter_pin, NULL);
- IPin_Release(source_pin);
- IPin_Release(splitter_pin);
- if (SUCCEEDED(hr))
- break;
-
-retry:
- IBaseFilter_Release(splitter);
- This->splitter = NULL;
- }
-
- IEnumMoniker_Release(filters);
- if (FAILED(hr))
- return hr;
-
- return S_OK;
-}
-
static HRESULT WINAPI MediaDet_put_Filename(IMediaDet* iface, BSTR newVal)
{
MediaDetImpl *This = impl_from_IMediaDet(iface);
@@ -538,7 +547,7 @@ static HRESULT WINAPI MediaDet_put_Filename(IMediaDet* iface, BSTR newVal)
This->graph = gb;
This->source = bf;
- hr = GetSplitter(This);
+ hr = find_splitter(This);
if (FAILED(hr))
return hr;
More information about the wine-cvs
mailing list