Index: dll/directx/wine/quartz/filesource.c =================================================================== --- dll/directx/wine/quartz/filesource.c (revision 63717) +++ dll/directx/wine/quartz/filesource.c (working copy) @@ -465,7 +465,7 @@ static ULONG WINAPI AsyncReader_Release(IBaseFilter * iface) { AsyncReader *This = impl_from_IBaseFilter(iface); - ULONG refCount = BaseFilterImpl_Release(iface); + ULONG refCount = InterlockedDecrement(&This->filter.refCount); TRACE("(%p)->() Release from %d\n", This, refCount + 1); @@ -485,6 +485,7 @@ CoTaskMemFree(This->pszFileName); if (This->pmt) FreeMediaType(This->pmt); + BaseFilter_Destroy(&This->filter); CoTaskMemFree(This); return 0; } Index: dll/directx/wine/quartz/nullrenderer.c =================================================================== --- dll/directx/wine/quartz/nullrenderer.c (revision 63717) +++ dll/directx/wine/quartz/nullrenderer.c (working copy) @@ -108,10 +108,11 @@ static ULONG WINAPI NullRendererInner_Release(IUnknown *iface) { NullRendererImpl *This = impl_from_IUnknown(iface); - ULONG refCount = BaseFilterImpl_Release(&This->renderer.filter.IBaseFilter_iface); + ULONG refCount = InterlockedDecrement(&This->renderer.filter.refCount); if (!refCount) { + BaseFilter_Destroy(&This->renderer.filter); TRACE("Destroying Null Renderer\n"); CoTaskMemFree(This); } Index: dll/directx/wine/quartz/parser.c =================================================================== --- dll/directx/wine/quartz/parser.c (revision 63717) +++ dll/directx/wine/quartz/parser.c (working copy) @@ -180,6 +180,7 @@ } CoTaskMemFree(This->ppPins); + BaseFilter_Destroy(&This->filter); TRACE("Destroying parser\n"); CoTaskMemFree(This); @@ -188,7 +189,7 @@ ULONG WINAPI Parser_Release(IBaseFilter * iface) { ParserImpl *This = impl_from_IBaseFilter(iface); - ULONG refCount = BaseFilterImpl_Release(iface); + ULONG refCount = InterlockedDecrement(&This->filter.refCount); TRACE("(%p)->() Release from %d\n", This, refCount + 1); Index: include/reactos/wine/strmbase.h =================================================================== --- include/reactos/wine/strmbase.h (revision 63717) +++ include/reactos/wine/strmbase.h (working copy) @@ -194,6 +194,7 @@ VOID WINAPI BaseFilterImpl_IncrementPinVersion(BaseFilter* This); HRESULT WINAPI BaseFilter_Init(BaseFilter * This, const IBaseFilterVtbl *Vtbl, const CLSID *pClsid, DWORD_PTR DebugInfo, const BaseFilterFuncTable* pBaseFuncsTable); +HRESULT WINAPI BaseFilter_Destroy(BaseFilter * This); /* Enums */ HRESULT WINAPI EnumMediaTypes_Construct(BasePin *iface, BasePin_GetMediaType enumFunc, BasePin_GetMediaTypeVersion versionFunc, IEnumMediaTypes ** ppEnum); Index: lib/3rdparty/strmbase/filter.c =================================================================== --- lib/3rdparty/strmbase/filter.c (revision 63717) +++ lib/3rdparty/strmbase/filter.c (working copy) @@ -60,15 +60,8 @@ TRACE("(%p)->() Release from %d\n", This, refCount + 1); if (!refCount) - { - if (This->pClock) - IReferenceClock_Release(This->pClock); + BaseFilter_Destroy(This); - This->IBaseFilter_iface.lpVtbl = NULL; - This->csFilter.DebugInfo->Spare[0] = 0; - DeleteCriticalSection(&This->csFilter); - } - return refCount; } @@ -209,3 +202,15 @@ return S_OK; } + +HRESULT WINAPI BaseFilter_Destroy(BaseFilter * This) +{ + if (This->pClock) + IReferenceClock_Release(This->pClock); + + This->IBaseFilter_iface.lpVtbl = NULL; + This->csFilter.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->csFilter); + + return S_OK; +} Index: lib/3rdparty/strmbase/renderer.c =================================================================== --- lib/3rdparty/strmbase/renderer.c (revision 63717) +++ lib/3rdparty/strmbase/renderer.c (working copy) @@ -284,7 +284,7 @@ ULONG WINAPI BaseRendererImpl_Release(IBaseFilter* iface) { BaseRenderer *This = impl_from_IBaseFilter(iface); - ULONG refCount = BaseFilterImpl_Release(iface); + ULONG refCount = InterlockedDecrement(&This->filter.refCount); if (!refCount) { @@ -309,6 +309,7 @@ CloseHandle(This->ThreadSignal); CloseHandle(This->RenderEvent); QualityControlImpl_Destroy(This->qcimpl); + BaseFilter_Destroy(&This->filter); } return refCount; } Index: lib/3rdparty/strmbase/transform.c =================================================================== --- lib/3rdparty/strmbase/transform.c (revision 63717) +++ lib/3rdparty/strmbase/transform.c (working copy) @@ -295,7 +295,7 @@ ULONG WINAPI TransformFilterImpl_Release(IBaseFilter * iface) { TransformFilter *This = impl_from_IBaseFilter(iface); - ULONG refCount = BaseFilterImpl_Release(iface); + ULONG refCount = InterlockedDecrement(&This->filter.refCount); TRACE("(%p/%p)->() Release from %d\n", This, iface, refCount + 1); @@ -325,6 +325,7 @@ FreeMediaType(&This->pmt); QualityControlImpl_Destroy(This->qcimpl); IUnknown_Release(This->seekthru_unk); + BaseFilter_Destroy(&This->filter); CoTaskMemFree(This); return 0;