Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/strmbase/renderer.c | 50 ++++++++++++++++++++++------------------ include/wine/strmbase.h | 1 + 2 files changed, 28 insertions(+), 23 deletions(-)
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c index c3571029d4..fd6cf523c5 100644 --- a/dlls/strmbase/renderer.c +++ b/dlls/strmbase/renderer.c @@ -275,36 +275,40 @@ HRESULT WINAPI BaseRendererImpl_QueryInterface(IBaseFilter* iface, REFIID riid, return BaseFilterImpl_QueryInterface(iface, riid, ppv); }
-ULONG WINAPI BaseRendererImpl_Release(IBaseFilter* iface) +void strmbase_renderer_cleanup(BaseRenderer *filter) { - BaseRenderer *This = impl_from_IBaseFilter(iface); - ULONG refCount = InterlockedDecrement(&This->filter.refCount); + IPin *peer;
- if (!refCount) + if (SUCCEEDED(IPin_ConnectedTo(&filter->pInputPin->pin.IPin_iface, &peer))) { - IPin *pConnectedTo; + IPin_Disconnect(peer); + IPin_Release(peer); + } + IPin_Disconnect(&filter->pInputPin->pin.IPin_iface); + IPin_Release(&filter->pInputPin->pin.IPin_iface);
- if (SUCCEEDED(IPin_ConnectedTo(&This->pInputPin->pin.IPin_iface, &pConnectedTo))) - { - IPin_Disconnect(pConnectedTo); - IPin_Release(pConnectedTo); - } - IPin_Disconnect(&This->pInputPin->pin.IPin_iface); - IPin_Release(&This->pInputPin->pin.IPin_iface); + if (filter->pPosition) + IUnknown_Release(filter->pPosition); + + filter->csRenderLock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&filter->csRenderLock);
- if (This->pPosition) - IUnknown_Release(This->pPosition); + BaseRendererImpl_ClearPendingSample(filter); + CloseHandle(filter->evComplete); + CloseHandle(filter->ThreadSignal); + CloseHandle(filter->RenderEvent); + QualityControlImpl_Destroy(filter->qcimpl); + BaseFilter_Destroy(&filter->filter); +} + +ULONG WINAPI BaseRendererImpl_Release(IBaseFilter* iface) +{ + BaseRenderer *This = impl_from_IBaseFilter(iface); + ULONG refCount = InterlockedDecrement(&This->filter.refCount);
- This->csRenderLock.DebugInfo->Spare[0] = 0; - DeleteCriticalSection(&This->csRenderLock); + if (!refCount) + strmbase_renderer_cleanup(This);
- BaseRendererImpl_ClearPendingSample(This); - CloseHandle(This->evComplete); - CloseHandle(This->ThreadSignal); - CloseHandle(This->RenderEvent); - QualityControlImpl_Destroy(This->qcimpl); - BaseFilter_Destroy(&This->filter); - } return refCount; }
diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h index 1cd002890e..b561c76965 100644 --- a/include/wine/strmbase.h +++ b/include/wine/strmbase.h @@ -623,6 +623,7 @@ HRESULT WINAPI BaseRendererImpl_ClearPendingSample(BaseRenderer *iface); HRESULT WINAPI strmbase_renderer_init(BaseRenderer *filter, const IBaseFilterVtbl *vtbl, IUnknown *outer, const CLSID *clsid, const WCHAR *sink_name, DWORD_PTR debug_info, const BaseRendererFuncTable *func_table); +void strmbase_renderer_cleanup(BaseRenderer *filter);
#ifdef __IBasicAudio_FWD_DEFINED__ typedef struct tagBasicAudio
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/videorenderer.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/dlls/quartz/videorenderer.c b/dlls/quartz/videorenderer.c index 1646e3fe0c..f3d817b90c 100644 --- a/dlls/quartz/videorenderer.c +++ b/dlls/quartz/videorenderer.c @@ -694,7 +694,7 @@ static ULONG WINAPI VideoRendererInner_AddRef(IUnknown *iface) static ULONG WINAPI VideoRendererInner_Release(IUnknown *iface) { VideoRendererImpl *This = impl_from_IUnknown(iface); - ULONG refCount = BaseRendererImpl_Release(&This->renderer.filter.IBaseFilter_iface); + ULONG refCount = InterlockedDecrement(&This->renderer.filter.refCount);
TRACE("(%p)->(): new ref = %d\n", This, refCount);
@@ -708,6 +708,7 @@ static ULONG WINAPI VideoRendererInner_Release(IUnknown *iface) CloseHandle(This->hEvent);
TRACE("Destroying Video Renderer\n"); + strmbase_renderer_cleanup(&This->renderer); CoTaskMemFree(This);
return 0; @@ -1068,7 +1069,7 @@ HRESULT VideoRenderer_create(IUnknown *pUnkOuter, void **ppv) return S_OK;
fail: - BaseRendererImpl_Release(&pVideoRenderer->renderer.filter.IBaseFilter_iface); + strmbase_renderer_cleanup(&pVideoRenderer->renderer); CoTaskMemFree(pVideoRenderer); return hr; }
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/vmr9.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c index 2a39d11d57..3d22f123b1 100644 --- a/dlls/quartz/vmr9.c +++ b/dlls/quartz/vmr9.c @@ -826,7 +826,7 @@ static ULONG WINAPI VMR9Inner_AddRef(IUnknown * iface) static ULONG WINAPI VMR9Inner_Release(IUnknown * iface) { struct quartz_vmr *This = impl_from_inner_IUnknown(iface); - ULONG refCount = BaseRendererImpl_Release(&This->renderer.filter.IBaseFilter_iface); + ULONG refCount = InterlockedDecrement(&This->renderer.filter.refCount);
TRACE("(%p/%p)->() Release from %d\n", This, iface, refCount + 1);
@@ -848,6 +848,7 @@ static ULONG WINAPI VMR9Inner_Release(IUnknown * iface) }
FreeLibrary(This->hD3d9); + strmbase_renderer_cleanup(&This->renderer); CoTaskMemFree(This); } return refCount; @@ -2442,7 +2443,7 @@ static HRESULT vmr_create(IUnknown *outer_unk, LPVOID *ppv, const CLSID *clsid) return hr;
fail: - BaseRendererImpl_Release(&pVMR->renderer.filter.IBaseFilter_iface); + strmbase_renderer_cleanup(&pVMR->renderer); FreeLibrary(pVMR->hD3d9); CoTaskMemFree(pVMR); return hr;
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/dsoundrender.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c index f92ab41880..b9eb14952e 100644 --- a/dlls/quartz/dsoundrender.c +++ b/dlls/quartz/dsoundrender.c @@ -680,7 +680,7 @@ HRESULT DSoundRender_create(IUnknown * pUnkOuter, LPVOID * ppv) } else { - BaseRendererImpl_Release(&pDSoundRender->renderer.filter.IBaseFilter_iface); + strmbase_renderer_cleanup(&pDSoundRender->renderer); CoTaskMemFree(pDSoundRender); }
@@ -725,7 +725,7 @@ static HRESULT WINAPI DSoundRender_QueryInterface(IBaseFilter * iface, REFIID ri static ULONG WINAPI DSoundRender_Release(IBaseFilter * iface) { DSoundRenderImpl *This = impl_from_IBaseFilter(iface); - ULONG refCount = BaseRendererImpl_Release(iface); + ULONG refCount = InterlockedDecrement(&This->renderer.filter.refCount);
TRACE("(%p)->() Release from %d\n", This, refCount + 1);
@@ -748,6 +748,7 @@ static ULONG WINAPI DSoundRender_Release(IBaseFilter * iface) CloseHandle(This->blocked);
TRACE("Destroying Audio Renderer\n"); + strmbase_renderer_cleanup(&This->renderer); CoTaskMemFree(This);
return 0;
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/qedit/nullrenderer.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/dlls/qedit/nullrenderer.c b/dlls/qedit/nullrenderer.c index c19a90df71..6ba70cb369 100644 --- a/dlls/qedit/nullrenderer.c +++ b/dlls/qedit/nullrenderer.c @@ -113,11 +113,12 @@ static ULONG WINAPI NullRendererInner_AddRef(IUnknown *iface) static ULONG WINAPI NullRendererInner_Release(IUnknown *iface) { NullRendererImpl *This = impl_from_IUnknown(iface); - ULONG refCount = BaseRendererImpl_Release(&This->renderer.filter.IBaseFilter_iface); + ULONG refCount = InterlockedDecrement(&This->renderer.filter.refCount);
if (!refCount) { TRACE("Destroying Null Renderer\n"); + strmbase_renderer_cleanup(&This->renderer); CoTaskMemFree(This); }
@@ -234,10 +235,7 @@ HRESULT NullRenderer_create(IUnknown *pUnkOuter, void **ppv) (DWORD_PTR)(__FILE__ ": NullRendererImpl.csFilter"), &RendererFuncTable);
if (FAILED(hr)) - { - BaseRendererImpl_Release(&pNullRenderer->renderer.filter.IBaseFilter_iface); CoTaskMemFree(pNullRenderer); - } else *ppv = &pNullRenderer->IUnknown_inner;
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/strmbase/renderer.c | 11 ----------- include/wine/strmbase.h | 1 - 2 files changed, 12 deletions(-)
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c index fd6cf523c5..d263b208eb 100644 --- a/dlls/strmbase/renderer.c +++ b/dlls/strmbase/renderer.c @@ -301,17 +301,6 @@ void strmbase_renderer_cleanup(BaseRenderer *filter) BaseFilter_Destroy(&filter->filter); }
-ULONG WINAPI BaseRendererImpl_Release(IBaseFilter* iface) -{ - BaseRenderer *This = impl_from_IBaseFilter(iface); - ULONG refCount = InterlockedDecrement(&This->filter.refCount); - - if (!refCount) - strmbase_renderer_cleanup(This); - - return refCount; -} - HRESULT WINAPI BaseRendererImpl_Receive(BaseRenderer *This, IMediaSample * pSample) { HRESULT hr = S_OK; diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h index b561c76965..18336c037d 100644 --- a/include/wine/strmbase.h +++ b/include/wine/strmbase.h @@ -608,7 +608,6 @@ typedef struct BaseRendererFuncTable { } BaseRendererFuncTable;
HRESULT WINAPI BaseRendererImpl_QueryInterface(IBaseFilter * iface, REFIID riid, LPVOID * ppv); -ULONG WINAPI BaseRendererImpl_Release(IBaseFilter * iface); HRESULT WINAPI BaseRendererImpl_Receive(BaseRenderer *This, IMediaSample * pSample); HRESULT WINAPI BaseRendererImpl_Stop(IBaseFilter * iface); HRESULT WINAPI BaseRendererImpl_Run(IBaseFilter * iface, REFERENCE_TIME tStart);