HRESULT WINAPI BaseFilterImpl_QueryInterface(IBaseFilter * iface, REFIID riid, LPVOID * ppv)
{
- BaseFilter *This = impl_from_IBaseFilter(iface);
TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv);
*ppv = NULL;
- if (IsEqualIID(riid, &IID_IUnknown))
- *ppv = This;
- else if (IsEqualIID(riid, &IID_IPersist))
- *ppv = This;
- else if (IsEqualIID(riid, &IID_IMediaFilter))
- *ppv = This;
- else if (IsEqualIID(riid, &IID_IBaseFilter))
- *ppv = This;
-
- if (*ppv)
+ if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IPersist) ||
+ IsEqualIID(riid, &IID_IMediaFilter) || IsEqualIID(riid, &IID_IBaseFilter))
{
- IUnknown_AddRef((IUnknown *)(*ppv));
+ *ppv = iface;
+ IBaseFilter_AddRef(iface);
return S_OK;
}
TRACE("(%p)->() Release from %d\n", This, refCount + 1);
if (!refCount)
- {
- if (This->pClock)
- IReferenceClock_Release(This->pClock);
-
- This->IBaseFilter_iface.lpVtbl = NULL;
- This->csFilter.DebugInfo->Spare[0] = 0;
- DeleteCriticalSection(&This->csFilter);
- }
+ BaseFilter_Destroy(This);
return refCount;
}
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;
+}