[PATCH 1/6] strmbase: Factor out strmbase_renderer_cleanup().

Zebediah Figura z.figura12 at gmail.com
Wed May 15 18:16:55 CDT 2019


Signed-off-by: Zebediah Figura <z.figura12 at 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
-- 
2.21.0




More information about the wine-devel mailing list