Zebediah Figura : wineqtdecoder/qtsplitter: Share source pin and filter reference counts.

Alexandre Julliard julliard at winehq.org
Wed Jun 19 15:08:15 CDT 2019


Module: wine
Branch: master
Commit: 9ee197f2f61e6edf660b199cd02748fe412c0f35
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=9ee197f2f61e6edf660b199cd02748fe412c0f35

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Tue Jun 18 20:17:33 2019 -0500

wineqtdecoder/qtsplitter: Share source pin and filter reference counts.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wineqtdecoder/qtsplitter.c | 60 ++++++++++++++++-------------------------
 1 file changed, 23 insertions(+), 37 deletions(-)

diff --git a/dlls/wineqtdecoder/qtsplitter.c b/dlls/wineqtdecoder/qtsplitter.c
index 8a88729..8298406 100644
--- a/dlls/wineqtdecoder/qtsplitter.c
+++ b/dlls/wineqtdecoder/qtsplitter.c
@@ -779,23 +779,22 @@ static const IBaseFilterVtbl QT_Vtbl = {
     BaseFilterImpl_QueryVendorInfo
 };
 
-static HRESULT break_source_connection(BaseOutputPin *pin)
+static void free_source_pin(QTOutPin *pin)
 {
-    HRESULT hr;
-
-    EnterCriticalSection(pin->pin.pCritSec);
-    if (!pin->pin.pConnectedTo || !pin->pMemInputPin)
-        hr = VFW_E_NOT_CONNECTED;
-    else
+    EnterCriticalSection(pin->pin.pin.pCritSec);
+    if (pin->pin.pin.pConnectedTo)
     {
-        hr = IMemAllocator_Decommit(pin->pAllocator);
-        if (SUCCEEDED(hr))
-            hr = IPin_Disconnect(pin->pin.pConnectedTo);
-        IPin_Disconnect(&pin->pin.IPin_iface);
+        if (SUCCEEDED(IMemAllocator_Decommit(pin->pin.pAllocator)))
+            IPin_Disconnect(pin->pin.pin.pConnectedTo);
+        IPin_Disconnect(&pin->pin.pin.IPin_iface);
     }
-    LeaveCriticalSection(pin->pin.pCritSec);
+    LeaveCriticalSection(pin->pin.pin.pCritSec);
 
-    return hr;
+    DeleteMediaType(pin->pmt);
+    FreeMediaType(&pin->pin.pin.mtCurrent);
+    if (pin->pin.pAllocator)
+        IMemAllocator_Release(pin->pin.pAllocator);
+    CoTaskMemFree(pin);
 }
 
 /*
@@ -803,23 +802,16 @@ static HRESULT break_source_connection(BaseOutputPin *pin)
  */
 static HRESULT QT_RemoveOutputPins(QTSplitter *This)
 {
-    HRESULT hr;
-    TRACE("(%p)\n", This);
-
     if (This->pVideo_Pin)
     {
         OutputQueue_Destroy(This->pVideo_Pin->queue);
-        hr = break_source_connection(&This->pVideo_Pin->pin);
-        TRACE("Disconnect: %08x\n", hr);
-        IPin_Release(&This->pVideo_Pin->pin.pin.IPin_iface);
+        free_source_pin(This->pVideo_Pin);
         This->pVideo_Pin = NULL;
     }
     if (This->pAudio_Pin)
     {
         OutputQueue_Destroy(This->pAudio_Pin->queue);
-        hr = break_source_connection(&This->pAudio_Pin->pin);
-        TRACE("Disconnect: %08x\n", hr);
-        IPin_Release(&This->pAudio_Pin->pin.pin.IPin_iface);
+        free_source_pin(This->pAudio_Pin);
         This->pAudio_Pin = NULL;
     }
 
@@ -1340,22 +1332,16 @@ static HRESULT WINAPI QTOutPin_QueryInterface(IPin *iface, REFIID riid, void **p
     return E_NOINTERFACE;
 }
 
-static ULONG WINAPI QTOutPin_Release(IPin *iface)
+static ULONG WINAPI QTOutPin_AddRef(IPin *iface)
 {
-    QTOutPin *This = impl_QTOutPin_from_IPin(iface);
-    ULONG refCount = InterlockedDecrement(&This->pin.pin.refCount);
-    TRACE("(%p)->() Release from %d\n", iface, refCount + 1);
+    QTOutPin *pin = impl_QTOutPin_from_IPin(iface);
+    return IBaseFilter_AddRef(pin->pin.pin.pinInfo.pFilter);
+}
 
-    if (!refCount)
-    {
-        DeleteMediaType(This->pmt);
-        FreeMediaType(&This->pin.pin.mtCurrent);
-        if (This->pin.pAllocator)
-            IMemAllocator_Release(This->pin.pAllocator);
-        CoTaskMemFree(This);
-        return 0;
-    }
-    return refCount;
+static ULONG WINAPI QTOutPin_Release(IPin *iface)
+{
+    QTOutPin *pin = impl_QTOutPin_from_IPin(iface);
+    return IBaseFilter_Release(pin->pin.pin.pinInfo.pFilter);
 }
 
 static HRESULT WINAPI QTOutPin_CheckMediaType(BasePin *base, const AM_MEDIA_TYPE *amt)
@@ -1406,7 +1392,7 @@ static HRESULT WINAPI QTOutPin_DecideAllocator(BaseOutputPin *iface, IMemInputPi
 
 static const IPinVtbl QT_OutputPin_Vtbl = {
     QTOutPin_QueryInterface,
-    BasePinImpl_AddRef,
+    QTOutPin_AddRef,
     QTOutPin_Release,
     BaseOutputPinImpl_Connect,
     BaseOutputPinImpl_ReceiveConnection,




More information about the wine-cvs mailing list