Module: wine Branch: master Commit: 3b48ba6c1da9f2b88f5413efcb09e954ee331131 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3b48ba6c1da9f2b88f5413efcb...
Author: Thomas Faber thomas.faber@reactos.org Date: Fri Nov 20 15:07:52 2015 +0100
quartz: Don't cache IFilterMapper2 interface in FilterGraph2.
Signed-off-by: Thomas Faber thomas.faber@reactos.org Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/quartz/filtergraph.c | 43 ++++++++++++++++++++++++++--------------- dlls/quartz/tests/filtergraph.c | 2 -- 2 files changed, 27 insertions(+), 18 deletions(-)
diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c index 495f4be..9f072a8 100644 --- a/dlls/quartz/filtergraph.c +++ b/dlls/quartz/filtergraph.c @@ -176,7 +176,6 @@ typedef struct _IFilterGraphImpl { IUnknown *outer_unk; LONG ref; IUnknown *punkFilterMapper2; - IFilterMapper2 * pFilterMapper2; IBaseFilter ** ppFiltersInGraph; LPWSTR * pFilterNames; ULONG nFilters; @@ -265,11 +264,11 @@ static HRESULT WINAPI FilterGraphInner_QueryInterface(IUnknown *iface, REFIID ri TRACE(" requesting IFilterMapper interface from aggregated filtermapper (%p)\n", *ppvObj); return IUnknown_QueryInterface(This->punkFilterMapper2, riid, ppvObj); } else if (IsEqualGUID(&IID_IFilterMapper2, riid)) { - *ppvObj = This->pFilterMapper2; TRACE(" returning IFilterMapper2 interface from aggregated filtermapper (%p)\n", *ppvObj); + return IUnknown_QueryInterface(This->punkFilterMapper2, riid, ppvObj); } else if (IsEqualGUID(&IID_IFilterMapper3, riid)) { - *ppvObj = This->pFilterMapper2; TRACE(" returning IFilterMapper3 interface from aggregated filtermapper (%p)\n", *ppvObj); + return IUnknown_QueryInterface(This->punkFilterMapper2, riid, ppvObj); } else if (IsEqualGUID(&IID_IGraphVersion, riid)) { *ppvObj = &This->IGraphConfig_iface; TRACE(" returning IGraphConfig interface (%p)\n", *ppvObj); @@ -319,9 +318,6 @@ static ULONG WINAPI FilterGraphInner_Release(IUnknown *iface) IUnknown_Release(This->ItfCacheEntries[i].iface); }
- /* AddRef on controlling IUnknown, to compensate for Release of cached IFilterMapper2 */ - IUnknown_AddRef(This->outer_unk); - IFilterMapper2_Release(This->pFilterMapper2); IUnknown_Release(This->punkFilterMapper2);
if (This->pSite) IUnknown_Release(This->pSite); @@ -910,6 +906,7 @@ static HRESULT WINAPI FilterGraph2_Connect(IFilterGraph2 *iface, IPin *ppinOut, CLSID FilterCLSID; PIN_DIRECTION dir; unsigned int i = 0; + IFilterMapper2 *pFilterMapper2 = NULL;
TRACE("(%p/%p)->(%p, %p)\n", This, iface, ppinOut, ppinIn);
@@ -999,10 +996,16 @@ static HRESULT WINAPI FilterGraph2_Connect(IFilterGraph2 *iface, IPin *ppinOut, TRACE("MajorType %s\n", debugstr_guid(&mt->majortype)); TRACE("SubType %s\n", debugstr_guid(&mt->subtype));
+ hr = IUnknown_QueryInterface(This->punkFilterMapper2, &IID_IFilterMapper2, (void**)&pFilterMapper2); + if (FAILED(hr)) { + WARN("Unable to get IFilterMapper2 (%x)\n", hr); + goto out; + } + /* Try to find a suitable filter that can connect to the pin to render */ tab[0] = mt->majortype; tab[1] = mt->subtype; - hr = IFilterMapper2_EnumMatchingFilters(This->pFilterMapper2, &pEnumMoniker, 0, FALSE, MERIT_UNLIKELY, TRUE, 1, tab, NULL, NULL, FALSE, FALSE, 0, NULL, NULL, NULL); + hr = IFilterMapper2_EnumMatchingFilters(pFilterMapper2, &pEnumMoniker, 0, FALSE, MERIT_UNLIKELY, TRUE, 1, tab, NULL, NULL, FALSE, FALSE, 0, NULL, NULL, NULL); if (FAILED(hr)) { WARN("Unable to enum filters (%x)\n", hr); goto out; @@ -1172,6 +1175,8 @@ error: IEnumMoniker_Release(pEnumMoniker);
out: + if (pFilterMapper2) + IFilterMapper2_Release(pFilterMapper2); if (penummt) IEnumMediaTypes_Release(penummt); if (mt) @@ -1267,6 +1272,7 @@ static HRESULT WINAPI FilterGraph2_Render(IFilterGraph2 *iface, IPin *ppinOut) ULONG nb; IMoniker* pMoniker; INT x; + IFilterMapper2 *pFilterMapper2 = NULL;
TRACE("(%p/%p)->(%p)\n", This, iface, ppinOut);
@@ -1376,10 +1382,20 @@ static HRESULT WINAPI FilterGraph2_Render(IFilterGraph2 *iface, IPin *ppinOut) continue; }
+ if (pFilterMapper2 == NULL) + { + hr = IUnknown_QueryInterface(This->punkFilterMapper2, &IID_IFilterMapper2, (void**)&pFilterMapper2); + if (FAILED(hr)) + { + WARN("Unable to query IFilterMapper2 (%x)\n", hr); + break; + } + } + /* Try to find a suitable renderer with the same media type */ tab[0] = mt->majortype; tab[1] = mt->subtype; - hr = IFilterMapper2_EnumMatchingFilters(This->pFilterMapper2, &pEnumMoniker, 0, FALSE, MERIT_UNLIKELY, TRUE, 1, tab, NULL, NULL, FALSE, FALSE, 0, NULL, NULL, NULL); + hr = IFilterMapper2_EnumMatchingFilters(pFilterMapper2, &pEnumMoniker, 0, FALSE, MERIT_UNLIKELY, TRUE, 1, tab, NULL, NULL, FALSE, FALSE, 0, NULL, NULL, NULL); if (FAILED(hr)) { WARN("Unable to enum filters (%x)\n", hr); @@ -1493,6 +1509,9 @@ error: hr = S_OK; }
+ if (pFilterMapper2) + IFilterMapper2_Release(pFilterMapper2); + IEnumMediaTypes_Release(penummt); return hr; } @@ -5708,14 +5727,6 @@ HRESULT FilterGraph_create(IUnknown *pUnkOuter, LPVOID *ppObj) hr = CoCreateInstance(&CLSID_FilterMapper2, fimpl->outer_unk, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&fimpl->punkFilterMapper2);
- if (SUCCEEDED(hr)) - hr = IUnknown_QueryInterface(fimpl->punkFilterMapper2, &IID_IFilterMapper2, - (void**)&fimpl->pFilterMapper2); - - if (SUCCEEDED(hr)) - /* Release controlling IUnknown - compensate refcount increase from caching IFilterMapper2 interface. */ - IUnknown_Release(fimpl->outer_unk); - if (FAILED(hr)) { ERR("Unable to create filter mapper (%x)\n", hr); if (fimpl->punkFilterMapper2) IUnknown_Release(fimpl->punkFilterMapper2); diff --git a/dlls/quartz/tests/filtergraph.c b/dlls/quartz/tests/filtergraph.c index f3af03e..39d6e88 100644 --- a/dlls/quartz/tests/filtergraph.c +++ b/dlls/quartz/tests/filtergraph.c @@ -1942,9 +1942,7 @@ static void test_aggregate_filter_graph(void) ok(punk != &unk_outer.IUnknown_iface, "punk = %p, expected not %p\n", punk, &unk_outer.IUnknown_iface); IUnknown_Release(punk);
-todo_wine ok(unk_outer.AddRef_called == 0, "IUnknownImpl_AddRef called %d times\n", unk_outer.AddRef_called); -todo_wine ok(unk_outer.Release_called == 0, "IUnknownImpl_Release called %d times\n", unk_outer.Release_called); unk_outer.AddRef_called = 0; unk_outer.Release_called = 0;