[PATCH 2/5] strmbase/transform: Use BaseFilterImpl_Release().

Zebediah Figura z.figura12 at gmail.com
Sat May 25 15:21:22 CDT 2019


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/strmbase/transform.c | 71 +++++++++++++++++----------------------
 1 file changed, 31 insertions(+), 40 deletions(-)

diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c
index 6a7636c6e48..04ef23e23a3 100644
--- a/dlls/strmbase/transform.c
+++ b/dlls/strmbase/transform.c
@@ -139,8 +139,38 @@ static IPin *transform_get_pin(BaseFilter *iface, unsigned int index)
     return filter->ppPins[index];
 }
 
+static void transform_destroy(BaseFilter *iface)
+{
+    TransformFilter *filter = impl_from_BaseFilter(iface);
+    ULONG i;
+
+    for (i = 0; i < 2; ++i)
+    {
+        IPin *peer;
+
+        if (SUCCEEDED(IPin_ConnectedTo(filter->ppPins[i], &peer)))
+        {
+            IPin_Disconnect(peer);
+            IPin_Release(peer);
+        }
+        IPin_Disconnect(filter->ppPins[i]);
+        IPin_Release(filter->ppPins[i]);
+    }
+
+    CoTaskMemFree(filter->ppPins);
+
+    filter->csReceive.DebugInfo->Spare[0] = 0;
+    DeleteCriticalSection(&filter->csReceive);
+    FreeMediaType(&filter->pmt);
+    QualityControlImpl_Destroy(filter->qcimpl);
+    IUnknown_Release(filter->seekthru_unk);
+    strmbase_filter_cleanup(&filter->filter);
+    CoTaskMemFree(filter);
+}
+
 static const BaseFilterFuncTable tfBaseFuncTable = {
     .filter_get_pin = transform_get_pin,
+    .filter_destroy = transform_destroy,
 };
 
 static const BaseInputPinFuncTable tf_input_BaseInputFuncTable = {
@@ -161,45 +191,6 @@ static const BaseOutputPinFuncTable tf_output_BaseOutputFuncTable = {
     BaseOutputPinImpl_DecideAllocator,
 };
 
-static ULONG WINAPI TransformFilterImpl_Release(IBaseFilter * iface)
-{
-    TransformFilter *This = impl_from_IBaseFilter(iface);
-    ULONG refCount = InterlockedDecrement(&This->filter.refCount);
-
-    TRACE("(%p/%p)->() Release from %d\n", This, iface, refCount + 1);
-
-    if (!refCount)
-    {
-        ULONG i;
-
-        for (i = 0; i < 2; i++)
-        {
-            IPin *pConnectedTo;
-
-            if (SUCCEEDED(IPin_ConnectedTo(This->ppPins[i], &pConnectedTo)))
-            {
-                IPin_Disconnect(pConnectedTo);
-                IPin_Release(pConnectedTo);
-            }
-            IPin_Disconnect(This->ppPins[i]);
-
-            IPin_Release(This->ppPins[i]);
-        }
-
-        CoTaskMemFree(This->ppPins);
-
-        TRACE("Destroying transform filter\n");
-        This->csReceive.DebugInfo->Spare[0] = 0;
-        DeleteCriticalSection(&This->csReceive);
-        FreeMediaType(&This->pmt);
-        QualityControlImpl_Destroy(This->qcimpl);
-        IUnknown_Release(This->seekthru_unk);
-        strmbase_filter_cleanup(&This->filter);
-        CoTaskMemFree(This);
-    }
-    return refCount;
-}
-
 static HRESULT WINAPI TransformFilterImpl_Stop(IBaseFilter *iface)
 {
     TransformFilter *This = impl_from_IBaseFilter(iface);
@@ -275,7 +266,7 @@ static const IBaseFilterVtbl transform_vtbl =
 {
     BaseFilterImpl_QueryInterface,
     BaseFilterImpl_AddRef,
-    TransformFilterImpl_Release,
+    BaseFilterImpl_Release,
     BaseFilterImpl_GetClassID,
     TransformFilterImpl_Stop,
     TransformFilterImpl_Pause,
-- 
2.21.0




More information about the wine-devel mailing list